xbmc
AddonSettings.h
1 /*
2  * Copyright (C) 2017-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 "addons/IAddon.h"
12 #include "settings/SettingControl.h"
13 #include "settings/SettingCreator.h"
14 #include "settings/SettingsBase.h"
15 #include "settings/lib/ISettingCallback.h"
16 
17 #include <map>
18 #include <memory>
19 #include <set>
20 #include <string>
21 #include <vector>
22 
23 enum class SettingDependencyOperator;
24 
25 class CSettingCategory;
26 class CSettingGroup;
27 class CSettingDependency;
28 class CXBMCTinyXML;
29 
30 struct StringSettingOption;
31 
32 namespace ADDON
33 {
34 
35 class IAddon;
36 class IAddonInstanceHandler;
37 
39  public CSettingCreator,
41  public ISettingCallback
42 {
43 public:
44  CAddonSettings(const std::shared_ptr<IAddon>& addon, AddonInstanceId instanceId);
45  ~CAddonSettings() override = default;
46 
47  // specialization of CSettingsBase
48  bool Initialize() override { return false; }
49 
50  // implementations of CSettingsBase
51  bool Load() override { return false; }
52  bool Save() override;
53 
54  // specialization of CSettingCreator
55  std::shared_ptr<CSetting> CreateSetting(
56  const std::string& settingType,
57  const std::string& settingId,
58  CSettingsManager* settingsManager = nullptr) const override;
59 
60  // implementation of ISettingCallback
61  void OnSettingAction(const std::shared_ptr<const CSetting>& setting) override;
62 
63  const std::string& GetAddonId() const { return m_addonId; }
64 
65  bool Initialize(const CXBMCTinyXML& doc, bool allowEmpty = false);
66  bool Load(const CXBMCTinyXML& doc);
67  bool Save(CXBMCTinyXML& doc) const;
68 
69  bool HasSettings() const;
70 
71  std::string GetSettingLabel(int label) const;
72 
73  std::shared_ptr<CSetting> AddSetting(const std::string& settingId, bool value);
74  std::shared_ptr<CSetting> AddSetting(const std::string& settingId, int value);
75  std::shared_ptr<CSetting> AddSetting(const std::string& settingId, double value);
76  std::shared_ptr<CSetting> AddSetting(const std::string& settingId, const std::string& value);
77 
78 protected:
79  // specializations of CSettingsBase
80  void InitializeSettingTypes() override;
81  void InitializeControls() override;
82  void InitializeConditions() override;
83 
84  // implementation of CSettingsBase
85  bool InitializeDefinitions() override { return false; }
86 
87 private:
88  bool AddInstanceSettings();
89  bool InitializeDefinitions(const CXBMCTinyXML& doc);
90 
91  bool ParseSettingVersion(const CXBMCTinyXML& doc, uint32_t& version) const;
92 
93  std::shared_ptr<CSettingGroup> ParseOldSettingElement(
94  const TiXmlElement* categoryElement,
95  const std::shared_ptr<CSettingCategory>& category,
96  std::set<std::string>& settingIds);
97 
98  std::shared_ptr<CSettingCategory> ParseOldCategoryElement(uint32_t& categoryId,
99  const TiXmlElement* categoryElement,
100  std::set<std::string>& settingIds);
101 
102  bool InitializeFromOldSettingDefinitions(const CXBMCTinyXML& doc);
103  std::shared_ptr<CSetting> InitializeFromOldSettingAction(const std::string& settingId,
104  const TiXmlElement* settingElement,
105  const std::string& defaultValue);
106  std::shared_ptr<CSetting> InitializeFromOldSettingLabel();
107  std::shared_ptr<CSetting> InitializeFromOldSettingBool(const std::string& settingId,
108  const TiXmlElement* settingElement,
109  const std::string& defaultValue);
110  std::shared_ptr<CSetting> InitializeFromOldSettingTextIpAddress(
111  const std::string& settingId,
112  const std::string& settingType,
113  const TiXmlElement* settingElement,
114  const std::string& defaultValue,
115  const int settingLabel);
116  std::shared_ptr<CSetting> InitializeFromOldSettingNumber(const std::string& settingId,
117  const TiXmlElement* settingElement,
118  const std::string& defaultValue,
119  const int settingLabel);
120  std::shared_ptr<CSetting> InitializeFromOldSettingPath(const std::string& settingId,
121  const std::string& settingType,
122  const TiXmlElement* settingElement,
123  const std::string& defaultValue,
124  const int settingLabel);
125  std::shared_ptr<CSetting> InitializeFromOldSettingDate(const std::string& settingId,
126  const TiXmlElement* settingElement,
127  const std::string& defaultValue,
128  const int settingLabel);
129  std::shared_ptr<CSetting> InitializeFromOldSettingTime(const std::string& settingId,
130  const TiXmlElement* settingElement,
131  const std::string& defaultValue,
132  const int settingLabel);
133  std::shared_ptr<CSetting> InitializeFromOldSettingSelect(
134  const std::string& settingId,
135  const TiXmlElement* settingElement,
136  const std::string& defaultValue,
137  const int settingLabel,
138  const std::string& settingValues,
139  const std::vector<std::string>& settingLValues);
140  std::shared_ptr<CSetting> InitializeFromOldSettingAddon(const std::string& settingId,
141  const TiXmlElement* settingElement,
142  const std::string& defaultValue,
143  const int settingLabel);
144  std::shared_ptr<CSetting> InitializeFromOldSettingEnums(
145  const std::string& settingId,
146  const std::string& settingType,
147  const TiXmlElement* settingElement,
148  const std::string& defaultValue,
149  const std::string& settingValues,
150  const std::vector<std::string>& settingLValues);
151  std::shared_ptr<CSetting> InitializeFromOldSettingFileEnum(const std::string& settingId,
152  const TiXmlElement* settingElement,
153  const std::string& defaultValue,
154  const std::string& settingValues);
155  std::shared_ptr<CSetting> InitializeFromOldSettingRangeOfNum(const std::string& settingId,
156  const TiXmlElement* settingElement,
157  const std::string& defaultValue);
158  std::shared_ptr<CSetting> InitializeFromOldSettingSlider(const std::string& settingId,
159  const TiXmlElement* settingElement,
160  const std::string& defaultValue);
161  std::shared_ptr<CSetting> InitializeFromOldSettingFileWithSource(
162  const std::string& settingId,
163  const TiXmlElement* settingElement,
164  const std::string& defaultValue,
165  std::string source);
166 
167  bool LoadOldSettingValues(const CXBMCTinyXML& doc,
168  std::map<std::string, std::string>& settings) const;
169 
170  struct ConditionExpression
171  {
172  SettingDependencyOperator m_operator;
173  bool m_negated;
174  int32_t m_relativeSettingIndex;
175  std::string m_value;
176  };
177 
178  bool ParseOldLabel(const TiXmlElement* element, const std::string& settingId, int& labelId);
179  bool ParseOldCondition(const std::shared_ptr<const CSetting>& setting,
180  const std::vector<std::shared_ptr<const CSetting>>& settings,
181  const std::string& condition,
182  CSettingDependency& dependeny) const;
183  static bool ParseOldConditionExpression(std::string str, ConditionExpression& expression);
184 
185  static void FileEnumSettingOptionsFiller(const std::shared_ptr<const CSetting>& setting,
186  std::vector<StringSettingOption>& list,
187  std::string& current,
188  void* data);
189 
190  // store these values so that we don't always have to access the weak pointer
191  const std::string m_addonId;
192  const std::string m_addonPath;
193  const std::string m_addonProfile;
194  const AddonInstanceId m_instanceId{ADDON_SETTINGS_ID};
195  std::weak_ptr<IAddon> m_addon;
196 
197  uint32_t m_unidentifiedSettingId = 0;
198  int m_unknownSettingLabelId;
199  std::map<int, std::string> m_unknownSettingLabels;
200 
201  Logger m_logger;
202 };
203 
204 } // namespace ADDON
Category of groups of settings being part of a section.
Definition: SettingSection.h:93
Definition: XBMCTinyXML.h:33
Definition: SettingControl.h:30
Definition: ISettingCallback.h:16
std::shared_ptr< CSetting > CreateSetting(const std::string &settingType, const std::string &settingId, CSettingsManager *settingsManager=nullptr) const override
Creates a new setting of the given custom setting type.
Definition: AddonSettings.cpp:169
Definition: AddonSettings.h:38
bool Load() override
Loads the setting values.
Definition: AddonSettings.h:51
Definition: SettingCreator.h:13
Definition: SettingDefinitions.h:85
Definition: settings.py:1
Basic wrapper around CSettingsManager providing the framework for properly setting up the settings ma...
Definition: SettingsBase.h:31
Settings manager responsible for initializing, loading and handling all settings. ...
Definition: SettingsManager.h:41
Group of settings being part of a category.
Definition: SettingSection.h:28
bool Save() override
Saves the setting values.
Definition: AddonSettings.cpp:438
Definition: SettingDependency.h:111
Definition: Addon.cpp:39
bool Initialize() override
Initializes the setting system with the generic settings definition and platform specific setting def...
Definition: AddonSettings.h:48
void OnSettingAction(const std::shared_ptr< const CSetting > &setting) override
The given setting has been activated.
Definition: AddonSettings.cpp:180