From dea65b637ca2369524b9b1864eff3b2457fb37b7 Mon Sep 17 00:00:00 2001 From: Vladimir Svyatski Date: Fri, 21 Apr 2017 13:49:32 +0300 Subject: [PATCH] Add context menu entry to clean the Recycle Bin in databases This implements the feature request (issue) #503. --- .../16x16/actions/group-empty-trash.png | Bin 0 -> 1115 bytes src/gui/DatabaseWidget.cpp | 35 ++++++++++++++++++ src/gui/DatabaseWidget.h | 2 + src/gui/MainWindow.cpp | 6 +++ src/gui/MainWindow.ui | 12 +++++- 5 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 share/icons/application/16x16/actions/group-empty-trash.png diff --git a/share/icons/application/16x16/actions/group-empty-trash.png b/share/icons/application/16x16/actions/group-empty-trash.png new file mode 100644 index 0000000000000000000000000000000000000000..aa9d7321f94a42ed44418c86e8a26a585de0ed7c GIT binary patch literal 1115 zcmYL}YfMvT7{}jpTG~nv6l9Zg2BTe^!!WWI8ih>+x?mVvA$-u6qoJ%qucz;-`>+qs^UwdwFVBZx zp2od-*;RgmJ-sm9PC8Jp8Se;%1bLM zOOC04L|HCZ3385#{mgXO>JX{=g+`Dl;;P;Gzzb626Ed%s_3|csnvh(HW zuM=J*_-pF`Jb1JLXy*#>t#1Ik6M#?#1RORSaIjF|a;{zQz&*h+7wAy+QC9dl66*<1FP*Jf;hHTx63-_BqU{~+Nrttgfbp8( z(qqdHzCnPD3UAUulg2b;>D~p;q{GJ-GA4}0 zSWI4*LKf*%DF148unyZpI06IGGEd^)E`CpZLhhGOABdE>opy$qX6uQC#RXzPc@b~9 zHH!~;Lhx61tJJBEPtVxKSGzGQS*u_!KLs>Hm^^SOSv0nGI4QP{?zT`NZWxxvc80Pj9oIipMY#((L~TBt*lIpLBhRST`w7nm=wCbu9m; z*7^9PsIWTlnfAT5k*d?7~QV4j-ze z@0u*`Q`$~qyQ};8va5n6QkNoycsKx9TgCN((9*Kws%!t_#2x*m)d846&z=z9+L|xZuokT)uwT$-@ zqQpFNr`|{u8SAG^!*`gE(Xkzvh7mMm1&zBf9?d5eRgR5a=C6cCyyzBl)VB(;mBcd4 zI0WTx@A582)U>KM6FQTxhzwT@6dKtZEuc&zbUYuXv0wAJ$d`28u!A^Xr&3qBmU-qL zp%fDu4We4;ZPm7&Ch$wOSVsE@r9;24&$L+uL9duQWm9MGpJek2J(ltD+a|75R1Ue~ zuDWewng?G-n6L8Xn6&l|hV`PD#n_iTKlq{E=K3+f$EZl$&^Zkd|^ho#E`AZJfr*5%h_4gUgKas{FQ literal 0 HcmV?d00001 diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index b4f62315..342f37f0 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -1267,3 +1267,38 @@ void DatabaseWidget::hideMessage() m_messageWidget->animatedHide(); } } + +bool DatabaseWidget::isRecycleBinSelected() const +{ + return m_groupView->currentGroup() && m_groupView->currentGroup() == m_db->metadata()->recycleBin(); +} + +void DatabaseWidget::emptyTrash() +{ + Group* currentGroup = m_groupView->currentGroup(); + if (!currentGroup) { + Q_ASSERT(false); + return; + } + + if (currentGroup == m_db->metadata()->recycleBin()) { + QMessageBox::StandardButton result = MessageBox::question( + this, tr("Empty recycle bin?"), + tr("Are you sure you want to permanently delete everytning from your recycle bin?"), + QMessageBox::Yes | QMessageBox::No); + + if (result == QMessageBox::Yes) { + // destroying direct entries of the recycle bin + QList subEntries = currentGroup->entries(); + for (Entry* entry : subEntries) { + delete entry; + } + // destroying direct subgroups of the recycle bin + QList subGroups = currentGroup->children(); + for (Group* group : subGroups) { + delete group; + } + refreshSearch(); + } + } +} diff --git a/src/gui/DatabaseWidget.h b/src/gui/DatabaseWidget.h index d98cb072..5751aedb 100644 --- a/src/gui/DatabaseWidget.h +++ b/src/gui/DatabaseWidget.h @@ -102,6 +102,7 @@ public: void closeUnlockDialog(); void blockAutoReload(bool block = true); void refreshSearch(); + bool isRecycleBinSelected() const; signals: void closeRequest(); @@ -152,6 +153,7 @@ public slots: void switchToImportKeepass1(const QString& fileName); void databaseModified(); void databaseSaved(); + void emptyTrash(); // Search related slots void search(const QString& searchtext); diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 814501f6..72a0f4c3 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -197,6 +197,7 @@ MainWindow::MainWindow() m_ui->actionGroupNew->setIcon(filePath()->icon("actions", "group-new", false)); m_ui->actionGroupEdit->setIcon(filePath()->icon("actions", "group-edit", false)); m_ui->actionGroupDelete->setIcon(filePath()->icon("actions", "group-delete", false)); + m_ui->actionGroupEmptyTrash->setIcon(filePath()->icon("actions", "group-empty-trash", false)); m_ui->actionSettings->setIcon(filePath()->icon("actions", "configure")); m_ui->actionSettings->setMenuRole(QAction::PreferencesRole); @@ -295,6 +296,8 @@ MainWindow::MainWindow() SLOT(switchToGroupEdit())); m_actionMultiplexer.connect(m_ui->actionGroupDelete, SIGNAL(triggered()), SLOT(deleteGroup())); + m_actionMultiplexer.connect(m_ui->actionGroupEmptyTrash, SIGNAL(triggered()), + SLOT(emptyTrash())); connect(m_ui->actionSettings, SIGNAL(triggered()), SLOT(switchToSettings())); connect(m_ui->actionPasswordGenerator, SIGNAL(toggled(bool)), SLOT(switchToPasswordGen(bool))); @@ -413,6 +416,7 @@ void MainWindow::setMenuActionState(DatabaseWidget::Mode mode) bool singleEntrySelected = dbWidget->numberOfSelectedEntries() == 1; bool entriesSelected = dbWidget->numberOfSelectedEntries() > 0; bool groupSelected = dbWidget->isGroupSelected(); + bool recycleBinSelected = dbWidget->isRecycleBinSelected(); m_ui->actionEntryNew->setEnabled(!inSearch); m_ui->actionEntryClone->setEnabled(singleEntrySelected); @@ -429,6 +433,8 @@ void MainWindow::setMenuActionState(DatabaseWidget::Mode mode) m_ui->actionGroupNew->setEnabled(groupSelected); m_ui->actionGroupEdit->setEnabled(groupSelected); m_ui->actionGroupDelete->setEnabled(groupSelected && dbWidget->canDeleteCurrentGroup()); + m_ui->actionGroupEmptyTrash->setVisible(recycleBinSelected); + m_ui->actionGroupEmptyTrash->setEnabled(recycleBinSelected); m_ui->actionChangeMasterKey->setEnabled(true); m_ui->actionChangeDatabaseSettings->setEnabled(true); m_ui->actionDatabaseSave->setEnabled(true); diff --git a/src/gui/MainWindow.ui b/src/gui/MainWindow.ui index c44bee9e..adacff5c 100644 --- a/src/gui/MainWindow.ui +++ b/src/gui/MainWindow.ui @@ -162,7 +162,7 @@ 0 0 800 - 29 + 21 @@ -235,8 +235,10 @@ &Groups + + @@ -521,6 +523,14 @@ Re&pair database + + + Empty recycle bin + + + false + +