diff --git a/src/PwManager.cpp b/src/PwManager.cpp index a504b8a..3189b6e 100755 --- a/src/PwManager.cpp +++ b/src/PwManager.cpp @@ -825,6 +825,8 @@ if(!Groups.size() || !parent){ return &Groups.back(); } else { int i=Groups.indexOf(*parent)+1; + for(i;iLevel)break; Groups.insert(i,group); return &Groups[i];} } @@ -957,28 +959,63 @@ for(int i=0; i<64; i+=2){ } } -void PwDatabase::moveGroup(CGroup* group, CGroup* DstGroup){ -/* +void PwDatabase::moveGroup(CGroup* group, CGroup* DstGroup, int pos){ int NumSubGroups=0; -int GroupIndex=getGroupIndex(group); +int GroupIndex=Groups.indexOf(*group); +int DstIndex; int i; -for(i=GroupIndex+1; iLevel) break; +for(i=GroupIndex+1; iLevel) break; } NumSubGroups=i-GroupIndex-1; + int LevelDiff; +QList tmp; + if(DstGroup) - LevelDiff=DstGroup->Level - group->Level; + LevelDiff=DstGroup->Level - group->Level +1; else LevelDiff=-group->Level; +for(i=GroupIndex; i<=GroupIndex+NumSubGroups; i++){ + tmp << Groups[i]; + tmp.back().Level+=LevelDiff; +} +for(i=0; i<=NumSubGroups; i++) + Groups.removeAt(GroupIndex); + +int NumParentSubGroups; if(DstGroup){ - groups.insert(pos, groups[ + DstIndex=Groups.indexOf(*DstGroup); + NumParentSubGroups=getNumberOfChilds(DstGroup);} +else{ + DstIndex=0; + NumParentSubGroups=Groups.size();} + +if(pos==-1)DstIndex+=(NumParentSubGroups+1); +else{ int n=0; //Counter for direct (first-level) childs + for(i=0; iLevel+1)n++; + } + DstIndex+=n; +} + + +for(i=NumSubGroups; i>=0; i--) + Groups.insert(DstIndex,tmp[i]); } -*/ +int PwDatabase::getNumberOfChilds(CGroup* group){ +if(!group)return Groups.size(); +int GroupIndex=Groups.indexOf(*group); +int i; +for(i=GroupIndex+1; iLevel) break; +} +return (i-GroupIndex-1); } diff --git a/src/PwManager.h b/src/PwManager.h index 3df641b..4bb672f 100755 --- a/src/PwManager.h +++ b/src/PwManager.h @@ -57,9 +57,10 @@ public: CGroup* addGroup(CGroup* parent); void deleteGroup(CGroup* pGroup); void deleteGroup(unsigned long ID); - void moveGroup(CGroup* group, CGroup* DstGroup); + void moveGroup(CGroup* group, CGroup* DstGroup, int pos=-1); int getGroupIndex(CGroup* group); int getGroupIndex(unsigned long ID); + int getNumberOfChilds(CGroup* pGroup); void deleteEntry(CEntry* pEntry); void moveEntry(CEntry* pEntry,CGroup* pDstGroup); diff --git a/src/lib/GroupView.cpp b/src/lib/GroupView.cpp index a71663f..5d22621 100644 --- a/src/lib/GroupView.cpp +++ b/src/lib/GroupView.cpp @@ -35,6 +35,7 @@ #include "GroupView.h" KeepassGroupView::KeepassGroupView(QWidget* parent):QTreeWidget(parent){ +db=0; LastHoverItem=NULL; setHeaderLabels(QStringList()<font(0); f.setBold(false); LastHoverItem->setFont(0,f); + LastHoverItem=NULL; } - +GroupViewItem* item=(GroupViewItem*)itemAt(event->pos()); +if(item) + db->moveGroup(DragItem->pGroup,item->pGroup); +else + db->moveGroup(DragItem->pGroup,NULL); +updateItems(); }