From 73e8c49e3b1b85280bfa85abb78314639c3e2caa Mon Sep 17 00:00:00 2001 From: sniperbeamer Date: Thu, 3 Sep 2009 17:17:22 +0000 Subject: [PATCH] Add ability to drag'n'drop fields (username, password, ...) to other applications git-svn-id: https://svn.code.sf.net/p/keepassx/code/trunk@339 b624d157-de02-0410-bad0-e51aec6abb33 --- src/lib/EntryView.cpp | 134 ++++++++++++++++++++++-------------------- src/lib/EntryView.h | 31 +++++----- src/lib/GroupView.cpp | 1 - 3 files changed, 85 insertions(+), 81 deletions(-) diff --git a/src/lib/EntryView.cpp b/src/lib/EntryView.cpp index b0acb34..d35f34b 100644 --- a/src/lib/EntryView.cpp +++ b/src/lib/EntryView.cpp @@ -242,7 +242,7 @@ void KeepassEntryView::OnDeleteEntry(){ } bool backup = false; - IGroupHandle* bGroup; + IGroupHandle* bGroup = NULL; if (config->backup() && ((EntryViewItem*)entries[0])->EntryHandle->group() != (bGroup=db->backupGroup())) backup = true; if (backup && !bGroup) { @@ -266,40 +266,68 @@ void KeepassEntryView::OnDeleteEntry(){ emit fileModified(); } - +QString KeepassEntryView::columnString(IEntryHandle* entry, int col, bool forceClearText) { + switch (col) { + case 0: + return entry->title(); + case 1: + if (config->hideUsernames() && !forceClearText) + return "******"; + else + return entry->username(); + case 2: + return entry->url(); + case 3: + { + if (config->hidePasswords() && !forceClearText) { + return "******"; + } + else { + SecString password = entry->password(); + password.unlock(); + return password.string(); + } + } + case 4: + { + QString comment = entry->comment(); + int toPos = comment.indexOf(QRegExp("[\\r\\n]")); + if (toPos == -1) + return comment; + else + return comment.left(toPos); + } + case 5: + return entry->expire().dateToString(Qt::SystemLocaleDate); + case 6: + return entry->creation().dateToString(Qt::SystemLocaleDate); + case 7: + return entry->lastMod().dateToString(Qt::SystemLocaleDate); + case 8: + return entry->lastAccess().dateToString(Qt::SystemLocaleDate); + case 9: + return entry->binaryDesc(); + case 10: + return entry->group()->title(); + default: + Q_ASSERT(false); + return QString(); + } +} void KeepassEntryView::updateEntry(EntryViewItem* item){ IEntryHandle* entry = item->EntryHandle; - int j=0; - item->setText(j++,entry->title()); - item->setIcon(0,db->icon(entry->image())); - if(config->hideUsernames()) - item->setText(j++,"******"); - else - item->setText(j++,entry->username()); - item->setText(j++,entry->url()); - if(config->hidePasswords()) - item->setText(j++,"******"); - else{ - SecString password=entry->password(); - password.unlock(); - item->setText(j++,password.string()); - } - QString comment = entry->comment(); - int toPos = comment.indexOf(QRegExp("[\\r\\n]")); - if (toPos == -1) - item->setText(j++,comment); - else - item->setText(j++,comment.left(toPos)); - item->setText(j++,entry->expire().dateToString(Qt::SystemLocaleDate)); - item->setText(j++,entry->creation().dateToString(Qt::SystemLocaleDate)); - item->setText(j++,entry->lastMod().dateToString(Qt::SystemLocaleDate)); - item->setText(j++,entry->lastAccess().dateToString(Qt::SystemLocaleDate)); - item->setText(j++,entry->binaryDesc()); + + int cols = NUM_COLUMNS - 1; if (ViewMode == ShowSearchResults) { - item->setText(j,entry->group()->title()); - item->setIcon(j++,db->icon(entry->group()->image())); + item->setIcon(10, db->icon(entry->group()->image())); + ++cols; + } + + for (int i=0; isetText(i, columnString(entry, i)); } + item->setIcon(0, db->icon(entry->image())); } void KeepassEntryView::editEntry(EntryViewItem* item){ @@ -511,41 +539,15 @@ void KeepassEntryView::showGroup(IGroupHandle* group){ } void KeepassEntryView::createItems(QList& entries){ - for(int i=0;iisValid())continue; - EntryViewItem* item=new EntryViewItem(this); + for (int i=0; iisValid()) + continue; + + EntryViewItem* item = new EntryViewItem(this); Items.push_back(item); - Items.back()->EntryHandle=entries[i]; - int j=0; - item->setText(j++,entries[i]->title()); - item->setIcon(0,db->icon(entries[i]->image())); - if(config->hideUsernames()) - item->setText(j++,"******"); - else - item->setText(j++,entries[i]->username()); - item->setText(j++,entries[i]->url()); - if(config->hidePasswords()) - item->setText(j++,"******"); - else{ - SecString password=entries[i]->password(); - password.unlock(); - item->setText(j++,password.string()); - } - QString comment = entries[i]->comment(); - int toPos = comment.indexOf(QRegExp("[\\r\\n]")); - if (toPos == -1) - item->setText(j++,comment); - else - item->setText(j++,comment.left(toPos)); - item->setText(j++,entries[i]->expire().dateToString(Qt::SystemLocaleDate)); - item->setText(j++,entries[i]->creation().dateToString(Qt::SystemLocaleDate)); - item->setText(j++,entries[i]->lastMod().dateToString(Qt::SystemLocaleDate)); - item->setText(j++,entries[i]->lastAccess().dateToString(Qt::SystemLocaleDate)); - item->setText(j++,entries[i]->binaryDesc()); - if (ViewMode == ShowSearchResults) { - item->setText(j,entries[i]->group()->title()); - item->setIcon(j++,db->icon(entries[i]->group()->image())); - } + Items.back()->EntryHandle = entries[i]; + + updateEntry(item); } } @@ -604,7 +606,9 @@ void KeepassEntryView::mouseMoveEvent(QMouseEvent *event){ QDrag *drag = new QDrag(this); QMimeData *mimeData = new QMimeData; void* pDragItems=&DragItems; - mimeData->setData("text/plain;charset=UTF-8",DragItems.first()->text(0).toUtf8()); + if (header()->logicalIndexAt(event->pos()) != -1) { + mimeData->setText(columnStringView(DragStartItem, header()->logicalIndexAt(event->pos()), true)); + } mimeData->setData("application/x-keepassx-entry",QByteArray((char*)&pDragItems,sizeof(void*))); drag->setMimeData(mimeData); EventOccurredBlock = true; diff --git a/src/lib/EntryView.h b/src/lib/EntryView.h index 44ba7dc..28a77e0 100644 --- a/src/lib/EntryView.h +++ b/src/lib/EntryView.h @@ -23,10 +23,21 @@ #include "Kdb3Database.h" -class EntryViewItem; class GroupViewItem; enum SelectionState{NONE,SINGLE,MULTIPLE,SEARCHGROUP}; +class EntryViewItem:public QTreeWidgetItem{ + public: + EntryViewItem(QTreeWidget *parent); + EntryViewItem(QTreeWidget *parent, QTreeWidgetItem * preceding); + EntryViewItem(QTreeWidgetItem *parent); + EntryViewItem(QTreeWidgetItem *parent, QTreeWidgetItem * preceding); + IEntryHandle* EntryHandle; + bool operator<(const QTreeWidgetItem& other) const; + private: + int compare(const QTreeWidgetItem& other, int col, int index) const; +}; + class KeepassEntryView:public QTreeWidget{ Q_OBJECT public: @@ -56,6 +67,10 @@ class KeepassEntryView:public QTreeWidget{ bool AutoResizeColumns; QList columnSizes; + QString columnString(IEntryHandle* entry, int col, bool forceClearText=false); + inline QString columnStringView(EntryViewItem* item, int col, bool forceClearText=false) { + return columnString(item->EntryHandle, col, forceClearText); + }; void updateEntry(EntryViewItem*); void editEntry(EntryViewItem*); void createItems(QList& entries); @@ -98,18 +113,4 @@ class KeepassEntryView:public QTreeWidget{ void viewModeChanged(bool searchResultMode); }; - -class EntryViewItem:public QTreeWidgetItem{ - public: - EntryViewItem(QTreeWidget *parent); - EntryViewItem(QTreeWidget *parent, QTreeWidgetItem * preceding); - EntryViewItem(QTreeWidgetItem *parent); - EntryViewItem(QTreeWidgetItem *parent, QTreeWidgetItem * preceding); - IEntryHandle* EntryHandle; - bool operator<(const QTreeWidgetItem& other) const; - private: - int compare(const QTreeWidgetItem& other, int col, int index) const; -}; - - #endif diff --git a/src/lib/GroupView.cpp b/src/lib/GroupView.cpp index 0813448..500024b 100644 --- a/src/lib/GroupView.cpp +++ b/src/lib/GroupView.cpp @@ -497,7 +497,6 @@ void KeepassGroupView::mouseMoveEvent(QMouseEvent *event){ QDrag *drag = new QDrag(this); QMimeData *mimeData = new QMimeData; - mimeData->setData("text/plain;charset=UTF-8",DragItem->text(0).toUtf8()); mimeData->setData("application/x-keepassx-group",QByteArray()); drag->setMimeData(mimeData);