diff --git a/src/forms/MainWindow.ui b/src/forms/MainWindow.ui
index f0eede0..a604aa1 100644
--- a/src/forms/MainWindow.ui
+++ b/src/forms/MainWindow.ui
@@ -167,14 +167,15 @@
-
+
-
+
+
@@ -593,6 +599,16 @@
Add New Group...
+
+
+ Sort groups
+
+
+
+
+ Sort in descending oder
+
+
diff --git a/src/lib/GroupView.cpp b/src/lib/GroupView.cpp
index 5b5bc64..d741568 100644
--- a/src/lib/GroupView.cpp
+++ b/src/lib/GroupView.cpp
@@ -23,6 +23,7 @@
#include "dialogs/EditGroupDlg.h"
#include
+#include
#define INSERT_AREA_WIDTH 4
@@ -36,7 +37,7 @@ KeepassGroupView::KeepassGroupView(QWidget* parent):QTreeWidget(parent){
}
-void KeepassGroupView::createItems(){
+void KeepassGroupView::createItems(){
clear();
Items.clear();
InsLinePos=-1;
@@ -177,7 +178,7 @@ void KeepassGroupView::OnCurrentGroupChanged(QTreeWidgetItem* cur){
emit groupChanged(((GroupViewItem*)cur)->GroupHandle);
}
else
- emit groupChanged(NULL);
+ emit groupChanged(NULL);
}
@@ -187,11 +188,11 @@ void KeepassGroupView::setCurrentGroup(IGroupHandle* group){
for(i=0;iGroupHandle==group){found=true; break;}
if(!found)return;
- setCurrentItem(Items[i]);
+ setCurrentItem(Items[i]);
}
void KeepassGroupView::dragEnterEvent ( QDragEnterEvent * event ){
- LastHoverItem=NULL;
+ LastHoverItem=NULL;
InsLinePos=-1;
if(event->mimeData()->hasFormat("application/x-keepassx-group")){
@@ -299,15 +300,15 @@ void KeepassGroupView::dropEvent( QDropEvent * event ){
if(event->pos().y()>ItemRect.y()+2){
qDebug("Insert behind sibling '%s'",((char*)Item->text(0).toUtf8().data()));
if(DragItem->parent()){
- DragItem->parent()->takeChild(DragItem->parent()->indexOfChild(DragItem));
+ DragItem->parent()->takeChild(DragItem->parent()->indexOfChild(DragItem));
}
else{
- takeTopLevelItem(indexOfTopLevelItem(DragItem));
+ takeTopLevelItem(indexOfTopLevelItem(DragItem));
}
if(Item->parent()){
int index=Item->parent()->indexOfChild(Item)+1;
db->moveGroup(DragItem->GroupHandle,((GroupViewItem*)Item->parent())->GroupHandle,index);
- Item->parent()->insertChild(index,DragItem);
+ Item->parent()->insertChild(index,DragItem);
}
else{
int index=indexOfTopLevelItem(Item)+1;
@@ -319,15 +320,15 @@ void KeepassGroupView::dropEvent( QDropEvent * event ){
else{
qDebug("Insert before sibling '%s'",((char*)Item->text(0).toUtf8().data()));
if(DragItem->parent()){
- DragItem->parent()->takeChild(DragItem->parent()->indexOfChild(DragItem));
+ DragItem->parent()->takeChild(DragItem->parent()->indexOfChild(DragItem));
}
else{
- takeTopLevelItem(indexOfTopLevelItem(DragItem));
+ takeTopLevelItem(indexOfTopLevelItem(DragItem));
}
if(Item->parent()){
int index=Item->parent()->indexOfChild(Item);
db->moveGroup(DragItem->GroupHandle,((GroupViewItem*)Item->parent())->GroupHandle,index);
- Item->parent()->insertChild(index,DragItem);
+ Item->parent()->insertChild(index,DragItem);
}
else{
int index=indexOfTopLevelItem(Item);
@@ -343,7 +344,7 @@ void KeepassGroupView::dropEvent( QDropEvent * event ){
}
-void KeepassGroupView::entryDragMoveEvent( QDragMoveEvent * event ){
+void KeepassGroupView::entryDragMoveEvent(QDragMoveEvent* event){
GroupViewItem* Item=(GroupViewItem*)itemAt(event->pos());
if(!Item){
@@ -378,7 +379,7 @@ void KeepassGroupView::entryDragMoveEvent( QDragMoveEvent * event ){
}
-void KeepassGroupView::dragMoveEvent( QDragMoveEvent * event ){
+void KeepassGroupView::dragMoveEvent(QDragMoveEvent* event){
if(DragType==EntryDrag){
entryDragMoveEvent(event);
return;
@@ -435,7 +436,7 @@ void KeepassGroupView::dragMoveEvent( QDragMoveEvent * event ){
InsLinePos=ItemRect.y();
}
InsLineStart=ItemRect.x();
- viewport()->update(QRegion(0,InsLinePos-2,viewport()->width(),4));
+ viewport()->update(QRegion(0,InsLinePos-2,viewport()->width(),4));
}
event->acceptProposedAction();
return;
@@ -451,7 +452,7 @@ void KeepassGroupView::paintEvent(QPaintEvent* event){
if(InsLinePos != -1){
QPainter painter(viewport());
painter.setBrush(QBrush(QColor(0,0,0),Qt::Dense4Pattern));
- painter.setPen(Qt::NoPen);
+ painter.setPen(Qt::NoPen);
painter.drawRect(InsLineStart,InsLinePos-2,viewport()->width(),4);
}
}
@@ -494,11 +495,47 @@ void KeepassGroupView::mouseMoveEvent(QMouseEvent *event){
}
void KeepassGroupView::OnItemExpanded(QTreeWidgetItem* item){
- dynamic_cast(item)->GroupHandle->setExpanded(true);
+ static_cast(item)->GroupHandle->setExpanded(true);
}
void KeepassGroupView::OnItemCollapsed(QTreeWidgetItem* item){
- dynamic_cast(item)->GroupHandle->setExpanded(false);
+ static_cast(item)->GroupHandle->setExpanded(false);
+}
+
+void KeepassGroupView::OnSort() {
+ QHash oldIndex;
+ for (int i=0; iparent())
+ oldIndex.insert(Items[i], Items[i]->parent()->indexOfChild(Items[i]));
+ else
+ oldIndex.insert(Items[i], invisibleRootItem()->indexOfChild(Items[i]));
+ }
+
+ sortItems(0, Qt::AscendingOrder);
+
+ bool modified = false;
+ QMutableHashIterator i(oldIndex);
+ while (i.hasNext()) {
+ i.next();
+ int newIndex;
+ IGroupHandle* parent;
+ if (i.key()->parent()) {
+ newIndex = i.key()->parent()->indexOfChild(i.key());
+ parent = static_cast(i.key()->parent())->GroupHandle;
+ }
+ else {
+ newIndex = invisibleRootItem()->indexOfChild(i.key());
+ parent = NULL;
+ }
+
+ if (newIndex != i.value()) {
+ db->moveGroup(static_cast(i.key())->GroupHandle, parent, newIndex);
+ modified = true;
+ }
+ }
+
+ if (modified)
+ emit fileModified();
}
@@ -518,3 +555,21 @@ GroupViewItem::GroupViewItem(QTreeWidgetItem *parent):QTreeWidgetItem(parent){
GroupViewItem::GroupViewItem(QTreeWidgetItem *parent, QTreeWidgetItem *preceding):QTreeWidgetItem(parent,preceding){
}
+bool GroupViewItem::operator<(const QTreeWidgetItem& other) const {
+ const GroupViewItem* otherItem = static_cast(&other);
+ KeepassGroupView* groupView = static_cast(treeWidget());
+
+ // Search result is always at the bottom
+ if (this == groupView->SearchResultItem)
+ return false;
+ if (otherItem == groupView->SearchResultItem)
+ return true;
+
+ // Backup group is always at the bottom but above search results
+ if (!parent() && text(0).compare("Backup", Qt::CaseInsensitive) == 0)
+ return false;
+ if (!otherItem->parent() && otherItem->text(0).compare("Backup", Qt::CaseInsensitive) == 0)
+ return true;
+
+ return QTreeWidgetItem::operator<(other);
+}
diff --git a/src/lib/GroupView.h b/src/lib/GroupView.h
index dc0a658..10827fd 100644
--- a/src/lib/GroupView.h
+++ b/src/lib/GroupView.h
@@ -17,6 +17,7 @@
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
+
#ifndef _GROUP_VIEW_H_
#define _GROUP_VIEW_H_
@@ -44,13 +45,13 @@ class KeepassGroupView:public QTreeWidget{
virtual void dragEnterEvent(QDragEnterEvent* event);
virtual void dragMoveEvent(QDragMoveEvent* event);
void entryDragMoveEvent(QDragMoveEvent* event);
- virtual void dragLeaveEvent ( QDragLeaveEvent * event );
- virtual void dropEvent ( QDropEvent * event );
+ virtual void dragLeaveEvent(QDragLeaveEvent* event);
+ virtual void dropEvent(QDropEvent* event);
void entryDropEvent(QDropEvent* event);
virtual void mousePressEvent(QMouseEvent *event);
virtual void mouseMoveEvent(QMouseEvent *event);
- virtual void paintEvent ( QPaintEvent * event );
- virtual void contextMenuEvent(QContextMenuEvent *event);
+ virtual void paintEvent (QPaintEvent* event);
+ virtual void contextMenuEvent(QContextMenuEvent* event);
void addChildren(GroupViewItem* item);
QPoint DragStartPos;
GroupViewItem* DragItem;
@@ -71,6 +72,7 @@ class KeepassGroupView:public QTreeWidget{
void OnHideSearchResults();
void OnItemExpanded(QTreeWidgetItem*);
void OnItemCollapsed(QTreeWidgetItem*);
+ void OnSort();
signals:
void groupChanged(IGroupHandle* NewGroup);
@@ -87,6 +89,7 @@ class GroupViewItem:public QTreeWidgetItem{
GroupViewItem(QTreeWidget *parent, QTreeWidgetItem * preceding);
GroupViewItem(QTreeWidgetItem *parent);
GroupViewItem(QTreeWidgetItem *parent, QTreeWidgetItem * preceding);
+ bool operator<(const QTreeWidgetItem& other) const;
IGroupHandle* GroupHandle;
};
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 0f31538..9671357 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -152,6 +152,7 @@ void KeepassMainWindow::setupConnections(){
connect(EditNewSubgroupAction, SIGNAL(triggered()), GroupView, SLOT(OnNewSubgroup()));
connect(EditEditGroupAction, SIGNAL(triggered()), GroupView, SLOT(OnEditGroup()));
connect(EditDeleteGroupAction, SIGNAL(triggered()), GroupView, SLOT(OnDeleteGroup()));
+ connect(EditGroupSortAction, SIGNAL(triggered()), GroupView, SLOT(OnSort()));
connect(EditNewEntryAction, SIGNAL(triggered()), EntryView, SLOT(OnNewEntry()));
connect(EditEditEntryAction, SIGNAL(triggered()), EntryView, SLOT(OnEditEntry()));
connect(EntryView, SIGNAL(requestCreateGroup(QString,quint32,GroupViewItem*)), GroupView, SLOT(createGroup(QString,quint32,GroupViewItem*)));
@@ -243,6 +244,7 @@ void KeepassMainWindow::setupIcons(){
EditNewEntryAction->setIcon(getIcon("newentry"));
EditEditEntryAction->setIcon(getIcon("editentry"));
EditDeleteEntryAction->setIcon(getIcon("deleteentry"));
+ EditGroupSortAction->setIcon(getIcon("swap"));
EditUsernameToClipboardAction->setIcon(getIcon("copyusername"));
EditPasswordToClipboardAction->setIcon(getIcon("copypwd"));
EditCloneEntryAction->setIcon(getIcon("cloneentry"));
@@ -278,6 +280,7 @@ void KeepassMainWindow::setupMenus(){
GroupView->ContextMenu->addAction(EditNewSubgroupAction);
GroupView->ContextMenu->addAction(EditEditGroupAction);
GroupView->ContextMenu->addAction(EditDeleteGroupAction);
+ GroupView->ContextMenu->addAction(EditGroupSortAction);
GroupView->ContextMenu->addSeparator();
GroupView->ContextMenu->addAction(EditNewEntryAction);
GroupView->ContextMenu->addSeparator();