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 000000000..aa9d7321f Binary files /dev/null and b/share/icons/application/16x16/actions/group-empty-trash.png differ diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index b4f623155..342f37f09 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 d98cb0722..5751aedb4 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 814501f6a..72a0f4c31 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 c44bee9e7..adacff5cb 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 + +