yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
layout_manager.cc
Go to the documentation of this file.
2
3#include "imgui/imgui.h"
4#include "imgui/imgui_internal.h"
5#include "util/log.h"
6
7namespace yaze {
8namespace editor {
9
11 ImGuiID dockspace_id) {
12 // Don't reinitialize if already set up
13 if (IsLayoutInitialized(type)) {
14 LOG_INFO("LayoutManager",
15 "Layout for editor type %d already initialized, skipping",
16 static_cast<int>(type));
17 return;
18 }
19
20 LOG_INFO("LayoutManager", "Initializing layout for editor type %d",
21 static_cast<int>(type));
22
23 // Clear existing layout for this dockspace
24 ImGui::DockBuilderRemoveNode(dockspace_id);
25 ImGui::DockBuilderAddNode(dockspace_id,
26 ImGuiDockNodeFlags_DockSpace);
27 ImGui::DockBuilderSetNodeSize(dockspace_id, ImGui::GetMainViewport()->Size);
28
29 // Build layout based on editor type
30 switch (type) {
32 BuildOverworldLayout(dockspace_id);
33 break;
35 BuildDungeonLayout(dockspace_id);
36 break;
38 BuildGraphicsLayout(dockspace_id);
39 break;
41 BuildPaletteLayout(dockspace_id);
42 break;
44 BuildScreenLayout(dockspace_id);
45 break;
47 BuildMusicLayout(dockspace_id);
48 break;
50 BuildSpriteLayout(dockspace_id);
51 break;
53 BuildMessageLayout(dockspace_id);
54 break;
56 BuildAssemblyLayout(dockspace_id);
57 break;
59 BuildSettingsLayout(dockspace_id);
60 break;
61 default:
62 LOG_WARN("LayoutManager", "No layout defined for editor type %d",
63 static_cast<int>(type));
64 break;
65 }
66
67 // Finalize the layout
68 ImGui::DockBuilderFinish(dockspace_id);
69
70 // Mark as initialized
72}
73
74void LayoutManager::BuildOverworldLayout(ImGuiID dockspace_id) {
75 // TODO: [EditorManagerRefactor] Implement DockBuilder layout for Overworld
76 // Editor
77 //
78 // Desired layout:
79 // - Left 25%: Tile16 Selector (top 50%) + Tile8 Selector (bottom 50%)
80 // - Center 60%: Main Canvas (full height)
81 // - Right 15%: Area Graphics (top 60%) + Scratch Pad (bottom 40%)
82 //
83 // Additional floating cards:
84 // - Tile16 Editor (floating, 800x600)
85 // - GFX Groups (floating, 700x550)
86 // - Usage Stats (floating, 600x500)
87 // - V3 Settings (floating, 500x600)
88
89 ImGuiID dock_left_id = 0;
90 ImGuiID dock_center_id = 0;
91 ImGuiID dock_right_id = 0;
92
93 // Split dockspace: Left 25% | Center 60% | Right 15%
94 dock_left_id = ImGui::DockBuilderSplitNode(dockspace_id, ImGuiDir_Left, 0.25f,
95 nullptr, &dockspace_id);
96 dock_right_id = ImGui::DockBuilderSplitNode(dockspace_id, ImGuiDir_Right,
97 0.20f, nullptr, &dockspace_id);
98 dock_center_id = dockspace_id; // Center is what remains
99
100 // Split left panel: Tile16 (top) and Tile8 (bottom)
101 ImGuiID dock_left_top = 0;
102 ImGuiID dock_left_bottom = ImGui::DockBuilderSplitNode(
103 dock_left_id, ImGuiDir_Down, 0.50f, nullptr, &dock_left_top);
104
105 // Split right panel: Area Graphics (top) and Scratch Pad (bottom)
106 ImGuiID dock_right_top = 0;
107 ImGuiID dock_right_bottom = ImGui::DockBuilderSplitNode(
108 dock_right_id, ImGuiDir_Down, 0.40f, nullptr, &dock_right_top);
109
110 // Dock windows to their designated nodes
111 ImGui::DockBuilderDockWindow(" Overworld Canvas", dock_center_id);
112 ImGui::DockBuilderDockWindow(" Tile16 Selector", dock_left_top);
113 ImGui::DockBuilderDockWindow(" Tile8 Selector", dock_left_bottom);
114 ImGui::DockBuilderDockWindow(" Area Graphics", dock_right_top);
115 ImGui::DockBuilderDockWindow(" Scratch Pad", dock_right_bottom);
116
117 // Note: Floating windows (Tile16 Editor, GFX Groups, etc.) are not docked
118 // They will appear as floating windows with their configured default positions
119}
120
121void LayoutManager::BuildDungeonLayout(ImGuiID dockspace_id) {
122 // TODO: [EditorManagerRefactor] Implement DockBuilder layout for Dungeon
123 // Editor
124 //
125 // Desired layout:
126 // - Left 20%: Room Selector (top 60%) + Entrances (bottom 40%)
127 // - Center 65%: Room Canvas + Tabs for multiple rooms
128 // - Right 15%: Object Editor (top) + Palette Editor (bottom)
129
130 ImGuiID dock_left_id = 0;
131 ImGuiID dock_center_id = 0;
132 ImGuiID dock_right_id = 0;
133
134 // Split dockspace: Left 20% | Center 65% | Right 15%
135 dock_left_id = ImGui::DockBuilderSplitNode(dockspace_id, ImGuiDir_Left, 0.20f,
136 nullptr, &dockspace_id);
137 dock_right_id = ImGui::DockBuilderSplitNode(dockspace_id, ImGuiDir_Right,
138 0.19f, nullptr, &dockspace_id);
139 dock_center_id = dockspace_id;
140
141 // Split left panel: Room Selector (top 60%) and Entrances (bottom 40%)
142 ImGuiID dock_left_top = 0;
143 ImGuiID dock_left_bottom = ImGui::DockBuilderSplitNode(
144 dock_left_id, ImGuiDir_Down, 0.40f, nullptr, &dock_left_top);
145
146 // Split right panel: Object Editor (top 50%) and Palette Editor (bottom 50%)
147 ImGuiID dock_right_top = 0;
148 ImGuiID dock_right_bottom = ImGui::DockBuilderSplitNode(
149 dock_right_id, ImGuiDir_Down, 0.50f, nullptr, &dock_right_top);
150
151 // Dock windows
152 ImGui::DockBuilderDockWindow(" Rooms List", dock_left_top);
153 ImGui::DockBuilderDockWindow(" Entrances", dock_left_bottom);
154 ImGui::DockBuilderDockWindow(" Object Editor", dock_right_top);
155 ImGui::DockBuilderDockWindow(" Palette Editor", dock_right_bottom);
156
157 // Room tabs and Room Matrix are floating by default
158 // Individual room windows (###RoomCard*) will dock together due to their
159 // window class
160}
161
162void LayoutManager::BuildGraphicsLayout(ImGuiID dockspace_id) {
163 // TODO: [EditorManagerRefactor] Implement DockBuilder layout for Graphics
164 // Editor
165 //
166 // Desired layout:
167 // - Left 30%: Sheet Browser
168 // - Center 50%: Sheet Editor
169 // - Right 20%: Animations (top) + Prototype (bottom)
170
171 ImGuiID dock_left_id = 0;
172 ImGuiID dock_center_id = 0;
173 ImGuiID dock_right_id = 0;
174
175 // Split dockspace: Left 30% | Center 50% | Right 20%
176 dock_left_id = ImGui::DockBuilderSplitNode(dockspace_id, ImGuiDir_Left, 0.30f,
177 nullptr, &dockspace_id);
178 dock_right_id = ImGui::DockBuilderSplitNode(dockspace_id, ImGuiDir_Right,
179 0.29f, nullptr, &dockspace_id);
180 dock_center_id = dockspace_id;
181
182 // Split right panel: Animations (top) and Prototype (bottom)
183 ImGuiID dock_right_top = 0;
184 ImGuiID dock_right_bottom = ImGui::DockBuilderSplitNode(
185 dock_right_id, ImGuiDir_Down, 0.50f, nullptr, &dock_right_top);
186
187 // Dock windows
188 ImGui::DockBuilderDockWindow(" GFX Sheets", dock_left_id);
189 ImGui::DockBuilderDockWindow(" Sheet Editor", dock_center_id);
190 ImGui::DockBuilderDockWindow(" Animations", dock_right_top);
191 ImGui::DockBuilderDockWindow(" Prototype", dock_right_bottom);
192}
193
194void LayoutManager::BuildPaletteLayout(ImGuiID dockspace_id) {
195 // TODO: [EditorManagerRefactor] Implement DockBuilder layout for Palette
196 // Editor
197 //
198 // Desired layout:
199 // - Left 25%: Group Manager (top) + ROM Palette Browser (bottom)
200 // - Center 50%: Main Palette Editor
201 // - Right 25%: SNES Palette (top) + Color Harmony Tools (bottom)
202
203 ImGuiID dock_left_id = 0;
204 ImGuiID dock_center_id = 0;
205 ImGuiID dock_right_id = 0;
206
207 // Split dockspace: Left 25% | Center 50% | Right 25%
208 dock_left_id = ImGui::DockBuilderSplitNode(dockspace_id, ImGuiDir_Left, 0.25f,
209 nullptr, &dockspace_id);
210 dock_right_id = ImGui::DockBuilderSplitNode(dockspace_id, ImGuiDir_Right,
211 0.33f, nullptr, &dockspace_id);
212 dock_center_id = dockspace_id;
213
214 // Split left panel: Group Manager (top) and ROM Browser (bottom)
215 ImGuiID dock_left_top = 0;
216 ImGuiID dock_left_bottom = ImGui::DockBuilderSplitNode(
217 dock_left_id, ImGuiDir_Down, 0.50f, nullptr, &dock_left_top);
218
219 // Split right panel: SNES Palette (top) and Color Tools (bottom)
220 ImGuiID dock_right_top = 0;
221 ImGuiID dock_right_bottom = ImGui::DockBuilderSplitNode(
222 dock_right_id, ImGuiDir_Down, 0.50f, nullptr, &dock_right_top);
223
224 // Dock windows
225 ImGui::DockBuilderDockWindow(" Group Manager", dock_left_top);
226 ImGui::DockBuilderDockWindow(" ROM Palette Browser", dock_left_bottom);
227 ImGui::DockBuilderDockWindow(" Palette Editor", dock_center_id);
228 ImGui::DockBuilderDockWindow(" SNES Palette", dock_right_top);
229 ImGui::DockBuilderDockWindow(" Color Harmony", dock_right_bottom);
230}
231
232void LayoutManager::BuildScreenLayout(ImGuiID dockspace_id) {
233 // TODO: [EditorManagerRefactor] Implement DockBuilder layout for Screen
234 // Editor
235 //
236 // Desired layout:
237 // - Grid layout with Overworld Map in center (larger)
238 // - Corners: Dungeon Maps, Title Screen, Inventory Menu, Naming Screen
239
240 ImGuiID dock_top = 0;
241 ImGuiID dock_bottom = ImGui::DockBuilderSplitNode(
242 dockspace_id, ImGuiDir_Down, 0.50f, nullptr, &dock_top);
243
244 // Split top: left and right
245 ImGuiID dock_top_left = 0;
246 ImGuiID dock_top_right = ImGui::DockBuilderSplitNode(
247 dock_top, ImGuiDir_Right, 0.50f, nullptr, &dock_top_left);
248
249 // Split bottom: left and right
250 ImGuiID dock_bottom_left = 0;
251 ImGuiID dock_bottom_right = ImGui::DockBuilderSplitNode(
252 dock_bottom, ImGuiDir_Right, 0.50f, nullptr, &dock_bottom_left);
253
254 // Dock windows in grid
255 ImGui::DockBuilderDockWindow(" Dungeon Map Editor", dock_top_left);
256 ImGui::DockBuilderDockWindow(" Title Screen", dock_top_right);
257 ImGui::DockBuilderDockWindow(" Inventory Menu", dock_bottom_left);
258 ImGui::DockBuilderDockWindow(" Naming Screen", dock_bottom_right);
259
260 // Overworld Map could be floating or in center - let user configure
261}
262
263void LayoutManager::BuildMusicLayout(ImGuiID dockspace_id) {
264 // TODO: [EditorManagerRefactor] Implement DockBuilder layout for Music Editor
265 //
266 // Desired layout:
267 // - Left 30%: Music Tracker
268 // - Center 45%: Instrument Editor
269 // - Right 25%: Assembly/Export
270
271 ImGuiID dock_left_id = 0;
272 ImGuiID dock_center_id = 0;
273 ImGuiID dock_right_id = 0;
274
275 // Split dockspace: Left 30% | Center 45% | Right 25%
276 dock_left_id = ImGui::DockBuilderSplitNode(dockspace_id, ImGuiDir_Left, 0.30f,
277 nullptr, &dockspace_id);
278 dock_right_id = ImGui::DockBuilderSplitNode(dockspace_id, ImGuiDir_Right,
279 0.36f, nullptr, &dockspace_id);
280 dock_center_id = dockspace_id;
281
282 // Dock windows
283 ImGui::DockBuilderDockWindow(" Music Tracker", dock_left_id);
284 ImGui::DockBuilderDockWindow(" Instrument Editor", dock_center_id);
285 ImGui::DockBuilderDockWindow(" Music Assembly", dock_right_id);
286}
287
288void LayoutManager::BuildSpriteLayout(ImGuiID dockspace_id) {
289 // TODO: [EditorManagerRefactor] Implement DockBuilder layout for Sprite
290 // Editor
291 //
292 // Desired layout:
293 // - Left 50%: Vanilla Sprites
294 // - Right 50%: Custom Sprites
295
296 ImGuiID dock_left_id = 0;
297 ImGuiID dock_right_id = ImGui::DockBuilderSplitNode(
298 dockspace_id, ImGuiDir_Right, 0.50f, nullptr, &dock_left_id);
299
300 // Dock windows
301 ImGui::DockBuilderDockWindow(" Vanilla Sprites", dock_left_id);
302 ImGui::DockBuilderDockWindow(" Custom Sprites", dock_right_id);
303}
304
305void LayoutManager::BuildMessageLayout(ImGuiID dockspace_id) {
306 // TODO: [EditorManagerRefactor] Implement DockBuilder layout for Message
307 // Editor
308 //
309 // Desired layout:
310 // - Left 25%: Message List
311 // - Center 50%: Message Editor
312 // - Right 25%: Font Atlas (top) + Dictionary (bottom)
313
314 ImGuiID dock_left_id = 0;
315 ImGuiID dock_center_id = 0;
316 ImGuiID dock_right_id = 0;
317
318 // Split dockspace: Left 25% | Center 50% | Right 25%
319 dock_left_id = ImGui::DockBuilderSplitNode(dockspace_id, ImGuiDir_Left, 0.25f,
320 nullptr, &dockspace_id);
321 dock_right_id = ImGui::DockBuilderSplitNode(dockspace_id, ImGuiDir_Right,
322 0.33f, nullptr, &dockspace_id);
323 dock_center_id = dockspace_id;
324
325 // Split right panel: Font Atlas (top) and Dictionary (bottom)
326 ImGuiID dock_right_top = 0;
327 ImGuiID dock_right_bottom = ImGui::DockBuilderSplitNode(
328 dock_right_id, ImGuiDir_Down, 0.50f, nullptr, &dock_right_top);
329
330 // Dock windows
331 ImGui::DockBuilderDockWindow(" Message List", dock_left_id);
332 ImGui::DockBuilderDockWindow(" Message Editor", dock_center_id);
333 ImGui::DockBuilderDockWindow(" Font Atlas", dock_right_top);
334 ImGui::DockBuilderDockWindow(" Dictionary", dock_right_bottom);
335}
336
337void LayoutManager::BuildAssemblyLayout(ImGuiID dockspace_id) {
338 // TODO: [EditorManagerRefactor] Implement DockBuilder layout for Assembly
339 // Editor
340 //
341 // Desired layout:
342 // - Left 60%: Code Editor
343 // - Right 40%: Output/Errors (top) + Documentation (bottom)
344
345 ImGuiID dock_left_id = 0;
346 ImGuiID dock_right_id = ImGui::DockBuilderSplitNode(
347 dockspace_id, ImGuiDir_Right, 0.40f, nullptr, &dock_left_id);
348
349 // Split right panel: Output (top) and Docs (bottom)
350 ImGuiID dock_right_top = 0;
351 ImGuiID dock_right_bottom = ImGui::DockBuilderSplitNode(
352 dock_right_id, ImGuiDir_Down, 0.50f, nullptr, &dock_right_top);
353
354 // Dock windows
355 ImGui::DockBuilderDockWindow(" Assembly Editor", dock_left_id);
356 ImGui::DockBuilderDockWindow(" Assembly Output", dock_right_top);
357 ImGui::DockBuilderDockWindow(" Assembly Docs", dock_right_bottom);
358}
359
360void LayoutManager::BuildSettingsLayout(ImGuiID dockspace_id) {
361 // TODO: [EditorManagerRefactor] Implement DockBuilder layout for Settings
362 // Editor
363 //
364 // Desired layout:
365 // - Left 25%: Category navigation (vertical list)
366 // - Right 75%: Settings content for selected category
367
368 ImGuiID dock_left_id = 0;
369 ImGuiID dock_right_id = ImGui::DockBuilderSplitNode(
370 dockspace_id, ImGuiDir_Right, 0.75f, nullptr, &dock_left_id);
371
372 // Dock windows
373 ImGui::DockBuilderDockWindow(" Settings Navigation", dock_left_id);
374 ImGui::DockBuilderDockWindow(" Settings Content", dock_right_id);
375}
376
377void LayoutManager::SaveCurrentLayout(const std::string& name) {
378 // TODO: [EditorManagerRefactor] Implement layout saving to file
379 // Use ImGui::SaveIniSettingsToMemory() and write to custom file
380 LOG_INFO("LayoutManager", "Saving layout: %s", name.c_str());
381}
382
383void LayoutManager::LoadLayout(const std::string& name) {
384 // TODO: [EditorManagerRefactor] Implement layout loading from file
385 // Use ImGui::LoadIniSettingsFromMemory() and read from custom file
386 LOG_INFO("LayoutManager", "Loading layout: %s", name.c_str());
387}
388
390 layouts_initialized_[type] = false;
391 LOG_INFO("LayoutManager", "Reset layout for editor type %d",
392 static_cast<int>(type));
393}
394
396 auto it = layouts_initialized_.find(type);
397 return it != layouts_initialized_.end() && it->second;
398}
399
401 layouts_initialized_[type] = true;
402 LOG_INFO("LayoutManager", "Marked layout for editor type %d as initialized",
403 static_cast<int>(type));
404}
405
407 layouts_initialized_.clear();
408 LOG_INFO("LayoutManager", "Cleared all layout initialization flags");
409}
410
411} // namespace editor
412} // namespace yaze
413
void LoadLayout(const std::string &name)
Load a saved layout by name.
void BuildScreenLayout(ImGuiID dockspace_id)
void BuildPaletteLayout(ImGuiID dockspace_id)
void BuildDungeonLayout(ImGuiID dockspace_id)
void BuildGraphicsLayout(ImGuiID dockspace_id)
void BuildAssemblyLayout(ImGuiID dockspace_id)
void ClearInitializationFlags()
Clear all initialization flags (for testing)
void BuildMessageLayout(ImGuiID dockspace_id)
std::unordered_map< EditorType, bool > layouts_initialized_
bool IsLayoutInitialized(EditorType type) const
Check if a layout has been initialized for an editor.
void BuildSettingsLayout(ImGuiID dockspace_id)
void ResetToDefaultLayout(EditorType type)
Reset the layout for an editor to its default.
void BuildOverworldLayout(ImGuiID dockspace_id)
void MarkLayoutInitialized(EditorType type)
Mark a layout as initialized.
void InitializeEditorLayout(EditorType type, ImGuiID dockspace_id)
Initialize the default layout for a specific editor type.
void SaveCurrentLayout(const std::string &name)
Save the current layout with a custom name.
void BuildSpriteLayout(ImGuiID dockspace_id)
void BuildMusicLayout(ImGuiID dockspace_id)
#define LOG_WARN(category, format,...)
Definition log.h:108
#define LOG_INFO(category, format,...)
Definition log.h:106
Main namespace for the application.
Definition controller.cc:20