From a058dcee5dbd27b30e2134ede5af687860c09cb6 Mon Sep 17 00:00:00 2001 From: Florian Geyer Date: Wed, 11 Apr 2012 20:35:52 +0200 Subject: [PATCH] Multiple DatabaseTabWidget fixes. Close databases on exit. Ask to save changes on database close. Remove database from db list on database close. Delete file pointer on database close. Require to set master key at database creation time. Append "*" to tabname if database is modified. Handle database modified signals in database tab widget. --- src/gui/DatabaseTabWidget.cpp | 77 +++++++++++++++++++++++++++++++---- src/gui/DatabaseTabWidget.h | 8 +++- src/gui/DatabaseWidget.cpp | 5 +++ src/gui/DatabaseWidget.h | 3 ++ src/gui/MainWindow.cpp | 12 ++++++ src/gui/MainWindow.h | 3 ++ 6 files changed, 97 insertions(+), 11 deletions(-) diff --git a/src/gui/DatabaseTabWidget.cpp b/src/gui/DatabaseTabWidget.cpp index 466cc484..6a31f2cf 100644 --- a/src/gui/DatabaseTabWidget.cpp +++ b/src/gui/DatabaseTabWidget.cpp @@ -19,6 +19,7 @@ #include #include +#include #include "core/Database.h" #include "core/Metadata.h" @@ -51,6 +52,8 @@ void DatabaseTabWidget::newDatabase() dbStruct.dbWidget = new DatabaseWidget(db, this); insertDatabase(db, dbStruct); + + dbStruct.dbWidget->switchToMasterKeyChange(); } void DatabaseTabWidget::openDatabase() @@ -127,22 +130,42 @@ void DatabaseTabWidget::emitEntrySelectionChanged() Q_EMIT entrySelectionChanged(isSingleEntrySelected); } -void DatabaseTabWidget::closeDatabase(Database* db) +bool DatabaseTabWidget::closeDatabase(Database* db) { Q_ASSERT(db); const DatabaseManagerStruct& dbStruct = m_dbList.value(db); - - if (dbStruct.modified) { - // TODO message box - } - int index = databaseIndex(db); Q_ASSERT(index != -1); + if (dbStruct.modified) { + QMessageBox::StandardButton result = + QMessageBox::question( + this, tr("Save changes?"), + tr("\"%1\" was modified.\nSave changes?").arg(tabText(index)), + QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::Yes); + if (result == QMessageBox::Yes) { + saveDatabase(db); + } + else if (result == QMessageBox::Cancel) { + return false; + } + } removeTab(index); + m_dbList.remove(db); + delete dbStruct.file; delete dbStruct.dbWidget; delete db; + return true; +} + +bool DatabaseTabWidget::closeAllDatabases() { + while (!m_dbList.isEmpty()) { + if (!closeDatabase()) { + return false; + } + } + return true; } void DatabaseTabWidget::saveDatabase(Database* db) @@ -192,13 +215,21 @@ void DatabaseTabWidget::saveDatabaseAs(Database* db) } } -void DatabaseTabWidget::closeDatabase(int index) +bool DatabaseTabWidget::closeDatabase(int index) { if (index == -1) { index = currentIndex(); } - closeDatabase(indexDatabase(index)); + return closeDatabase(indexDatabase(index)); +} + +void DatabaseTabWidget::closeDatabaseFromSender() +{ + Q_ASSERT(sender()); + DatabaseWidget* dbWidget = static_cast(sender()); + Database* db = databaseFromDatabaseWidget(dbWidget); + closeDatabase(db); } void DatabaseTabWidget::saveDatabase(int index) @@ -272,7 +303,9 @@ void DatabaseTabWidget::updateTabName(Database* db) tabName = QString("%1 [%2]").arg(db->metadata()->name(), tr("New database")); } } - + if (dbStruct.modified) { + tabName.append("*"); + } setTabText(index, tabName); } @@ -297,6 +330,19 @@ Database* DatabaseTabWidget::indexDatabase(int index) return 0; } +Database* DatabaseTabWidget::databaseFromDatabaseWidget(DatabaseWidget* dbWidget) +{ + QHashIterator i(m_dbList); + while (i.hasNext()) { + i.next(); + if (i.value().dbWidget == dbWidget) { + return i.key(); + } + } + + return 0; +} + void DatabaseTabWidget::insertDatabase(Database* db, const DatabaseManagerStruct& dbStruct) { m_dbList.insert(db, dbStruct); @@ -308,6 +354,8 @@ void DatabaseTabWidget::insertDatabase(Database* db, const DatabaseManagerStruct connect(db->metadata(), SIGNAL(nameTextChanged(Database*)), SLOT(updateTabName(Database*))); connect(dbStruct.dbWidget->entryView(), SIGNAL(entrySelectionChanged()), SLOT(emitEntrySelectionChanged())); + connect(dbStruct.dbWidget, SIGNAL(closeRequest()), SLOT(closeDatabase())); + connect(db, SIGNAL(modified()), SLOT(modified())); } DatabaseWidget* DatabaseTabWidget::currentDatabaseWidget() @@ -320,3 +368,14 @@ DatabaseWidget* DatabaseTabWidget::currentDatabaseWidget() return 0; } } + +void DatabaseTabWidget::modified() +{ + Q_ASSERT(sender()); + Database* db = static_cast(sender()); + DatabaseManagerStruct& dbStruct = m_dbList[db]; + if (!dbStruct.modified) { + dbStruct.modified = true; + updateTabName(db); + } +} diff --git a/src/gui/DatabaseTabWidget.h b/src/gui/DatabaseTabWidget.h index 9571f8f7..4f2dab16 100644 --- a/src/gui/DatabaseTabWidget.h +++ b/src/gui/DatabaseTabWidget.h @@ -54,7 +54,9 @@ public Q_SLOTS: void openDatabase(); void saveDatabase(int index = -1); void saveDatabaseAs(int index = -1); - void closeDatabase(int index = -1); + bool closeDatabase(int index = -1); + void closeDatabaseFromSender(); + bool closeAllDatabases(); void changeMasterKey(); void createEntry(); void editEntry(); @@ -70,13 +72,15 @@ private Q_SLOTS: void openDatabaseRead(); void openDatabaseCleanup(); void emitEntrySelectionChanged(); + void modified(); private: void saveDatabase(Database* db); void saveDatabaseAs(Database* db); - void closeDatabase(Database* db); + bool closeDatabase(Database* db); int databaseIndex(Database* db); Database* indexDatabase(int index); + Database* databaseFromDatabaseWidget(DatabaseWidget* dbWidget); void insertDatabase(Database* db, const DatabaseManagerStruct& dbStruct); QWidget* m_window; diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 19f6584f..f3980b95 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -155,6 +155,11 @@ void DatabaseWidget::updateMasterKey(bool accepted) { if (accepted) { m_db->setKey(m_changeMasterKeyWidget->newMasterKey()); + + } + else if (m_db->transformedMasterKey().isEmpty()) { // TODO other test? + Q_EMIT closeRequest(); + return; } setCurrentIndex(0); diff --git a/src/gui/DatabaseWidget.h b/src/gui/DatabaseWidget.h index d5034b99..ca564917 100644 --- a/src/gui/DatabaseWidget.h +++ b/src/gui/DatabaseWidget.h @@ -38,6 +38,9 @@ public: GroupView* groupView(); EntryView* entryView(); +Q_SIGNALS: + void closeRequest(); + public Q_SLOTS: void createEntry(); void createGroup(); diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 5a8ca783..f9375b07 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -18,6 +18,8 @@ #include "MainWindow.h" #include "ui_MainWindow.h" +#include + #include "core/Database.h" #include "core/DataPath.h" #include "core/Metadata.h" @@ -63,3 +65,13 @@ void MainWindow::currentTabChanged(int index) m_ui->actionGroupEdit->setEnabled(hasTab); m_ui->actionChangeMasterKey->setEnabled(hasTab); } + +void MainWindow::closeEvent(QCloseEvent *event) { + if (!m_ui->tabWidget->closeAllDatabases()) { + event->ignore(); + } + else { + event->accept(); + } +} + diff --git a/src/gui/MainWindow.h b/src/gui/MainWindow.h index b4185660..42f4ba3c 100644 --- a/src/gui/MainWindow.h +++ b/src/gui/MainWindow.h @@ -32,6 +32,9 @@ public: MainWindow(); ~MainWindow(); +protected: + void closeEvent(QCloseEvent *event); + private Q_SLOTS: void currentTabChanged(int index);