From 21d4a2a8d359e213cd1eeb8b86615571b0a2881c Mon Sep 17 00:00:00 2001 From: APTX Date: Tue, 19 Jun 2012 17:35:46 +0200 Subject: [PATCH] Make settings settable through Settings and notify of setting changes in the database. --- localmylist/database.cpp | 5 +++++ localmylist/database.h | 1 + localmylist/settings.cpp | 42 ++++++++++++++++++++++++++++++++++++---- localmylist/settings.h | 4 ++++ 4 files changed, 48 insertions(+), 4 deletions(-) diff --git a/localmylist/database.cpp b/localmylist/database.cpp index 30c2a49..3f7047d 100644 --- a/localmylist/database.cpp +++ b/localmylist/database.cpp @@ -1123,6 +1123,7 @@ void Database::prepareQueries() d->db.driver()->subscribeToNotification("new_pending_request"); d->db.driver()->subscribeToNotification("new_pending_mylist_update"); d->db.driver()->subscribeToNotification("rename_data_changed"); + d->db.driver()->subscribeToNotification("config_changed"); } bool Database::exec(QSqlQuery &query) @@ -1204,6 +1205,10 @@ void Database::handleNotification(const QString ¬ification) { emit renameDataChanged(); } + else if (notification == "config_changed") + { + emit configChanged(); + } } diff --git a/localmylist/database.h b/localmylist/database.h index 02e17da..780e4dd 100644 --- a/localmylist/database.h +++ b/localmylist/database.h @@ -291,6 +291,7 @@ signals: void newPendingRequest(); void newPendingMyListUpdate(); void renameDataChanged(); + void configChanged(); private slots: void handleNotification(const QString ¬ification); diff --git a/localmylist/settings.cpp b/localmylist/settings.cpp index 74cd26c..f158ce1 100644 --- a/localmylist/settings.cpp +++ b/localmylist/settings.cpp @@ -6,7 +6,8 @@ namespace LocalMyList { Settings::Settings(Database *db, QObject *parent) : QObject(parent) { - this->db = db; + this->db = 0; + setDatabase(db); } Database *Settings::database() const @@ -16,24 +17,57 @@ Database *Settings::database() const void Settings::setDatabase(Database *db) { + if (this->db == db) + return; + + if (this->db) + disconnect(this->db, SIGNAL(configChanged()), this, SLOT(settingsChangedInDatabase())); + + if (!db) + return; + this->db = db; + connect(db, SIGNAL(configChanged()), this, SLOT(settingsChangedInDatabase())); } QVariant Settings::get(const QString &key) const { - if (!settings.contains(key)) readSettings(); + if (stagedSettings.contains(key)) + return stagedSettings.value(key); + + if (!settings.contains(key)) + readSettings(); + return settings.value(key); } void Settings::set(const QString &key, const QVariant &value) { - settings[key] = value; - db->setConfig(key, value); + stagedSettings[key] = value; +} + +void Settings::commit() +{ + db->transaction(); + for (auto i = stagedSettings.constBegin(); i != stagedSettings.constEnd(); ++i) + { + db->setConfig(i.key(), i.value()); + settings[i.key()] = i.value(); + } + db->commit(); + stagedSettings.clear(); + emit settingsChanged(); +} + +void Settings::rollback() +{ + stagedSettings.clear(); } void Settings::settingsChangedInDatabase() { settings.clear(); + emit settingsChanged(); } void Settings::readSettings() const diff --git a/localmylist/settings.h b/localmylist/settings.h index 26252c1..330cb4f 100644 --- a/localmylist/settings.h +++ b/localmylist/settings.h @@ -25,6 +25,9 @@ signals: public slots: QVariant get(const QString &key) const; void set(const QString &key, const QVariant &value); + + void commit(); + void rollback(); void settingsChangedInDatabase(); @@ -33,6 +36,7 @@ private: Database *db; mutable QVariantMap settings; + QVariantMap stagedSettings; }; } // namespace LocalMyList -- 2.52.0