1//////////////////////////////////////////////////////////////////////
2// This file is part of Remere's Map Editor
3//////////////////////////////////////////////////////////////////////
4// Remere's Map Editor is free software: you can redistribute it and/or modify
5// it under the terms of the GNU General Public License as published by
6// the Free Software Foundation, either version 3 of the License, or
7// (at your option) any later version.
8//
9// Remere's Map Editor is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12// GNU General Public License for more details.
13//
14// You should have received a copy of the GNU General Public License
15// along with this program. If not, see <http://www.gnu.org/licenses/>.
16//////////////////////////////////////////////////////////////////////
17
18#ifndef RME_SETTINGS_H_
19#define RME_SETTINGS_H_
20
21#include "main.h"
22
23namespace Config {
24 enum Key {
25 NONE,
26 VERSION_ID,
27
28 USE_CUSTOM_DATA_DIRECTORY,
29 DATA_DIRECTORY,
30 EXTENSIONS_DIRECTORY,
31
32 MERGE_MOVE,
33 TEXTURE_MANAGEMENT,
34 TEXTURE_CLEAN_PULSE,
35 TEXTURE_CLEAN_THRESHOLD,
36 TEXTURE_LONGEVITY,
37 HARD_REFRESH_RATE,
38 USE_MEMCACHED_SPRITES,
39 USE_MEMCACHED_SPRITES_TO_SAVE,
40 SOFTWARE_CLEAN_THRESHOLD,
41 SOFTWARE_CLEAN_SIZE,
42 TRANSPARENT_FLOORS,
43 TRANSPARENT_ITEMS,
44 SHOW_INGAME_BOX,
45 SHOW_GRID,
46 SHOW_EXTRA,
47 SHOW_ALL_FLOORS,
48 SHOW_CREATURES,
49 SHOW_SPAWNS,
50 SHOW_HOUSES,
51 SHOW_SHADE,
52 SHOW_SPECIAL_TILES,
53 SHOW_ZONE_AREAS,
54 HIGHLIGHT_ITEMS,
55 SHOW_ITEMS,
56 SHOW_BLOCKING,
57 SHOW_TOOLTIPS,
58 SHOW_PREVIEW,
59 SHOW_WALL_HOOKS,
60 SHOW_AS_MINIMAP,
61 SHOW_ONLY_TILEFLAGS,
62 SHOW_ONLY_MODIFIED_TILES,
63 HIDE_ITEMS_WHEN_ZOOMED,
64 GROUP_ACTIONS,
65 SCROLL_SPEED,
66 ZOOM_SPEED,
67 UNDO_SIZE,
68 UNDO_MEM_SIZE,
69 MERGE_PASTE,
70 SELECTION_TYPE,
71 COMPENSATED_SELECT,
72 BORDER_IS_GROUND,
73 BORDERIZE_PASTE,
74 BORDERIZE_DRAG,
75 BORDERIZE_DRAG_THRESHOLD,
76 BORDERIZE_PASTE_THRESHOLD,
77 BORDERIZE_DELETE,
78 ICON_BACKGROUND,
79 ALWAYS_MAKE_BACKUP,
80 USE_AUTOMAGIC,
81 SAME_GROUND_TYPE_BORDER,
82 WALLS_REPEL_BORDERS,
83 LAYER_CARPETS,
84 CUSTOM_BORDER_ENABLED,
85 CUSTOM_BORDER_ID,
86 HOUSE_BRUSH_REMOVE_ITEMS,
87 AUTO_ASSIGN_DOORID,
88 ERASER_LEAVE_UNIQUE,
89 DOODAD_BRUSH_ERASE_LIKE,
90 WARN_FOR_DUPLICATE_ID,
91 USE_UPDATER,
92 USE_OTBM_4_FOR_ALL_MAPS,
93 USE_OTGZ,
94 SAVE_WITH_OTB_MAGIC_NUMBER,
95 REPLACE_SIZE,
96
97 USE_LARGE_CONTAINER_ICONS,
98 USE_LARGE_CHOOSE_ITEM_ICONS,
99 USE_LARGE_TERRAIN_TOOLBAR,
100 USE_LARGE_DOODAD_SIZEBAR,
101 USE_LARGE_ITEM_SIZEBAR,
102 USE_LARGE_HOUSE_SIZEBAR,
103 USE_LARGE_RAW_SIZEBAR,
104 USE_GUI_SELECTION_SHADOW,
105 PALETTE_COL_COUNT,
106 PALETTE_TERRAIN_STYLE,
107 PALETTE_DOODAD_STYLE,
108 PALETTE_ITEM_STYLE,
109 PALETTE_RAW_STYLE,
110
111 ASSETS_DATA_DIRS,
112 DEFAULT_CLIENT_VERSION,
113 CHECK_SIGNATURES,
114
115 CURSOR_RED,
116 CURSOR_GREEN,
117 CURSOR_BLUE,
118 CURSOR_ALPHA,
119
120 CURSOR_ALT_RED,
121 CURSOR_ALT_GREEN,
122 CURSOR_ALT_BLUE,
123 CURSOR_ALT_ALPHA,
124
125 SCREENSHOT_DIRECTORY,
126 SCREENSHOT_FORMAT,
127 MAX_SPAWN_RADIUS,
128 CURRENT_SPAWN_RADIUS,
129 AUTO_CREATE_SPAWN,
130 DEFAULT_SPAWNTIME,
131 SWITCH_MOUSEBUTTONS,
132 DOUBLECLICK_PROPERTIES,
133 LISTBOX_EATS_ALL_EVENTS,
134 RAW_LIKE_SIMONE,
135 WORKER_THREADS,
136 COPY_POSITION_FORMAT,
137
138 GOTO_WEBSITE_ON_BOOT,
139 INDIRECTORY_INSTALLATION,
140 AUTOCHECK_FOR_UPDATES,
141 ONLY_ONE_INSTANCE,
142 SHOW_TILESET_EDITOR,
143
144 PALETTE_LAYOUT,
145 MINIMAP_VISIBLE,
146 MINIMAP_LAYOUT,
147 MINIMAP_UPDATE_DELAY,
148 MINIMAP_VIEW_BOX,
149 MINIMAP_EXPORT_DIR,
150 TILESET_EXPORT_DIR,
151 WINDOW_HEIGHT,
152 WINDOW_WIDTH,
153 WINDOW_MAXIMIZED,
154 WELCOME_DIALOG,
155
156 NUMERICAL_HOTKEYS,
157 RECENT_FILES,
158
159 RECENT_EDITED_MAP_PATH,
160 RECENT_EDITED_MAP_POSITION,
161
162 FIND_ITEM_MODE,
163 JUMP_TO_ITEM_MODE,
164
165 SHOW_TOOLBAR_STANDARD,
166 SHOW_TOOLBAR_BRUSHES,
167 SHOW_TOOLBAR_POSITION,
168 SHOW_TOOLBAR_SIZES,
169 TOOLBAR_STANDARD_LAYOUT,
170 TOOLBAR_BRUSHES_LAYOUT,
171 TOOLBAR_POSITION_LAYOUT,
172 TOOLBAR_SIZES_LAYOUT,
173
174 // add new settings at the end to make sure nothing gets misread
175 DRAW_LOCKED_DOOR,
176 HIGHLIGHT_LOCKED_DOORS,
177 PALETTE_COLLECTION_STYLE,
178 USE_LARGE_COLLECTION_TOOLBAR,
179 SHOW_LIGHTS,
180 SHOW_LIGHT_STR,
181 SHOW_TECHNICAL_ITEMS,
182 SHOW_WAYPOINTS,
183
184 EXPERIMENTAL_FOG,
185
186 SHOW_TOWNS,
187 ALWAYS_SHOW_ZONES,
188 EXT_HOUSE_SHADER,
189
190 AUTO_SELECT_RAW_ON_RIGHTCLICK,
191 AUTO_SAVE_ENABLED,
192 AUTO_SAVE_INTERVAL,
193
194 // Network/Live settings
195 LIVE_HOST,
196 LIVE_PORT,
197 LIVE_PASSWORD,
198 LIVE_USERNAME,
199
200 DARK_MODE,
201 DARK_MODE_CUSTOM_COLOR,
202 DARK_MODE_RED,
203 DARK_MODE_GREEN,
204 DARK_MODE_BLUE,
205
206 // House creation settings
207 MAX_HOUSE_TILES,
208 HOUSE_FLOOR_SCAN,
209 AUTO_DETECT_HOUSE_EXIT,
210
211 // LOD (Level of Detail) settings
212 TOOLTIP_MAX_ZOOM,
213 GROUND_ONLY_ZOOM_THRESHOLD,
214 ITEM_DISPLAY_ZOOM_THRESHOLD,
215 SPECIAL_FEATURES_ZOOM_THRESHOLD,
216 ANIMATION_ZOOM_THRESHOLD,
217 EFFECTS_ZOOM_THRESHOLD,
218 LIGHT_ZOOM_THRESHOLD,
219 SHADE_ZOOM_THRESHOLD,
220 TOWN_ZONE_ZOOM_THRESHOLD,
221 GRID_ZOOM_THRESHOLD,
222
223 // Palette grid settings
224 GRID_CHUNK_SIZE,
225 GRID_VISIBLE_ROWS_MARGIN,
226
227 // Website link control setting
228 LAST_WEBSITES_OPEN_TIME,
229
230 LAST,
231 };
232
233 // Hotkey settings
234 const std::string HOTKEY_PREFIX = "hotkey.";
235
236 enum HotkeySettings : uint32_t {
237 HOTKEY_BASE = 1000, // Start at 1000 to avoid conflicts
238 // Add more specific hotkey settings as needed
239 };
240}
241
242class wxConfigBase;
243
244class Settings {
245public:
246 Settings();
247 ~Settings();
248
249 bool getBoolean(uint32_t key) const;
250 int getInteger(uint32_t key) const;
251 float getFloat(uint32_t key) const;
252 std::string getString(uint32_t key) const;
253
254 void setInteger(uint32_t key, int newval);
255 void setFloat(uint32_t key, float newval);
256 void setString(uint32_t key, std::string newval);
257
258 wxConfigBase& getConfigObject();
259 void setDefaults() {
260 IO(DEFAULT);
261 }
262 void load();
263 void save(bool endoftheworld = false);
264
265public:
266 enum DynamicType {
267 TYPE_NONE,
268 TYPE_STR,
269 TYPE_INT,
270 TYPE_FLOAT,
271 };
272 class DynamicValue {
273 public:
274 DynamicValue() :
275 type(TYPE_NONE) {
276 intval = 0;
277 };
278 DynamicValue(DynamicType t) :
279 type(t) {
280 if (t == TYPE_STR) {
281 strval = nullptr;
282 } else if (t == TYPE_INT) {
283 intval = 0;
284 } else if (t == TYPE_FLOAT) {
285 floatval = 0.0;
286 } else {
287 intval = 0;
288 }
289 };
290 ~DynamicValue() {
291 if (type == TYPE_STR) {
292 delete strval;
293 }
294 }
295 DynamicValue(const DynamicValue& dv) :
296 type(dv.type) {
297 if (dv.type == TYPE_STR) {
298 strval = newd std::string(*dv.strval);
299 } else if (dv.type == TYPE_INT) {
300 intval = dv.intval;
301 } else if (dv.type == TYPE_FLOAT) {
302 floatval = dv.floatval;
303 } else {
304 intval = 0;
305 }
306 };
307
308 std::string str();
309
310 private:
311 DynamicType type;
312 union {
313 int intval;
314 std::string* strval;
315 float floatval;
316 };
317
318 friend class Settings;
319 };
320
321private:
322 enum IOMode {
323 DEFAULT,
324 LOAD,
325 SAVE,
326 };
327 void IO(IOMode mode);
328 std::vector<DynamicValue> store;
329#ifdef __WINDOWS__
330 bool use_file_cfg;
331#endif
332};
333
334extern Settings g_settings;
335
336#endif
337