10 #ifndef hifi_Shared_Preferences_h
11 #define hifi_Shared_Preferences_h
14 #include <QtCore/QObject>
15 #include <QtCore/QVariant>
16 #include <QtCore/QList>
17 #include <QtCore/QString>
18 #include <QtCore/QVariantMap>
20 #include "DependencyManager.h"
24 class Preferences :
public QObject,
public Dependency {
26 Q_PROPERTY(QVariantMap preferencesByCategory READ getPreferencesByCategory CONSTANT)
27 Q_PROPERTY(QList<QString> categories READ getCategories CONSTANT)
30 void addPreference(Preference* preference);
31 const QVariantMap& getPreferencesByCategory() {
return _preferencesByCategory; }
32 const QList<QString>& getCategories() {
return _categories; }
35 QVariantMap _preferencesByCategory;
36 QList<QString> _categories;
41 class Preference :
public QObject {
43 Q_PROPERTY(QString category READ getCategory CONSTANT)
44 Q_PROPERTY(QString name READ getName CONSTANT)
45 Q_PROPERTY(Type type READ getType CONSTANT)
46 Q_PROPERTY(
bool enabled READ isEnabled NOTIFY enabledChanged)
66 explicit Preference(QObject* parent =
nullptr) : QObject(parent) {}
67 Preference(
const QString& category,
const QString& name, QObject* parent =
nullptr)
68 : QObject(parent), _category(category), _name(name) { }
70 const QString& getCategory()
const {
return _category; }
71 const QString& getName()
const {
return _name; }
72 bool isEnabled()
const {
76 void setEnabled(
bool enabled) {
77 if (enabled != _enabled) {
79 emit enabledChanged();
83 void setEnabler(BoolPreference* enabler,
bool inverse =
false);
84 virtual Type getType() {
return Invalid; };
86 Q_INVOKABLE
virtual void load() {};
87 Q_INVOKABLE
virtual void save()
const {}
90 void enabledChanged();
93 void onEnablerValueChanged();
96 virtual void emitValueChanged() {};
98 BoolPreference* _enabler {
nullptr };
99 const QString _category;
101 bool _enabled {
true };
102 bool _enablerInverted {
false };
105 class ButtonPreference :
public Preference {
108 using Lambda = std::function<void()>;
109 ButtonPreference(
const QString& category,
const QString& name, Lambda triggerHandler)
110 : Preference(category, name), _triggerHandler(triggerHandler) { }
111 Type getType()
override {
return Button; }
112 Q_INVOKABLE
void trigger() { _triggerHandler(); }
115 const Lambda _triggerHandler;
118 class BoolPreference :
public Preference {
120 Q_PROPERTY(
bool value READ getValue WRITE setValue NOTIFY valueChanged)
123 using Getter = std::function<bool()>;
124 using Setter = std::function<void(
const bool&)>;
126 BoolPreference(
const QString& category,
const QString& name, Getter getter, Setter setter)
127 : Preference(category, name), _getter(getter), _setter(setter) { }
129 bool getValue()
const {
return _value; }
130 void setValue(
const bool& value) {
if (_value != value) { _value = value; emitValueChanged(); } }
131 void load()
override { _value = _getter(); }
132 void save()
const override {
133 bool oldValue = _getter();
134 if (_value != oldValue) {
144 const Getter _getter;
145 const Setter _setter;
147 void emitValueChanged()
override { emit valueChanged(); }
150 class FloatPreference :
public Preference {
152 Q_PROPERTY(
float value READ getValue WRITE setValue NOTIFY valueChanged)
153 Q_PROPERTY(
float min READ getMin CONSTANT)
154 Q_PROPERTY(
float max READ getMax CONSTANT)
155 Q_PROPERTY(
float step READ getStep CONSTANT)
156 Q_PROPERTY(uint decimals READ getDecimals CONSTANT)
159 using Getter = std::function<float()>;
160 using Setter = std::function<void(
const float&)>;
162 FloatPreference(
const QString& category,
const QString& name, Getter getter, Setter setter)
163 : Preference(category, name), _getter(getter), _setter(setter) { }
165 float getValue()
const {
return _value; }
166 void setValue(
const float& value) {
if (_value != value) { _value = value; emitValueChanged(); } }
167 void load()
override { _value = _getter(); }
168 void save()
const override {
169 float oldValue = _getter();
170 if (_value != oldValue) {
175 float getMin()
const {
return _min; }
176 void setMin(
float min) { _min = min; };
178 float getMax()
const {
return _max; }
179 void setMax(
float max) { _max = max; };
181 float getStep()
const {
return _step; }
182 void setStep(
float step) { _step = step; };
184 float getDecimals()
const {
return _decimals; }
185 void setDecimals(
float decimals) { _decimals = decimals; };
191 void emitValueChanged()
override { emit valueChanged(); }
194 const Getter _getter;
195 const Setter _setter;
197 uint _decimals { 0 };
203 class IntPreference :
public Preference {
205 Q_PROPERTY(
float value READ getValue WRITE setValue NOTIFY valueChanged)
206 Q_PROPERTY(
float min READ getMin CONSTANT)
207 Q_PROPERTY(
float max READ getMax CONSTANT)
208 Q_PROPERTY(
float step READ getStep CONSTANT)
209 Q_PROPERTY(
int decimals READ getDecimals CONSTANT)
212 using Getter = std::function<int()>;
213 using Setter = std::function<void(
const int&)>;
215 IntPreference(
const QString& category,
const QString& name, Getter getter, Setter setter)
216 : Preference(category, name), _getter(getter), _setter(setter) { }
218 int getValue()
const {
return _value; }
219 void setValue(
const int& value) {
if (_value != value) { _value = value; emitValueChanged(); } }
220 void load()
override { _value = _getter(); }
221 void save()
const override {
222 int oldValue = _getter();
223 if (_value != oldValue) {
228 float getMin()
const {
return _min; }
229 void setMin(
float min) { _min = min; };
231 float getMax()
const {
return _max; }
232 void setMax(
float max) { _max = max; };
234 float getStep()
const {
return _step; }
235 void setStep(
float step) { _step = step; };
237 int getDecimals()
const {
return _decimals; }
238 void setDecimals(
int decimals) { _decimals = decimals; };
245 const Getter _getter;
246 const Setter _setter;
248 void emitValueChanged()
override { emit valueChanged(); }
250 int _min { std::numeric_limits<int>::min() };
251 int _max { std::numeric_limits<int>::max() };
256 class StringPreference :
public Preference {
258 Q_PROPERTY(QString value READ getValue WRITE setValue NOTIFY valueChanged)
261 using Getter = std::function<QString()>;
262 using Setter = std::function<void(
const QString&)>;
264 StringPreference(
const QString& category,
const QString& name, Getter getter, Setter setter)
265 : Preference(category, name), _getter(getter), _setter(setter) { }
268 QString getValue()
const {
return _value; }
269 void setValue(
const QString& value) {
if (_value != value) { _value = value; emitValueChanged(); } }
270 void load()
override { _value = _getter(); }
271 void save()
const override {
272 QString oldValue = _getter();
273 if (_value != oldValue) {
282 void emitValueChanged()
override { emit valueChanged(); }
285 const Getter _getter;
286 const Setter _setter;
289 class SliderPreference :
public FloatPreference {
292 SliderPreference(
const QString& category,
const QString& name, Getter getter, Setter setter)
293 : FloatPreference(category, name, getter, setter) { }
295 Type getType()
override {
return Slider; }
298 class SpinnerPreference :
public FloatPreference {
301 SpinnerPreference(
const QString& category,
const QString& name, Getter getter, Setter setter)
302 : FloatPreference(category, name, getter, setter) { }
304 Type getType()
override {
return Spinner; }
307 class SpinnerSliderPreference :
public FloatPreference {
310 SpinnerSliderPreference(
const QString& category,
const QString& name, Getter getter, Setter setter)
311 : FloatPreference(category, name, getter, setter) { }
313 Type getType()
override {
return SpinnerSlider; }
316 class IntSpinnerPreference :
public IntPreference {
319 IntSpinnerPreference(
const QString& category,
const QString& name, Getter getter, Setter setter)
320 : IntPreference(category, name, getter, setter) { }
322 Type getType()
override {
return Spinner; }
325 class EditPreference :
public StringPreference {
327 Q_PROPERTY(QString placeholderText READ getPlaceholderText CONSTANT)
330 EditPreference(
const QString& category,
const QString& name, Getter getter, Setter setter)
331 : StringPreference(category, name, getter, setter) { }
332 Type getType()
override {
return Editable; }
333 const QString& getPlaceholderText()
const {
return _placeholderText; }
334 void setPlaceholderText(
const QString& placeholderText) { _placeholderText = placeholderText; }
337 QString _placeholderText;
340 class ComboBoxPreference :
public EditPreference {
342 Q_PROPERTY(QStringList items READ getItems CONSTANT)
345 ComboBoxPreference(
const QString& category,
const QString& name, Getter getter, Setter setter)
346 : EditPreference(category, name, getter, setter) { }
347 Type getType()
override {
return ComboBox; }
349 const QStringList& getItems() {
return _items; }
350 void setItems(
const QStringList& items) { _items = items; }
356 class BrowsePreference :
public EditPreference {
358 Q_PROPERTY(QString browseLabel READ getBrowseLabel CONSTANT)
361 BrowsePreference(
const QString& category,
const QString& name, Getter getter, Setter setter)
362 : EditPreference(category, name, getter, setter) { }
363 Type getType()
override {
return Browsable; }
365 const QString& getBrowseLabel() {
return _browseLabel; }
366 void setBrowseLabel(
const QString& browseLabel) { _browseLabel = browseLabel; }
369 QString _browseLabel {
"Browse" };
372 class AvatarPreference :
public BrowsePreference {
375 AvatarPreference(
const QString& category,
const QString& name, Getter getter, Setter setter)
376 : BrowsePreference(category, name, getter, setter) {
377 _browseLabel =
"Change";
379 Type getType()
override {
return Avatar; }
383 class CheckPreference :
public BoolPreference {
385 Q_PROPERTY(
bool indented READ getIndented CONSTANT)
387 using Getter = std::function<bool()>;
388 using Setter = std::function<void(
const bool&)>;
390 CheckPreference(
const QString& category,
const QString& name, Getter getter, Setter setter)
391 : BoolPreference(category, name, getter, setter) { }
392 Type getType()
override {
return Checkbox; }
394 bool getIndented() {
return _isIndented; }
395 void setIndented(
const bool indented) { _isIndented = indented; }
397 bool _isIndented {
false };
400 class PrimaryHandPreference :
public StringPreference {
403 PrimaryHandPreference(
const QString& category,
const QString& name, Getter getter, Setter setter)
404 : StringPreference(category, name, getter, setter) { }
405 Type getType()
override {
return PrimaryHand; }
408 class RadioButtonsPreference :
public IntPreference {
410 Q_PROPERTY(QString heading READ getHeading CONSTANT)
411 Q_PROPERTY(QStringList items READ getItems CONSTANT)
412 Q_PROPERTY(
bool indented READ getIndented CONSTANT)
414 RadioButtonsPreference(
const QString& category,
const QString& name, Getter getter, Setter setter)
415 : IntPreference(category, name, getter, setter) { }
416 Type getType()
override {
return RadioButtons; }
418 const QString& getHeading() {
return _heading; }
419 const QStringList& getItems() {
return _items; }
420 void setHeading(
const QString& heading) { _heading = heading; }
421 void setItems(
const QStringList& items) { _items = items; }
422 bool getIndented()
const {
return _indented; }
423 void setIndented(
const bool indented) { _indented = indented; }
428 bool _indented {
false };