Drag'n'Drop: added insertion marks for group sorting

git-svn-id: https://svn.code.sf.net/p/keepassx/code/trunk@21 b624d157-de02-0410-bad0-e51aec6abb33
master
tariq 19 years ago
parent 265104133b
commit ed93603383
  1. 8
      src/forms/MainWindow.ui
  2. 53
      src/lib/GroupView.cpp
  3. 5
      src/lib/GroupView.h

@ -328,16 +328,16 @@
<pixmapfunction></pixmapfunction>
<customwidgets>
<customwidget>
<class>KeepassGroupView</class>
<class>KeepassEntryView</class>
<extends>QTreeWidget</extends>
<header>../../src/lib/GroupView.h</header>
<header>../../src/lib/EntryView.h</header>
<container>0</container>
<pixmap></pixmap>
</customwidget>
<customwidget>
<class>KeepassEntryView</class>
<class>KeepassGroupView</class>
<extends>QTreeWidget</extends>
<header>../../src/lib/EntryView.h</header>
<header>../../src/lib/GroupView.h</header>
<container>0</container>
<pixmap></pixmap>
</customwidget>

@ -22,6 +22,7 @@
#include <QDragMoveEvent>
#include <QDragLeaveEvent>
#include <QDropEvent>
#include <QPaintEvent>
#include <QMouseEvent>
#include <QApplication>
#include <QFont>
@ -34,8 +35,10 @@
#include "main.h"
#include "GroupView.h"
KeepassGroupView::KeepassGroupView(QWidget* parent):QTreeWidget(parent){
db=0;
InsertionMarker=QLine();
db=NULL;
LastHoverItem=NULL;
setHeaderLabels(QStringList()<<tr("Gruppen"));
}
@ -49,43 +52,61 @@ event->accept();
void KeepassGroupView:: dragMoveEvent ( QDragMoveEvent * event ){
GroupViewItem* item=(GroupViewItem*)itemAt(event->pos());
if(LastHoverItem){
QFont f=LastHoverItem->font(0);
f.setBold(false);
LastHoverItem->setFont(0,f);
}
InsertionMarker=QLine();
if(item){
QRect ItemRect=visualItemRect(item);
if(!db->isParentGroup(item->pGroup,DragItem->pGroup) && DragItem!=item){
QFont f=item->font(0);
f.setBold(true);
item->setFont(0,f);
LastHoverItem=item;
event->setAccepted(true);}
if((ItemRect.height()+ItemRect.y())-event->pos().y() > 4){
QFont f=item->font(0);
f.setBold(true);
item->setFont(0,f);
LastHoverItem=item;
event->setAccepted(true);
}
else{
LastHoverItem=NULL;
InsertionMarker=QLine(ItemRect.x(),ItemRect.y()+ItemRect.height(),
ItemRect.x()+ItemRect.width(),ItemRect.y()+ItemRect.height());
}
}
else
event->setAccepted(false);
}
else{
LastHoverItem=NULL;}
}
else{
LastHoverItem=NULL;
}
update();
}
void KeepassGroupView:: dragLeaveEvent ( QDragLeaveEvent * event ){
InsertionMarker=QLine();
if(LastHoverItem){
QFont f=LastHoverItem->font(0);
f.setBold(false);
LastHoverItem->setFont(0,f);
}
update();
}
void KeepassGroupView::dropEvent( QDropEvent * event ){
InsertionMarker=QLine();
if(LastHoverItem){
QFont f=LastHoverItem->font(0);
f.setBold(false);
LastHoverItem->setFont(0,f);
LastHoverItem=NULL;
}
GroupViewItem* item=(GroupViewItem*)itemAt(event->pos());
if(item)
@ -132,6 +153,7 @@ void KeepassGroupView::mouseMoveEvent(QMouseEvent *event){
}
void KeepassGroupView::updateItems(){
clear();
Items.clear();
for(int i=0; i<db->Groups.size();i++){
@ -168,10 +190,23 @@ for(int i=Items.size()-1;i>=0;i--){
if(Items[i]->pGroup->Level==level){
return Items[i];}
}
return Items.back();
}
void KeepassGroupView::paintEvent(QPaintEvent* event){
QTreeWidget::paintEvent(event);
QPainter painter(viewport());
QPen pen(QColor(100,100,100));
pen.setWidth(2);
pen.setStyle(Qt::DotLine);
painter.setPen(pen);
if(!InsertionMarker.isNull()){
painter.drawLine(InsertionMarker);
}
}
GroupViewItem::GroupViewItem(QTreeWidget *parent):QTreeWidgetItem(parent){

@ -39,12 +39,17 @@ protected:
virtual void dropEvent ( QDropEvent * event );
virtual void mousePressEvent(QMouseEvent *event);
virtual void mouseMoveEvent(QMouseEvent *event);
virtual void paintEvent ( QPaintEvent * event );
private:
QLine InsertionMarker;
QPoint DragStartPos;
QPixmap DragPixmap;
GroupViewItem* DragItem;
GroupViewItem* LastHoverItem;
GroupViewItem* getLastSameLevelItem(int level);
};