| 21 |
21 |
| 22 #include "common.h" |
22 #include "common.h" |
| 23 #include "str.h" |
23 #include "str.h" |
| 24 |
24 |
| 25 // ============================================================================= |
25 // ============================================================================= |
| 26 // Determine configuration file. Use APPNAME if given. |
26 #define CONFIGFILE APPNAME ".cfg" |
| 27 #ifdef APPNAME |
27 #include <QString> |
| 28 #define CONFIGFILE APPNAME ".ini" |
|
| 29 #else // APPNAME |
|
| 30 #define APPNAME "(unnamed application)" |
|
| 31 #define CONFIGFILE "config.ini" |
|
| 32 #endif // APPNAME |
|
| 33 |
|
| 34 #ifdef CONFIG_WITH_QT |
|
| 35 #include <QString> |
|
| 36 #endif // CONFIG_WITH_QT |
|
| 37 |
|
| 38 // ------------------------------- |
|
| 39 #define CFGSECTNAME(X) CFGSECT_##X |
|
| 40 |
28 |
| 41 #define MAX_INI_LINE 512 |
29 #define MAX_INI_LINE 512 |
| 42 #define NUM_CONFIG (sizeof config::pointers / sizeof *config::pointers) |
30 #define NUM_CONFIG (g_pConfigPointers.size ()) |
| 43 |
31 |
| 44 // ============================================================================= |
32 #define cfg(T, NAME, DEFAULT) \ |
| 45 enum configsection_e { |
33 T##config NAME (DEFAULT, #NAME, #T, #DEFAULT) |
| 46 #define CFG(...) |
34 |
| 47 #define SECT(A,B) CFGSECTNAME (A), |
35 #define extern_cfg(T, NAME) \ |
| 48 #include "cfgdef.h" |
36 extern T##config NAME |
| 49 #undef CFG |
|
| 50 #undef SECT |
|
| 51 NUM_ConfigSections, |
|
| 52 NO_CONFIG_SECTION = -1 |
|
| 53 }; |
|
| 54 |
37 |
| 55 // ============================================================================= |
38 // ============================================================================= |
| 56 enum configtype_e { |
39 enum configtype_e { |
| 57 CONFIG_none, |
40 CONFIG_none, |
| 58 CONFIG_int, |
41 CONFIG_int, |
| 75 |
57 |
| 76 // ------------------------------------------ |
58 // ------------------------------------------ |
| 77 static bool load (); |
59 static bool load (); |
| 78 static bool save (); |
60 static bool save (); |
| 79 static void reset (); |
61 static void reset (); |
| 80 static config* pointers[]; |
|
| 81 static const char* sections[]; |
|
| 82 static const char* sectionNames[]; |
|
| 83 static str dirpath (); |
62 static str dirpath (); |
| 84 static str filepath (); |
63 static str filepath (); |
| 85 }; |
64 }; |
| |
65 |
| |
66 extern std::vector<config*> g_pConfigPointers; |
| 86 |
67 |
| 87 // ============================================================================= |
68 // ============================================================================= |
| 88 #define DEFINE_UNARY_OPERATOR(T, OP) \ |
69 #define DEFINE_UNARY_OPERATOR(T, OP) \ |
| 89 T operator OP () { \ |
70 T operator OP () { \ |
| 90 return (OP value); \ |
71 return (OP value); \ |
| 128 class T##config : public config |
109 class T##config : public config |
| 129 |
110 |
| 130 #define IMPLEMENT_CONFIG(T) \ |
111 #define IMPLEMENT_CONFIG(T) \ |
| 131 T value, defval; \ |
112 T value, defval; \ |
| 132 \ |
113 \ |
| 133 T##config (const configsection_e _sect, const char* _description, \ |
114 T##config (T _defval, const char* _name, const char* _typestring, \ |
| 134 T _defval, const char* _name, const char* _fullname, const char* _typestring, \ |
|
| 135 const char* _defaultstring) \ |
115 const char* _defaultstring) \ |
| 136 { \ |
116 { \ |
| 137 sect = _sect; \ |
|
| 138 description = _description; \ |
|
| 139 value = defval = _defval; \ |
117 value = defval = _defval; \ |
| 140 name = _name; \ |
118 name = _name; \ |
| 141 fullname = _fullname; \ |
|
| 142 typestring = _typestring; \ |
119 typestring = _typestring; \ |
| 143 defaultstring = _defaultstring; \ |
120 defaultstring = _defaultstring; \ |
| |
121 g_pConfigPointers.push_back (this); \ |
| 144 } \ |
122 } \ |
| 145 operator T () { \ |
123 operator T () { \ |
| 146 return value; \ |
124 return value; \ |
| 147 } \ |
125 } \ |
| 148 configtype_e getType () { \ |
126 configtype_e getType () { \ |
| 149 return CONFIG_##T; \ |
127 return CONFIG_##T; \ |
| 150 } \ |
128 } \ |
| 151 void resetValue () { \ |
129 virtual void resetValue () { \ |
| 152 value = defval; \ |
130 value = defval; \ |
| 153 } |
131 } |
| 154 |
132 |
| 155 // ============================================================================= |
133 // ============================================================================= |
| 156 CONFIGTYPE (int) { |
134 CONFIGTYPE (int) { |
| 233 IMPLEMENT_CONFIG (bool) |
211 IMPLEMENT_CONFIG (bool) |
| 234 DEFINE_ALL_COMPARE_OPERATORS (bool) |
212 DEFINE_ALL_COMPARE_OPERATORS (bool) |
| 235 DEFINE_ASSIGN_OPERATOR (bool, =) |
213 DEFINE_ASSIGN_OPERATOR (bool, =) |
| 236 }; |
214 }; |
| 237 |
215 |
| 238 // ============================================================================= |
|
| 239 // Extern the configurations now |
|
| 240 #define CFG(TYPE, SECT, NAME, DESCR, DEFAULT) extern TYPE##config SECT##_##NAME; |
|
| 241 #define SECT(...) |
|
| 242 #include "cfgdef.h" |
|
| 243 #undef CFG |
|
| 244 #undef SECT |
|
| 245 |
|
| 246 #endif // __OPTIONS_H__ |
216 #endif // __OPTIONS_H__ |