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_MAIN_BAR_H_
19#define RME_MAIN_BAR_H_
20
21#include <wx/docview.h>
22
23namespace MenuBar {
24 struct Action;
25
26 enum ActionID {
27 NEW,
28 OPEN,
29 SAVE,
30 SAVE_AS,
31 GENERATE_MAP,
32 GENERATE_PROCEDURAL_MAP,
33 CLOSE,
34 IMPORT_MAP,
35 IMPORT_MONSTERS,
36 IMPORT_MINIMAP,
37 EXPORT_MINIMAP,
38 EXPORT_TILESETS,
39 RELOAD_DATA,
40 RECENT_FILES,
41 PREFERENCES,
42 EXIT,
43 UNDO,
44 REDO,
45 FIND_ITEM,
46 FIND_CREATURE,
47 REPLACE_ITEMS,
48 AUTOMAGIC,
49 SEARCH_ON_MAP_EVERYTHING,
50 SEARCH_ON_MAP_ZONES,
51 SEARCH_ON_MAP_UNIQUE,
52 SEARCH_ON_MAP_ACTION,
53 SEARCH_ON_MAP_CONTAINER,
54 SEARCH_ON_MAP_WRITEABLE,
55 SEARCH_ON_SELECTION_EVERYTHING,
56 SEARCH_ON_SELECTION_ZONES,
57 SEARCH_ON_SELECTION_UNIQUE,
58 SEARCH_ON_SELECTION_ACTION,
59 SEARCH_ON_SELECTION_CONTAINER,
60 SEARCH_ON_SELECTION_WRITEABLE,
61 SEARCH_ON_SELECTION_ITEM,
62 REPLACE_ON_SELECTION_ITEMS,
63 REMOVE_ON_SELECTION_ITEM,
64 SELECT_MODE_COMPENSATE,
65 SELECT_MODE_CURRENT,
66 SELECT_MODE_LOWER,
67 SELECT_MODE_VISIBLE,
68 // AUTOMAGIC removed - now controlled by 'A' hotkey
69 BORDERIZE_SELECTION,
70 BORDERIZE_MAP,
71 RANDOMIZE_SELECTION,
72 RANDOMIZE_MAP,
73 GOTO_PREVIOUS_POSITION,
74 GOTO_POSITION,
75 JUMP_TO_BRUSH,
76 JUMP_TO_ITEM_BRUSH,
77 CLEAR_INVALID_HOUSES,
78 CLEAR_MODIFIED_STATE,
79 CUT,
80 COPY,
81 PASTE,
82 EDIT_TOWNS,
83 EDIT_ITEMS,
84 EDIT_MONSTERS,
85 MAP_CLEANUP,
86 MAP_REMOVE_ITEMS,
87 MAP_REMOVE_CORPSES,
88 MAP_REMOVE_UNREACHABLE_TILES,
89 MAP_CLEAN_HOUSE_ITEMS,
90 MAP_PROPERTIES,
91 MAP_STATISTICS,
92 VIEW_TOOLBARS_BRUSHES,
93 VIEW_TOOLBARS_POSITION,
94 VIEW_TOOLBARS_SIZES,
95 VIEW_TOOLBARS_STANDARD,
96 NEW_VIEW,
97 // RD
98 NEW_DETACHED_VIEW,
99 TOGGLE_FULLSCREEN,
100 ZOOM_IN,
101 ZOOM_OUT,
102 ZOOM_NORMAL,
103 SHOW_SHADE,
104 SHOW_ALL_FLOORS,
105 GHOST_ITEMS,
106 GHOST_HIGHER_FLOORS,
107 HIGHLIGHT_ITEMS,
108 HIGHLIGHT_LOCKED_DOORS,
109 SHOW_INGAME_BOX,
110 SHOW_LIGHTS,
111 SHOW_LIGHT_STR,
112 SHOW_TECHNICAL_ITEMS,
113 SHOW_WAYPOINTS,
114 SHOW_GRID,
115 SHOW_EXTRA,
116 SHOW_CREATURES,
117 SHOW_SPAWNS,
118 SHOW_SPECIAL,
119 SHOW_ZONES,
120 SHOW_AS_MINIMAP,
121 SHOW_ONLY_COLORS,
122 SHOW_ONLY_MODIFIED,
123 SHOW_HOUSES,
124 SHOW_PATHING,
125 SHOW_TOOLTIPS,
126 SHOW_PREVIEW,
127 SHOW_WALL_HOOKS,
128 SHOW_TOWNS,
129 ALWAYS_SHOW_ZONES,
130 EXT_HOUSE_SHADER,
131 REFRESH_ITEMS,
132
133 WIN_MINIMAP,
134 NEW_PALETTE,
135 TAKE_SCREENSHOT,
136 LIVE_START,
137 LIVE_JOIN,
138 LIVE_CLOSE,
139 SELECT_TERRAIN,
140 SELECT_DOODAD,
141 SELECT_ITEM,
142 SELECT_COLLECTION,
143 SELECT_CREATURE,
144 SELECT_HOUSE,
145 SELECT_WAYPOINT,
146 SELECT_RAW,
147 FLOOR_0,
148 FLOOR_1,
149 FLOOR_2,
150 FLOOR_3,
151 FLOOR_4,
152 FLOOR_5,
153 FLOOR_6,
154 FLOOR_7,
155 FLOOR_8,
156 FLOOR_9,
157 FLOOR_10,
158 FLOOR_11,
159 FLOOR_12,
160 FLOOR_13,
161 FLOOR_14,
162 FLOOR_15,
163 DEBUG_VIEW_DAT,
164 EXTENSIONS,
165 GOTO_WEBSITE,
166 ABOUT,
167 ID_MENU_SERVER_HOST,
168 ID_MENU_SERVER_CONNECT,
169
170 EXPERIMENTAL_FOG,
171 MAP_REMOVE_DUPLICATES,
172 SHOW_HOTKEYS,
173 MAP_MENU_REPLACE_ITEMS,
174 MAP_MENU_GENERATE_ISLAND,
175 MAP_VALIDATE_GROUND,
176 MAP_CREATE_BORDER,
177 MAP_SUMMARIZE,
178
179
180
181 };
182}
183
184class MainFrame;
185
186class MainMenuBar : public wxEvtHandler {
187public:
188 MainMenuBar(MainFrame* frame);
189 virtual ~MainMenuBar();
190
191 bool Load(const FileName&, wxArrayString& warnings, wxString& error);
192
193 // Update
194 // Turn on/off all buttons according to current editor state
195 void Update();
196 void UpdateFloorMenu(); // Only concerns the floor menu
197
198 void AddRecentFile(FileName file);
199 void LoadRecentFiles();
200 void SaveRecentFiles();
201 std::vector<wxString> GetRecentFiles();
202
203 // Interface
204 void EnableItem(MenuBar::ActionID id, bool enable);
205 void CheckItem(MenuBar::ActionID id, bool enable);
206 bool IsItemChecked(MenuBar::ActionID id) const;
207
208 // Event handlers for all menu buttons
209 // File Menu
210 void OnNew(wxCommandEvent& event);
211 void OnOpen(wxCommandEvent& event);
212 void OnGenerateMap(wxCommandEvent& event);
213 void OnGenerateProceduralMap(wxCommandEvent& event);
214 void OnOpenRecent(wxCommandEvent& event);
215 void OnSave(wxCommandEvent& event);
216 void OnSaveAs(wxCommandEvent& event);
217 void OnClose(wxCommandEvent& event);
218 void OnPreferences(wxCommandEvent& event);
219 void OnQuit(wxCommandEvent& event);
220
221 // Import Menu
222 // Export Menu
223 void OnImportMap(wxCommandEvent& event);
224 void OnImportMonsterData(wxCommandEvent& event);
225 void OnImportMinimap(wxCommandEvent& event);
226 void OnExportMinimap(wxCommandEvent& event);
227 void OnExportTilesets(wxCommandEvent& event);
228 void OnReloadDataFiles(wxCommandEvent& event);
229
230 // Edit Menu
231 void OnUndo(wxCommandEvent& event);
232 void OnRedo(wxCommandEvent& event);
233 void OnBorderizeSelection(wxCommandEvent& event);
234 void OnBorderizeMap(wxCommandEvent& event);
235 void OnRandomizeSelection(wxCommandEvent& event);
236 void OnRandomizeMap(wxCommandEvent& event);
237 void OnJumpToBrush(wxCommandEvent& event);
238 void OnJumpToItemBrush(wxCommandEvent& event);
239 void OnGotoPreviousPosition(wxCommandEvent& event);
240 void OnGotoPosition(wxCommandEvent& event);
241 void OnMapRemoveItems(wxCommandEvent& event);
242 void OnMapRemoveCorpses(wxCommandEvent& event);
243 void OnMapRemoveUnreachable(wxCommandEvent& event);
244 void OnClearHouseTiles(wxCommandEvent& event);
245 void OnClearModifiedState(wxCommandEvent& event);
246 void OnSelectionTypeChange(wxCommandEvent& event);
247 void OnCut(wxCommandEvent& event);
248 void OnCopy(wxCommandEvent& event);
249 void OnPaste(wxCommandEvent& event);
250 void OnSearchForItem(wxCommandEvent& event);
251 void OnSearchForCreature(wxCommandEvent& event);
252 void OnReplaceItems(wxCommandEvent& event);
253 void OnSearchForStuffOnMap(wxCommandEvent& event);
254 void OnSearchForZonesOnMap(wxCommandEvent& event);
255 void OnSearchForUniqueOnMap(wxCommandEvent& event);
256 void OnSearchForActionOnMap(wxCommandEvent& event);
257 void OnSearchForContainerOnMap(wxCommandEvent& event);
258 void OnSearchForWriteableOnMap(wxCommandEvent& event);
259
260 // Select menu
261 void OnSearchForStuffOnSelection(wxCommandEvent& event);
262 void OnSearchForZonesOnSelection(wxCommandEvent& event);
263 void OnSearchForUniqueOnSelection(wxCommandEvent& event);
264 void OnSearchForActionOnSelection(wxCommandEvent& event);
265 void OnSearchForContainerOnSelection(wxCommandEvent& event);
266 void OnSearchForWriteableOnSelection(wxCommandEvent& event);
267 void OnSearchForItemOnSelection(wxCommandEvent& event);
268 void OnReplaceItemsOnSelection(wxCommandEvent& event);
269 void OnRemoveItemOnSelection(wxCommandEvent& event);
270
271 // Map menu
272 void OnMapEditTowns(wxCommandEvent& event);
273 void OnMapEditItems(wxCommandEvent& event);
274 void OnMapEditMonsters(wxCommandEvent& event);
275 void OnMapCleanHouseItems(wxCommandEvent& event);
276 void OnMapCleanup(wxCommandEvent& event);
277 void OnMapProperties(wxCommandEvent& event);
278 void OnMapStatistics(wxCommandEvent& event);
279 void OnMapRemoveDuplicates(wxCommandEvent& event);
280 void OnMapValidateGround(wxCommandEvent& event);
281
282 // View Menu
283 void OnToolbars(wxCommandEvent& event);
284 void OnNewView(wxCommandEvent& event);
285 void OnNewDetachedView(wxCommandEvent& event);
286 void OnToggleFullscreen(wxCommandEvent& event);
287 void OnZoomIn(wxCommandEvent& event);
288 void OnZoomOut(wxCommandEvent& event);
289 void OnZoomNormal(wxCommandEvent& event);
290 void OnChangeViewSettings(wxCommandEvent& event);
291
292 // Network menu
293 void OnStartLive(wxCommandEvent& event);
294 void OnJoinLive(wxCommandEvent& event);
295 void OnCloseLive(wxCommandEvent& event);
296 void onServerHost(wxCommandEvent& event);
297 void onServerConnect(wxCommandEvent& event);
298
299 // Window Menu
300 void OnMinimapWindow(wxCommandEvent& event);
301 void OnNewPalette(wxCommandEvent& event);
302 void OnTakeScreenshot(wxCommandEvent& event);
303 void OnSelectTerrainPalette(wxCommandEvent& event);
304 void OnSelectDoodadPalette(wxCommandEvent& event);
305 void OnSelectItemPalette(wxCommandEvent& event);
306 void OnSelectCollectionPalette(wxCommandEvent& event);
307 void OnSelectHousePalette(wxCommandEvent& event);
308 void OnSelectCreaturePalette(wxCommandEvent& event);
309 void OnSelectWaypointPalette(wxCommandEvent& event);
310 void OnSelectRawPalette(wxCommandEvent& event);
311
312 // Floor menu
313 void OnChangeFloor(wxCommandEvent& event);
314
315 // About Menu
316 void OnDebugViewDat(wxCommandEvent& event);
317 void OnListExtensions(wxCommandEvent& event);
318 void OnGotoWebsite(wxCommandEvent& event);
319 void OnAbout(wxCommandEvent& event);
320 void OnShowHotkeys(wxCommandEvent& event);
321
322 // Add to class MainMenuBar private section:
323 void OnRefreshItems(wxCommandEvent& event);
324 void OnGenerateIsland(wxCommandEvent& event);
325 void OnCreateBorder(wxCommandEvent& event);
326 void OnMapSummarize(wxCommandEvent& event);
327
328protected:
329 // Load and returns a menu item, also sets accelerator
330 wxObject* LoadItem(pugi::xml_node node, wxMenu* parent, wxArrayString& warnings, wxString& error);
331 // Checks the items in the menus according to the settings (in config)
332 void LoadValues();
333 void SearchItems(bool unique, bool action, bool container, bool writable, bool zones, bool onSelection = false);
334
335protected:
336 MainFrame* frame;
337 wxMenuBar* menubar;
338
339 // Used so that calling Check on menu items don't trigger events (avoids infinite recursion)
340 bool checking_programmaticly;
341
342 std::map<MenuBar::ActionID, std::list<wxMenuItem*>> items;
343
344 // Hardcoded recent files
345 wxFileHistory recentFiles;
346
347 std::map<std::string, MenuBar::Action*> actions;
348
349 DECLARE_EVENT_TABLE();
350};
351
352namespace MenuBar {
353 struct Action {
354 Action() :
355 id(0), kind(wxITEM_NORMAL) { }
356 Action(std::string s, int id, wxItemKind kind, wxCommandEventFunction handler) :
357 id(id), setting(0), name(s), kind(kind), handler(handler) { }
358
359 int id;
360 int setting;
361 std::string name;
362 wxItemKind kind;
363 wxCommandEventFunction handler;
364 };
365}
366
367// Add this declaration before the MainMenuBar class
368std::vector<std::pair<uint16_t, uint16_t>> ParseRangeString(const wxString& input);
369
370#endif
371