aboutsummaryrefslogtreecommitdiffstats
path: root/src/settings_interface.h
blob: 09c309b4fdaa77f6807390abfb6a7af2aa4d9bbf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#pragma once

#include <QString>
#include <QVariant>
#include <QSettings>

namespace AppSettingsTypes {
    enum Timezone {LOCALTIME = 0, UTC};
    enum InstanceType {MASTODON = 0};
}
// Declare metatypes for use with QVariant
Q_DECLARE_METATYPE(AppSettingsTypes::Timezone);
Q_DECLARE_METATYPE(AppSettingsTypes::InstanceType);

class SettingsInterface {
public:
    ~SettingsInterface();
    const QVariant read_setting(const QString &key);
    template<typename T>
    static const T quick_read_setting(const QString &key);
    void write_setting(const QString &key, const QVariant &value);
    void clear_setting(const QString &key);
    void clear_all();
    bool commit();
    bool is_default(const QString &key);
    bool is_uncommited(const QString &key);

private:
    QSettings qt_settings;
    QHash<QString, QVariant>* modified = nullptr;

    // Optimization to commit a clear_all() faster
    bool must_clear_all = false;
    // List of keys to remove from the QSettings
    QStringList must_clear;
};

// Template code implementations have to be "seen" at the same time as the declaration
template<typename T>
const T SettingsInterface::quick_read_setting(const QString &key) {
    static SettingsInterface settings;
    return settings.read_setting(key).value<T>();
}