Razorsettings => LxQt::Settings
authorAlexander Sokolov <sokoloff.a@gmail.com>
Sun, 6 Oct 2013 08:42:46 +0000 (12:42 +0400)
committerAlexander Sokolov <sokoloff.a@gmail.com>
Sun, 6 Oct 2013 08:42:46 +0000 (12:42 +0400)
CMakeLists.txt
configdialog/configdialog.cpp
configdialog/configdialog.h
lxqtapplication.cpp
lxqtpower/lxqtpowerproviders.h
lxqtsettings.cpp [new file with mode: 0644]
lxqtsettings.h [new file with mode: 0644]
razorsettings.cpp [deleted file]
razorsettings.h [deleted file]

index bd7c356..d8652db 100644 (file)
@@ -9,7 +9,7 @@ set(LXQT_PATCH_VERSION 0)
 
 set(PUB_HDRS
     aboutdialog/lxqtaboutdialog.h
-    razorsettings.h
+    lxqtsettings.h
     xfitman.h
     lxqtplugininfo.h
     powermanager.h
@@ -47,7 +47,7 @@ set(SRCS
     lxqtplugininfo.cpp
     powermanager.cpp
     addplugindialog/addplugindialog.cpp
-    razorsettings.cpp
+    lxqtsettings.cpp
     screensaver.cpp
     lxqtapplication.cpp
     programfinder.cpp
@@ -69,7 +69,7 @@ set(MOCS
     aboutdialog/lxqtaboutdialog_p.h
     powermanager.h
     addplugindialog/addplugindialog.h
-    razorsettings.h
+    lxqtsettings.h
     screensaver.h
     lxqtapplication.h
 
index 85f4797..538518d 100644 (file)
 
 using namespace LxQt;
 
-ConfigDialog::ConfigDialog(const QString& title, RazorSettings* settings, QWidget* parent) :
+ConfigDialog::ConfigDialog(const QString& title, Settings* settings, QWidget* parent) :
     QDialog(parent),
     mSettings(settings),
-    mCache(new RazorSettingsCache(settings)),
+    mCache(new SettingsCache(settings)),
     ui(new Ui::ConfigDialog)
 {
     ui->setupUi(this);
     setWindowTitle(title);
     connect(ui->buttons, SIGNAL(clicked(QAbstractButton*)), SLOT(dialogButtonsAction(QAbstractButton*)));
     ui->moduleList->setVisible(false);
-    connect(RazorSettings::globalSettings(), SIGNAL(settingsChanged()), this, SLOT(updateIcons()));
+    connect(Settings::globalSettings(), SIGNAL(settingsChanged()), this, SLOT(updateIcons()));
     foreach(QPushButton* button, ui->buttons->findChildren<QPushButton*>())
         button->setAutoDefault(false);
 }
index 6fa3679..14e5a99 100644 (file)
@@ -25,7 +25,7 @@
 #ifndef RAZORCONFIGDIALOG_H
 #define RAZORCONFIGDIALOG_H
 
-#include <razorsettings.h>
+#include <lxqtsettings.h>
 
 #include <QtGui/QDialog>
 #include <QtGui/QAbstractButton>
@@ -42,7 +42,7 @@ class ConfigDialog : public QDialog
     Q_OBJECT
 
 public:
-    explicit ConfigDialog(const QString& title, RazorSettings* settings, QWidget* parent = 0);
+    explicit ConfigDialog(const QString& title, Settings* settings, QWidget* parent = 0);
     ~ConfigDialog();
 
     /*!
@@ -58,22 +58,22 @@ public:
 signals:
     /*!
      * This signal is emitted when the user pressed the "Reset" button.
-     * RazorSettings should be re-read and the widgets should be set accordingly.
+     * Settings should be re-read and the widgets should be set accordingly.
      */
     void reset();
 
     /*!
      * This is emitted whenever the window is closed and settings need to be saved.
-     * It is only necessary if additional actions need to be performed - RazorSettings are handled automatically.
+     * It is only necessary if additional actions need to be performed - Settings are handled automatically.
      */
     void save();
 
 protected:
-    RazorSettings* mSettings;
+    Settings* mSettings;
     virtual void closeEvent(QCloseEvent* event);
 
 private:
-    RazorSettingsCache* mCache;
+    SettingsCache* mCache;
     QList<QStringList> mIcons;
     QSize mMaxSize;
     Ui::ConfigDialog* ui;
index a92df57..f454823 100644 (file)
@@ -31,7 +31,7 @@
 #include <qtxdg/xdgdirs.h>
 
 #include "lxqtapplication.h"
-#include "razorsettings.h"
+#include "lxqtsettings.h"
 
 using namespace LxQt;
 
@@ -100,9 +100,9 @@ Application::Application(int &argc, char** argv)
         qInstallMsgHandler(dbgMessageOutput);
 #endif
 
-    XdgIcon::setThemeName(RazorSettings::globalSettings()->value("icon_theme").toString());
+    XdgIcon::setThemeName(Settings::globalSettings()->value("icon_theme").toString());
     setWindowIcon(QIcon(QString(LXQT_SHARE_DIR) + "/graphics/razor_logo.png"));
-    connect(RazorSettings::globalSettings(), SIGNAL(razorThemeChanged()), this, SLOT(updateTheme()));
+    connect(Settings::globalSettings(), SIGNAL(razorThemeChanged()), this, SLOT(updateTheme()));
     updateTheme();
 }
 
index bfee0dc..07677d6 100644 (file)
@@ -30,7 +30,7 @@
 #define LXQTPOWER_PROVIDERS_H
 
 #include <QtCore/QObject>
-#include <razorsettings.h>
+#include <lxqtsettings.h>
 #include "lxqtpower.h"
 
 namespace LxQt
@@ -138,7 +138,7 @@ public slots:
     bool doAction(Power::Action action);
 
 private:
-    RazorSettings mSettings;
+    Settings mSettings;
 };
 
 } // namespace LxQt
