kodi
Setting.h
1 /*
2  * Copyright (C) 2013-2018 Team Kodi
3  * This file is part of Kodi - https://kodi.tv
4  *
5  * SPDX-License-Identifier: GPL-2.0-or-later
6  * See LICENSES/README.md for more information.
7  */
8 
9 #pragma once
10 
11 #include "ISetting.h"
12 #include "ISettingCallback.h"
13 #include "ISettingControl.h"
14 #include "SettingDefinitions.h"
15 #include "SettingDependency.h"
16 #include "SettingLevel.h"
17 #include "SettingType.h"
18 #include "SettingUpdate.h"
19 #include "threads/SharedSection.h"
20 #include "utils/logtypes.h"
21 
22 #include <memory>
23 #include <set>
24 #include <shared_mutex>
25 #include <string>
26 #include <utility>
27 #include <vector>
28 
29 enum class SettingOptionsType {
30  Unknown = 0,
31  StaticTranslatable,
32  Static,
33  Dynamic
34 };
35 
36 class CSetting;
37 using SettingPtr = std::shared_ptr<CSetting>;
38 using SettingConstPtr = std::shared_ptr<const CSetting>;
39 using SettingList = std::vector<SettingPtr>;
40 
46 class CSetting : public ISetting,
47  protected ISettingCallback,
48  public std::enable_shared_from_this<CSetting>
49 {
50 public:
51  CSetting(const std::string& id, CSettingsManager* settingsManager = nullptr);
52  CSetting(const std::string& id, const CSetting& setting);
53  ~CSetting() override = default;
54 
55  virtual std::shared_ptr<CSetting> Clone(const std::string &id) const = 0;
56  void MergeBasics(const CSetting& other);
57  virtual void MergeDetails(const CSetting& other) = 0;
58 
59  bool Deserialize(const TiXmlNode *node, bool update = false) override;
60 
61  virtual SettingType GetType() const = 0;
62  virtual bool FromString(const std::string &value) = 0;
63  virtual std::string ToString() const = 0;
64  virtual bool Equals(const std::string &value) const = 0;
65  virtual bool CheckValidity(const std::string &value) const = 0;
66  virtual void Reset() = 0;
67 
68  bool IsEnabled() const;
69  bool GetEnabled() const { return m_enabled; }
70  void SetEnabled(bool enabled);
71  bool IsDefault() const { return !m_changed; }
72  const std::string& GetParent() const { return m_parentSetting; }
73  void SetParent(const std::string& parentSetting) { m_parentSetting = parentSetting; }
74  SettingLevel GetLevel() const { return m_level; }
75  void SetLevel(SettingLevel level) { m_level = level; }
76  std::shared_ptr<const ISettingControl> GetControl() const { return m_control; }
77  std::shared_ptr<ISettingControl> GetControl() { return m_control; }
78  void SetControl(std::shared_ptr<ISettingControl> control) { m_control = std::move(control); }
79  const SettingDependencies& GetDependencies() const { return m_dependencies; }
80  void SetDependencies(const SettingDependencies &dependencies) { m_dependencies = dependencies; }
81  const std::set<CSettingUpdate>& GetUpdates() const { return m_updates; }
82 
83  void SetCallback(ISettingCallback *callback) { m_callback = callback; }
84 
85  bool IsReference() const { return !m_referencedId.empty(); }
86  const std::string& GetReferencedId() const { return m_referencedId; }
87  void SetReferencedId(const std::string& referencedId) { m_referencedId = referencedId; }
88  void MakeReference(const std::string& referencedId = "");
89 
90  bool GetVisible() const { return ISetting::IsVisible(); }
91  // overrides of ISetting
92  bool IsVisible() const override;
93 
94  // implementation of ISettingCallback
95  void OnSettingAction(const std::shared_ptr<const CSetting>& setting) override;
96 
106  static bool DeserializeIdentification(const TiXmlNode* node,
107  std::string& identification,
108  bool& isReference);
109 
110 protected:
111  // implementation of ISettingCallback
112  bool OnSettingChanging(const std::shared_ptr<const CSetting>& setting) override;
113  void OnSettingChanged(const std::shared_ptr<const CSetting>& setting) override;
114  bool OnSettingUpdate(const std::shared_ptr<CSetting>& setting,
115  const char* oldSettingId,
116  const TiXmlNode* oldSettingNode) override;
117  void OnSettingPropertyChanged(const std::shared_ptr<const CSetting>& setting,
118  const char* propertyName) override;
119 
120  void Copy(const CSetting &setting);
121 
122  template<class TSetting>
123  std::shared_ptr<TSetting> shared_from_base()
124  {
125  return std::static_pointer_cast<TSetting>(shared_from_this());
126  }
127 
128  ISettingCallback *m_callback = nullptr;
129  bool m_enabled = true;
130  std::string m_parentSetting;
131  SettingLevel m_level = SettingLevel::Standard;
132  std::shared_ptr<ISettingControl> m_control;
133  SettingDependencies m_dependencies;
134  std::set<CSettingUpdate> m_updates;
135  bool m_changed = false;
136  mutable CSharedSection m_critical;
137 
138  std::string m_referencedId;
139 
140 private:
141  static Logger s_logger;
142 };
143 
144 template<typename TValue, SettingType TSettingType>
145 class CTraitedSetting : public CSetting
146 {
147 public:
148  typedef TValue Value;
149 
150  // implementation of CSetting
151  SettingType GetType() const override { return TSettingType; }
152 
153  static SettingType Type() { return TSettingType; }
154 
155 protected:
156  CTraitedSetting(const std::string& id, CSettingsManager* settingsManager = nullptr)
157  : CSetting(id, settingsManager)
158  { }
159  CTraitedSetting(const std::string& id, const CTraitedSetting& setting) : CSetting(id, setting) {}
160  ~CTraitedSetting() override = default;
161 };
162 
168 class CSettingList : public CSetting
169 {
170 public:
171  CSettingList(const std::string &id, std::shared_ptr<CSetting> settingDefinition, CSettingsManager *settingsManager = nullptr);
172  CSettingList(const std::string &id, std::shared_ptr<CSetting> settingDefinition, int label, CSettingsManager *settingsManager = nullptr);
173  CSettingList(const std::string &id, const CSettingList &setting);
174  ~CSettingList() override = default;
175 
176  std::shared_ptr<CSetting> Clone(const std::string &id) const override;
177  void MergeDetails(const CSetting& other) override;
178 
179  bool Deserialize(const TiXmlNode *node, bool update = false) override;
180 
181  SettingType GetType() const override { return SettingType::List; }
182  bool FromString(const std::string &value) override;
183  std::string ToString() const override;
184  bool Equals(const std::string &value) const override;
185  bool CheckValidity(const std::string &value) const override;
186  void Reset() override;
187 
188  SettingType GetElementType() const;
189  std::shared_ptr<CSetting> GetDefinition() { return m_definition; }
190  std::shared_ptr<const CSetting> GetDefinition() const { return m_definition; }
191  void SetDefinition(std::shared_ptr<CSetting> definition) { m_definition = std::move(definition); }
192 
193  const std::string& GetDelimiter() const { return m_delimiter; }
194  void SetDelimiter(const std::string &delimiter) { m_delimiter = delimiter; }
195  int GetMinimumItems() const { return m_minimumItems; }
196  void SetMinimumItems(int minimumItems) { m_minimumItems = minimumItems; }
197  int GetMaximumItems() const { return m_maximumItems; }
198  void SetMaximumItems(int maximumItems) { m_maximumItems = maximumItems; }
199 
200  bool FromString(const std::vector<std::string> &value);
201 
202  const SettingList& GetValue() const { return m_values; }
203  bool SetValue(const SettingList &values);
204  const SettingList& GetDefault() const { return m_defaults; }
205  void SetDefault(const SettingList &values);
206 
207 protected:
208  void copy(const CSettingList &setting);
209  static void copy(const SettingList &srcValues, SettingList &dstValues);
210  bool fromString(const std::string &strValue, SettingList &values) const;
211  bool fromValues(const std::vector<std::string> &strValues, SettingList &values) const;
212  std::string toString(const SettingList &values) const;
213 
214  SettingList m_values;
215  SettingList m_defaults;
216  std::shared_ptr<CSetting> m_definition;
217  std::string m_delimiter = "|";
218  int m_minimumItems = 0;
219  int m_maximumItems = -1;
220 
221  static Logger s_logger;
222 };
223 
229 class CSettingBool : public CTraitedSetting<bool, SettingType::Boolean>
230 {
231 public:
232  CSettingBool(const std::string &id, CSettingsManager *settingsManager = nullptr);
233  CSettingBool(const std::string &id, const CSettingBool &setting);
234  CSettingBool(const std::string &id, int label, bool value, CSettingsManager *settingsManager = nullptr);
235  ~CSettingBool() override = default;
236 
237  std::shared_ptr<CSetting> Clone(const std::string &id) const override;
238  void MergeDetails(const CSetting& other) override;
239 
240  bool Deserialize(const TiXmlNode *node, bool update = false) override;
241 
242  bool FromString(const std::string &value) override;
243  std::string ToString() const override;
244  bool Equals(const std::string &value) const override;
245  bool CheckValidity(const std::string &value) const override;
246  void Reset() override { SetValue(m_default); }
247 
248  bool GetValue() const
249  {
250  std::shared_lock<CSharedSection> lock(m_critical);
251  return m_value;
252  }
253  bool SetValue(bool value);
254  bool GetDefault() const { return m_default; }
255  void SetDefault(bool value);
256 
257 private:
258  static constexpr Value DefaultValue = false;
259 
260  void copy(const CSettingBool &setting);
261  bool fromString(const std::string &strValue, bool &value) const;
262 
263  bool m_value = DefaultValue;
264  bool m_default = DefaultValue;
265 
266  static Logger s_logger;
267 };
268 
274 class CSettingInt : public CTraitedSetting<int, SettingType::Integer>
275 {
276 public:
277  CSettingInt(const std::string &id, CSettingsManager *settingsManager = nullptr);
278  CSettingInt(const std::string &id, const CSettingInt &setting);
279  CSettingInt(const std::string &id, int label, int value, CSettingsManager *settingsManager = nullptr);
280  CSettingInt(const std::string &id, int label, int value, int minimum, int step, int maximum, CSettingsManager *settingsManager = nullptr);
281  CSettingInt(const std::string &id, int label, int value, const TranslatableIntegerSettingOptions &options, CSettingsManager *settingsManager = nullptr);
282  ~CSettingInt() override = default;
283 
284  std::shared_ptr<CSetting> Clone(const std::string &id) const override;
285  void MergeDetails(const CSetting& other) override;
286 
287  bool Deserialize(const TiXmlNode *node, bool update = false) override;
288 
289  bool FromString(const std::string &value) override;
290  std::string ToString() const override;
291  bool Equals(const std::string &value) const override;
292  bool CheckValidity(const std::string &value) const override;
293  virtual bool CheckValidity(int value) const;
294  void Reset() override { SetValue(m_default); }
295 
296  int GetValue() const
297  {
298  std::shared_lock<CSharedSection> lock(m_critical);
299  return m_value;
300  }
301  bool SetValue(int value);
302  int GetDefault() const { return m_default; }
303  void SetDefault(int value);
304 
305  int GetMinimum() const { return m_min; }
306  void SetMinimum(int minimum) { m_min = minimum; }
307  int GetStep() const { return m_step; }
308  void SetStep(int step) { m_step = step; }
309  int GetMaximum() const { return m_max; }
310  void SetMaximum(int maximum) { m_max = maximum; }
311 
312  SettingOptionsType GetOptionsType() const;
313  const TranslatableIntegerSettingOptions& GetTranslatableOptions() const { return m_translatableOptions; }
314  void SetTranslatableOptions(const TranslatableIntegerSettingOptions &options) { m_translatableOptions = options; }
315  const IntegerSettingOptions& GetOptions() const { return m_options; }
316  void SetOptions(const IntegerSettingOptions &options) { m_options = options; }
317  const std::string& GetOptionsFillerName() const { return m_optionsFillerName; }
318  void SetOptionsFillerName(const std::string &optionsFillerName, void *data = nullptr)
319  {
320  m_optionsFillerName = optionsFillerName;
321  m_optionsFillerData = data;
322  }
323  void SetOptionsFiller(IntegerSettingOptionsFiller optionsFiller, void *data = nullptr)
324  {
325  m_optionsFiller = optionsFiller;
326  m_optionsFillerData = data;
327  }
328  IntegerSettingOptions GetDynamicOptions() const { return m_dynamicOptions; }
329  IntegerSettingOptions UpdateDynamicOptions();
330  SettingOptionsSort GetOptionsSort() const { return m_optionsSort; }
331  void SetOptionsSort(SettingOptionsSort optionsSort) { m_optionsSort = optionsSort; }
332 
333 private:
334  static constexpr Value DefaultValue = 0;
335  static constexpr Value DefaultMin = DefaultValue;
336  static constexpr Value DefaultStep = 1;
337  static constexpr Value DefaultMax = DefaultValue;
338 
339  void copy(const CSettingInt &setting);
340  static bool fromString(const std::string &strValue, int &value);
341 
342  int m_value = DefaultValue;
343  int m_default = DefaultValue;
344  int m_min = DefaultMin;
345  int m_step = DefaultStep;
346  int m_max = DefaultMax;
347  TranslatableIntegerSettingOptions m_translatableOptions;
348  IntegerSettingOptions m_options;
349  std::string m_optionsFillerName;
350  IntegerSettingOptionsFiller m_optionsFiller = nullptr;
351  void *m_optionsFillerData = nullptr;
352  IntegerSettingOptions m_dynamicOptions;
353  SettingOptionsSort m_optionsSort = SettingOptionsSort::NoSorting;
354 
355  static Logger s_logger;
356 };
357 
363 class CSettingNumber : public CTraitedSetting<double, SettingType::Number>
364 {
365 public:
366  CSettingNumber(const std::string &id, CSettingsManager *settingsManager = nullptr);
367  CSettingNumber(const std::string &id, const CSettingNumber &setting);
368  CSettingNumber(const std::string &id, int label, float value, CSettingsManager *settingsManager = nullptr);
369  CSettingNumber(const std::string &id, int label, float value, float minimum, float step, float maximum, CSettingsManager *settingsManager = nullptr);
370  ~CSettingNumber() override = default;
371 
372  std::shared_ptr<CSetting> Clone(const std::string &id) const override;
373  void MergeDetails(const CSetting& other) override;
374 
375  bool Deserialize(const TiXmlNode *node, bool update = false) override;
376 
377  bool FromString(const std::string &value) override;
378  std::string ToString() const override;
379  bool Equals(const std::string &value) const override;
380  bool CheckValidity(const std::string &value) const override;
381  virtual bool CheckValidity(double value) const;
382  void Reset() override { SetValue(m_default); }
383 
384  double GetValue() const
385  {
386  std::shared_lock<CSharedSection> lock(m_critical);
387  return m_value;
388  }
389  bool SetValue(double value);
390  double GetDefault() const { return m_default; }
391  void SetDefault(double value);
392 
393  double GetMinimum() const { return m_min; }
394  void SetMinimum(double minimum) { m_min = minimum; }
395  double GetStep() const { return m_step; }
396  void SetStep(double step) { m_step = step; }
397  double GetMaximum() const { return m_max; }
398  void SetMaximum(double maximum) { m_max = maximum; }
399 
400 private:
401  static constexpr Value DefaultValue = 0.0;
402  static constexpr Value DefaultMin = DefaultValue;
403  static constexpr Value DefaultStep = 1.0;
404  static constexpr Value DefaultMax = DefaultValue;
405 
406  virtual void copy(const CSettingNumber &setting);
407  static bool fromString(const std::string &strValue, double &value);
408 
409  double m_value = DefaultValue;
410  double m_default = DefaultValue;
411  double m_min = DefaultMin;
412  double m_step = DefaultStep;
413  double m_max = DefaultMax;
414 
415  static Logger s_logger;
416 };
417 
423 class CSettingString : public CTraitedSetting<std::string, SettingType::String>
424 {
425 public:
426  CSettingString(const std::string &id, CSettingsManager *settingsManager = nullptr);
427  CSettingString(const std::string &id, const CSettingString &setting);
428  CSettingString(const std::string &id, int label, const std::string &value, CSettingsManager *settingsManager = nullptr);
429  ~CSettingString() override = default;
430 
431  std::shared_ptr<CSetting> Clone(const std::string &id) const override;
432  void MergeDetails(const CSetting& other) override;
433 
434  bool Deserialize(const TiXmlNode *node, bool update = false) override;
435 
436  bool FromString(const std::string &value) override { return SetValue(value); }
437  std::string ToString() const override { return m_value; }
438  bool Equals(const std::string &value) const override { return m_value == value; }
439  bool CheckValidity(const std::string &value) const override;
440  void Reset() override { SetValue(m_default); }
441 
442  virtual const std::string& GetValue() const
443  {
444  std::shared_lock<CSharedSection> lock(m_critical);
445  return m_value;
446  }
447  virtual bool SetValue(const std::string &value);
448  virtual const std::string& GetDefault() const { return m_default; }
449  virtual void SetDefault(const std::string &value);
450 
451  virtual bool AllowEmpty() const { return m_allowEmpty; }
452  void SetAllowEmpty(bool allowEmpty) { m_allowEmpty = allowEmpty; }
453  virtual bool AllowNewOption() const { return m_allowNewOption; }
454  void SetAllowNewOption(bool allowNewOption) { m_allowNewOption = allowNewOption; }
455 
456  SettingOptionsType GetOptionsType() const;
457  const TranslatableStringSettingOptions& GetTranslatableOptions() const { return m_translatableOptions; }
458  void SetTranslatableOptions(const TranslatableStringSettingOptions &options) { m_translatableOptions = options; }
459  const StringSettingOptions& GetOptions() const { return m_options; }
460  void SetOptions(const StringSettingOptions &options) { m_options = options; }
461  const std::string& GetOptionsFillerName() const { return m_optionsFillerName; }
462  void SetOptionsFillerName(const std::string &optionsFillerName, void *data = nullptr)
463  {
464  m_optionsFillerName = optionsFillerName;
465  m_optionsFillerData = data;
466  }
467  void SetOptionsFiller(StringSettingOptionsFiller optionsFiller, void *data = nullptr)
468  {
469  m_optionsFiller = optionsFiller;
470  m_optionsFillerData = data;
471  }
472  StringSettingOptions GetDynamicOptions() const { return m_dynamicOptions; }
473  StringSettingOptions UpdateDynamicOptions();
474  SettingOptionsSort GetOptionsSort() const { return m_optionsSort; }
475  void SetOptionsSort(SettingOptionsSort optionsSort) { m_optionsSort = optionsSort; }
476 
477 protected:
478  static const Value DefaultValue;
479 
480  virtual void copy(const CSettingString &setting);
481 
482  std::string m_value;
483  std::string m_default;
484  bool m_allowEmpty = false;
485  bool m_allowNewOption = false;
486  TranslatableStringSettingOptions m_translatableOptions;
487  StringSettingOptions m_options;
488  std::string m_optionsFillerName;
489  StringSettingOptionsFiller m_optionsFiller = nullptr;
490  void *m_optionsFillerData = nullptr;
491  StringSettingOptions m_dynamicOptions;
492  SettingOptionsSort m_optionsSort = SettingOptionsSort::NoSorting;
493 
494  static Logger s_logger;
495 };
496 
506 class CSettingAction : public CSetting
507 {
508 public:
509  CSettingAction(const std::string &id, CSettingsManager *settingsManager = nullptr);
510  CSettingAction(const std::string &id, int label, CSettingsManager *settingsManager = nullptr);
511  CSettingAction(const std::string &id, const CSettingAction &setting);
512  ~CSettingAction() override = default;
513 
514  std::shared_ptr<CSetting> Clone(const std::string &id) const override;
515  void MergeDetails(const CSetting& other) override;
516 
517  bool Deserialize(const TiXmlNode *node, bool update = false) override;
518 
519  SettingType GetType() const override { return SettingType::Action; }
520  bool FromString(const std::string &value) override { return CheckValidity(value); }
521  std::string ToString() const override { return ""; }
522  bool Equals(const std::string &value) const override { return value.empty(); }
523  bool CheckValidity(const std::string &value) const override { return value.empty(); }
524  void Reset() override { }
525 
526  bool HasData() const { return !m_data.empty(); }
527  const std::string& GetData() const { return m_data; }
528  void SetData(const std::string& data) { m_data = data; }
529 
530 protected:
531  virtual void copy(const CSettingAction& setting);
532 
533  std::string m_data;
534 
535  static Logger s_logger;
536 };
List setting implementation.
Definition: Setting.h:168
Definition: ISettingCallback.h:16
Setting base class containing all the properties which are common to all settings independent of the ...
Definition: Setting.h:46
String setting implementation.
Definition: Setting.h:423
Interface defining the base of all setting objects.
Definition: ISetting.h:22
Definition: Setting.h:145
Real number setting implementation.
Definition: Setting.h:363
Action setting implementation.
Definition: Setting.h:506
virtual bool IsVisible() const
Whether the setting object is visible or hidden.
Definition: ISetting.h:58
A CSharedSection is a mutex that satisfies the Shared Lockable concept (see Lockables.h).
Definition: SharedSection.h:19
Settings manager responsible for initializing, loading and handling all settings. ...
Definition: SettingsManager.h:41
Boolean setting implementation.
Definition: Setting.h:229
Integer setting implementation.
Definition: Setting.h:274
SettingLevel
Levels which every setting is assigned to.
Definition: SettingLevel.h:15
SettingType
Basic setting types available in the settings system.
Definition: SettingType.h:15