Some fixes to connection manager.
[jenirok] / src / common / settings.cpp
index c0296cd..6453bb3 100644 (file)
 #include <QtSql/QSqlQuery>
 #include <QtCore/QVariant>
 #include <QtCore/QDebug>
+#include <QtCore/QTranslator>
+#include <QtCore/QLocale>
 #include <gconf/gconf-client.h>
 #include "settings.h"
 #include "db.h"
 
+namespace
+{
+    static int const LANGUAGE_COUNT = 5;
+
+    static QString const LANGUAGE_NAMES[LANGUAGE_COUNT] = {
+       "English",
+       "Deutsch",
+       "Norsk",
+       "Suomi",
+       "Svenska"
+    };
+
+    static QString const LANGUAGE_IDS[LANGUAGE_COUNT] = {
+       "en_US",
+       "de_DE",
+       "nb_NO",
+       "fi_FI",
+       "sv_SE"
+    };
+}
+
 Settings* Settings::instance_ = 0;
 
 Settings* Settings::instance()
@@ -35,23 +58,59 @@ Settings* Settings::instance()
     return instance_;
 }
 
+void Settings::getLanguages(QList<Settings::Language>& languages)
+{
+    for(int i = 0; i < LANGUAGE_COUNT; i++)
+    {
+        Language lang;
+        lang.name = LANGUAGE_NAMES[i];
+        lang.id = LANGUAGE_IDS[i];
+        languages.push_back(lang);
+    }
+}
+
+void Settings::loadLanguage(QApplication& app)
+{
+    QString language = get("language");
+
+    if(language.isEmpty())
+    {
+       language = QLocale::system().name();
+    }
+
+    QTranslator* translator = new QTranslator(&app);
+    translator->load(":/translations/" + language);
+    app.installTranslator(translator);
+}
+
 void Settings::close()
 {
     delete instance_;
     instance_ = 0;
 }
 
-bool Settings::set(QString const& name, QString const& value)
+void Settings::startEdit()
 {
-    bool connected = DB::connected();
+    if(!editing_ && !DB::connected())
+    {
+        editing_ = DB::connect();
+    }
+}
 
-    if(!connected)
+void Settings::endEdit()
+{
+    if(editing_)
     {
-        if(!DB::connect())
-        {
-            return false;
-        }
+        DB::disconnect();
+        editing_ = false;
     }
+}
+
+bool Settings::set(QString const& name, QString const& value)
+{
+    bool close = !editing_;
+
+    startEdit();
 
     QSqlQuery deleteQuery;
     deleteQuery.prepare("DELETE FROM settings WHERE name = :name");
@@ -65,28 +124,31 @@ bool Settings::set(QString const& name, QString const& value)
 
     bool returnValue = query.exec();
 
-    if(!connected)
+    if(close)
     {
-        DB::disconnect();
+        endEdit();
     }
 
+    settings_[name] = value;
+
     return returnValue;
 }
 
 QString Settings::get(QString const& name)
 {
-    QString result = "";
-
-    bool connected = DB::connected();
+    QMap<QString, QString>::iterator it;
 
-    if(!connected)
+    if((it = settings_.find(name)) != settings_.end())
     {
-        if(!DB::connect())
-        {
-            return result;
-        }
+        return it.value();
     }
 
+    QString result = "";
+
+    bool close = !editing_;
+
+    startEdit();
+
     QSqlQuery query;
 
     query.prepare("SELECT value FROM settings WHERE name = :name");
@@ -101,11 +163,13 @@ QString Settings::get(QString const& name)
         result = getDefaultValue(name);
     }
 
-    if(!connected)
+    if(close)
     {
-        DB::disconnect();
+        endEdit();
     }
 
+    settings_[name] = result;
+
     return result;
 
 }
@@ -137,23 +201,17 @@ QString Settings::getDefaultValue(QString const& name)
 
 bool Settings::reset()
 {
-    bool connected = DB::connected();
+    bool close = !editing_;
 
-    if(!connected)
-    {
-        if(!DB::connect())
-        {
-            return false;
-        }
-    }
+    startEdit();
 
     QSqlQuery query;
 
     bool ret = query.exec("DELETE FROM settings");
 
-    if(!connected)
+    if(close)
     {
-        DB::disconnect();
+        endEdit();
     }
 
     return ret;
@@ -208,7 +266,6 @@ Settings::ConnectionType Settings::getConnectionType()
                 values.push_back((char *)list->data);
                 list = list->next;
             }
-
         }
 
         g_object_unref(gcClient);
@@ -245,6 +302,11 @@ Settings::ConnectionType Settings::getConnectionType()
     return ALWAYS_ASK;
 }
 
-Settings::Settings()
+Settings::Settings(): editing_(false)
+{
+}
+
+Settings::~Settings()
 {
+    DB::removeDatabase();
 }