yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
main.cc
Go to the documentation of this file.
1#include <cstdlib>
2#include <set>
3#include <string>
4
10#include "app/gui/core/icons.h"
13#include "imgui/imgui.h"
14#include "util/log.h"
15
16namespace {
17
18constexpr size_t kLabSessionId = 0;
19
21 const char* id;
22 const char* display_name;
23 const char* window_title;
24 const char* icon;
25 const char* category;
26 const char* shortcut;
27 const char* disabled_tooltip;
30};
31
32constexpr LabPanelSeed kLabPanels[] = {
33 // Overworld
34 {"overworld.canvas", "Overworld Canvas", nullptr, ICON_MD_MAP, "Overworld",
35 "Ctrl+Shift+O", nullptr, 5, true},
36 {"overworld.area_graphics", "Area Graphics", nullptr, ICON_MD_IMAGE,
37 "Overworld", nullptr, nullptr, 50, false},
38 {"overworld.tile16_selector", "Tile16 Selector", nullptr, ICON_MD_GRID_ON,
39 "Overworld", nullptr, nullptr, 50, true},
40 {"overworld.tile16_editor", "Tile16 Editor", nullptr, ICON_MD_EDIT,
41 "Overworld", nullptr, nullptr, 15, false},
42 {"overworld.tile8_selector", "Tile8 Selector", nullptr, ICON_MD_GRID_3X3,
43 "Overworld", nullptr, nullptr, 50, false},
44 {"overworld.properties", "Map Properties", nullptr, ICON_MD_TUNE,
45 "Overworld", nullptr, nullptr, 50, false},
46 {"overworld.scratch", "Scratch Workspace", nullptr, ICON_MD_DRAW,
47 "Overworld", nullptr, nullptr, 50, false},
48 {"overworld.usage_stats", "Usage Statistics", nullptr, ICON_MD_ANALYTICS,
49 "Overworld", nullptr, nullptr, 50, false},
50 {"overworld.debug", "Debug Window", nullptr, ICON_MD_BUG_REPORT,
51 "Overworld", nullptr, nullptr, 50, false},
52 {"overworld.gfx_groups", "Graphics Groups", nullptr, ICON_MD_COLLECTIONS,
53 "Overworld", nullptr, nullptr, 50, false},
54 {"overworld.v3_settings", "v3 Settings", nullptr, ICON_MD_SETTINGS,
55 "Overworld", nullptr, nullptr, 50, false},
56
57 // Dungeon
58 {"dungeon.room_selector", "Room List", " Room List", ICON_MD_LIST,
59 "Dungeon", "Ctrl+Shift+R", "Load a ROM to browse dungeon rooms", 20,
60 false},
61 {"dungeon.entrance_list", "Entrance List", " Entrance List",
62 ICON_MD_DOOR_FRONT, "Dungeon", "Ctrl+Shift+E",
63 "Load a ROM to browse dungeon entrances", 25, false},
64 {"dungeon.entrance_properties", "Entrance Properties",
65 " Entrance Properties", ICON_MD_TUNE, "Dungeon", nullptr,
66 "Load a ROM to edit entrance properties", 26, false},
67 {"dungeon.room_matrix", "Room Matrix", " Room Matrix", ICON_MD_GRID_VIEW,
68 "Dungeon", "Ctrl+Shift+M", "Load a ROM to view the room matrix", 30,
69 false},
70 {"dungeon.room_graphics", "Room Graphics", " Room Graphics", ICON_MD_IMAGE,
71 "Dungeon", "Ctrl+Shift+G", "Load a ROM to view room graphics", 50, false},
72 {"dungeon.object_editor", "Object Editor", nullptr, ICON_MD_CONSTRUCTION,
73 "Dungeon", nullptr, nullptr, 60, false},
74 {"dungeon.sprite_editor", "Sprite Editor", nullptr, ICON_MD_PERSON,
75 "Dungeon", nullptr, nullptr, 65, false},
76 {"dungeon.item_editor", "Item Editor", nullptr, ICON_MD_INVENTORY,
77 "Dungeon", nullptr, nullptr, 66, false},
78 {"dungeon.palette_editor", "Palette Editor", " Palette Editor",
79 ICON_MD_PALETTE, "Dungeon", "Ctrl+Shift+P",
80 "Load a ROM to edit dungeon palettes", 70, false},
81
82 // Graphics
83 {"graphics.sheet_browser_v2", "Sheet Browser", nullptr, ICON_MD_VIEW_LIST,
84 "Graphics", nullptr, nullptr, 10, true},
85 {"graphics.pixel_editor", "Pixel Editor", nullptr, ICON_MD_DRAW,
86 "Graphics", nullptr, nullptr, 20, true},
87 {"graphics.palette_controls", "Palette Controls", nullptr, ICON_MD_PALETTE,
88 "Graphics", nullptr, nullptr, 30, false},
89 {"graphics.link_sprite_editor", "Link Sprite Editor", nullptr,
90 ICON_MD_PERSON, "Graphics", nullptr, nullptr, 35, false},
91 {"graphics.gfx_group_editor", "Graphics Groups", nullptr,
92 ICON_MD_VIEW_MODULE, "Graphics", nullptr, nullptr, 39, false},
93 {"graphics.paletteset_editor", "Palettesets", nullptr,
94 ICON_MD_COLOR_LENS, "Graphics", nullptr, nullptr, 45, false},
95
96 // Palette
97 {"palette.control_panel", "Palette Controls", " Palette Controls",
98 ICON_MD_PALETTE, "Palette", "Ctrl+Shift+P", "Load a ROM first", 10, false},
99 {"palette.ow_main", "Overworld Main", " Overworld Main", ICON_MD_LANDSCAPE,
100 "Palette", "Ctrl+Alt+1", "Load a ROM first", 20, false},
101 {"palette.ow_animated", "Overworld Animated", " Overworld Animated",
102 ICON_MD_WATER, "Palette", "Ctrl+Alt+2", "Load a ROM first", 30, false},
103 {"palette.dungeon_main", "Dungeon Main", " Dungeon Main", ICON_MD_CASTLE,
104 "Palette", "Ctrl+Alt+3", "Load a ROM first", 40, false},
105 {"palette.sprites", "Global Sprite Palettes", " SNES Palette",
106 ICON_MD_PETS, "Palette", "Ctrl+Alt+4", "Load a ROM first", 50, false},
107 {"palette.sprites_aux1", "Sprites Aux 1", " Sprites Aux 1",
108 ICON_MD_FILTER_1, "Palette", "Ctrl+Alt+7", "Load a ROM first", 51, false},
109 {"palette.sprites_aux2", "Sprites Aux 2", " Sprites Aux 2",
110 ICON_MD_FILTER_2, "Palette", "Ctrl+Alt+8", "Load a ROM first", 52, false},
111 {"palette.sprites_aux3", "Sprites Aux 3", " Sprites Aux 3",
112 ICON_MD_FILTER_3, "Palette", "Ctrl+Alt+9", "Load a ROM first", 53, false},
113 {"palette.equipment", "Equipment Palettes", " Equipment Palettes",
114 ICON_MD_SHIELD, "Palette", "Ctrl+Alt+5", "Load a ROM first", 60, false},
115 {"palette.quick_access", "Quick Access", " Color Harmony",
116 ICON_MD_COLOR_LENS, "Palette", "Ctrl+Alt+Q", "Load a ROM first", 70, false},
117 {"palette.custom", "Custom Palette", " Palette Editor", ICON_MD_BRUSH,
118 "Palette", "Ctrl+Alt+C", "Load a ROM first", 80, false},
119
120 // Sprite
121 {"sprite.vanilla_editor", "Vanilla Sprites", nullptr, ICON_MD_SMART_TOY,
122 "Sprite", nullptr, nullptr, 10, true},
123 {"sprite.custom_editor", "Custom Sprites", nullptr, ICON_MD_ADD_CIRCLE,
124 "Sprite", nullptr, nullptr, 20, false},
125
126 // Screen
127 {"screen.dungeon_maps", "Dungeon Maps", " Dungeon Map Editor", ICON_MD_MAP,
128 "Screen", "Alt+1", "Load a ROM first", 10, false},
129 {"screen.inventory_menu", "Inventory Menu", " Inventory Menu",
130 ICON_MD_INVENTORY, "Screen", "Alt+2", "Load a ROM first", 20, false},
131 {"screen.overworld_map", "Overworld Map", " Overworld Map", ICON_MD_PUBLIC,
132 "Screen", "Alt+3", "Load a ROM first", 30, false},
133 {"screen.title_screen", "Title Screen", " Title Screen", ICON_MD_TITLE,
134 "Screen", "Alt+4", "Load a ROM first", 40, false},
135 {"screen.naming_screen", "Naming Screen", " Naming Screen", ICON_MD_EDIT,
136 "Screen", "Alt+5", "Load a ROM first", 50, false},
137
138 // Music
139 {"music.song_browser", "Song Browser", " Song Browser",
140 ICON_MD_LIBRARY_MUSIC, "Music", "Ctrl+Shift+B", nullptr, 5, false},
141 {"music.tracker", "Playback Control", " Playback Control",
142 ICON_MD_PLAY_CIRCLE, "Music", "Ctrl+Shift+M", nullptr, 10, false},
143 {"music.piano_roll", "Piano Roll", " Piano Roll", ICON_MD_PIANO, "Music",
144 "Ctrl+Shift+P", nullptr, 15, false},
145 {"music.instrument_editor", "Instrument Editor", " Instrument Editor",
146 ICON_MD_SPEAKER, "Music", "Ctrl+Shift+I", nullptr, 20, false},
147 {"music.sample_editor", "Sample Editor", " Sample Editor", ICON_MD_WAVES,
148 "Music", "Ctrl+Shift+S", nullptr, 25, false},
149 {"music.assembly", "Assembly View", " Music Assembly", ICON_MD_CODE,
150 "Music", "Ctrl+Shift+A", nullptr, 30, false},
151
152 // Message
153 {"message.message_list", "Message List", nullptr, ICON_MD_LIST, "Message",
154 nullptr, nullptr, 10, false},
155 {"message.message_editor", "Message Editor", nullptr, ICON_MD_EDIT,
156 "Message", nullptr, nullptr, 20, false},
157 {"message.font_atlas", "Font Atlas", nullptr, ICON_MD_FONT_DOWNLOAD,
158 "Message", nullptr, nullptr, 30, false},
159 {"message.dictionary", "Dictionary", nullptr, ICON_MD_BOOK, "Message",
160 nullptr, nullptr, 40, false},
161
162 // Assembly
163 {"assembly.toolbar", "Toolbar", nullptr, ICON_MD_CONSTRUCTION, "Assembly",
164 nullptr, nullptr, 5, true},
165 {"assembly.code_editor", "Code Editor", nullptr, ICON_MD_CODE, "Assembly",
166 nullptr, nullptr, 10, true},
167 {"assembly.file_browser", "File Browser", nullptr, ICON_MD_FOLDER_OPEN,
168 "Assembly", nullptr, nullptr, 20, true},
169 {"assembly.symbols", "Symbols", nullptr, ICON_MD_LIST_ALT, "Assembly",
170 nullptr, nullptr, 30, false},
171 {"assembly.build_output", "Build Output", nullptr, ICON_MD_TERMINAL,
172 "Assembly", nullptr, nullptr, 40, false},
173
174 // Emulator + Memory
175 {"emulator.cpu_debugger", "CPU Debugger", " CPU Debugger",
176 ICON_MD_BUG_REPORT, "Emulator", nullptr, nullptr, 10, false},
177 {"emulator.ppu_viewer", "PPU Viewer", " PPU Viewer",
178 ICON_MD_VIDEOGAME_ASSET, "Emulator", nullptr, nullptr, 20, false},
179 {"emulator.memory_viewer", "Memory Viewer", " Memory Viewer",
180 ICON_MD_MEMORY, "Emulator", nullptr, nullptr, 30, false},
181 {"emulator.breakpoints", "Breakpoints", " Breakpoints", ICON_MD_STOP,
182 "Emulator", nullptr, nullptr, 40, false},
183 {"emulator.performance", "Performance", " Performance", ICON_MD_SPEED,
184 "Emulator", nullptr, nullptr, 50, false},
185 {"emulator.ai_agent", "AI Agent", " AI Agent", ICON_MD_SMART_TOY,
186 "Emulator", nullptr, nullptr, 60, false},
187 {"emulator.save_states", "Save States", " Save States", ICON_MD_SAVE,
188 "Emulator", nullptr, nullptr, 70, false},
189 {"emulator.keyboard_config", "Keyboard Config", " Keyboard Config",
190 ICON_MD_KEYBOARD, "Emulator", nullptr, nullptr, 80, false},
191 {"emulator.virtual_controller", "Virtual Controller",
192 " Virtual Controller", ICON_MD_SPORTS_ESPORTS, "Emulator", nullptr, nullptr,
193 85, false},
194 {"emulator.apu_debugger", "APU Debugger", " APU Debugger",
195 ICON_MD_AUDIOTRACK, "Emulator", nullptr, nullptr, 90, false},
196 {"emulator.audio_mixer", "Audio Mixer", " Audio Mixer", ICON_MD_AUDIO_FILE,
197 "Emulator", nullptr, nullptr, 100, false},
198 {"emulator.mesen2_debug", "Mesen2 Debug", " Mesen2 Debug", ICON_MD_BUG_REPORT,
199 "Emulator", "Ctrl+Shift+M", "Connect to Mesen2-OoS for debugging", 105, false},
200 {"memory.hex_editor", "Hex Editor", nullptr, ICON_MD_MEMORY, "Memory",
201 nullptr, nullptr, 10, false},
202};
203
205 panel_manager->RegisterSession(kLabSessionId);
206 panel_manager->SetActiveSession(kLabSessionId);
207
208 for (const auto& panel : kLabPanels) {
210 descriptor.card_id = panel.id;
211 descriptor.display_name = panel.display_name;
212 descriptor.window_title = panel.window_title ? panel.window_title : "";
213 descriptor.icon = panel.icon ? panel.icon : "";
214 descriptor.category = panel.category ? panel.category : "";
215 descriptor.shortcut_hint = panel.shortcut ? panel.shortcut : "";
216 descriptor.disabled_tooltip =
217 panel.disabled_tooltip ? panel.disabled_tooltip : "";
218 descriptor.visibility_flag = nullptr;
219 descriptor.priority = panel.priority;
220
221 panel_manager->RegisterPanel(kLabSessionId, descriptor);
222 if (panel.visible_by_default) {
223 panel_manager->ShowPanel(kLabSessionId, panel.id);
224 }
225 }
226}
227
229 const ImGuiViewport* viewport = ImGui::GetMainViewport();
230 ImGui::SetNextWindowPos(viewport->WorkPos);
231 ImGui::SetNextWindowSize(viewport->WorkSize);
232 ImGui::SetNextWindowViewport(viewport->ID);
233
234 ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoDocking |
235 ImGuiWindowFlags_NoTitleBar |
236 ImGuiWindowFlags_NoCollapse |
237 ImGuiWindowFlags_NoResize |
238 ImGuiWindowFlags_NoMove |
239 ImGuiWindowFlags_NoBringToFrontOnFocus |
240 ImGuiWindowFlags_NoNavFocus |
241 ImGuiWindowFlags_NoBackground;
242
243 yaze::gui::StyleVarGuard dockspace_vars(
244 {{ImGuiStyleVar_WindowRounding, 0.0f},
245 {ImGuiStyleVar_WindowBorderSize, 0.0f},
246 {ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f)}});
247 ImGui::Begin("LabDockspace", nullptr, window_flags);
248
249 ImGuiID dockspace_id = ImGui::GetID("MainDockSpace");
250 ImGui::DockSpace(dockspace_id, ImVec2(0.0f, 0.0f),
251 ImGuiDockNodeFlags_PassthruCentralNode);
252 ImGui::End();
253}
254
255void DrawLabPanels(const yaze::editor::PanelManager& panel_manager) {
256 const auto& descriptors = panel_manager.GetAllPanelDescriptors();
257 for (const auto& [panel_id, descriptor] : descriptors) {
258 if (descriptor.visibility_flag && !*descriptor.visibility_flag) {
259 continue;
260 }
261
262 bool open = true;
263 bool* open_ptr = descriptor.visibility_flag ? descriptor.visibility_flag : &open;
264 const std::string title = descriptor.GetWindowTitle();
265
266 if (ImGui::Begin(title.c_str(), open_ptr)) {
267 ImGui::Text("Lab panel: %s", descriptor.display_name.c_str());
268 ImGui::Text("Panel ID: %s", panel_id.c_str());
269 }
270 ImGui::End();
271 }
272}
273
274} // namespace
275
276int main(int argc, char** argv) {
277 (void)argc;
278 (void)argv;
279
281 yaze::util::LogLevel::INFO, "", std::set<std::string>{});
282
285 if (!window_backend) {
286 return EXIT_FAILURE;
287 }
288
290 config.title = "Yaze Lab";
291 config.width = 1400;
292 config.height = 900;
293 config.resizable = true;
294 config.high_dpi = false;
295
296 if (!window_backend->Initialize(config).ok()) {
297 return EXIT_FAILURE;
298 }
299
300 auto renderer = yaze::gfx::RendererFactory::Create();
301 if (!renderer || !window_backend->InitializeRenderer(renderer.get())) {
302 window_backend->Shutdown();
303 return EXIT_FAILURE;
304 }
305
306 if (!window_backend->InitializeImGui(renderer.get()).ok()) {
307 renderer->Shutdown();
308 window_backend->Shutdown();
309 return EXIT_FAILURE;
310 }
311
312 yaze::editor::PanelManager panel_manager;
313 RegisterLabPanels(&panel_manager);
314
315 yaze::editor::LayoutManager layout_manager;
316 layout_manager.SetPanelManager(&panel_manager);
317
319 layout_designer.Initialize(&panel_manager, &layout_manager, nullptr);
320 layout_designer.Open();
321
322 bool running = true;
324
325 while (running && window_backend->IsActive()) {
326 while (window_backend->PollEvent(event)) {
329 running = false;
330 }
331 }
332
333 window_backend->NewImGuiFrame();
334 ImGui::NewFrame();
335
337 layout_designer.Draw();
338 DrawLabPanels(panel_manager);
339
340 ImGui::Render();
341 renderer->Clear();
342 window_backend->RenderImGui(renderer.get());
343 renderer->Present();
344 }
345
346 window_backend->ShutdownImGui();
347 renderer->Shutdown();
348 window_backend->Shutdown();
349 return EXIT_SUCCESS;
350}
int main(int argc, char **argv)
Definition main.cc:383
Manages ImGui DockBuilder layouts for each editor type.
void SetPanelManager(PanelManager *manager)
Set the panel manager for window title lookups.
Central registry for all editor cards with session awareness and dependency injection.
void RegisterSession(size_t session_id)
void SetActiveSession(size_t session_id)
bool ShowPanel(size_t session_id, const std::string &base_card_id)
void RegisterPanel(size_t session_id, const PanelDescriptor &base_info)
const std::unordered_map< std::string, PanelDescriptor > & GetAllPanelDescriptors() const
Get all panel descriptors (for layout designer, panel browser, etc.)
Main window for the WYSIWYG layout designer.
void Draw()
Draw the designer window (call every frame)
void Initialize(PanelManager *panel_manager, yaze::editor::LayoutManager *layout_manager=nullptr, yaze::editor::EditorManager *editor_manager=nullptr)
Initialize the designer with manager references.
static std::unique_ptr< IRenderer > Create(RendererBackendType type=RendererBackendType::kDefault)
RAII guard for ImGui style vars.
Definition style_guard.h:68
static WindowBackendType GetDefaultType()
Get the default backend type for this build.
static std::unique_ptr< IWindowBackend > Create(WindowBackendType type)
Create a window backend of the specified type.
static LogManager & instance()
Definition log.cc:32
void configure(LogLevel level, const std::string &file_path, const std::set< std::string > &categories)
Configures the logging system.
Definition log.cc:46
#define ICON_MD_GRID_VIEW
Definition icons.h:897
#define ICON_MD_FOLDER_OPEN
Definition icons.h:813
#define ICON_MD_SETTINGS
Definition icons.h:1699
#define ICON_MD_PIANO
Definition icons.h:1462
#define ICON_MD_LIBRARY_MUSIC
Definition icons.h:1080
#define ICON_MD_WAVES
Definition icons.h:2133
#define ICON_MD_TITLE
Definition icons.h:1990
#define ICON_MD_MEMORY
Definition icons.h:1195
#define ICON_MD_LANDSCAPE
Definition icons.h:1059
#define ICON_MD_VIEW_MODULE
Definition icons.h:2093
#define ICON_MD_PETS
Definition icons.h:1431
#define ICON_MD_SHIELD
Definition icons.h:1724
#define ICON_MD_VIEW_LIST
Definition icons.h:2092
#define ICON_MD_CONSTRUCTION
Definition icons.h:458
#define ICON_MD_COLLECTIONS
Definition icons.h:438
#define ICON_MD_DRAW
Definition icons.h:625
#define ICON_MD_BRUSH
Definition icons.h:325
#define ICON_MD_TUNE
Definition icons.h:2022
#define ICON_MD_MAP
Definition icons.h:1173
#define ICON_MD_CODE
Definition icons.h:434
#define ICON_MD_STOP
Definition icons.h:1862
#define ICON_MD_LIST_ALT
Definition icons.h:1095
#define ICON_MD_VIDEOGAME_ASSET
Definition icons.h:2076
#define ICON_MD_FONT_DOWNLOAD
Definition icons.h:818
#define ICON_MD_FILTER_2
Definition icons.h:752
#define ICON_MD_BUG_REPORT
Definition icons.h:327
#define ICON_MD_GRID_3X3
Definition icons.h:892
#define ICON_MD_EDIT
Definition icons.h:645
#define ICON_MD_PUBLIC
Definition icons.h:1524
#define ICON_MD_SPEED
Definition icons.h:1817
#define ICON_MD_AUDIOTRACK
Definition icons.h:213
#define ICON_MD_CASTLE
Definition icons.h:380
#define ICON_MD_GRID_ON
Definition icons.h:896
#define ICON_MD_FILTER_3
Definition icons.h:753
#define ICON_MD_LIST
Definition icons.h:1094
#define ICON_MD_INVENTORY
Definition icons.h:1011
#define ICON_MD_KEYBOARD
Definition icons.h:1028
#define ICON_MD_DOOR_FRONT
Definition icons.h:613
#define ICON_MD_SPEAKER
Definition icons.h:1812
#define ICON_MD_PLAY_CIRCLE
Definition icons.h:1480
#define ICON_MD_IMAGE
Definition icons.h:982
#define ICON_MD_TERMINAL
Definition icons.h:1951
#define ICON_MD_PERSON
Definition icons.h:1415
#define ICON_MD_SAVE
Definition icons.h:1644
#define ICON_MD_FILTER_1
Definition icons.h:751
#define ICON_MD_SPORTS_ESPORTS
Definition icons.h:1826
#define ICON_MD_PALETTE
Definition icons.h:1370
#define ICON_MD_AUDIO_FILE
Definition icons.h:212
#define ICON_MD_COLOR_LENS
Definition icons.h:440
#define ICON_MD_ANALYTICS
Definition icons.h:154
#define ICON_MD_BOOK
Definition icons.h:283
#define ICON_MD_WATER
Definition icons.h:2129
#define ICON_MD_ADD_CIRCLE
Definition icons.h:95
#define ICON_MD_SMART_TOY
Definition icons.h:1781
constexpr size_t kLabSessionId
Definition main.cc:18
constexpr LabPanelSeed kLabPanels[]
Definition main.cc:32
void DrawLabPanels(const yaze::editor::PanelManager &panel_manager)
Definition main.cc:255
void RegisterLabPanels(yaze::editor::PanelManager *panel_manager)
Definition main.cc:204
SDL2/SDL3 compatibility layer.
Metadata for an editor panel (formerly PanelInfo)
Window configuration parameters.
Definition iwindow.h:24
Platform-agnostic window event data.
Definition iwindow.h:65
WindowEventType type
Definition iwindow.h:66