diff --git a/src/core/Database.cpp b/src/core/Database.cpp index 2a0499f57..fed8fb12b 100644 --- a/src/core/Database.cpp +++ b/src/core/Database.cpp @@ -702,8 +702,15 @@ void Database::setPublicCustomData(const QVariantMap& customData) void Database::createRecycleBin() { Q_ASSERT(!m_data.isReadOnly); - Group* recycleBin = Group::createRecycleBin(); + + auto recycleBin = new Group(); + recycleBin->setUuid(QUuid::createUuid()); recycleBin->setParent(rootGroup()); + recycleBin->setName(tr("Recycle Bin")); + recycleBin->setIcon(Group::RecycleBinIconNumber); + recycleBin->setSearchingEnabled(Group::Disable); + recycleBin->setAutoTypeEnabled(Group::Disable); + m_metadata->setRecycleBin(recycleBin); } diff --git a/src/core/Group.cpp b/src/core/Group.cpp index adbd51473..7fd403ab1 100644 --- a/src/core/Group.cpp +++ b/src/core/Group.cpp @@ -75,17 +75,6 @@ Group::~Group() cleanupParent(); } -Group* Group::createRecycleBin() -{ - Group* recycleBin = new Group(); - recycleBin->setUuid(QUuid::createUuid()); - recycleBin->setName(tr("Recycle Bin")); - recycleBin->setIcon(RecycleBinIconNumber); - recycleBin->setSearchingEnabled(Group::Disable); - recycleBin->setAutoTypeEnabled(Group::Disable); - return recycleBin; -} - template inline bool Group::set(P& property, const V& value) { if (property != value) { @@ -281,6 +270,11 @@ bool Group::isExpired() const return m_data.timeInfo.expires() && m_data.timeInfo.expiryTime() < Clock::currentDateTimeUtc(); } +bool Group::isEmpty() const +{ + return !hasChildren() && m_entries.isEmpty(); +} + CustomData* Group::customData() { return m_customData; diff --git a/src/core/Group.h b/src/core/Group.h index 2df00ef50..2e6da887e 100644 --- a/src/core/Group.h +++ b/src/core/Group.h @@ -80,8 +80,6 @@ public: Group(); ~Group(); - static Group* createRecycleBin(); - const QUuid& uuid() const; const QString uuidToHex() const; QString name() const; @@ -103,6 +101,7 @@ public: Entry* lastTopVisibleEntry() const; bool isExpired() const; bool isRecycled() const; + bool isEmpty() const; CustomData* customData(); const CustomData* customData() const; diff --git a/src/gui/dbsettings/DatabaseSettingsWidgetGeneral.cpp b/src/gui/dbsettings/DatabaseSettingsWidgetGeneral.cpp index b96016fdc..65d7f52b6 100644 --- a/src/gui/dbsettings/DatabaseSettingsWidgetGeneral.cpp +++ b/src/gui/dbsettings/DatabaseSettingsWidgetGeneral.cpp @@ -23,6 +23,7 @@ #include "core/Entry.h" #include "core/Group.h" #include "core/Metadata.h" +#include "gui/MessageBox.h" DatabaseSettingsWidgetGeneral::DatabaseSettingsWidgetGeneral(QWidget* parent) : DatabaseSettingsWidget(parent) @@ -77,9 +78,31 @@ void DatabaseSettingsWidgetGeneral::showEvent(QShowEvent* event) bool DatabaseSettingsWidgetGeneral::save() { + auto* meta = m_db->metadata(); + + if (!m_ui->recycleBinEnabledCheckBox->isChecked() && meta->recycleBinEnabled()) { + auto recycleBin = meta->recycleBin(); + if (recycleBin && !recycleBin->isEmpty()) { + auto result = MessageBox::question(this, + tr("Delete Recycle Bin"), + tr("Do you want to delete the current recycle bin and all its " + "contents?\nThis action is not reversible."), + MessageBox::Delete | MessageBox::No, + MessageBox::No); + + if (result == MessageBox::Delete) { + recycleBin->deleteLater(); + } else { + recycleBin->setName(recycleBin->name().append(tr(" (old)"))); + recycleBin->setIcon(Group::DefaultIconNumber); + } + } + + meta->setRecycleBin(nullptr); + } + m_db->setCompressionAlgorithm(m_ui->compressionCheckbox->isChecked() ? Database::CompressionGZip : Database::CompressionNone); - Metadata* meta = m_db->metadata(); meta->setName(m_ui->dbNameEdit->text()); meta->setDescription(m_ui->dbDescriptionEdit->text()); diff --git a/tests/TestGroup.cpp b/tests/TestGroup.cpp index bd3d36081..ae9c59894 100644 --- a/tests/TestGroup.cpp +++ b/tests/TestGroup.cpp @@ -799,7 +799,7 @@ void TestGroup::testAddEntryWithPath() void TestGroup::testIsRecycled() { Database* db = new Database(); - db->rootGroup()->createRecycleBin(); + db->metadata()->setRecycleBinEnabled(true); Group* group1 = new Group(); group1->setName("group1");