diff --git a/lxqtsettings.cpp b/lxqtsettings.cpp
new file mode 100644 (file)
index 0000000..c113453
--- /dev/null
@@ -0,0 +1,662 @@
+/* BEGIN_COMMON_COPYRIGHT_HEADER
+ * (c)LGPL2+
+ *
+ * Razor - a lightweight, Qt based, desktop toolset
+ * http://razor-qt.org
+ *
+ * Copyright: 2010-2011 Razor team
+ * Authors:
+ *   Alexander Sokoloff <sokoloff.a@gmail.com>
+ *   Petr Vanek <petr@scribus.info>
+ *
+ * This program or library is free software; you can redistribute it
+ * and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
+ * END_COMMON_COPYRIGHT_HEADER */
+
+#include "lxqtsettings.h"
+#include <qtxdg/xdgicon.h>
+#include <qtxdg/xdgdirs.h>
+#include <QtCore/QDebug>
+#include <QtCore/QEvent>
+#include <QtCore/QDir>
+#include <QtCore/QStringList>
+#include <QtCore/QMutex>
+#include <QtCore/QFileSystemWatcher>
+#include <QtCore/QSharedData>
+
+using namespace LxQt;
+
+class LxQt::SettingsPrivate
+{
+public:
+    SettingsPrivate(Settings* parent):
+        mParent(parent)
+    {
+    }
+
+    QString localizedKey(const QString& key) const;
+
+    QFileSystemWatcher mWatcher;
+
+private:
+    Settings* mParent;
+};
+
+
+RazorTheme* RazorTheme::mInstance = 0;
+
+class LxQt::RazorThemeData: public QSharedData {
+public:
+    RazorThemeData(): mValid(false) {}
+    QString loadQss(const QString& qssFile) const;
+    QString findTheme(const QString &themeName);
+
+    QString mName;
+    QString mPath;
+    QString mPreviewImg;
+    bool mValid;
+
+};
+
+
+class LxQt::GlobalSettingsPrivate
+{
+public:
+    GlobalSettingsPrivate(GlobalSettings *parent):
+        mParent(parent),
+        mThemeUpdated(0ull)
+    {
+
+    }
+
+    GlobalSettings *mParent;
+    QString mIconTheme;
+    QString mRazorTheme;
+    qlonglong mThemeUpdated;
+
+};
+
+
+/************************************************
+
+ ************************************************/
+Settings::Settings(const QString& module, QObject* parent) :
+    QSettings("razor", module, parent),
+    d_ptr(new SettingsPrivate(this))
+{
+    // HACK: we need to ensure that the user (~/.config/razor/<module>.conf)
+    //       exists to have functional mWatcher
+    if (!contains("__userfile__"))
+    {
+        setValue("__userfile__", true);
+        sync();
+    }
+    d_ptr->mWatcher.addPath(this->fileName());
+    connect(&(d_ptr->mWatcher), SIGNAL(fileChanged(QString)), this, SLOT(fileChanged()));
+}
+
+
+/************************************************
+
+ ************************************************/
+Settings::Settings(const QString &fileName, QSettings::Format format, QObject *parent):
+    QSettings(fileName, format, parent),
+    d_ptr(new SettingsPrivate(this))
+{
+    // HACK: we need to ensure that the user (~/.config/razor/<module>.conf)
+    //       exists to have functional mWatcher
+    if (!contains("__userfile__"))
+    {
+        setValue("__userfile__", true);
+        sync();
+    }
+    d_ptr->mWatcher.addPath(this->fileName());
+    connect(&(d_ptr->mWatcher), SIGNAL(fileChanged(QString)), this, SLOT(fileChanged()));
+}
+
+
+/************************************************
+
+ ************************************************/
+Settings::Settings(const QSettings* parentSettings, const QString& subGroup, QObject* parent):
+    QSettings(parentSettings->organizationName(), parentSettings->applicationName(), parent),
+    d_ptr(new SettingsPrivate(this))
+{
+    beginGroup(subGroup);
+}
+
+
+/************************************************
+
+ ************************************************/
+Settings::Settings(const QSettings& parentSettings, const QString& subGroup, QObject* parent):
+    QSettings(parentSettings.organizationName(), parentSettings.applicationName(), parent),
+    d_ptr(new SettingsPrivate(this))
+{
+    beginGroup(subGroup);
+}
+
+
+/************************************************
+
+ ************************************************/
+Settings::~Settings()
+{
+    // because in the Settings::Settings(const QString& module, QObject* parent)
+    // constructor there is no beginGroup() called...
+    if (!group().isEmpty())
+        endGroup();
+
+    delete d_ptr;
+}
+
+bool Settings::event(QEvent *event)
+{
+    if (event->type() == QEvent::UpdateRequest)
+    {
+        emit settingsChanged();
+    }
+
+    return QSettings::event(event);
+}
+
+void Settings::fileChanged()
+{
+//    Q_D(Settings);
+    sync();
+    emit settingsChanged();
+}
+
+
+/************************************************
+
+ ************************************************/
+const GlobalSettings *Settings::globalSettings()
+{
+    static QMutex mutex;
+    static GlobalSettings *instance = 0;
+    if (!instance)
+    {
+        mutex.lock();
+
+        if (!instance)
+            instance = new GlobalSettings();
+
+        mutex.unlock();
+    }
+
+    return instance;
+}
+
+
+/************************************************
+ LC_MESSAGES value     Possible keys in order of matching
+ lang_COUNTRY@MODIFIER lang_COUNTRY@MODIFIER, lang_COUNTRY, lang@MODIFIER, lang,
+                        default value
+ lang_COUNTRY          lang_COUNTRY, lang, default value
+ lang@MODIFIER         lang@MODIFIER, lang, default value
+ lang                  lang, default value
+ ************************************************/
+QString SettingsPrivate::localizedKey(const QString& key) const
+{
+
+    QString lang = getenv("LC_MESSAGES");
+
+    if (lang.isEmpty())
+        lang = getenv("LC_ALL");
+
+    if (lang.isEmpty())
+         lang = getenv("LANG");
+
+
+    QString modifier = lang.section('@', 1);
+    if (!modifier.isEmpty())
+        lang.truncate(lang.length() - modifier.length() - 1);
+
+    QString encoding = lang.section('.', 1);
+    if (!encoding.isEmpty())
+        lang.truncate(lang.length() - encoding.length() - 1);
+
+
+    QString country = lang.section('_', 1);
+    if (!country.isEmpty())
+        lang.truncate(lang.length() - country.length() - 1);
+
+
+
+    //qDebug() << "LC_MESSAGES: " << getenv("LC_MESSAGES");
+    //qDebug() << "Lang:" << lang;
+    //qDebug() << "Country:" << country;
+    //qDebug() << "Encoding:" << encoding;
+    //qDebug() << "Modifier:" << modifier;
+
+    if (!modifier.isEmpty() && !country.isEmpty())
+    {
+        QString k = QString("%1[%2_%3@%4]").arg(key, lang, country, modifier);
+        //qDebug() << "\t try " << k << mParent->contains(k);
+        if (mParent->contains(k))
+            return k;
+    }
+
+    if (!country.isEmpty())
+    {
+        QString k = QString("%1[%2_%3]").arg(key, lang, country);
+        //qDebug() << "\t try " << k  << mParent->contains(k);
+        if (mParent->contains(k))
+            return k;
+    }
+
+    if (!modifier.isEmpty())
+    {
+        QString k = QString("%1[%2@%3]").arg(key, lang, modifier);
+        //qDebug() << "\t try " << k  << mParent->contains(k);
+        if (mParent->contains(k))
+            return k;
+    }
+
+    QString k = QString("%1[%2]").arg(key, lang);
+    //qDebug() << "\t try " << k  << mParent->contains(k);
+    if (mParent->contains(k))
+        return k;
+
+
+    //qDebug() << "\t try " << key  << mParent->contains(key);
+    return key;
+}
+
+
+/************************************************
+
+ ************************************************/
+QVariant Settings::localizedValue(const QString& key, const QVariant& defaultValue) const
+{
+    Q_D(const Settings);
+    return value(d->localizedKey(key), defaultValue);
+}
+
+
+/************************************************
+
+ ************************************************/
+void Settings::setLocalizedValue(const QString &key, const QVariant &value)
+{
+    Q_D(const Settings);
+    setValue(d->localizedKey(key), value);
+}
+
+
+/************************************************
+
+ ************************************************/
+RazorTheme::RazorTheme():
+    d(new RazorThemeData)
+{
+}
+
+
+/************************************************
+
+ ************************************************/
+RazorTheme::RazorTheme(const QString &path):
+    d(new RazorThemeData)
+{
+    if (path.isEmpty())
+        return;
+
+    QFileInfo fi(path);
+    if (fi.isAbsolute())
+    {
+        d->mPath = path;
+        d->mName = fi.fileName();
+        d->mValid = fi.isDir();
+    }
+    else
+    {
+        d->mName = path;
+        d->mPath = d->findTheme(path);
+        d->mValid = !(d->mPath.isEmpty());
+    }
+
+    if (QDir(path).exists("preview.png"))
+        d->mPreviewImg = path + "/preview.png";
+}
+
+
+/************************************************
+
+ ************************************************/
+QString RazorThemeData::findTheme(const QString &themeName)
+{
+    if (themeName.isEmpty())
+        return "";
+
+    QStringList paths;
+    paths << XdgDirs::dataHome(false);
+    paths << XdgDirs::dataDirs();
+
+    foreach(QString path, paths)
+    {
+        QDir dir(QString("%1/razor/themes/%2").arg(path, themeName));
+        if (dir.isReadable())
+            return dir.absolutePath();
+    }
+
+    return QString();
+}
+
+
+/************************************************
+
+ ************************************************/
+RazorTheme::RazorTheme(const RazorTheme &other):
+    d(other.d)
+{
+}
+
+
+/************************************************
+
+ ************************************************/
+RazorTheme::~RazorTheme()
+{
+}
+
+
+/************************************************
+
+ ************************************************/
+RazorTheme& RazorTheme::operator=(const RazorTheme &other)
+{
+    d = other.d;
+    return *this;
+}
+
+
+/************************************************
+
+ ************************************************/
+bool RazorTheme::isValid() const
+{
+    return d->mValid;
+}
+
+
+/************************************************
+
+ ************************************************/
+QString RazorTheme::name() const
+{
+    return d->mName;
+}
+
+/************************************************
+
+ ************************************************/
+QString RazorTheme::path() const
+{
+    return d->mPath;
+}
+
+
+/************************************************
+
+ ************************************************/
+QString RazorTheme::previewImage() const
+{
+    return d->mPreviewImg;
+}
+
+
+/************************************************
+
+ ************************************************/
+QString RazorTheme::qss(const QString& module) const
+{
+    QString path = QString("%1/%2.qss").arg(d->mPath, module);
+
+    QString styleSheet;
+    if (!path.isEmpty())
+        styleSheet = d->loadQss(path);
+    else
+        qWarning() << QString("QSS file %1 cannot be found").arg(path);
+
+    // Single/double click ...........................
+    Settings s("desktop");
+    bool singleClick = s.value("icon-launch-mode", "singleclick").toString() == "singleclick";
+    styleSheet += QString("QAbstractItemView {activate-on-singleclick : %1; }").arg(singleClick ? 1 : 0);
+
+    return styleSheet;
+}
+
+
+/************************************************
+
+ ************************************************/
+QString RazorThemeData::loadQss(const QString& qssFile) const
+{
+    QFile f(qssFile);
+    if (! f.open(QIODevice::ReadOnly | QIODevice::Text))
+    {
+        qWarning() << "Theme: Cannot open file for reading:" << qssFile;
+        return QString();
+    }
+
+    QString qss = f.readAll();
+    f.close();
+
+    if (qss.isEmpty())
+        return QString();
+
+    // handle relative paths
+    QString qssDir = QFileInfo(qssFile).canonicalPath();
+    qss.replace(QRegExp("url.[ \\t\\s]*", Qt::CaseInsensitive, QRegExp::RegExp2), "url(" + qssDir + "/");
+
+    return qss;
+}
+
+
+/************************************************
+
+ ************************************************/
+QString RazorTheme::desktopBackground(int screen) const
+{
+    QString wallpaperCfgFileName = QString("%1/wallpaper.cfg").arg(d->mPath);
+
+    if (wallpaperCfgFileName.isEmpty())
+        return QString();
+
+    QSettings s(wallpaperCfgFileName, QSettings::IniFormat);
+    QString themeDir = QFileInfo(wallpaperCfgFileName).absolutePath();
+    // There is something strange... If I remove next line the wallpapers array is not found...
+    s.childKeys();
+    s.beginReadArray("wallpapers");
+
+    s.setArrayIndex(screen - 1);
+    if (s.contains("file"))
+        return QString("%1/%2").arg(themeDir, s.value("file").toString());
+
+    s.setArrayIndex(0);
+    if (s.contains("file"))
+        return QString("%1/%2").arg(themeDir, s.value("file").toString());
+
+    return QString();
+}
+
+
+/************************************************
+
+ ************************************************/
+const RazorTheme &RazorTheme::currentTheme()
+{
+    static RazorTheme theme;
+    QString name = Settings::globalSettings()->value("theme").toString();
+    if (theme.name() != name)
+    {
+        theme = RazorTheme(name);
+    }
+    return theme;
+}
+
+
+/************************************************
+
+ ************************************************/
+QList<RazorTheme> RazorTheme::allThemes()
+{
+    QList<RazorTheme> ret;
+    QSet<QString> processed;
+
+    QStringList paths;
+    paths << XdgDirs::dataHome(false);
+    paths << XdgDirs::dataDirs();
+
+    foreach(QString path, paths)
+    {
+        QDir dir(QString("%1/razor/themes").arg(path));
+        QFileInfoList dirs = dir.entryInfoList(QDir::AllDirs | QDir::NoDotAndDotDot);
+
+        foreach(QFileInfo dir, dirs)
+        {
+            if (!processed.contains(dir.fileName()) &&
+                 QDir(dir.absoluteFilePath()).exists("razor-panel.qss"))
+            {
+                processed << dir.fileName();
+                ret << RazorTheme(dir.absoluteFilePath());
+            }
+
+        }
+    }
+
+    return ret;
+}
+
+
+/************************************************
+
+ ************************************************/
+SettingsCache::SettingsCache(QSettings &settings) :
+    mSettings(settings)
+{
+    loadFromSettings();
+}
+
+
+/************************************************
+
+ ************************************************/
+SettingsCache::SettingsCache(QSettings *settings) :
+    mSettings(*settings)
+{
+    loadFromSettings();
+}
+
+
+/************************************************
+
+ ************************************************/
+void SettingsCache::loadFromSettings()
+{
+   foreach (QString key, mSettings.allKeys())
+   {
+       mCache.insert(key, mSettings.value(key));
+   }
+}
+
+
+/************************************************
+
+ ************************************************/
+void SettingsCache::loadToSettings()
+{
+    QHash<QString, QVariant>::const_iterator i = mCache.constBegin();
+
+    while(i != mCache.constEnd())
+    {
+        mSettings.setValue(i.key(), i.value());
+        ++i;
+    }
+
+    mSettings.sync();
+}
+
+
+/************************************************
+
+ ************************************************/
+GlobalSettings::GlobalSettings():
+    Settings("razor"),
+    d_ptr(new GlobalSettingsPrivate(this))
+{
+    if (value("icon_theme").toString().isEmpty())
+    {
+        QStringList failback;
+        failback << "oxygen";
+        failback << "Tango";
+        failback << "Prudence-icon";
+        failback << "Humanity";
+        failback << "elementary";
+        failback << "gnome";
+
+
+        QDir dir("/usr/share/icons/");
+        foreach (QString s, failback)
+        {
+            if (dir.exists(s))
+            {
+                setValue("icon_theme", s);
+                sync();
+                break;
+            }
+        }
+    }
+
+    fileChanged();
+}
+
+GlobalSettings::~GlobalSettings()
+{
+    delete d_ptr;
+}
+
+
+/************************************************
+
+ ************************************************/
+void GlobalSettings::fileChanged()
+{
+    Q_D(GlobalSettings);
+    sync();
+
+
+    QString it = value("icon_theme").toString();
+    if (d->mIconTheme != it)
+    {
+        d->mIconTheme = it;
+        XdgIcon::setThemeName(it);
+        emit iconThemeChanged();
+    }
+
+    QString rt = value("theme").toString();
+    qlonglong themeUpdated = value("__theme_updated__").toLongLong();
+    if ((d->mRazorTheme != rt) || (d->mThemeUpdated != themeUpdated))
+    {
+        d->mRazorTheme = rt;
+        emit razorThemeChanged();
+    }
+
+    emit settingsChanged();
+}
+
diff --git a/lxqtsettings.h b/lxqtsettings.h
new file mode 100644 (file)
index 0000000..341eb9c
--- /dev/null
@@ -0,0 +1,201 @@
+/* BEGIN_COMMON_COPYRIGHT_HEADER
+ * (c)LGPL2+
+ *
+ * Razor - a lightweight, Qt based, desktop toolset
+ * http://razor-qt.org
+ *
+ * Copyright: 2010-2011 Razor team
+ * Authors:
+ *   Alexander Sokoloff <sokoloff.a@gmail.com>
+ *
+ * This program or library is free software; you can redistribute it
+ * and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
+ * END_COMMON_COPYRIGHT_HEADER */
+
+
+#ifndef LXQTSETTINGS_H
+#define LXQTSETTINGS_H
+
+#include <QtCore/QObject>
+#include <QtCore/QSettings>
+#include <QtCore/QSharedDataPointer>
+
+class QEvent;
+    
+namespace LxQt
+{
+
+class SettingsPrivate;
+class GlobalSettings;
+
+/*! \brief User settings handling */
+class Settings : public QSettings
+{
+    Q_OBJECT
+public:
+
+    /*! \brief Constructs a Settings object for accessing settings of the module called module, and with parent parent.
+    Settings can be accessed using the standard interface provided by QSettings, but it also provides some convenience functions and signals.
+
+    \param module a base name of the config file. It's a name without
+            the extension. For example: if you want to open settings for
+            panel create it as Settings("panel").
+            The function will create all parent directories necessary to create
+            the file.
+    \param parent It's no need to delete this class manually if it's set.
+    */
+    explicit Settings(const QString& module, QObject* parent = 0);
+    //explicit Settings(QObject* parent=0);
+    explicit Settings(const QSettings* parentSettings, const QString& subGroup, QObject* parent=0);
+    explicit Settings(const QSettings& parentSettings, const QString& subGroup, QObject* parent=0);
+    Settings(const QString &fileName, QSettings::Format format, QObject *parent = 0);
+    ~Settings();
+
+    static const GlobalSettings *globalSettings();
+
+
+    /*! Returns the localized value for key. In the desktop file keys may be postfixed by [LOCALE]. If the
+        localized value doesn't exist, returns non lokalized value. If non localized value doesn't exist, returns defaultValue.
+        LOCALE must be of the form lang_COUNTRY.ENCODING@MODIFIER, where _COUNTRY, .ENCODING, and @MODIFIER may be omitted.
+
+        If no default value is specified, a default QVariant is returned. */
+    QVariant localizedValue(const QString& key, const QVariant& defaultValue = QVariant()) const;
+
+    /*! Sets the value of setting key to value. If a localized version of the key already exists, the previous value is
+        overwritten. Otherwise, it overwrites the the un-localized version. */
+    void setLocalizedValue(const QString &key, const QVariant &value);
+
+signals:
+    void settingsChanged();
+
+protected:
+    bool event(QEvent *event);
+
+protected slots:
+    virtual void fileChanged();
+
+private:
+    Q_DISABLE_COPY(Settings)
+
+    SettingsPrivate* const d_ptr;
+    Q_DECLARE_PRIVATE(Settings)
+};
+
+
+class RazorThemeData;
+
+/*! \brief QSS theme handling */
+class RazorTheme
+{
+public:
+    /// Constructs a null theme.
+    RazorTheme();
+
+    /*! Constructs an theme from the dir with the given path. If path not absolute
+        (i.e. the theme name only) the relevant dir must be found relative to the
+        $XDG_DATA_HOME + $XDG_DATA_DIRS directories. */
+    RazorTheme(const QString &path);
+
+    /// Constructs a copy of other. This is very fast.
+    RazorTheme(const RazorTheme &other);
+
+    RazorTheme& operator=(const RazorTheme &other);
+    ~RazorTheme();
+
+    /// Returns the name of the theme.
+    QString name() const;
+
+    QString path() const;
+
+    QString previewImage() const;
+
+    /// Returns true if this theme is valid; otherwise returns false.
+    bool isValid() const;
+
+    /*! \brief Returns StyleSheet text (not file name, but real text) of the module called module.
+        Paths in url() C/QSS functions are parsed to be real values for the theme,
+        relative to full path
+    */
+    QString qss(const QString& module) const;
+
+    /*! \brief A full path to image used as a wallpaper
+     \param screen is an ID of the screen like in Qt. -1 means default (any) screen.
+                   Any other value greater than -1 is the exact screen (in dualhead).
+                  In themes the index starts from 1 (ix 1 means 1st screen).
+     \retval QString a file name (including path).
+    */
+    QString desktopBackground(int screen=-1) const;
+
+    /// Returns the current razor theme.
+    static const RazorTheme &currentTheme();
+
+    /// Returns the all themes found in the system.
+    static QList<RazorTheme> allThemes();
+
+private:
+    static RazorTheme* mInstance;
+    QSharedDataPointer<RazorThemeData> d;
+};
+
+/*!
+A global pointer referring to the unique RazorTheme object.
+It is equivalent to the pointer returned by the RazorTheme::instance() function.
+Only one theme object can be created. !*/
+
+#define razorTheme RazorTheme::currentTheme()
+
+
+class SettingsCache
+{
+public:
+    explicit SettingsCache(QSettings &settings);
+    explicit SettingsCache(QSettings *settings);
+    virtual ~SettingsCache() {}
+
+    void loadFromSettings();
+    void loadToSettings();
+
+private:
+    QSettings &mSettings;
+    QHash<QString, QVariant> mCache;
+};
+
+class GlobalSettingsPrivate;
+
+class GlobalSettings: public Settings
+{
+    Q_OBJECT
+public:
+    GlobalSettings();
+    ~GlobalSettings();
+
+signals:
+    /// Signal emitted when the icon theme has changed.
+    void iconThemeChanged();
+
+    /// Signal emitted when the razor theme has changed.
+    void razorThemeChanged();
+
+protected slots:
+    void fileChanged();
+
+private:
+    GlobalSettingsPrivate* const d_ptr;
+    Q_DECLARE_PRIVATE(GlobalSettings)
+};
+
+} // namespace LxQt
+#endif // LXQTSETTINGS_H
diff --git a/razorsettings.cpp b/razorsettings.cpp
deleted file mode 100644 (file)
index 6b08ce3..0000000
+++ /dev/null
@@ -1,660 +0,0 @@
-/* BEGIN_COMMON_COPYRIGHT_HEADER
- * (c)LGPL2+
- *
- * Razor - a lightweight, Qt based, desktop toolset
- * http://razor-qt.org
- *
- * Copyright: 2010-2011 Razor team
- * Authors:
- *   Alexander Sokoloff <sokoloff.a@gmail.com>
- *   Petr Vanek <petr@scribus.info>
- *
- * This program or library is free software; you can redistribute it
- * and/or modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
-
- * You should have received a copy of the GNU Lesser General
- * Public License along with this library; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301 USA
- *
- * END_COMMON_COPYRIGHT_HEADER */
-
-#include "razorsettings.h"
-#include <qtxdg/xdgicon.h>
-#include <qtxdg/xdgdirs.h>
-#include <QtCore/QDebug>
-#include <QtCore/QEvent>
-#include <QtCore/QDir>
-#include <QtCore/QStringList>
-#include <QtCore/QMutex>
-#include <QtCore/QFileSystemWatcher>
-#include <QtCore/QSharedData>
-
-class RazorSettingsPrivate
-{
-public:
-    RazorSettingsPrivate(RazorSettings* parent):
-        mParent(parent)
-    {
-    }
-
-    QString localizedKey(const QString& key) const;
-
-    QFileSystemWatcher mWatcher;
-
-private:
-    RazorSettings* mParent;
-};
-
-
-RazorTheme* RazorTheme::mInstance = 0;
-
-class RazorThemeData: public QSharedData {
-public:
-    RazorThemeData(): mValid(false) {}
-    QString loadQss(const QString& qssFile) const;
-    QString findTheme(const QString &themeName);
-
-    QString mName;
-    QString mPath;
-    QString mPreviewImg;
-    bool mValid;
-
-};
-
-
-class GlobalRazorSettingsPrivate
-{
-public:
-    GlobalRazorSettingsPrivate(GlobalRazorSettings *parent):
-        mParent(parent),
-        mThemeUpdated(0ull)
-    {
-
-    }
-
-    GlobalRazorSettings *mParent;
-    QString mIconTheme;
-    QString mRazorTheme;
-    qlonglong mThemeUpdated;
-
-};
-
-
-/************************************************
-
- ************************************************/
-RazorSettings::RazorSettings(const QString& module, QObject* parent) :
-    QSettings("razor", module, parent),
-    d_ptr(new RazorSettingsPrivate(this))
-{
-    // HACK: we need to ensure that the user (~/.config/razor/<module>.conf)
-    //       exists to have functional mWatcher
-    if (!contains("__userfile__"))
-    {
-        setValue("__userfile__", true);
-        sync();
-    }
-    d_ptr->mWatcher.addPath(this->fileName());
-    connect(&(d_ptr->mWatcher), SIGNAL(fileChanged(QString)), this, SLOT(fileChanged()));
-}
-
-
-/************************************************
-
- ************************************************/
-RazorSettings::RazorSettings(const QString &fileName, QSettings::Format format, QObject *parent):
-    QSettings(fileName, format, parent),
-    d_ptr(new RazorSettingsPrivate(this))
-{
-    // HACK: we need to ensure that the user (~/.config/razor/<module>.conf)
-    //       exists to have functional mWatcher
-    if (!contains("__userfile__"))
-    {
-        setValue("__userfile__", true);
-        sync();
-    }
-    d_ptr->mWatcher.addPath(this->fileName());
-    connect(&(d_ptr->mWatcher), SIGNAL(fileChanged(QString)), this, SLOT(fileChanged()));
-}
-
-
-/************************************************
-
- ************************************************/
-RazorSettings::RazorSettings(const QSettings* parentSettings, const QString& subGroup, QObject* parent):
-    QSettings(parentSettings->organizationName(), parentSettings->applicationName(), parent),
-    d_ptr(new RazorSettingsPrivate(this))
-{
-    beginGroup(subGroup);
-}
-
-
-/************************************************
-
- ************************************************/
-RazorSettings::RazorSettings(const QSettings& parentSettings, const QString& subGroup, QObject* parent):
-    QSettings(parentSettings.organizationName(), parentSettings.applicationName(), parent),
-    d_ptr(new RazorSettingsPrivate(this))
-{
-    beginGroup(subGroup);
-}
-
-
-/************************************************
-
- ************************************************/
-RazorSettings::~RazorSettings()
-{
-    // because in the RazorSettings::RazorSettings(const QString& module, QObject* parent)
-    // constructor there is no beginGroup() called...
-    if (!group().isEmpty())
-        endGroup();
-
-    delete d_ptr;
-}
-
-bool RazorSettings::event(QEvent *event)
-{
-    if (event->type() == QEvent::UpdateRequest)
-    {
-        emit settingsChanged();
-    }
-
-    return QSettings::event(event);
-}
-
-void RazorSettings::fileChanged()
-{
-//    Q_D(RazorSettings);
-    sync();
-    emit settingsChanged();
-}
-
-
-/************************************************
-
- ************************************************/
-const GlobalRazorSettings *RazorSettings::globalSettings()
-{
-    static QMutex mutex;
-    static GlobalRazorSettings *instance = 0;
-    if (!instance)
-    {
-        mutex.lock();
-
-        if (!instance)
-            instance = new GlobalRazorSettings();
-
-        mutex.unlock();
-    }
-
-    return instance;
-}
-
-
-/************************************************
- LC_MESSAGES value     Possible keys in order of matching
- lang_COUNTRY@MODIFIER lang_COUNTRY@MODIFIER, lang_COUNTRY, lang@MODIFIER, lang,
-                        default value
- lang_COUNTRY          lang_COUNTRY, lang, default value
- lang@MODIFIER         lang@MODIFIER, lang, default value
- lang                  lang, default value
- ************************************************/
-QString RazorSettingsPrivate::localizedKey(const QString& key) const
-{
-
-    QString lang = getenv("LC_MESSAGES");
-
-    if (lang.isEmpty())
-        lang = getenv("LC_ALL");
-
-    if (lang.isEmpty())
-         lang = getenv("LANG");
-
-
-    QString modifier = lang.section('@', 1);
-    if (!modifier.isEmpty())
-        lang.truncate(lang.length() - modifier.length() - 1);
-
-    QString encoding = lang.section('.', 1);
-    if (!encoding.isEmpty())
-        lang.truncate(lang.length() - encoding.length() - 1);
-
-
-    QString country = lang.section('_', 1);
-    if (!country.isEmpty())
-        lang.truncate(lang.length() - country.length() - 1);
-
-
-
-    //qDebug() << "LC_MESSAGES: " << getenv("LC_MESSAGES");
-    //qDebug() << "Lang:" << lang;
-    //qDebug() << "Country:" << country;
-    //qDebug() << "Encoding:" << encoding;
-    //qDebug() << "Modifier:" << modifier;
-
-    if (!modifier.isEmpty() && !country.isEmpty())
-    {
-        QString k = QString("%1[%2_%3@%4]").arg(key, lang, country, modifier);
-        //qDebug() << "\t try " << k << mParent->contains(k);
-        if (mParent->contains(k))
-            return k;
-    }
-
-    if (!country.isEmpty())
-    {
-        QString k = QString("%1[%2_%3]").arg(key, lang, country);
-        //qDebug() << "\t try " << k  << mParent->contains(k);
-        if (mParent->contains(k))
-            return k;
-    }
-
-    if (!modifier.isEmpty())
-    {
-        QString k = QString("%1[%2@%3]").arg(key, lang, modifier);
-        //qDebug() << "\t try " << k  << mParent->contains(k);
-        if (mParent->contains(k))
-            return k;
-    }
-
-    QString k = QString("%1[%2]").arg(key, lang);
-    //qDebug() << "\t try " << k  << mParent->contains(k);
-    if (mParent->contains(k))
-        return k;
-
-
-    //qDebug() << "\t try " << key  << mParent->contains(key);
-    return key;
-}
-
-
-/************************************************
-
- ************************************************/
-QVariant RazorSettings::localizedValue(const QString& key, const QVariant& defaultValue) const
-{
-    Q_D(const RazorSettings);
-    return value(d->localizedKey(key), defaultValue);
-}
-
-
-/************************************************
-
- ************************************************/
-void RazorSettings::setLocalizedValue(const QString &key, const QVariant &value)
-{
-    Q_D(const RazorSettings);
-    setValue(d->localizedKey(key), value);
-}
-
-
-/************************************************
-
- ************************************************/
-RazorTheme::RazorTheme():
-    d(new RazorThemeData)
-{
-}
-
-
-/************************************************
-
- ************************************************/
-RazorTheme::RazorTheme(const QString &path):
-    d(new RazorThemeData)
-{
-    if (path.isEmpty())
-        return;
-
-    QFileInfo fi(path);
-    if (fi.isAbsolute())
-    {
-        d->mPath = path;
-        d->mName = fi.fileName();
-        d->mValid = fi.isDir();
-    }
-    else
-    {
-        d->mName = path;
-        d->mPath = d->findTheme(path);
-        d->mValid = !(d->mPath.isEmpty());
-    }
-
-    if (QDir(path).exists("preview.png"))
-        d->mPreviewImg = path + "/preview.png";
-}
-
-
-/************************************************
-
- ************************************************/
-QString RazorThemeData::findTheme(const QString &themeName)
-{
-    if (themeName.isEmpty())
-        return "";
-
-    QStringList paths;
-    paths << XdgDirs::dataHome(false);
-    paths << XdgDirs::dataDirs();
-
-    foreach(QString path, paths)
-    {
-        QDir dir(QString("%1/razor/themes/%2").arg(path, themeName));
-        if (dir.isReadable())
-            return dir.absolutePath();
-    }
-
-    return QString();
-}
-
-
-/************************************************
-
- ************************************************/
-RazorTheme::RazorTheme(const RazorTheme &other):
-    d(other.d)
-{
-}
-
-
-/************************************************
-
- ************************************************/
-RazorTheme::~RazorTheme()
-{
-}
-
-
-/************************************************
-
- ************************************************/
-RazorTheme& RazorTheme::operator=(const RazorTheme &other)
-{
-    d = other.d;
-    return *this;
-}
-
-
-/************************************************
-
- ************************************************/
-bool RazorTheme::isValid() const
-{
-    return d->mValid;
-}
-
-
-/************************************************
-
- ************************************************/
-QString RazorTheme::name() const
-{
-    return d->mName;
-}
-
-/************************************************
-
- ************************************************/
-QString RazorTheme::path() const
-{
-    return d->mPath;
-}
-
-
-/************************************************
-
- ************************************************/
-QString RazorTheme::previewImage() const
-{
-    return d->mPreviewImg;
-}
-
-
-/************************************************
-
- ************************************************/
-QString RazorTheme::qss(const QString& module) const
-{
-    QString path = QString("%1/%2.qss").arg(d->mPath, module);
-
-    QString styleSheet;
-    if (!path.isEmpty())
-        styleSheet = d->loadQss(path);
-    else
-        qWarning() << QString("QSS file %1 cannot be found").arg(path);
-
-    // Single/double click ...........................
-    RazorSettings s("desktop");
-    bool singleClick = s.value("icon-launch-mode", "singleclick").toString() == "singleclick";
-    styleSheet += QString("QAbstractItemView {activate-on-singleclick : %1; }").arg(singleClick ? 1 : 0);
-
-    return styleSheet;
-}
-
-
-/************************************************
-
- ************************************************/
-QString RazorThemeData::loadQss(const QString& qssFile) const
-{
-    QFile f(qssFile);
-    if (! f.open(QIODevice::ReadOnly | QIODevice::Text))
-    {
-        qWarning() << "Theme: Cannot open file for reading:" << qssFile;
-        return QString();
-    }
-
-    QString qss = f.readAll();
-    f.close();
-
-    if (qss.isEmpty())
-        return QString();
-
-    // handle relative paths
-    QString qssDir = QFileInfo(qssFile).canonicalPath();
-    qss.replace(QRegExp("url.[ \\t\\s]*", Qt::CaseInsensitive, QRegExp::RegExp2), "url(" + qssDir + "/");
-
-    return qss;
-}
-
-
-/************************************************
-
- ************************************************/
-QString RazorTheme::desktopBackground(int screen) const
-{
-    QString wallpaperCfgFileName = QString("%1/wallpaper.cfg").arg(d->mPath);
-
-    if (wallpaperCfgFileName.isEmpty())
-        return QString();
-
-    QSettings s(wallpaperCfgFileName, QSettings::IniFormat);
-    QString themeDir = QFileInfo(wallpaperCfgFileName).absolutePath();
-    // There is something strange... If I remove next line the wallpapers array is not found...
-    s.childKeys();
-    s.beginReadArray("wallpapers");
-
-    s.setArrayIndex(screen - 1);
-    if (s.contains("file"))
-        return QString("%1/%2").arg(themeDir, s.value("file").toString());
-
-    s.setArrayIndex(0);
-    if (s.contains("file"))
-        return QString("%1/%2").arg(themeDir, s.value("file").toString());
-
-    return QString();
-}
-
-
-/************************************************
-
- ************************************************/
-const RazorTheme &RazorTheme::currentTheme()
-{
-    static RazorTheme theme;
-    QString name = RazorSettings::globalSettings()->value("theme").toString();
-    if (theme.name() != name)
-    {
-        theme = RazorTheme(name);
-    }
-    return theme;
-}
-
-
-/************************************************
-
- ************************************************/
-QList<RazorTheme> RazorTheme::allThemes()
-{
-    QList<RazorTheme> ret;
-    QSet<QString> processed;
-
-    QStringList paths;
-    paths << XdgDirs::dataHome(false);
-    paths << XdgDirs::dataDirs();
-
-    foreach(QString path, paths)
-    {
-        QDir dir(QString("%1/razor/themes").arg(path));
-        QFileInfoList dirs = dir.entryInfoList(QDir::AllDirs | QDir::NoDotAndDotDot);
-
-        foreach(QFileInfo dir, dirs)
-        {
-            if (!processed.contains(dir.fileName()) &&
-                 QDir(dir.absoluteFilePath()).exists("razor-panel.qss"))
-            {
-                processed << dir.fileName();
-                ret << RazorTheme(dir.absoluteFilePath());
-            }
-
-        }
-    }
-
-    return ret;
-}
-
-
-/************************************************
-
- ************************************************/
-RazorSettingsCache::RazorSettingsCache(QSettings &settings) :
-    mSettings(settings)
-{
-    loadFromSettings();
-}
-
-
-/************************************************
-
- ************************************************/
-RazorSettingsCache::RazorSettingsCache(QSettings *settings) :
-    mSettings(*settings)
-{
-    loadFromSettings();
-}
-
-
-/************************************************
-
- ************************************************/
-void RazorSettingsCache::loadFromSettings()
-{
-   foreach (QString key, mSettings.allKeys())
-   {
-       mCache.insert(key, mSettings.value(key));
-   }
-}
-
-
-/************************************************
-
- ************************************************/
-void RazorSettingsCache::loadToSettings()
-{
-    QHash<QString, QVariant>::const_iterator i = mCache.constBegin();
-
-    while(i != mCache.constEnd())
-    {
-        mSettings.setValue(i.key(), i.value());
-        ++i;
-    }
-
-    mSettings.sync();
-}
-
-
-/************************************************
-
- ************************************************/
-GlobalRazorSettings::GlobalRazorSettings():
-    RazorSettings("razor"),
-    d_ptr(new GlobalRazorSettingsPrivate(this))
-{
-    if (value("icon_theme").toString().isEmpty())
-    {
-        QStringList failback;
-        failback << "oxygen";
-        failback << "Tango";
-        failback << "Prudence-icon";
-        failback << "Humanity";
-        failback << "elementary";
-        failback << "gnome";
-
-
-        QDir dir("/usr/share/icons/");
-        foreach (QString s, failback)
-        {
-            if (dir.exists(s))
-            {
-                setValue("icon_theme", s);
-                sync();
-                break;
-            }
-        }
-    }
-
-    fileChanged();
-}
-
-GlobalRazorSettings::~GlobalRazorSettings()
-{
-    delete d_ptr;
-}
-
-
-/************************************************
-
- ************************************************/
-void GlobalRazorSettings::fileChanged()
-{
-    Q_D(GlobalRazorSettings);
-    sync();
-
-
-    QString it = value("icon_theme").toString();
-    if (d->mIconTheme != it)
-    {
-        d->mIconTheme = it;
-        XdgIcon::setThemeName(it);
-        emit iconThemeChanged();
-    }
-
-    QString rt = value("theme").toString();
-    qlonglong themeUpdated = value("__theme_updated__").toLongLong();
-    if ((d->mRazorTheme != rt) || (d->mThemeUpdated != themeUpdated))
-    {
-        d->mRazorTheme = rt;
-        emit razorThemeChanged();
-    }
-
-    emit settingsChanged();
-}
-
diff --git a/razorsettings.h b/razorsettings.h
deleted file mode 100644 (file)
index e4da685..0000000
+++ /dev/null
@@ -1,197 +0,0 @@
-/* BEGIN_COMMON_COPYRIGHT_HEADER
- * (c)LGPL2+
- *
- * Razor - a lightweight, Qt based, desktop toolset
- * http://razor-qt.org
- *
- * Copyright: 2010-2011 Razor team
- * Authors:
- *   Alexander Sokoloff <sokoloff.a@gmail.com>
- *
- * This program or library is free software; you can redistribute it
- * and/or modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library 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
- * Lesser General Public License for more details.
-
- * You should have received a copy of the GNU Lesser General
- * Public License along with this library; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301 USA
- *
- * END_COMMON_COPYRIGHT_HEADER */
-
-
-#ifndef RAZORSETTINGS_H
-#define RAZORSETTINGS_H
-
-#include <QtCore/QObject>
-#include <QtCore/QSettings>
-#include <QtCore/QSharedDataPointer>
-
-class QEvent;
-    
-class RazorSettingsPrivate;
-class GlobalRazorSettings;
-
-/*! \brief User settings handling */
-class RazorSettings : public QSettings
-{
-    Q_OBJECT
-public:
-
-    /*! \brief Constructs a RazorSettings object for accessing settings of the module called module, and with parent parent.
-    RazorSettings can be accessed using the standard interface provided by QSettings, but it also provides some convenience functions and signals.
-
-    \param module a base name of the config file. It's a name without
-            the extension. For example: if you want to open settings for
-            panel create it as RazorSettings("panel").
-            The function will create all parent directories necessary to create
-            the file.
-    \param parent It's no need to delete this class manually if it's set.
-    */
-    explicit RazorSettings(const QString& module, QObject* parent = 0);
-    //explicit RazorSettings(QObject* parent=0);
-    explicit RazorSettings(const QSettings* parentSettings, const QString& subGroup, QObject* parent=0);
-    explicit RazorSettings(const QSettings& parentSettings, const QString& subGroup, QObject* parent=0);
-    RazorSettings(const QString &fileName, QSettings::Format format, QObject *parent = 0);
-    ~RazorSettings();
-
-    static const GlobalRazorSettings *globalSettings();
-
-
-    /*! Returns the localized value for key. In the desktop file keys may be postfixed by [LOCALE]. If the
-        localized value doesn't exist, returns non lokalized value. If non localized value doesn't exist, returns defaultValue.
-        LOCALE must be of the form lang_COUNTRY.ENCODING@MODIFIER, where _COUNTRY, .ENCODING, and @MODIFIER may be omitted.
-
-        If no default value is specified, a default QVariant is returned. */
-    QVariant localizedValue(const QString& key, const QVariant& defaultValue = QVariant()) const;
-
-    /*! Sets the value of setting key to value. If a localized version of the key already exists, the previous value is
-        overwritten. Otherwise, it overwrites the the un-localized version. */
-    void setLocalizedValue(const QString &key, const QVariant &value);
-
-signals:
-    void settingsChanged();
-
-protected:
-    bool event(QEvent *event);
-
-protected slots:
-    virtual void fileChanged();
-
-private:
-    Q_DISABLE_COPY(RazorSettings)
-
-    RazorSettingsPrivate* const d_ptr;
-    Q_DECLARE_PRIVATE(RazorSettings)
-};
-
-
-class RazorThemeData;
-
-/*! \brief QSS theme handling */
-class RazorTheme
-{
-public:
-    /// Constructs a null theme.
-    RazorTheme();
-
-    /*! Constructs an theme from the dir with the given path. If path not absolute
-        (i.e. the theme name only) the relevant dir must be found relative to the
-        $XDG_DATA_HOME + $XDG_DATA_DIRS directories. */
-    RazorTheme(const QString &path);
-
-    /// Constructs a copy of other. This is very fast.
-    RazorTheme(const RazorTheme &other);
-
-    RazorTheme& operator=(const RazorTheme &other);
-    ~RazorTheme();
-
-    /// Returns the name of the theme.
-    QString name() const;
-
-    QString path() const;
-
-    QString previewImage() const;
-
-    /// Returns true if this theme is valid; otherwise returns false.
-    bool isValid() const;
-
-    /*! \brief Returns StyleSheet text (not file name, but real text) of the module called module.
-        Paths in url() C/QSS functions are parsed to be real values for the theme,
-        relative to full path
-    */
-    QString qss(const QString& module) const;
-
-    /*! \brief A full path to image used as a wallpaper
-     \param screen is an ID of the screen like in Qt. -1 means default (any) screen.
-                   Any other value greater than -1 is the exact screen (in dualhead).
-                  In themes the index starts from 1 (ix 1 means 1st screen).
-     \retval QString a file name (including path).
-    */
-    QString desktopBackground(int screen=-1) const;
-
-    /// Returns the current razor theme.
-    static const RazorTheme &currentTheme();
-
-    /// Returns the all themes found in the system.
-    static QList<RazorTheme> allThemes();
-
-private:
-    static RazorTheme* mInstance;
-    QSharedDataPointer<RazorThemeData> d;
-};
-
-/*!
-A global pointer referring to the unique RazorTheme object.
-It is equivalent to the pointer returned by the RazorTheme::instance() function.
-Only one theme object can be created. !*/
-
-#define razorTheme RazorTheme::currentTheme()
-
-
-class RazorSettingsCache
-{
-public:
-    explicit RazorSettingsCache(QSettings &settings);
-    explicit RazorSettingsCache(QSettings *settings);
-    virtual ~RazorSettingsCache() {}
-
-    void loadFromSettings();
-    void loadToSettings();
-
-private:
-    QSettings &mSettings;
-    QHash<QString, QVariant> mCache;
-};
-
-class GlobalRazorSettingsPrivate;
-
-class GlobalRazorSettings: public RazorSettings
-{
-    Q_OBJECT
-public:
-    GlobalRazorSettings();
-    ~GlobalRazorSettings();
-
-signals:
-    /// Signal emitted when the icon theme has changed.
-    void iconThemeChanged();
-
-    /// Signal emitted when the razor theme has changed.
-    void razorThemeChanged();
-
-protected slots:
-    void fileChanged();
-
-private:
-    GlobalRazorSettingsPrivate* const d_ptr;
-    Q_DECLARE_PRIVATE(GlobalRazorSettings)
-};
-
-#endif // RAZORSETTINGS_H