13#include "imgui/imgui.h"
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},
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},
49 "Overworld",
nullptr,
nullptr, 50,
false},
51 "Overworld",
nullptr,
nullptr, 50,
false},
53 "Overworld",
nullptr,
nullptr, 50,
false},
55 "Overworld",
nullptr,
nullptr, 50,
false},
58 {
"dungeon.room_selector",
"Room List",
" Room List",
ICON_MD_LIST,
59 "Dungeon",
"Ctrl+Shift+R",
"Load a ROM to browse dungeon rooms", 20,
61 {
"dungeon.entrance_list",
"Entrance List",
" Entrance List",
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},
68 "Dungeon",
"Ctrl+Shift+M",
"Load a ROM to view the room matrix", 30,
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},
73 "Dungeon",
nullptr,
nullptr, 60,
false},
74 {
"dungeon.sprite_editor",
"Sprite Editor",
nullptr,
ICON_MD_PERSON,
75 "Dungeon",
nullptr,
nullptr, 65,
false},
77 "Dungeon",
nullptr,
nullptr, 66,
false},
78 {
"dungeon.palette_editor",
"Palette Editor",
" Palette Editor",
80 "Load a ROM to edit dungeon palettes", 70,
false},
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,
91 {
"graphics.gfx_group_editor",
"Graphics Groups",
nullptr,
93 {
"graphics.paletteset_editor",
"Palettesets",
nullptr,
97 {
"palette.control_panel",
"Palette Controls",
" Palette Controls",
98 ICON_MD_PALETTE,
"Palette",
"Ctrl+Shift+P",
"Load a ROM first", 10,
false},
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",
109 {
"palette.sprites_aux2",
"Sprites Aux 2",
" Sprites Aux 2",
111 {
"palette.sprites_aux3",
"Sprites Aux 3",
" Sprites Aux 3",
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",
117 {
"palette.custom",
"Custom Palette",
" Palette Editor",
ICON_MD_BRUSH,
118 "Palette",
"Ctrl+Alt+C",
"Load a ROM first", 80,
false},
122 "Sprite",
nullptr,
nullptr, 10,
true},
124 "Sprite",
nullptr,
nullptr, 20,
false},
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",
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},
139 {
"music.song_browser",
"Song Browser",
" Song Browser",
141 {
"music.tracker",
"Playback Control",
" Playback Control",
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",
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},
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},
158 "Message",
nullptr,
nullptr, 30,
false},
159 {
"message.dictionary",
"Dictionary",
nullptr,
ICON_MD_BOOK,
"Message",
160 nullptr,
nullptr, 40,
false},
164 nullptr,
nullptr, 5,
true},
165 {
"assembly.code_editor",
"Code Editor",
nullptr,
ICON_MD_CODE,
"Assembly",
166 nullptr,
nullptr, 10,
true},
168 "Assembly",
nullptr,
nullptr, 20,
true},
170 nullptr,
nullptr, 30,
false},
172 "Assembly",
nullptr,
nullptr, 40,
false},
175 {
"emulator.cpu_debugger",
"CPU Debugger",
" CPU Debugger",
177 {
"emulator.ppu_viewer",
"PPU Viewer",
" PPU Viewer",
179 {
"emulator.memory_viewer",
"Memory Viewer",
" Memory Viewer",
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},
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",
191 {
"emulator.virtual_controller",
"Virtual Controller",
194 {
"emulator.apu_debugger",
"APU Debugger",
" APU Debugger",
197 "Emulator",
nullptr,
nullptr, 100,
false},
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},
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 :
"";
217 panel.disabled_tooltip ? panel.disabled_tooltip :
"";
219 descriptor.
priority = panel.priority;
222 if (panel.visible_by_default) {
229 const ImGuiViewport* viewport = ImGui::GetMainViewport();
230 ImGui::SetNextWindowPos(viewport->WorkPos);
231 ImGui::SetNextWindowSize(viewport->WorkSize);
232 ImGui::SetNextWindowViewport(viewport->ID);
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;
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);
249 ImGuiID dockspace_id = ImGui::GetID(
"MainDockSpace");
250 ImGui::DockSpace(dockspace_id, ImVec2(0.0f, 0.0f),
251 ImGuiDockNodeFlags_PassthruCentralNode);
256 const auto& descriptors = panel_manager.GetAllPanelDescriptors();
257 for (
const auto& [panel_id, descriptor] : descriptors) {
258 if (descriptor.visibility_flag && !*descriptor.visibility_flag) {
263 bool* open_ptr = descriptor.visibility_flag ? descriptor.visibility_flag : &open;
264 const std::string title = descriptor.GetWindowTitle();
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());
276int main(
int argc,
char** argv) {
285 if (!window_backend) {
290 config.
title =
"Yaze Lab";
296 if (!window_backend->Initialize(config).ok()) {
301 if (!renderer || !window_backend->InitializeRenderer(renderer.get())) {
302 window_backend->Shutdown();
306 if (!window_backend->InitializeImGui(renderer.get()).ok()) {
307 renderer->Shutdown();
308 window_backend->Shutdown();
316 layout_manager.SetPanelManager(&panel_manager);
319 layout_designer.
Initialize(&panel_manager, &layout_manager,
nullptr);
320 layout_designer.
Open();
325 while (running && window_backend->IsActive()) {
326 while (window_backend->PollEvent(event)) {
333 window_backend->NewImGuiFrame();
337 layout_designer.
Draw();
342 window_backend->RenderImGui(renderer.get());
346 window_backend->ShutdownImGui();
347 renderer->Shutdown();
348 window_backend->Shutdown();
int main(int argc, char **argv)
Manages ImGui DockBuilder layouts for each editor type.
Central registry for all editor cards with session awareness and dependency injection.
void RegisterPanel(size_t session_id, const WindowDescriptor &base_info)
void SetActiveSession(size_t session_id)
void RegisterSession(size_t session_id)
Main window for the WYSIWYG layout designer.
void Draw()
Draw the designer window (call every frame)
void Open()
Open the designer window.
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.
static LogManager & instance()
void configure(LogLevel level, const std::string &file_path, const std::set< std::string > &categories)
Configures the logging system.
#define ICON_MD_GRID_VIEW
#define ICON_MD_FOLDER_OPEN
#define ICON_MD_LIBRARY_MUSIC
#define ICON_MD_LANDSCAPE
#define ICON_MD_VIEW_MODULE
#define ICON_MD_VIEW_LIST
#define ICON_MD_CONSTRUCTION
#define ICON_MD_COLLECTIONS
#define ICON_MD_VIDEOGAME_ASSET
#define ICON_MD_FONT_DOWNLOAD
#define ICON_MD_BUG_REPORT
#define ICON_MD_AUDIOTRACK
#define ICON_MD_INVENTORY
#define ICON_MD_DOOR_FRONT
#define ICON_MD_PLAY_CIRCLE
#define ICON_MD_SPORTS_ESPORTS
#define ICON_MD_AUDIO_FILE
#define ICON_MD_COLOR_LENS
#define ICON_MD_ANALYTICS
#define ICON_MD_ADD_CIRCLE
#define ICON_MD_SMART_TOY
constexpr size_t kLabSessionId
constexpr LabPanelSeed kLabPanels[]
void DrawLabPanels(const yaze::editor::PanelManager &panel_manager)
void RegisterLabPanels(yaze::editor::PanelManager *panel_manager)
SDL2/SDL3 compatibility layer.
const char * display_name
const char * disabled_tooltip
const char * window_title
Metadata for a dockable editor window (formerly PanelInfo)
std::string shortcut_hint
std::string disabled_tooltip