diff --git a/src/core/Config.cpp b/src/core/Config.cpp index f42bb6044..c83c1e720 100644 --- a/src/core/Config.cpp +++ b/src/core/Config.cpp @@ -21,7 +21,6 @@ #include #include #include -#include #include Config* Config::m_instance(nullptr); @@ -51,6 +50,18 @@ void Config::set(const QString& key, const QVariant& value) m_settings->setValue(key, value); } +/** + * Sync configuration with persistent storage. + * + * Usually, you don't need to call this method manually, but if you are writing + * configurations after an emitted \link QCoreApplication::aboutToQuit() signal, + * use it to guarantee your config values are persisted. + */ +void Config::sync() +{ + m_settings->sync(); +} + Config::Config(const QString& fileName, QObject* parent) : QObject(parent) { @@ -106,6 +117,7 @@ Config::~Config() void Config::init(const QString& fileName) { m_settings.reset(new QSettings(fileName, QSettings::IniFormat)); + connect(qApp, &QCoreApplication::aboutToQuit, this, &Config::sync); m_defaults.insert("SingleInstance", true); m_defaults.insert("RememberLastDatabases", true); @@ -162,7 +174,7 @@ void Config::createConfigFromFile(const QString& file) void Config::createTempFileInstance() { Q_ASSERT(!m_instance); - QTemporaryFile* tmpFile = new QTemporaryFile(); + auto* tmpFile = new QTemporaryFile(); bool openResult = tmpFile->open(); Q_ASSERT(openResult); Q_UNUSED(openResult); diff --git a/src/core/Config.h b/src/core/Config.h index 2ee3f4dce..eb7978622 100644 --- a/src/core/Config.h +++ b/src/core/Config.h @@ -26,15 +26,18 @@ class QSettings; class Config : public QObject { - Q_OBJECT +Q_OBJECT public: - ~Config(); + Q_DISABLE_COPY(Config) + + ~Config() override; QVariant get(const QString& key); QVariant get(const QString& key, const QVariant& defaultValue); QString getFileName(); void set(const QString& key, const QVariant& value); bool hasAccessError(); + void sync(); static Config* instance(); static void createConfigFromFile(const QString& file); @@ -49,8 +52,6 @@ private: QScopedPointer m_settings; QHash m_defaults; - - Q_DISABLE_COPY(Config) }; inline Config* config() { diff --git a/src/gui/DatabaseTabWidget.h b/src/gui/DatabaseTabWidget.h index b216750ea..b839fb3ab 100644 --- a/src/gui/DatabaseTabWidget.h +++ b/src/gui/DatabaseTabWidget.h @@ -1,19 +1,19 @@ /* - * Copyright (C) 2011 Felix Geyer - * Copyright (C) 2017 KeePassXC Team + * Copyright (C) 2017 KeePassXC Team + * Copyright (C) 2011 Felix Geyer * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 or (at your option) - * version 3 of the License. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ #ifndef KEEPASSX_DATABASETABWIDGET_H @@ -51,7 +51,7 @@ class DatabaseTabWidget : public QTabWidget public: explicit DatabaseTabWidget(QWidget* parent = nullptr); - ~DatabaseTabWidget(); + ~DatabaseTabWidget() override; void openDatabase(const QString& fileName, const QString& pw = QString(), const QString& keyFile = QString()); void mergeDatabase(const QString& fileName); @@ -116,7 +116,7 @@ private: void connectDatabase(Database* newDb, Database* oldDb = nullptr); QHash m_dbList; - DatabaseWidgetStateSync* m_dbWidgetStateSync; + QPointer m_dbWidgetStateSync; }; #endif // KEEPASSX_DATABASETABWIDGET_H diff --git a/src/gui/DatabaseWidget.cpp b/src/gui/DatabaseWidget.cpp index 5f6ee56bb..b7a622b19 100644 --- a/src/gui/DatabaseWidget.cpp +++ b/src/gui/DatabaseWidget.cpp @@ -1,19 +1,19 @@ /* - * Copyright (C) 2010 Felix Geyer - * Copyright (C) 2017 KeePassXC Team + * Copyright (C) 2017 KeePassXC Team + * Copyright (C) 2010 Felix Geyer * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 or (at your option) - * version 3 of the License. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ #include "DatabaseWidget.h" diff --git a/src/gui/DatabaseWidgetStateSync.cpp b/src/gui/DatabaseWidgetStateSync.cpp index 39904ed99..9b89412ea 100644 --- a/src/gui/DatabaseWidgetStateSync.cpp +++ b/src/gui/DatabaseWidgetStateSync.cpp @@ -1,24 +1,26 @@ /* - * Copyright (C) 2014 Felix Geyer - * Copyright (C) 2014 Florian Geyer + * Copyright (C) 2018 KeePassXC Team + * Copyright (C) 2014 Felix Geyer + * Copyright (C) 2014 Florian Geyer * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 or (at your option) - * version 3 of the License. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ #include "DatabaseWidgetStateSync.h" #include "core/Config.h" +#include DatabaseWidgetStateSync::DatabaseWidgetStateSync(QObject* parent) : QObject(parent) @@ -31,9 +33,18 @@ DatabaseWidgetStateSync::DatabaseWidgetStateSync(QObject* parent) m_hidePasswords = config()->get("GUI/HidePasswords").toBool(); m_listViewState = config()->get("GUI/ListViewState").toByteArray(); m_searchViewState = config()->get("GUI/SearchViewState").toByteArray(); + + connect(qApp, &QCoreApplication::aboutToQuit, this, &DatabaseWidgetStateSync::sync); } DatabaseWidgetStateSync::~DatabaseWidgetStateSync() +{ +} + +/** + * Sync state with persistent storage. + */ +void DatabaseWidgetStateSync::sync() { config()->set("GUI/SplitterState", intListToVariant(m_mainSplitterSizes)); config()->set("GUI/DetailSplitterState", intListToVariant(m_detailSplitterSizes)); @@ -41,12 +52,13 @@ DatabaseWidgetStateSync::~DatabaseWidgetStateSync() config()->set("GUI/HidePasswords", m_hidePasswords); config()->set("GUI/ListViewState", m_listViewState); config()->set("GUI/SearchViewState", m_searchViewState); + config()->sync(); } void DatabaseWidgetStateSync::setActive(DatabaseWidget* dbWidget) { if (m_activeDbWidget) { - disconnect(m_activeDbWidget, 0, this, 0); + disconnect(m_activeDbWidget, nullptr, this, nullptr); } m_activeDbWidget = dbWidget; diff --git a/src/gui/DatabaseWidgetStateSync.h b/src/gui/DatabaseWidgetStateSync.h index aca593f1f..0b1c9b7cb 100644 --- a/src/gui/DatabaseWidgetStateSync.h +++ b/src/gui/DatabaseWidgetStateSync.h @@ -1,19 +1,20 @@ /* - * Copyright (C) 2014 Felix Geyer - * Copyright (C) 2014 Florian Geyer + * Copyright (C) 2018 KeePassXC Team + * Copyright (C) 2014 Felix Geyer + * Copyright (C) 2014 Florian Geyer * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 or (at your option) - * version 3 of the License. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ #ifndef KEEPASSX_DATABASEWIDGETSTATESYNC_H @@ -27,7 +28,7 @@ class DatabaseWidgetStateSync : public QObject public: explicit DatabaseWidgetStateSync(QObject* parent = nullptr); - ~DatabaseWidgetStateSync(); + ~DatabaseWidgetStateSync() override; public slots: void setActive(DatabaseWidget* dbWidget); @@ -38,12 +39,13 @@ private slots: void blockUpdates(); void updateSplitterSizes(); void updateViewState(); + void sync(); private: static QList variantToIntList(const QVariant& variant); static QVariant intListToVariant(const QList& list); - DatabaseWidget* m_activeDbWidget; + QPointer m_activeDbWidget; bool m_blockUpdates; QList m_mainSplitterSizes; diff --git a/src/gui/entry/EntryView.cpp b/src/gui/entry/EntryView.cpp index 36d60ced5..67169d27f 100644 --- a/src/gui/entry/EntryView.cpp +++ b/src/gui/entry/EntryView.cpp @@ -1,18 +1,19 @@ /* - * Copyright (C) 2010 Felix Geyer + * Copyright (C) 2018 KeePassXC Team + * Copyright (C) 2010 Felix Geyer * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 or (at your option) - * version 3 of the License. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ #include "EntryView.h" @@ -88,11 +89,11 @@ EntryView::EntryView(QWidget* parent) // Stretching of last section interferes with fitting columns to window header()->setStretchLastSection(false); header()->setContextMenuPolicy(Qt::CustomContextMenu); - connect(header(), SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(showHeaderMenu(QPoint))); - connect(header(), SIGNAL(sectionCountChanged(int, int)), this, SIGNAL(viewStateChanged())); - connect(header(), SIGNAL(sectionMoved(int, int, int)), this, SIGNAL(viewStateChanged())); - connect(header(), SIGNAL(sectionResized(int, int, int)), this, SIGNAL(viewStateChanged())); - connect(header(), SIGNAL(sortIndicatorChanged(int, Qt::SortOrder)), this, SIGNAL(viewStateChanged())); + connect(header(), SIGNAL(customContextMenuRequested(QPoint)), SLOT(showHeaderMenu(QPoint))); + connect(header(), SIGNAL(sectionCountChanged(int, int)), SIGNAL(viewStateChanged())); + connect(header(), SIGNAL(sectionMoved(int, int, int)), SIGNAL(viewStateChanged())); + connect(header(), SIGNAL(sectionResized(int, int, int)), SIGNAL(viewStateChanged())); + connect(header(), SIGNAL(sortIndicatorChanged(int, Qt::SortOrder)), SIGNAL(viewStateChanged())); // TODO: not working as expected, columns will end up being very small, // most likely due to the widget not being sized properly at this time diff --git a/src/gui/entry/EntryView.h b/src/gui/entry/EntryView.h index 1bea22f49..26672a665 100644 --- a/src/gui/entry/EntryView.h +++ b/src/gui/entry/EntryView.h @@ -1,18 +1,19 @@ /* - * Copyright (C) 2010 Felix Geyer + * Copyright (C) 2018 KeePassXC Team + * Copyright (C) 2010 Felix Geyer * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 or (at your option) - * version 3 of the License. + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 or (at your option) + * version 3 of the License. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ #ifndef KEEPASSX_ENTRYVIEW_H