annotate foosdk/sdk/foobar2000/SDK/advconfig_impl.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 // advconfig_impl.h : mainline (foobar2000 v2.0) implementation of advconfig objects
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #include "advconfig.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 //! Standard implementation of advconfig_branch. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 //! Usage: no need to use this class directly - use advconfig_branch_factory instead.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 class advconfig_branch_impl : public advconfig_branch {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 advconfig_branch_impl(const char* p_name, const GUID& p_guid, const GUID& p_parent, double p_priority) : m_name(p_name), m_guid(p_guid), m_parent(p_parent), m_priority(p_priority) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 void get_name(pfc::string_base& p_out) override { p_out = m_name; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 GUID get_guid() override { return m_guid; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 GUID get_parent() override { return m_parent; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 void reset() override {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 double get_sort_priority() override { return m_priority; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 pfc::string8 m_name;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 GUID m_guid, m_parent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 const double m_priority;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 #if FOOBAR2000_TARGET_VERSION < 81
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 #include "advconfig_impl_legacy.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 #include "configStore.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 #include "configCache.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 #include "cfg_var_legacy.h" // cfg_var_reader
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 namespace fb2k {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 pfc::string8 advconfig_autoName(const GUID& id);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 pfc::string8 advconfig_autoName(const GUID& id, const char * specified);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 //! Standard implementation of advconfig_entry_checkbox. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 class advconfig_entry_checkbox_impl : public advconfig_entry_checkbox_v2, private cfg_var_legacy::cfg_var_reader {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 advconfig_entry_checkbox_impl(const char* p_name, const char * varName, const GUID& p_guid, const GUID& p_parent, double p_priority, bool p_initialstate, bool isRadio = false, uint32_t flags = 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 : cfg_var_reader(p_guid), m_name(p_name), m_varName(varName), m_guid(p_guid), m_initialstate(p_initialstate), m_parent(p_parent), m_priority(p_priority), m_isRadio(isRadio), m_flags(flags) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 void get_name(pfc::string_base& p_out) override { p_out = m_name; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 GUID get_guid() override { return m_guid; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 GUID get_parent() override { return m_parent; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 void reset() override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 bool get_state() override { return get_state_(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 void set_state(bool p_state) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 bool is_radio() override { return m_isRadio; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 double get_sort_priority() override { return m_priority; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 bool get_default_state() override { return m_initialstate; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 t_uint32 get_preferences_flags() override { return m_flags; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 bool get_state_() const;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 bool get_default_state_() const { return m_initialstate; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 const char* varName() const { return m_varName; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 #ifdef FOOBAR2000_HAVE_CFG_VAR_LEGACY
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 // cfg_var_reader
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 void set_data_raw(stream_reader* p_stream, t_size p_sizehint, abort_callback& p_abort) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 const pfc::string8 m_name, m_varName;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 const GUID m_guid;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 const bool m_initialstate;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 const bool m_isRadio;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 const uint32_t m_flags;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 const GUID m_parent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 const double m_priority;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 //! Service factory helper around standard advconfig_branch implementation. Use this class to register your own Advanced Preferences branches. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 //! Usage: static advconfig_branch_factory mybranch(name, branchID, parentBranchID, priority);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 class advconfig_branch_factory : public service_factory_single_t<advconfig_branch_impl> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 advconfig_branch_factory(const char* p_name, const GUID& p_guid, const GUID& p_parent, double p_priority)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 : service_factory_single_t<advconfig_branch_impl>(p_name, p_guid, p_parent, p_priority) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 template<bool is_radio>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 class advconfig_checkbox_factory_ : public service_factory_single_t<advconfig_entry_checkbox_impl> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 advconfig_checkbox_factory_(const char* name, const GUID& guid, const GUID& parent, double priority, bool initialstate, uint32_t flags = 0) : service_factory_single_t<advconfig_entry_checkbox_impl>(name, fb2k::advconfig_autoName(guid), guid, parent, priority, initialstate, is_radio, flags) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 advconfig_checkbox_factory_(const char* name, const char* varName, const GUID& guid, const GUID& parent, double priority, bool initial, uint32_t flags = 0) : service_factory_single_t<advconfig_entry_checkbox_impl>(name, varName, guid, parent, priority, initial, is_radio, flags) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 bool get() const { return this->get_static_instance().get_state_(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 void set(bool val) { this->get_static_instance().set_state(val); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 operator bool() const { return get(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 bool operator=(bool val) { set(val); return val; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 const char* varName() const { return this->get_static_instance().varName(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 typedef advconfig_checkbox_factory_<false> advconfig_checkbox_factory;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 typedef advconfig_checkbox_factory_<true> advconfig_radio_factory;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 #if 0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 // OBSOLETE, use advconfig_checkbox_factory / advconfig_radio_factory
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 template<bool p_is_radio, uint32_t prefFlags = 0>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 class advconfig_checkbox_factory_t : public advconfig_checkbox_factory_<p_is_radio> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 advconfig_checkbox_factory_t(const char* p_name, const GUID& p_guid, const GUID& p_parent, double p_priority, bool p_initialstate) : advconfig_checkbox_factory_<p_is_radio>(p_name, fb2k::advconfig_autoName(p_guid), p_guid, p_parent, p_priority, p_initialstate, prefFlags) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 struct advconfig_entry_string_desc { const char* name; const char* varName; GUID guid, parent; double priority = 0; const char* initial = ""; uint32_t prefsFlags = 0; uint32_t flags = 0; };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 //! Standard advconfig_entry_string implementation. Use advconfig_string_factory to register your own string entries in Advanced Preferences instead of using this class directly.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 class advconfig_entry_string_impl : public advconfig_entry_string_v2, private cfg_var_legacy::cfg_var_reader {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 advconfig_entry_string_impl(advconfig_entry_string_desc const& arg) : cfg_var_reader(arg.guid), m_name(arg.name), m_varName(fb2k::advconfig_autoName(arg.guid, arg.varName)), m_guid(arg.guid), m_parent(arg.parent), m_priority(arg.priority), m_initialstate(arg.initial), m_prefFlags(arg.prefsFlags), m_flags(arg.flags) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 advconfig_entry_string_impl(const char* p_name, const char * p_varName, const GUID& p_guid, const GUID& p_parent, double p_priority, const char* p_initialstate, t_uint32 p_prefFlags)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 : cfg_var_reader(p_guid), m_name(p_name), m_varName(p_varName), m_guid(p_guid), m_parent(p_parent), m_initialstate(p_initialstate), m_priority(p_priority), m_prefFlags(p_prefFlags) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 void get_name(pfc::string_base& p_out) override { p_out = m_name; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 GUID get_guid() override { return m_guid; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 GUID get_parent() override { return m_parent; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 void reset() override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 double get_sort_priority() override { return m_priority; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 void get_state(pfc::string_base& p_out) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 void set_state(const char* p_string, t_size p_length = SIZE_MAX) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 t_uint32 get_flags() override { return m_flags; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 void get_default_state(pfc::string_base& out) override{ out = m_initialstate; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 t_uint32 get_preferences_flags() override { return m_prefFlags; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 #ifdef FOOBAR2000_HAVE_CFG_VAR_LEGACY
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 // cfg_var_reader
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 void set_data_raw(stream_reader* p_stream, t_size p_sizehint, abort_callback& p_abort) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 const pfc::string8 m_initialstate, m_name, m_varName;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 const GUID m_guid, m_parent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 const double m_priority;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 const t_uint32 m_prefFlags;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 const uint32_t m_flags = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 //! Service factory helper around standard advconfig_entry_string implementation. Use this class to register your own string entries in Advanced Preferences. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 //! Usage: static advconfig_string_factory mystring(name, itemID, branchID, priority, initialValue);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 class advconfig_string_factory : public service_factory_single_t<advconfig_entry_string_impl> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 advconfig_string_factory(const char* p_name, const char * varName, const GUID& p_guid, const GUID& p_parent, double p_priority, const char* p_initialstate, t_uint32 p_prefFlags = 0) : service_factory_single_t<advconfig_entry_string_impl>(p_name, varName, p_guid, p_parent, p_priority, p_initialstate, p_prefFlags) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 advconfig_string_factory(const char* p_name, const GUID& p_guid, const GUID& p_parent, double p_priority, const char* p_initialstate, t_uint32 p_prefFlags = 0) : service_factory_single_t<advconfig_entry_string_impl>(p_name, fb2k::advconfig_autoName(p_guid), p_guid, p_parent, p_priority, p_initialstate, p_prefFlags) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 advconfig_string_factory(advconfig_entry_string_desc const& arg) : service_factory_single_t<advconfig_entry_string_impl>(arg) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 void get(pfc::string_base& out) { get_static_instance().get_state(out); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 pfc::string8 get() { pfc::string8 temp; get(temp); return temp; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 void set(const char* in) { get_static_instance().set_state(in); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 // Thread hacks no longer needed
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 typedef advconfig_string_factory advconfig_string_factory_MT;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 //! Special advconfig_entry_string implementation - implements integer entries. Use advconfig_integer_factory to register your own integer entries in Advanced Preferences instead of using this class directly.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 template<typename int_t_>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 class advconfig_entry_integer_impl_ : public advconfig_entry_string_v2, private cfg_var_legacy::cfg_var_reader {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 typedef int_t_ int_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 advconfig_entry_integer_impl_(const char* p_name, const char * p_varName, const GUID& p_guid, const GUID& p_parent, double p_priority, int_t p_initialstate, int_t p_min, int_t p_max, t_uint32 p_prefFlags)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 : cfg_var_reader(p_guid), m_name(p_name), m_varName(p_varName), m_guid(p_guid), m_parent(p_parent), m_priority(p_priority), m_initval(p_initialstate), m_min(p_min), m_max(p_max), m_prefFlags(p_prefFlags) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 PFC_ASSERT(p_min < p_max);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 void get_name(pfc::string_base& p_out) override { p_out = m_name; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 GUID get_guid() override { return m_guid; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 GUID get_parent() override { return m_parent; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 void reset() override {fb2k::configStore::get()->deleteConfigBool(m_varName);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 double get_sort_priority() override { return m_priority; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 void get_state(pfc::string_base& p_out) override { p_out = pfc::format_int( get_state_int() ); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 void set_state(const char* p_string, t_size p_length) override {set_state_int(pfc::atoi64_ex(p_string, p_length));}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172 t_uint32 get_flags() override { return advconfig_entry_string::flag_is_integer | (is_signed() ? flag_is_signed : 0); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 int_t get_state_int() const {return fb2k::configStore::get()->getConfigInt(m_varName, m_initval);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 void set_state_int(int_t val) { val = pfc::clip_t<int_t>(val, m_min, m_max); fb2k::configStore::get()->setConfigInt(m_varName, val); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 void get_default_state(pfc::string_base& out) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 format(out, m_initval);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 void validate(pfc::string_base& val) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 format(val, pfc::clip_t<int_t>(pfc::atoi64_ex(val, SIZE_MAX), m_min, m_max));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 t_uint32 get_preferences_flags() override { return m_prefFlags; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 #ifdef FOOBAR2000_HAVE_CFG_VAR_LEGACY
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 // cfg_var_reader
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 void set_data_raw(stream_reader* p_stream, t_size p_sizehint, abort_callback& p_abort) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 switch (p_sizehint) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 case 4:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 { int32_t v; p_stream->read_lendian_t(v, p_abort); this->set_state_int(v); } break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 case 8:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 { int64_t v; p_stream->read_lendian_t(v, p_abort); this->set_state_int(v); } break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 void format(pfc::string_base& out, int_t v) const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 if (is_signed()) out = pfc::format_int(v);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 else out = pfc::format_uint(v);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 bool is_signed() const {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 return m_min < 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 const double m_priority;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 const int_t m_initval, m_min, m_max;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 const GUID m_guid, m_parent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 const pfc::string8 m_name, m_varName;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 const t_uint32 m_prefFlags;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 typedef advconfig_entry_integer_impl_<uint64_t> advconfig_entry_integer_impl;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 //! Service factory helper around integer-specialized advconfig_entry_string implementation. Use this class to register your own integer entries in Advanced Preferences. \n
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 //! Usage: static advconfig_integer_factory myint(name, itemID, parentID, priority, initialValue, minValue, maxValue);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 template<typename int_t_>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 class advconfig_integer_factory_ : public service_factory_single_t<advconfig_entry_integer_impl_<int_t_>> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 typedef int_t_ int_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 advconfig_integer_factory_(const char* p_name, const GUID& p_guid, const GUID& p_parent, double p_priority, t_uint64 p_initialstate, t_uint64 p_min, t_uint64 p_max, t_uint32 p_prefFlags = 0) : service_factory_single_t<advconfig_entry_integer_impl>(p_name, fb2k::advconfig_autoName(p_guid), p_guid, p_parent, p_priority, p_initialstate, p_min, p_max, p_prefFlags) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 advconfig_integer_factory_(const char* p_name, const char * p_varName, const GUID& p_guid, const GUID& p_parent, double p_priority, int_t p_initialstate, int_t p_min, int_t p_max, t_uint32 p_prefFlags = 0) : service_factory_single_t<advconfig_entry_integer_impl_<int_t_> >(p_name, p_varName, p_guid, p_parent, p_priority, p_initialstate, p_min, p_max, p_prefFlags) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 int_t get() const { return this->get_static_instance().get_state_int(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 void set(int_t val) { this->get_static_instance().set_state_int(val); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 operator int_t() const { return get(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 int_t operator=(int_t val) { set(val); return val; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 typedef advconfig_integer_factory_<uint64_t> advconfig_integer_factory;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 typedef advconfig_integer_factory_<int64_t> advconfig_signed_integer_factory;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 class advconfig_integer_factory_cached : public advconfig_integer_factory {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 using advconfig_integer_factory::int_t;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238 advconfig_integer_factory_cached(const char* p_name, const char* p_varName, const GUID& p_guid, const GUID& p_parent, double p_priority, int_t p_initialstate, int_t p_min, int_t p_max, t_uint32 p_prefFlags = 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 : advconfig_integer_factory(p_name, p_varName, p_guid, p_parent, p_priority, p_initialstate, p_min, p_max, p_prefFlags),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 m_cache(p_varName, p_initialstate) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 int_t get() { return m_cache.get(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243 void set(int_t v) { m_cache.set(v); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244 operator int_t() { return get(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 fb2k::configIntCache m_cache;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 template<bool is_radio>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 class advconfig_checkbox_factory_cached_ : public advconfig_checkbox_factory_<is_radio> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 advconfig_checkbox_factory_cached_(const char* name, const char* varName, const GUID& guid, const GUID& parent, double priority, bool initial, uint32_t flags = 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 : advconfig_checkbox_factory_<is_radio>(name, varName, guid, parent, priority, initial, flags),
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 m_cache(varName, initial) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 bool get() { return m_cache.get(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 void set(bool v) { m_cache.set(v); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 operator bool() { return get(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260 fb2k::configBoolCache m_cache;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 typedef advconfig_checkbox_factory_cached_<false> advconfig_checkbox_factory_cached;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 typedef advconfig_checkbox_factory_cached_<true> advconfig_radio_factory_cached;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
266 /*
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
267 Advanced Preferences variable declaration examples
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
268
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
269 static advconfig_string_factory mystring("name goes here","configStore var name goes here", myguid,parentguid,0,"asdf");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
270 to retrieve state: pfc::string8 val; mystring.get(val);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
271
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
272 static advconfig_checkbox_factory mycheckbox("name goes here","configStore var name goes here", myguid,parentguid,0,false);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
273 to retrieve state: mycheckbox.get();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
274
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
275 static advconfig_integer_factory myint("name goes here","configStore var name goes herE", myguid,parentguid,0,initialValue,minimumValue,maximumValue);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
276 to retrieve state: myint.get();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
277 */
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
278 #endif