Drag&Drop for Entries, some other UI work
git-svn-id: https://svn.code.sf.net/p/keepassx/code/trunk@53 b624d157-de02-0410-bad0-e51aec6abb33
This commit is contained in:
@@ -26,6 +26,8 @@
|
||||
#include <QMouseEvent>
|
||||
#include <QHeaderView>
|
||||
#include <QTime>
|
||||
#include <QApplication>
|
||||
#include <QPainter>
|
||||
#include "main.h"
|
||||
#include "EntryView.h"
|
||||
|
||||
@@ -45,7 +47,7 @@ header()->setResizeMode(QHeaderView::Interactive);
|
||||
header()->setStretchLastSection(false);
|
||||
connect(header(),SIGNAL(sectionResized(int,int,int)),this,SLOT(OnColumnResized(int,int,int)));
|
||||
ContextMenu=new QMenu(this);
|
||||
|
||||
setAlternatingRowColors(config.AlternatingRowColors);
|
||||
}
|
||||
|
||||
KeepassEntryView::~KeepassEntryView(){
|
||||
@@ -136,13 +138,13 @@ void KeepassEntryView::setEntry(CEntry* entry){
|
||||
if(config.Columns[4]){
|
||||
tmp->setText(j++,entry->Additional.section('\n',0,0));}
|
||||
if(config.Columns[5]){
|
||||
tmp->setText(j++,entry->Expire.toString(DateTimeFormat));}
|
||||
tmp->setText(j++,entry->Expire.date().toString(Qt::LocalDate));}
|
||||
if(config.Columns[6]){
|
||||
tmp->setText(j++,entry->Creation.toString(DateTimeFormat));}
|
||||
tmp->setText(j++,entry->Creation.date().toString(Qt::LocalDate));}
|
||||
if(config.Columns[7]){
|
||||
tmp->setText(j++,entry->LastMod.toString(DateTimeFormat));}
|
||||
tmp->setText(j++,entry->LastMod.date().toString(Qt::LocalDate));}
|
||||
if(config.Columns[8]){
|
||||
tmp->setText(j++,entry->LastAccess.toString(DateTimeFormat));}
|
||||
tmp->setText(j++,entry->LastAccess.date().toString(Qt::LocalDate));}
|
||||
if(config.Columns[9]){
|
||||
tmp->setText(j++,entry->BinaryDesc);}
|
||||
Items.back()->setIcon(0,EntryIcons[entry->ImageID]);
|
||||
@@ -174,13 +176,13 @@ for(int i=0;i<Items.size();i++){
|
||||
if(config.Columns[4]){
|
||||
tmp->setText(j++,entry->Additional.section('\n',0,0));}
|
||||
if(config.Columns[5]){
|
||||
tmp->setText(j++,entry->Expire.toString(DateTimeFormat));}
|
||||
tmp->setText(j++,entry->Expire.date().toString(Qt::LocalDate));}
|
||||
if(config.Columns[6]){
|
||||
tmp->setText(j++,entry->Creation.toString(DateTimeFormat));}
|
||||
tmp->setText(j++,entry->Creation.date().toString(Qt::LocalDate));}
|
||||
if(config.Columns[7]){
|
||||
tmp->setText(j++,entry->LastMod.toString(DateTimeFormat));}
|
||||
tmp->setText(j++,entry->LastMod.date().toString(Qt::LocalDate));}
|
||||
if(config.Columns[8]){
|
||||
tmp->setText(j++,entry->LastAccess.toString(DateTimeFormat));}
|
||||
tmp->setText(j++,entry->LastAccess.date().toString(Qt::LocalDate));}
|
||||
if(config.Columns[9]){
|
||||
tmp->setText(j++,entry->BinaryDesc);}
|
||||
tmp->setIcon(0,EntryIcons[entry->ImageID]);
|
||||
@@ -285,6 +287,66 @@ if(((ColumnSizes[j]-div)*w > 2)){
|
||||
resizeColumns();
|
||||
}
|
||||
|
||||
void KeepassEntryView::mousePressEvent(QMouseEvent *event){
|
||||
//save event position - maybe this is the start of a drag
|
||||
if (event->button() == Qt::LeftButton)
|
||||
DragStartPos = event->pos();
|
||||
//call base function
|
||||
QTreeWidget::mousePressEvent(event);
|
||||
}
|
||||
|
||||
void KeepassEntryView::mouseMoveEvent(QMouseEvent *event){
|
||||
if (!(event->buttons() & Qt::LeftButton))
|
||||
return;
|
||||
if ((event->pos() - DragStartPos).manhattanLength() < QApplication::startDragDistance())
|
||||
return;
|
||||
|
||||
DragItems.clear();
|
||||
EntryViewItem* DragStartItem=(EntryViewItem*)itemAt(DragStartPos);
|
||||
if(!DragStartItem){
|
||||
while(selectedItems().size()){
|
||||
setItemSelected(selectedItems()[0],false);}
|
||||
return;
|
||||
}
|
||||
if(selectedItems().size()==0){
|
||||
setItemSelected(DragStartItem,true);}
|
||||
else{
|
||||
bool AlreadySelected=false;
|
||||
for(int i=0;i<selectedItems().size();i++){
|
||||
if(selectedItems()[i]==DragStartItem){AlreadySelected=true; break;}
|
||||
}
|
||||
if(!AlreadySelected){
|
||||
while(selectedItems().size()){
|
||||
setItemSelected(selectedItems()[0],false);
|
||||
}
|
||||
setItemSelected(DragStartItem,true);
|
||||
}
|
||||
}
|
||||
|
||||
DragItems=selectedItems();
|
||||
QDrag *drag = new QDrag(this);
|
||||
QFontMetrics fontmet(DragStartItem->font(0));
|
||||
int DragPixmHeight=16;
|
||||
if(fontmet.height()>16)DragPixmHeight=fontmet.height();
|
||||
QString DragText;
|
||||
if(DragItems.size()>1)DragText=QString(tr("%1 items")).arg(DragItems.size());
|
||||
else DragText=((EntryViewItem*)DragItems[0])->pEntry->Title;
|
||||
DragPixmap = QPixmap(fontmet.width(DragText)+19,DragPixmHeight);
|
||||
DragPixmap.fill(QColor(255,255,255));
|
||||
QPainter painter(&DragPixmap);
|
||||
painter.setPen(QColor(0,0,0));
|
||||
painter.setFont(DragItems[0]->font(0));
|
||||
painter.drawPixmap(0,0,DragItems[0]->icon(0).pixmap());
|
||||
painter.drawText(19,DragPixmHeight-fontmet.strikeOutPos(),DragText);
|
||||
QMimeData *mimeData = new QMimeData;
|
||||
void* pDragItems=&DragItems;
|
||||
mimeData->setData("keepass/entry",QByteArray((char*)&pDragItems,sizeof(void*)));
|
||||
drag->setMimeData(mimeData);
|
||||
drag->setPixmap(DragPixmap);
|
||||
drag->start();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void KeepassEntryView::paintEvent(QPaintEvent * event){
|
||||
|
||||
@@ -50,10 +50,19 @@ private:
|
||||
QList<float>ColumnSizes;
|
||||
void resizeColumns();
|
||||
bool AutoResizeColumns;
|
||||
QPoint DragStartPos;
|
||||
QList<QTreeWidgetItem*> DragItems;
|
||||
QPixmap DragPixmap;
|
||||
protected:
|
||||
virtual void contextMenuEvent(QContextMenuEvent *event);
|
||||
virtual void paintEvent(QPaintEvent* event);
|
||||
virtual void resizeEvent(QResizeEvent* event);
|
||||
// virtual void dragEnterEvent ( QDragEnterEvent * event );
|
||||
// virtual void dragMoveEvent ( QDragMoveEvent * event );
|
||||
// virtual void dragLeaveEvent ( QDragLeaveEvent * event );
|
||||
// virtual void dropEvent ( QDropEvent * event );
|
||||
virtual void mousePressEvent(QMouseEvent *event);
|
||||
virtual void mouseMoveEvent(QMouseEvent *event);
|
||||
public slots:
|
||||
void OnColumnResized(int index,int OldSize, int NewSize);
|
||||
};
|
||||
|
||||
@@ -34,6 +34,7 @@
|
||||
#include <QBrush>
|
||||
#include <QMenu>
|
||||
#include "main.h"
|
||||
#include "EntryView.h"
|
||||
#include "GroupView.h"
|
||||
#define INSERT_AREA_WIDTH 4
|
||||
|
||||
@@ -41,7 +42,7 @@ KeepassGroupView::KeepassGroupView(QWidget* parent):QTreeWidget(parent){
|
||||
InsertionMarker=QLine();
|
||||
db=NULL;
|
||||
LastHoverItem=NULL;
|
||||
setHeaderLabels(QStringList()<<tr("Gruppen"));
|
||||
setHeaderLabels(QStringList()<<tr("Groups"));
|
||||
ShowSearchGroup=false;
|
||||
ContextMenu=new QMenu(this);
|
||||
}
|
||||
@@ -52,52 +53,70 @@ setItemSelected(Items.back(),true);
|
||||
}
|
||||
|
||||
void KeepassGroupView:: dragEnterEvent ( QDragEnterEvent * event ){
|
||||
if(event->mimeData()->hasFormat("keepass/group") ||
|
||||
event->mimeData()->hasFormat("keepass/entry")){
|
||||
event->accept();
|
||||
if(event->mimeData()->hasFormat("keepass/group")){
|
||||
DragType=GROUP;
|
||||
event->accept();
|
||||
return;
|
||||
}
|
||||
if(event->mimeData()->hasFormat("keepass/entry")){
|
||||
DragType=ENTRY;
|
||||
event->accept();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void KeepassGroupView:: dragMoveEvent ( QDragMoveEvent * event ){
|
||||
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);
|
||||
QFont f=LastHoverItem->font(0);
|
||||
f.setBold(false);
|
||||
LastHoverItem->setFont(0,f);
|
||||
}
|
||||
|
||||
InsertionMarker=QLine();
|
||||
if(isSearchResultGroup(item))
|
||||
event->setAccepted(false);
|
||||
else if(item){
|
||||
QRect ItemRect=visualItemRect(item);
|
||||
if(!db->isParentGroup(item->pGroup,DragItem->pGroup) && DragItem!=item){
|
||||
if((ItemRect.height()+ItemRect.y())-event->pos().y() > INSERT_AREA_WIDTH && event->pos().y() > INSERT_AREA_WIDTH){
|
||||
QFont f=item->font(0);
|
||||
f.setBold(true);
|
||||
item->setFont(0,f);
|
||||
LastHoverItem=item;
|
||||
event->setAccepted(true);
|
||||
}
|
||||
else{
|
||||
LastHoverItem=NULL;
|
||||
if(event->pos().y() > INSERT_AREA_WIDTH)
|
||||
InsertionMarker=QLine(ItemRect.x(),ItemRect.y()+ItemRect.height(),
|
||||
ItemRect.x()+ItemRect.width(),ItemRect.y()+ItemRect.height());
|
||||
else
|
||||
InsertionMarker=QLine(ItemRect.x(),0,
|
||||
ItemRect.x()+ItemRect.width(),0);
|
||||
else
|
||||
if(DragType==GROUP){
|
||||
if(item){
|
||||
QRect ItemRect=visualItemRect(item);
|
||||
if(!db->isParentGroup(item->pGroup,DragItem->pGroup) && DragItem!=item){
|
||||
if((ItemRect.height()+ItemRect.y())-event->pos().y() > INSERT_AREA_WIDTH && event->pos().y() > INSERT_AREA_WIDTH){
|
||||
QFont f=item->font(0);
|
||||
f.setBold(true);
|
||||
item->setFont(0,f);
|
||||
LastHoverItem=item;
|
||||
event->setAccepted(true);
|
||||
}
|
||||
else{
|
||||
LastHoverItem=NULL;
|
||||
if(event->pos().y() > INSERT_AREA_WIDTH)
|
||||
InsertionMarker=QLine(ItemRect.x(),ItemRect.y()+ItemRect.height()
|
||||
,ItemRect.x()+ItemRect.width(),ItemRect.y()+ItemRect.height());
|
||||
else
|
||||
InsertionMarker=QLine(ItemRect.x(),0,ItemRect.x()+ItemRect.width(),0);
|
||||
}
|
||||
}
|
||||
else
|
||||
event->setAccepted(false);
|
||||
}
|
||||
}
|
||||
else
|
||||
event->setAccepted(false);
|
||||
|
||||
else
|
||||
LastHoverItem=NULL;
|
||||
}
|
||||
else{
|
||||
LastHoverItem=NULL;
|
||||
|
||||
if(item){
|
||||
QFont f=item->font(0);
|
||||
f.setBold(true);
|
||||
item->setFont(0,f);
|
||||
LastHoverItem=item;
|
||||
event->setAccepted(true);
|
||||
}
|
||||
else{
|
||||
event->setAccepted(false);
|
||||
LastHoverItem=NULL;
|
||||
}
|
||||
}
|
||||
|
||||
update();
|
||||
}
|
||||
|
||||
@@ -122,21 +141,32 @@ if(LastHoverItem){
|
||||
LastHoverItem=NULL;
|
||||
}
|
||||
GroupViewItem* item=(GroupViewItem*)itemAt(event->pos());
|
||||
if(item){
|
||||
QRect ItemRect=visualItemRect(item);
|
||||
if((ItemRect.height()+ItemRect.y())-event->pos().y() > INSERT_AREA_WIDTH && event->pos().y() > INSERT_AREA_WIDTH){
|
||||
db->moveGroup(DragItem->pGroup,item->pGroup);}
|
||||
else{
|
||||
if(event->pos().y() > INSERT_AREA_WIDTH){
|
||||
if(db->getNumberOfChilds(item->pGroup) > 0)
|
||||
db->moveGroup(DragItem->pGroup,item->pGroup,0);
|
||||
else
|
||||
db->moveGroupDirectly(DragItem->pGroup,item->pGroup);
|
||||
}
|
||||
else db->moveGroupDirectly(DragItem->pGroup,NULL);
|
||||
}
|
||||
if(DragType==GROUP){
|
||||
if(item){
|
||||
QRect ItemRect=visualItemRect(item);
|
||||
if((ItemRect.height()+ItemRect.y())-event->pos().y() > INSERT_AREA_WIDTH && event->pos().y() > INSERT_AREA_WIDTH){
|
||||
db->moveGroup(DragItem->pGroup,item->pGroup);}
|
||||
else{
|
||||
if(event->pos().y() > INSERT_AREA_WIDTH){
|
||||
if(db->getNumberOfChilds(item->pGroup) > 0)
|
||||
db->moveGroup(DragItem->pGroup,item->pGroup,0);
|
||||
else
|
||||
db->moveGroupDirectly(DragItem->pGroup,item->pGroup);
|
||||
}
|
||||
else db->moveGroupDirectly(DragItem->pGroup,NULL);
|
||||
}
|
||||
}
|
||||
else db->moveGroup(DragItem->pGroup,NULL);
|
||||
}else{
|
||||
Q_ASSERT(item);
|
||||
QList<QTreeWidgetItem*>* pDragItems=(QList<QTreeWidgetItem*>*)*((QList<QTreeWidgetItem*>**)event->mimeData()->data("keepass/entry").data());
|
||||
for(int i=0;i<pDragItems->size();i++){
|
||||
db->moveEntry(((EntryViewItem*)(*pDragItems)[i])->pEntry,item->pGroup);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
else db->moveGroup(DragItem->pGroup,NULL);
|
||||
|
||||
|
||||
updateItems();
|
||||
}
|
||||
|
||||
@@ -60,6 +60,8 @@ private:
|
||||
GroupViewItem* DragItem;
|
||||
GroupViewItem* LastHoverItem;
|
||||
GroupViewItem* getLastSameLevelItem(int level);
|
||||
enum tDragType{GROUP,ENTRY};
|
||||
tDragType DragType;
|
||||
};
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user