src/platform/qt/ConfigController.h (view raw)
1/* Copyright (c) 2013-2015 Jeffrey Pfau
2 *
3 * This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6#pragma once
7
8#include "Override.h"
9
10#include <QHash>
11#include <QObject>
12#include <QSettings>
13#include <QVariant>
14
15#include <functional>
16#include <memory>
17
18#include <mgba/core/config.h>
19#include <mgba-util/configuration.h>
20#include <mgba/feature/commandline.h>
21
22class QMenu;
23
24struct mArguments;
25struct GBACartridgeOverride;
26
27namespace QGBA {
28
29class Action;
30class ActionMapper;
31
32class ConfigOption : public QObject {
33Q_OBJECT
34
35public:
36 ConfigOption(const QString& name, QObject* parent = nullptr);
37
38 void connect(std::function<void(const QVariant&)>, QObject* parent = nullptr);
39
40 Action* addValue(const QString& text, const QVariant& value, ActionMapper* actions = nullptr, const QString& menu = {});
41 Action* addValue(const QString& text, const char* value, ActionMapper* actions = nullptr, const QString& menu = {});
42 Action* addBoolean(const QString& text, ActionMapper* actions = nullptr, const QString& menu = {});
43
44 QString name() const { return m_name; }
45
46public slots:
47 void setValue(bool value);
48 void setValue(int value);
49 void setValue(unsigned value);
50 void setValue(const char* value);
51 void setValue(const QVariant& value);
52
53signals:
54 void valueChanged(const QVariant& value);
55
56private:
57 QHash<QObject*, std::function<void(const QVariant&)>> m_slots;
58 QList<std::pair<Action*, QVariant>> m_actions;
59 QString m_name;
60};
61
62class ConfigController : public QObject {
63Q_OBJECT
64
65public:
66 constexpr static const char* const PORT = "qt";
67 static const int MRU_LIST_SIZE = 10;
68
69 ConfigController(QObject* parent = nullptr);
70 ~ConfigController();
71
72 const mCoreOptions* options() const { return &m_opts; }
73 bool parseArguments(mArguments* args, int argc, char* argv[], mSubParser* subparser = nullptr);
74
75 ConfigOption* addOption(const char* key);
76 void updateOption(const char* key);
77
78 QString getOption(const char* key, const QVariant& defaultVal = QVariant()) const;
79 QString getOption(const QString& key, const QVariant& defaultVal = QVariant()) const;
80
81 QVariant getQtOption(const QString& key, const QString& group = QString()) const;
82
83 QList<QString> getMRU() const;
84 void setMRU(const QList<QString>& mru);
85
86 Configuration* overrides() { return mCoreConfigGetOverrides(&m_config); }
87 void saveOverride(const Override&);
88
89 Configuration* input() { return mCoreConfigGetInput(&m_config); }
90
91 const mCoreConfig* config() const { return &m_config; }
92 mCoreConfig* config() { return &m_config; }
93
94 static const QString& configDir();
95 static bool isPortable();
96
97public slots:
98 void setOption(const char* key, bool value);
99 void setOption(const char* key, int value);
100 void setOption(const char* key, unsigned value);
101 void setOption(const char* key, const char* value);
102 void setOption(const char* key, const QVariant& value);
103 void setQtOption(const QString& key, const QVariant& value, const QString& group = QString());
104
105 void makePortable();
106 void write();
107
108private:
109 Configuration* defaults() { return &m_config.defaultsTable; }
110
111 mCoreConfig m_config;
112 mCoreOptions m_opts{};
113
114 QHash<QString, ConfigOption*> m_optionSet;
115 std::unique_ptr<QSettings> m_settings;
116 static QString s_configDir;
117};
118
119}