From 8467e7756d725db2d6862fcda3ae0247080845cf Mon Sep 17 00:00:00 2001 From: Florian Geyer Date: Sat, 21 Apr 2012 19:06:28 +0200 Subject: [PATCH] Add ability to delete groups via gui. --- src/core/Database.cpp | 30 +++++++++++--- src/core/Database.h | 3 ++ src/core/Entry.cpp | 12 ++++++ src/core/Group.cpp | 77 ++++++++++++++++++++++++++++++----- src/core/Group.h | 5 +++ src/gui/DatabaseTabWidget.cpp | 5 +++ src/gui/DatabaseTabWidget.h | 1 + src/gui/DatabaseWidget.cpp | 28 +++++++++++-- src/gui/DatabaseWidget.h | 2 + src/gui/MainWindow.cpp | 15 ++++--- src/gui/MainWindow.ui | 4 +- 11 files changed, 153 insertions(+), 29 deletions(-) diff --git a/src/core/Database.cpp b/src/core/Database.cpp index b61ddc03..f567b404 100644 --- a/src/core/Database.cpp +++ b/src/core/Database.cpp @@ -197,16 +197,21 @@ bool Database::hasKey() return m_hasKey; } +void Database::createRecycleBin() +{ + Group* recycleBin = new Group(); + recycleBin->setUuid(Uuid::random()); + recycleBin->setName(tr("Recycle Bin")); + recycleBin->setIcon(43); + recycleBin->setParent(rootGroup()); + m_metadata->setRecycleBin(recycleBin); +} + void Database::recycleEntry(Entry* entry) { if (m_metadata->recycleBinEnabled()) { if (!m_metadata->recycleBin()) { - Group* recycleBin = new Group(); - recycleBin->setUuid(Uuid::random()); - recycleBin->setName(tr("Recycle Bin")); - recycleBin->setIcon(43); - recycleBin->setParent(rootGroup()); - m_metadata->setRecycleBin(recycleBin); + createRecycleBin(); } entry->setGroup(metadata()->recycleBin()); } @@ -214,3 +219,16 @@ void Database::recycleEntry(Entry* entry) delete entry; } } + +void Database::recycleGroup(Group* group) +{ + if (m_metadata->recycleBinEnabled()) { + if (!m_metadata->recycleBin()) { + createRecycleBin(); + } + group->setParent(metadata()->recycleBin()); + } + else { + delete group; + } +} diff --git a/src/core/Database.h b/src/core/Database.h index 780623bb..6475626a 100644 --- a/src/core/Database.h +++ b/src/core/Database.h @@ -86,6 +86,7 @@ public: void updateKey(quint64 rounds); bool hasKey(); void recycleEntry(Entry* entry); + void recycleGroup(Group* group); Q_SIGNALS: void groupDataChanged(Group* group); @@ -99,6 +100,8 @@ private: Entry* recFindEntry(const Uuid& uuid, Group* group); Group* recFindGroup(const Uuid& uuid, Group* group); + void createRecycleBin(); + Metadata* m_metadata; Group* m_rootGroup; QList m_deletedObjects; diff --git a/src/core/Entry.cpp b/src/core/Entry.cpp index 627c1272..b86910ce 100644 --- a/src/core/Entry.cpp +++ b/src/core/Entry.cpp @@ -44,6 +44,11 @@ Entry::~Entry() { if (m_group) { m_group->removeEntry(this); + + DeletedObject delEntry; + delEntry.deletionTime = QDateTime::currentDateTimeUtc(); + delEntry.uuid = m_uuid; + m_group->addDeletedObject(delEntry); } qDeleteAll(m_history); @@ -356,7 +361,14 @@ void Entry::setGroup(Group* group) { if (m_group) { m_group->removeEntry(this); + if (m_group->database() != group->database()) { + DeletedObject delEntry; + delEntry.deletionTime = QDateTime::currentDateTimeUtc(); + delEntry.uuid = m_uuid; + m_group->addDeletedObject(delEntry); + } } + group->addEntry(this); m_group = group; QObject::setParent(group); diff --git a/src/core/Group.cpp b/src/core/Group.cpp index 50ef7309..2887efa0 100644 --- a/src/core/Group.cpp +++ b/src/core/Group.cpp @@ -35,11 +35,30 @@ Group::Group() m_searchingEnabled = Inherit; m_updateTimeinfo = true; + m_emitSignals = true; } Group::~Group() { cleanupParent(); + m_emitSignals = false; + if (m_db && m_parent) { + + QList entries = m_entries; + Q_FOREACH (Entry* entry, entries) { + delete entry; + } + + QList children = m_children; + Q_FOREACH (Group* group, children) { + delete group; + } + + DeletedObject delGroup; + delGroup.deletionTime = QDateTime::currentDateTimeUtc(); + delGroup.uuid = m_uuid; + m_db->addDeletedObject(delGroup); + } } template bool Group::set(P& property, const V& value) { @@ -66,6 +85,11 @@ void Group::setUpdateTimeinfo(bool value) { m_updateTimeinfo = value; } +bool Group::emitSignals() +{ + return m_emitSignals; +} + Uuid Group::uuid() const { return m_uuid; @@ -255,6 +279,7 @@ void Group::setParent(Group* parent, int index) m_parent = parent; if (m_db != parent->m_db) { + recCreateDelObjects(); recSetDatabase(parent->m_db); } @@ -342,19 +367,19 @@ void Group::addEntry(Entry *entry) void Group::removeEntry(Entry* entry) { - Q_EMIT entryAboutToRemove(entry); + if (m_emitSignals) { + Q_EMIT entryAboutToRemove(entry); + } entry->disconnect(this); if (m_db) { entry->disconnect(m_db); - DeletedObject delObject; - delObject.deletionTime = QDateTime::currentDateTimeUtc(); - delObject.uuid = entry->uuid(); - m_db->addDeletedObject(delObject); } m_entries.removeAll(entry); - Q_EMIT modified(); - Q_EMIT entryRemoved(); + if (m_emitSignals) { + Q_EMIT modified(); + Q_EMIT entryRemoved(); + } } void Group::recSetDatabase(Database* db) @@ -392,9 +417,41 @@ void Group::recSetDatabase(Database* db) void Group::cleanupParent() { if (m_parent) { - Q_EMIT aboutToRemove(this); + if (m_parent->emitSignals()) { + Q_EMIT aboutToRemove(this); + } m_parent->m_children.removeAll(this); - Q_EMIT modified(); - Q_EMIT removed(); + if (m_parent->emitSignals()) { + Q_EMIT modified(); + Q_EMIT removed(); + } + } +} + +void Group::recCreateDelObjects() +{ + if (m_db) { + DeletedObject delGroup; + delGroup.deletionTime = QDateTime::currentDateTimeUtc(); + delGroup.uuid = m_uuid; + m_db->addDeletedObject(delGroup); + + Q_FOREACH (Entry* entry, m_entries) { + DeletedObject delEntry; + delEntry.deletionTime = QDateTime::currentDateTimeUtc(); + delEntry.uuid = entry->uuid(); + m_db->addDeletedObject(delEntry); + } + + Q_FOREACH (Group* group, m_children) { + group->recCreateDelObjects(); + } + } +} + +void Group::addDeletedObject(const DeletedObject& delObj) +{ + if (m_db) { + m_db->addDeletedObject(delObj); } } diff --git a/src/core/Group.h b/src/core/Group.h index 1b4ec864..04cd5fa3 100644 --- a/src/core/Group.h +++ b/src/core/Group.h @@ -75,6 +75,9 @@ public: QList entries(); const QList& entries() const; QList entriesRecursive(bool includeHistoryItems = false); + bool emitSignals(); + void addDeletedObject(const DeletedObject& delObj); + Q_SIGNALS: void dataChanged(Group* group); @@ -102,6 +105,7 @@ private: void recSetDatabase(Database* db); void cleanupParent(); + void recCreateDelObjects(); QPointer m_db; Uuid m_uuid; @@ -122,6 +126,7 @@ private: QPixmapCache::Key m_pixmapCacheKey; bool m_updateTimeinfo; + bool m_emitSignals; friend void Database::setRootGroup(Group* group); friend Entry::~Entry(); diff --git a/src/gui/DatabaseTabWidget.cpp b/src/gui/DatabaseTabWidget.cpp index e8422ad4..a5d031e7 100644 --- a/src/gui/DatabaseTabWidget.cpp +++ b/src/gui/DatabaseTabWidget.cpp @@ -302,6 +302,11 @@ void DatabaseTabWidget::editGroup() currentDatabaseWidget()->switchToGroupEdit(); } +void DatabaseTabWidget::deleteGroup() +{ + currentDatabaseWidget()->deleteGroup(); +} + void DatabaseTabWidget::updateTabName(Database* db) { int index = databaseIndex(db); diff --git a/src/gui/DatabaseTabWidget.h b/src/gui/DatabaseTabWidget.h index 6ebc2d45..cef09ce6 100644 --- a/src/gui/DatabaseTabWidget.h +++ b/src/gui/DatabaseTabWidget.h @@ -66,6 +66,7 @@ public Q_SLOTS: void deleteEntry(); void createGroup(); void editGroup(); + void deleteGroup(); Q_SIGNALS: void entrySelectionChanged(bool singleEntrySelected); diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index cb885c84..aa04f612 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -119,9 +119,6 @@ void DatabaseWidget::deleteEntry() if (result == QMessageBox::Yes) { delete m_entryView->currentEntry(); } - else { - return; - } } else { m_db->recycleEntry(m_entryView->currentEntry()); @@ -136,6 +133,24 @@ void DatabaseWidget::createGroup() switchToGroupEdit(m_newGroup, true); } +void DatabaseWidget::deleteGroup() +{ + Q_ASSERT(canDeleteCurrentGoup()); + + bool inRecylceBin = Tools::hasChild(m_db->metadata()->recycleBin(), m_groupView->currentGroup()); + if (inRecylceBin || !m_db->metadata()->recycleBinEnabled()) { + QMessageBox::StandardButton result = QMessageBox::question( + this, tr("Question"), tr("Do you really want to delete this group for good?"), + QMessageBox::Yes | QMessageBox::No); + if (result == QMessageBox::Yes) { + delete m_groupView->currentGroup(); + } + } + else { + m_db->recycleGroup(m_groupView->currentGroup()); + } +} + void DatabaseWidget::switchToView(bool accepted) { if (m_newGroup) { @@ -235,3 +250,10 @@ bool DatabaseWidget::dbHasKey() { return m_db->hasKey(); } + +bool DatabaseWidget::canDeleteCurrentGoup() +{ + bool isRootGroup = m_db->rootGroup() == m_groupView->currentGroup(); + bool isRecycleBin = m_db->metadata()->recycleBin() == m_groupView->currentGroup(); + return !isRootGroup && !isRecycleBin; +} diff --git a/src/gui/DatabaseWidget.h b/src/gui/DatabaseWidget.h index 76d1d894..2ee7495d 100644 --- a/src/gui/DatabaseWidget.h +++ b/src/gui/DatabaseWidget.h @@ -40,6 +40,8 @@ public: EntryView* entryView(); bool dbHasKey(); void deleteEntry(); + void deleteGroup(); + bool canDeleteCurrentGoup(); Q_SIGNALS: void closeRequest(); diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 6c1960f9..cb71ca5d 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -48,6 +48,7 @@ MainWindow::MainWindow() connect(m_ui->actionEntryDelete, SIGNAL(triggered()), m_ui->tabWidget, SLOT(deleteEntry())); connect(m_ui->actionGroupNew, SIGNAL(triggered()), m_ui->tabWidget, SLOT(createGroup())); connect(m_ui->actionGroupEdit, SIGNAL(triggered()), m_ui->tabWidget, SLOT(editGroup())); + connect(m_ui->actionGroupDelete, SIGNAL(triggered()), m_ui->tabWidget, SLOT(deleteGroup())); connect(m_ui->actionQuit, SIGNAL(triggered()), SLOT(close())); } @@ -79,15 +80,13 @@ void MainWindow::setMenuActionState(int index) m_ui->actionEntryDelete->setEnabled(false); } m_ui->actionGroupEdit->setEnabled(true); - // TODO - /* - if () { //check if root group selected - m_ui->actiocGroupDelete->setEnabled(true); + + if (dbWidget->canDeleteCurrentGoup()) { + m_ui->actionGroupDelete->setEnabled(true); } else { - m_ui->actiocGroupDelete->setEnabled(false); + m_ui->actionGroupDelete->setEnabled(false); } - */ m_ui->actionChangeMasterKey->setEnabled(true); m_ui->actionChangeDatabaseSettings->setEnabled(true); m_ui->actionDatabaseSave->setEnabled(true); @@ -102,7 +101,7 @@ void MainWindow::setMenuActionState(int index) m_ui->actionEntryEdit->setEnabled(false); m_ui->actionGroupEdit->setEnabled(false); m_ui->actionEntryDelete->setEnabled(false); - m_ui->actiocGroupDelete->setEnabled(false); + m_ui->actionGroupDelete->setEnabled(false); m_ui->actionChangeMasterKey->setEnabled(false); m_ui->actionChangeDatabaseSettings->setEnabled(false); m_ui->actionDatabaseSave->setEnabled(false); @@ -119,7 +118,7 @@ void MainWindow::setMenuActionState(int index) m_ui->actionEntryEdit->setEnabled(false); m_ui->actionGroupEdit->setEnabled(false); m_ui->actionEntryDelete->setEnabled(false); - m_ui->actiocGroupDelete->setEnabled(false); + m_ui->actionGroupDelete->setEnabled(false); m_ui->actionChangeMasterKey->setEnabled(false); m_ui->actionChangeDatabaseSettings->setEnabled(false); m_ui->actionDatabaseSave->setEnabled(false); diff --git a/src/gui/MainWindow.ui b/src/gui/MainWindow.ui index 72de9b88..21ac1478 100644 --- a/src/gui/MainWindow.ui +++ b/src/gui/MainWindow.ui @@ -74,7 +74,7 @@ - + @@ -175,7 +175,7 @@ Edit group - + false