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);
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();
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.
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 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 an editor panel (formerly PanelInfo)
std::string disabled_tooltip
std::string shortcut_hint