3 * Copyright (C) 2013 Team XBMC
6 * This Program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2, or (at your option)
11 * This Program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with XBMC; see the file COPYING. If not, see
18 * <http://www.gnu.org/licenses/>.
27 #include <boost/shared_ptr.hpp>
30 #include "ISettingCallback.h"
31 #include "ISettingControl.h"
32 #include "SettingDependency.h"
33 #include "SettingUpdate.h"
34 #include "threads/SharedSection.h"
38 \brief Basic setting types available in the settings system.
52 \brief Levels which every setting is assigned to.
55 SettingLevelBasic = 0,
63 SettingOptionsTypeNone = 0,
64 SettingOptionsTypeStatic,
65 SettingOptionsTypeDynamic
68 typedef std::pair<int, int> StaticIntegerSettingOption;
69 typedef std::vector<StaticIntegerSettingOption> StaticIntegerSettingOptions;
70 typedef std::pair<std::string, int> DynamicIntegerSettingOption;
71 typedef std::vector<DynamicIntegerSettingOption> DynamicIntegerSettingOptions;
72 typedef std::pair<std::string, std::string> DynamicStringSettingOption;
73 typedef std::vector<DynamicStringSettingOption> DynamicStringSettingOptions;
77 \brief Setting base class containing all the properties which are common to
78 all settings independent of the setting type.
80 class CSetting : public ISetting,
81 protected ISettingCallback
84 CSetting(const std::string &id, CSettingsManager *settingsManager = NULL);
85 CSetting(const std::string &id, const CSetting &setting);
88 virtual CSetting* Clone(const std::string &id) const = 0;
90 virtual bool Deserialize(const TiXmlNode *node, bool update = false);
92 virtual int GetType() const = 0;
93 virtual bool FromString(const std::string &value) = 0;
94 virtual std::string ToString() const = 0;
95 virtual bool Equals(const std::string &value) const = 0;
96 virtual bool CheckValidity(const std::string &value) const = 0;
97 virtual void Reset() = 0;
99 int GetLabel() const { return m_label; }
100 void SetLabel(int label) { m_label = label; }
101 int GetHelp() const { return m_help; }
102 void SetHelp(int help) { m_help = help; }
103 bool IsEnabled() const;
104 const std::string& GetParent() const { return m_parentSetting; }
105 SettingLevel GetLevel() const { return m_level; }
106 const ISettingControl* GetControl() const { return m_control; }
107 void SetControl(ISettingControl* control) { m_control = control; }
108 const SettingDependencies& GetDependencies() const { return m_dependencies; }
109 const std::set<CSettingUpdate>& GetUpdates() const { return m_updates; }
111 // overrides of ISetting
112 virtual bool IsVisible() const;
115 friend class CSettingsManager;
117 virtual bool OnSettingChanging(const CSetting *setting);
118 virtual void OnSettingChanged(const CSetting *setting);
119 virtual void OnSettingAction(const CSetting *setting);
120 virtual bool OnSettingUpdate(CSetting* &setting, const char *oldSettingId, const TiXmlNode *oldSettingNode);
121 virtual void OnSettingPropertyChanged(const CSetting *setting, const char *propertyName);
123 void Copy(const CSetting &setting);
125 ISettingCallback *m_callback;
128 std::string m_parentSetting;
129 SettingLevel m_level;
130 ISettingControl *m_control;
131 SettingDependencies m_dependencies;
132 std::set<CSettingUpdate> m_updates;
134 CSharedSection m_critical;
137 typedef boost::shared_ptr<CSetting> SettingPtr;
139 typedef std::vector<CSetting *> SettingList;
140 typedef std::vector<SettingPtr> SettingPtrList;
144 \brief List setting implementation
147 class CSettingList : public CSetting
150 CSettingList(const std::string &id, CSetting *settingDefinition, CSettingsManager *settingsManager = NULL);
151 CSettingList(const std::string &id, const CSettingList &setting);
152 virtual ~CSettingList();
154 virtual CSetting* Clone(const std::string &id) const;
156 virtual bool Deserialize(const TiXmlNode *node, bool update = false);
158 virtual int GetType() const { return SettingTypeList; }
159 virtual bool FromString(const std::string &value);
160 virtual std::string ToString() const;
161 virtual bool Equals(const std::string &value) const;
162 virtual bool CheckValidity(const std::string &value) const;
163 virtual void Reset();
165 int GetElementType() const;
166 const CSetting* GetDefinition() const { return m_definition; }
168 bool FromString(const std::vector<std::string> &value);
170 const SettingPtrList& GetValue() const { return m_values; }
171 bool SetValue(const SettingPtrList &values);
172 const SettingPtrList& GetDefault() const { return m_defaults; }
173 void SetDefault(const SettingPtrList &values);
176 void copy(const CSettingList &setting);
177 static void copy(const SettingPtrList &srcValues, SettingPtrList &dstValues);
178 bool fromString(const std::string &strValue, SettingPtrList &values) const;
179 bool fromValues(const std::vector<std::string> &strValues, SettingPtrList &values) const;
180 std::string toString(const SettingPtrList &values) const;
182 SettingPtrList m_values;
183 SettingPtrList m_defaults;
184 CSetting *m_definition;
185 std::string m_delimiter;
192 \brief Boolean setting implementation.
195 class CSettingBool : public CSetting
198 CSettingBool(const std::string &id, CSettingsManager *settingsManager = NULL);
199 CSettingBool(const std::string &id, const CSettingBool &setting);
200 CSettingBool(const std::string &id, int label, bool value, CSettingsManager *settingsManager = NULL);
201 virtual ~CSettingBool() { }
203 virtual CSetting* Clone(const std::string &id) const;
205 virtual bool Deserialize(const TiXmlNode *node, bool update = false);
207 virtual int GetType() const { return SettingTypeBool; }
208 virtual bool FromString(const std::string &value);
209 virtual std::string ToString() const;
210 virtual bool Equals(const std::string &value) const;
211 virtual bool CheckValidity(const std::string &value) const;
212 virtual void Reset() { SetValue(m_default); }
214 bool GetValue() const { CSharedLock lock(m_critical); return m_value; }
215 bool SetValue(bool value);
216 bool GetDefault() const { return m_default; }
217 void SetDefault(bool value);
220 void copy(const CSettingBool &setting);
221 bool fromString(const std::string &strValue, bool &value) const;
229 \brief Integer setting implementation
232 class CSettingInt : public CSetting
235 CSettingInt(const std::string &id, CSettingsManager *settingsManager = NULL);
236 CSettingInt(const std::string &id, const CSettingInt &setting);
237 CSettingInt(const std::string &id, int label, int value, int minimum, int step, int maximum, CSettingsManager *settingsManager = NULL);
238 CSettingInt(const std::string &id, int label, int value, const StaticIntegerSettingOptions &options, CSettingsManager *settingsManager = NULL);
239 virtual ~CSettingInt() { }
241 virtual CSetting* Clone(const std::string &id) const;
243 virtual bool Deserialize(const TiXmlNode *node, bool update = false);
245 virtual int GetType() const { return SettingTypeInteger; }
246 virtual bool FromString(const std::string &value);
247 virtual std::string ToString() const;
248 virtual bool Equals(const std::string &value) const;
249 virtual bool CheckValidity(const std::string &value) const;
250 virtual bool CheckValidity(int value) const;
251 virtual void Reset() { SetValue(m_default); }
253 int GetValue() const { CSharedLock lock(m_critical); return m_value; }
254 bool SetValue(int value);
255 int GetDefault() const { return m_default; }
256 void SetDefault(int value);
258 int GetMinimum() const { return m_min; }
259 int GetStep() const { return m_step; }
260 int GetMaximum() const { return m_max; }
262 SettingOptionsType GetOptionsType() const;
263 const StaticIntegerSettingOptions& GetOptions() const { return m_options; }
264 const std::string& GetOptionsFiller() const { return m_optionsFiller; }
265 DynamicIntegerSettingOptions UpdateDynamicOptions();
268 void copy(const CSettingInt &setting);
269 static bool fromString(const std::string &strValue, int &value);
276 StaticIntegerSettingOptions m_options;
277 std::string m_optionsFiller;
278 DynamicIntegerSettingOptions m_dynamicOptions;
283 \brief Real number setting implementation.
286 class CSettingNumber : public CSetting
289 CSettingNumber(const std::string &id, CSettingsManager *settingsManager = NULL);
290 CSettingNumber(const std::string &id, const CSettingNumber &setting);
291 CSettingNumber(const std::string &id, int label, float value, float minimum, float step, float maximum, CSettingsManager *settingsManager = NULL);
292 virtual ~CSettingNumber() { }
294 virtual CSetting* Clone(const std::string &id) const;
296 virtual bool Deserialize(const TiXmlNode *node, bool update = false);
298 virtual int GetType() const { return SettingTypeNumber; }
299 virtual bool FromString(const std::string &value);
300 virtual std::string ToString() const;
301 virtual bool Equals(const std::string &value) const;
302 virtual bool CheckValidity(const std::string &value) const;
303 virtual bool CheckValidity(double value) const;
304 virtual void Reset() { SetValue(m_default); }
306 double GetValue() const { CSharedLock lock(m_critical); return m_value; }
307 bool SetValue(double value);
308 double GetDefault() const { return m_default; }
309 void SetDefault(double value);
311 double GetMinimum() const { return m_min; }
312 double GetStep() const { return m_step; }
313 double GetMaximum() const { return m_max; }
316 virtual void copy(const CSettingNumber &setting);
317 static bool fromString(const std::string &strValue, double &value);
328 \brief String setting implementation.
331 class CSettingString : public CSetting
334 CSettingString(const std::string &id, CSettingsManager *settingsManager = NULL);
335 CSettingString(const std::string &id, const CSettingString &setting);
336 CSettingString(const std::string &id, int label, const std::string &value, CSettingsManager *settingsManager = NULL);
337 virtual ~CSettingString() { }
339 virtual CSetting* Clone(const std::string &id) const;
341 virtual bool Deserialize(const TiXmlNode *node, bool update = false);
343 virtual int GetType() const { return SettingTypeString; }
344 virtual bool FromString(const std::string &value) { return SetValue(value); }
345 virtual std::string ToString() const { return m_value; }
346 virtual bool Equals(const std::string &value) const { return m_value == value; }
347 virtual bool CheckValidity(const std::string &value) const;
348 virtual void Reset() { SetValue(m_default); }
350 virtual const std::string& GetValue() const { CSharedLock lock(m_critical); return m_value; }
351 virtual bool SetValue(const std::string &value);
352 virtual const std::string& GetDefault() const { return m_default; }
353 virtual void SetDefault(const std::string &value);
355 virtual bool AllowEmpty() const { return m_allowEmpty; }
357 SettingOptionsType GetOptionsType() const;
358 const std::string& GetOptionsFiller() const { return m_optionsFiller; }
359 DynamicStringSettingOptions UpdateDynamicOptions();
362 virtual void copy(const CSettingString &setting);
365 std::string m_default;
367 std::string m_optionsFiller;
368 DynamicStringSettingOptions m_dynamicOptions;
373 \brief Action setting implementation.
375 A setting action will trigger a call to the OnSettingAction() callback method
380 class CSettingAction : public CSetting
383 CSettingAction(const std::string &id, CSettingsManager *settingsManager = NULL);
384 CSettingAction(const std::string &id, const CSettingAction &setting);
385 virtual ~CSettingAction() { }
387 virtual CSetting* Clone(const std::string &id) const;
389 virtual bool Deserialize(const TiXmlNode *node, bool update = false);
391 virtual int GetType() const { return SettingTypeAction; }
392 virtual bool FromString(const std::string &value) { return false; }
393 virtual std::string ToString() const { return ""; }
394 virtual bool Equals(const std::string &value) const { return false; }
395 virtual bool CheckValidity(const std::string &value) const { return false; }
396 virtual void Reset() { }
398 // this needs to be public so it can be triggered when activated
399 // by the user in the GUI.
400 virtual void OnSettingAction(const CSetting *setting) { return CSetting::OnSettingAction(this); }