]> Some of my projects - localmylist.git/commitdiff
Make settings settable through Settings and notify of setting changes in the database.
authorAPTX <marek321@gmail.com>
Tue, 19 Jun 2012 15:35:46 +0000 (17:35 +0200)
committerAPTX <marek321@gmail.com>
Tue, 19 Jun 2012 15:35:46 +0000 (17:35 +0200)
localmylist/database.cpp
localmylist/database.h
localmylist/settings.cpp
localmylist/settings.h

index 30c2a49a822f898bda9b55882da064bfcd9659ca..3f7047d0de103d0a9075f0e20553eb5595268869 100644 (file)
@@ -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 &notification)
        {
                emit renameDataChanged();
        }
+       else if (notification == "config_changed")
+       {
+               emit configChanged();
+       }
 }
 
 
index 02e17da66bb4c27012f2d4f542535c855c64b701..780e4ddde0a0fc27145eda6e90982a3ce91793fe 100644 (file)
@@ -291,6 +291,7 @@ signals:
        void newPendingRequest();
        void newPendingMyListUpdate();
        void renameDataChanged();
+       void configChanged();
 
 private slots:
        void handleNotification(const QString &notification);
index 74cd26cdb4e56a851f5eeb6b21aea0487ff723be..f158ce1c4dddb0d37132164602b2a815c2422c93 100644 (file)
@@ -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
index 26252c1d7f661223badedd6c8e8f6a3541cebd50..330cb4ff275c617808840e916469f14d876ded25 100644 (file)
@@ -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