From 1dc90c1a7787bec84bf972f9a7cf8d4d2f51159f Mon Sep 17 00:00:00 2001 From: Florian Geyer Date: Sat, 24 Dec 2011 19:22:42 +0100 Subject: Implement save as. --- src/gui/DatabaseManager.cpp | 49 +++++++++++++++++++++++++++++++++++++++------ src/gui/DatabaseManager.h | 2 ++ src/gui/MainWindow.cpp | 2 ++ src/gui/MainWindow.ui | 11 +++++++++- 4 files changed, 57 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/gui/DatabaseManager.cpp b/src/gui/DatabaseManager.cpp index 6b92005df..6546cebc8 100644 --- a/src/gui/DatabaseManager.cpp +++ b/src/gui/DatabaseManager.cpp @@ -65,6 +65,7 @@ void DatabaseManager::openDatabase(const QString& fileName) DatabaseManagerStruct dbStruct; QScopedPointer file(new QFile(fileName)); + // TODO error handling if (!file->open(QIODevice::ReadWrite)) { if (!file->open(QIODevice::ReadOnly)) { // can only open read-only @@ -117,13 +118,41 @@ void DatabaseManager::saveDatabase(Database* db) DatabaseManagerStruct& dbStruct = m_dbList[db]; // TODO ensure that the data is actually written to disk - dbStruct.file->reset(); - m_writer.writeDatabase(dbStruct.file, db); - dbStruct.file->resize(dbStruct.file->pos()); - dbStruct.file->flush(); + if (dbStruct.file) { + dbStruct.file->reset(); + m_writer.writeDatabase(dbStruct.file, db); + dbStruct.file->resize(dbStruct.file->pos()); + dbStruct.file->flush(); - dbStruct.modified = false; - updateTabName(db); + dbStruct.modified = false; + updateTabName(db); + } + else { + saveDatabaseAs(db); + } +} + +void DatabaseManager::saveDatabaseAs(Database* db) +{ + QString fileName = QFileDialog::getSaveFileName(m_window, tr("Save database as"), + QString(), tr("KeePass 2 Database").append(" (*.kdbx)")); + if (!fileName.isEmpty()) { + DatabaseManagerStruct& dbStruct = m_dbList[db]; + + delete dbStruct.file; + QScopedPointer file(new QFile(fileName)); + // TODO error handling + if (!file->open(QIODevice::ReadWrite)) { + return; + } + dbStruct.file = file.take(); + // TODO ensure that the data is actually written to disk + m_writer.writeDatabase(dbStruct.file, db); + dbStruct.file->flush(); + + dbStruct.modified = false; + updateTabName(db); + } } void DatabaseManager::closeDatabase(int index) @@ -144,6 +173,14 @@ void DatabaseManager::saveDatabase(int index) saveDatabase(indexDatabase(index)); } +void DatabaseManager::saveDatabaseAs(int index) +{ + if (index == -1) { + index = m_tabWidget->currentIndex(); + } + saveDatabaseAs(indexDatabase(index)); +} + void DatabaseManager::updateTabName(Database* db) { int index = databaseIndex(db); diff --git a/src/gui/DatabaseManager.h b/src/gui/DatabaseManager.h index d562f4778..9f93614da 100644 --- a/src/gui/DatabaseManager.h +++ b/src/gui/DatabaseManager.h @@ -45,12 +45,14 @@ public: DatabaseManager(QTabWidget* tabWidget); void openDatabase(const QString& fileName); void saveDatabase(Database* db); + void saveDatabaseAs(Database* db); void closeDatabase(Database* db); public Q_SLOTS: void newDatabase(); void openDatabase(); void saveDatabase(int index = -1); + void saveDatabaseAs(int index = -1); void closeDatabase(int index = -1); private Q_SLOTS: diff --git a/src/gui/MainWindow.cpp b/src/gui/MainWindow.cpp index 2b331304a..813e400cc 100644 --- a/src/gui/MainWindow.cpp +++ b/src/gui/MainWindow.cpp @@ -33,6 +33,7 @@ MainWindow::MainWindow() connect(actionDatabaseNew, SIGNAL(triggered()), m_dbManager, SLOT(newDatabase())); connect(actionDatabaseOpen, SIGNAL(triggered()), m_dbManager, SLOT(openDatabase())); connect(actionDatabaseSave, SIGNAL(triggered()), m_dbManager, SLOT(saveDatabase())); + connect(actionDatabaseSaveAs, SIGNAL(triggered()), m_dbManager, SLOT(saveDatabaseAs())); connect(actionDatabaseClose, SIGNAL(triggered()), m_dbManager, SLOT(closeDatabase())); connect(actionQuit, SIGNAL(triggered()), SLOT(close())); } @@ -42,6 +43,7 @@ void MainWindow::currentTabChanged(int index) bool hasTab = (index != -1); actionDatabaseSave->setEnabled(hasTab); + actionDatabaseSaveAs->setEnabled(hasTab); actionDatabaseClose->setEnabled(hasTab); actionEntryNew->setEnabled(hasTab); actionGroupNew->setEnabled(hasTab); diff --git a/src/gui/MainWindow.ui b/src/gui/MainWindow.ui index 0a9f8240a..3fe4a1b96 100644 --- a/src/gui/MainWindow.ui +++ b/src/gui/MainWindow.ui @@ -36,7 +36,7 @@ 0 0 800 - 20 + 21 @@ -46,6 +46,7 @@ + @@ -178,6 +179,14 @@ Delete group + + + false + + + Save database as + + -- cgit v1.2.3