/*! * Copyright (C) 2020 by Savoir-faire Linux * Author: Andreas Traczyk * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * * \file appsettingsmanager.h */ #pragma once #include "utils.h" #include #include #include #include const QString defaultDownloadPath = QStandardPaths::writableLocation(QStandardPaths::DownloadLocation); #define KEYS \ X(MinimizeOnClose, true) \ X(DownloadPath, defaultDownloadPath) \ X(EnableNotifications, true) \ X(AutoUpdate, true) \ X(NeverShowMeAgain, false) /* * A class to expose settings keys in both c++ and QML. * Note: this using a non-constructable class instead of a * namespace allows for QML enum auto-completion in QtCreator. * This works well when there is only one enum class. Otherwise, * to prevent element name collision when defining multiple enums, * use a namespace with: * * Q_NAMESPACE * Q_CLASSINFO("RegisterEnumClassesUnscoped", "false") */ class Settings : public QObject { Q_OBJECT public: enum class Key { #define X(key, defaultValue) key, KEYS #undef X COUNT__ }; Q_ENUM(Key) static QString toString(Key key) { return QMetaEnum::fromType().valueToKey( Utils::toUnderlyingValue(key)); } static QVariant defaultValue(const Key key) { switch (key) { #define X(key, defaultValue) \ case Key::key: return defaultValue; KEYS #undef X default: return {}; } } private: Settings() = delete; }; Q_DECLARE_METATYPE(Settings::Key) /* * A singleton object to manage settings access. */ class AppSettingsManager : public QObject { Q_OBJECT public: virtual ~AppSettingsManager() = default; static AppSettingsManager& instance() { static AppSettingsManager *instance_ = new AppSettingsManager(nullptr); return *instance_; } static QVariant getValue(const Settings::Key key) { auto settings = instance().settings_; auto value = settings->value(Settings::toString(key), Settings::defaultValue(key)); if (QString(value.typeName()) == "QString" && (value.toString() == "false" || value.toString() == "true")) return value.toBool(); return value; } static void setValue(const Settings::Key key, const QVariant& value) { instance().settings_->setValue(Settings::toString(key), value); } static void initValues() { for (int i = 0; i < Utils::toUnderlyingValue(Settings::Key::COUNT__); ++i) { auto key = Utils::toEnum(i); if (!instance().settings_->contains(Settings::toString(key))) setValue(key, Settings::defaultValue(key)); } } private: explicit AppSettingsManager(QObject *) : settings_(new QSettings("jami.net", "Jami", this)) {} QSettings *settings_; };