From d5157c51028f505bdee3901d75126d9a87c2d11c Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Thu, 13 Jun 2013 15:07:33 +0200 Subject: [PATCH] Settings class converted to singleton pattern. --- CMakeLists.txt | 1 + src/core/settings.cpp | 41 ++++++++++++++++++++++------------------ src/core/settings.h | 28 +++++++++++++++------------ src/gui/formmain.cpp | 11 ++++++++++- src/gui/formmain.h | 1 + src/gui/formmain.ui | 41 ++++++++++++++++++++++++++++++++++++++-- src/gui/themefactory.cpp | 5 +++++ src/gui/themefactory.h | 10 ++++++++++ src/main.cpp | 4 ++-- 9 files changed, 107 insertions(+), 35 deletions(-) create mode 100644 src/gui/themefactory.cpp create mode 100644 src/gui/themefactory.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 668f3be9d..831abd5fe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -174,6 +174,7 @@ set(APP_HEADERS # GUI headers. src/gui/formmain.h src/gui/systemtrayicon.cpp + src/gui/themefactory.cpp # CORE headers. ) diff --git a/src/core/settings.cpp b/src/core/settings.cpp index fbfa63030..40e06dd51 100644 --- a/src/core/settings.cpp +++ b/src/core/settings.cpp @@ -26,7 +26,16 @@ #include "core/defs.h" -QPointer Settings::s_instance; +QPointer Settings::s_instance; + +Settings::Settings(const QString &file_name, Format format, QObject *parent) + : QSettings(file_name, format, parent) { +} + +Settings::~Settings() { + checkSettings(); + qDebug("Deleting Settings instance."); +} QSettings::Status Settings::checkSettings() { qDebug("Syncing settings."); @@ -35,28 +44,24 @@ QSettings::Status Settings::checkSettings() { return s_instance->status(); } -QVariant Settings::value(const QString §ion, - const QString &key, - const QVariant &default_value) { +Settings &Settings::getInstance() { if (s_instance.isNull()) { setupSettings(); } - return s_instance->value(QString("%1/%2").arg(section, key), default_value); + + return *s_instance; +} + +QVariant Settings::value(const QString §ion, + const QString &key, + const QVariant &default_value) { + return QSettings::value(QString("%1/%2").arg(section, key), default_value); } void Settings::setValue(const QString §ion, const QString &key, const QVariant &value) { - if (s_instance.isNull()) { - setupSettings(); - } - s_instance->setValue(QString("%1/%2").arg(section, key), value); -} - -void Settings::deleteSettings() { - checkSettings(); - qDebug("Deleting global settings."); - delete s_instance.data(); + QSettings::setValue(QString("%1/%2").arg(section, key), value); } QSettings::Status Settings::setupSettings() { @@ -70,15 +75,15 @@ QSettings::Status Settings::setupSettings() { APP_CFG_PATH; if (QFile(app_path).exists()) { - s_instance = new QSettings(app_path, QSettings::IniFormat); + s_instance = new Settings(app_path, QSettings::IniFormat, qApp); qDebug("Initializing settings in %s.", qPrintable(QDir::toNativeSeparators(app_path))); } else { - s_instance = new QSettings(home_path, QSettings::IniFormat); + s_instance = new Settings(home_path, QSettings::IniFormat, qApp); qDebug("Initializing settings in %s.", qPrintable(QDir::toNativeSeparators(home_path))); } - return checkSettings(); + return (*s_instance).checkSettings(); } diff --git a/src/core/settings.h b/src/core/settings.h index b0b1234c4..0fe1e204a 100644 --- a/src/core/settings.h +++ b/src/core/settings.h @@ -4,27 +4,31 @@ #include -class Settings { +class Settings : public QSettings { private: // We use QPointer instead of QScopedPointer // because of late s_instance usage in QApplication::aboutToQuit() listeners. - static QPointer s_instance; + static QPointer s_instance; public: + // Singleton getter. + static Settings &getInstance(); + + // Constructor and destructor. + Settings(const QString & file_name, Format format, QObject * parent = 0); + ~Settings(); + // Getter/setter for settings values. - static QVariant value(const QString §ion, - const QString &key, - const QVariant &default_value = QVariant()); + QVariant value(const QString §ion, + const QString &key, + const QVariant &default_value = QVariant()); - static void setValue(const QString §ion, - const QString &key, - const QVariant &value); - - // It's better to cleanup settings manually via this function. - static void deleteSettings(); + void setValue(const QString §ion, + const QString &key, + const QVariant &value); // Synchronises settings. - static QSettings::Status checkSettings(); + QSettings::Status checkSettings(); protected: // Creates settings file in correct location. diff --git a/src/gui/formmain.cpp b/src/gui/formmain.cpp index f3d6e2d6e..cc7432b9f 100644 --- a/src/gui/formmain.cpp +++ b/src/gui/formmain.cpp @@ -19,10 +19,19 @@ void FormMain::processExecutionMessage(const QString &message) { qPrintable(message)); } +void FormMain::quit() { + qDebug("Quitting the application."); + qApp->quit(); +} + void FormMain::cleanupResources() { - Settings::deleteSettings(); + qDebug("Cleaning up resources before the application exits."); } void FormMain::createConnections() { + // Menu "File" connections. + connect(m_ui->m_actionQuit, &QAction::triggered, this, &FormMain::quit); + + // General connections. connect(qApp, &QCoreApplication::aboutToQuit, this, &FormMain::cleanupResources); } diff --git a/src/gui/formmain.h b/src/gui/formmain.h index 783c619c0..9739d2e29 100644 --- a/src/gui/formmain.h +++ b/src/gui/formmain.h @@ -18,6 +18,7 @@ class FormMain : public QMainWindow { public slots: void processExecutionMessage(const QString &message); + void quit(); protected slots: void cleanupResources(); diff --git a/src/gui/formmain.ui b/src/gui/formmain.ui index 83b3eedc2..3219ab240 100644 --- a/src/gui/formmain.ui +++ b/src/gui/formmain.ui @@ -14,17 +14,54 @@ MainWindow - + 0 0 800 - 21 + 19 + + + &File + + + + + + + + + &Help + + + + + &View + + + + + + + + &Import + + + + + E&xport + + + + + &Quit + + diff --git a/src/gui/themefactory.cpp b/src/gui/themefactory.cpp new file mode 100644 index 000000000..69b84ab15 --- /dev/null +++ b/src/gui/themefactory.cpp @@ -0,0 +1,5 @@ +#include "themefactory.h" + + +ThemeFactory::ThemeFactory() { +} diff --git a/src/gui/themefactory.h b/src/gui/themefactory.h new file mode 100644 index 000000000..5895f4c09 --- /dev/null +++ b/src/gui/themefactory.h @@ -0,0 +1,10 @@ +#ifndef THEMEFACTORY_H +#define THEMEFACTORY_H + + +class ThemeFactory { + private: + ThemeFactory(); +}; + +#endif // THEMEFACTORY_H diff --git a/src/main.cpp b/src/main.cpp index 04db49065..328eb816c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -63,9 +63,9 @@ int main(int argc, char *argv[]) { window.show(); - if (Settings::value(APP_CFG_GEN, "first_start", true).toBool()) { + if (Settings::getInstance().value(APP_CFG_GEN, "first_start", true).toBool()) { // TODO: Open initial "Welcome" dialog here. - Settings::setValue(APP_CFG_GEN, "first_start", false); + Settings::getInstance().setValue(APP_CFG_GEN, "first_start", false); }