5#include "imgui/imgui.h"
6#include "imgui/imgui_internal.h"
16 if (!registry)
return;
19 for (
const auto& panel_id : default_panels) {
23 LOG_INFO(
"LayoutManager",
"Showing %zu default panels for editor type %d",
24 default_panels.size(),
static_cast<int>(type));
30 ImGuiID dockspace_id) {
34 "Layout for editor type %d already initialized, skipping",
35 static_cast<int>(type));
43 LOG_INFO(
"LayoutManager",
"Initializing layout for editor type %d",
44 static_cast<int>(type));
47 ImGui::DockBuilderRemoveNode(dockspace_id);
48 ImGui::DockBuilderAddNode(dockspace_id, ImGuiDockNodeFlags_DockSpace);
49 ImGui::DockBuilderSetNodeSize(dockspace_id, ImGui::GetMainViewport()->WorkSize);
58 ImGui::DockBuilderFinish(dockspace_id);
66 ImGuiDockNode* node = ImGui::DockBuilderGetNode(dockspace_id);
69 "Cannot rebuild layout: dockspace ID %u not found", dockspace_id);
73 LOG_INFO(
"LayoutManager",
"Forcing rebuild of layout for editor type %d",
74 static_cast<int>(type));
84 ImGui::DockBuilderRemoveNode(dockspace_id);
85 ImGui::DockBuilderAddNode(dockspace_id, ImGuiDockNodeFlags_DockSpace);
86 ImGui::DockBuilderSetNodeSize(dockspace_id, ImGui::GetMainViewport()->WorkSize);
95 ImGui::DockBuilderFinish(dockspace_id);
100 LOG_INFO(
"LayoutManager",
"Layout rebuild complete for editor type %d",
101 static_cast<int>(type));
109 float bottom = 0.25f;
111 float vertical_split = 0.50f;
120 ImGuiID left_top = 0;
121 ImGuiID left_bottom = 0;
122 ImGuiID right_top = 0;
123 ImGuiID right_bottom = 0;
131 bool left_top =
false;
132 bool left_bottom =
false;
133 bool right_top =
false;
134 bool right_bottom =
false;
155 needs.left_top =
true;
159 needs.left_bottom =
true;
163 needs.right_top =
true;
167 needs.right_bottom =
true;
180 ids.
center = dockspace_id;
183 ids.left = ImGui::DockBuilderSplitNode(ids.center, ImGuiDir_Left, cfg.
left,
184 nullptr, &ids.center);
187 ids.right = ImGui::DockBuilderSplitNode(ids.center, ImGuiDir_Right,
188 cfg.
right,
nullptr, &ids.center);
191 ids.bottom = ImGui::DockBuilderSplitNode(ids.center, ImGuiDir_Down,
192 cfg.
bottom,
nullptr, &ids.center);
195 ids.top = ImGui::DockBuilderSplitNode(ids.center, ImGuiDir_Up, cfg.
top,
196 nullptr, &ids.center);
200 ids.left_bottom = ImGui::DockBuilderSplitNode(
201 ids.left, ImGuiDir_Down, cfg.
vertical_split,
nullptr, &ids.left_top);
205 ids.right_bottom = ImGui::DockBuilderSplitNode(
206 ids.right, ImGuiDir_Down, cfg.
vertical_split,
nullptr, &ids.right_top);
219 "PanelManager not available, skipping dock layout for type %d",
220 static_cast<int>(type));
224 const size_t session_id =
227 DockSplitNeeds needs = ComputeSplitNeeds(preset);
229 DockNodeIds ids = BuildDockTree(dockspace_id, needs, cfg);
234 return ids.left ? ids.left : ids.center;
236 return ids.right ? ids.right : ids.center;
238 return ids.bottom ? ids.bottom : ids.center;
240 return ids.top ? ids.top : ids.center;
242 return ids.left_top ? ids.left_top
243 : (ids.left ? ids.left : ids.center);
245 return ids.left_bottom ? ids.left_bottom
246 : (ids.left ? ids.left : ids.center);
248 return ids.right_top ? ids.right_top
249 : (ids.right ? ids.right : ids.center);
251 return ids.right_bottom ? ids.right_bottom
252 : (ids.right ? ids.right : ids.center);
260 for (
const auto& [panel_id, position] : preset.panel_positions) {
267 "Preset references panel '%s' that is not registered (session "
269 panel_id.c_str(), session_id);
274 if (window_title.empty()) {
276 "Cannot dock panel '%s': missing window title (session %zu)",
277 panel_id.c_str(), session_id);
281 ImGui::DockBuilderDockWindow(window_title.c_str(), get_dock_id(position));
301 LOG_INFO(
"LayoutManager",
"Saving layout: %s", name.c_str());
307 LOG_INFO(
"LayoutManager",
"Loading layout: %s", name.c_str());
312 LOG_INFO(
"LayoutManager",
"Reset layout for editor type %d",
313 static_cast<int>(type));
323 LOG_INFO(
"LayoutManager",
"Marked layout for editor type %d as initialized",
324 static_cast<int>(type));
329 LOG_INFO(
"LayoutManager",
"Cleared all layout initialization flags");
void LoadLayout(const std::string &name)
Load a saved layout by name.
std::string GetWindowTitle(const std::string &card_id) const
Get window title for a card ID from registry.
EditorType current_editor_type_
void BuildScreenLayout(ImGuiID dockspace_id)
ImGuiID last_dockspace_id_
void BuildPaletteLayout(ImGuiID dockspace_id)
void BuildDungeonLayout(ImGuiID dockspace_id)
void BuildGraphicsLayout(ImGuiID dockspace_id)
void RebuildLayout(EditorType type, ImGuiID dockspace_id)
Force rebuild of layout for a specific editor type.
void BuildEmulatorLayout(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 BuildLayoutFromPreset(EditorType type, ImGuiID dockspace_id)
void SaveCurrentLayout(const std::string &name)
Save the current layout with a custom name.
void BuildSpriteLayout(ImGuiID dockspace_id)
void BuildMusicLayout(ImGuiID dockspace_id)
PanelManager * panel_manager_
static std::vector< std::string > GetDefaultPanels(EditorType type)
Get default visible panels for an editor.
static PanelLayoutPreset GetDefaultPreset(EditorType type)
Get the default layout preset for an editor type.
Central registry for all editor cards with session awareness and dependency injection.
const PanelDescriptor * GetPanelDescriptor(size_t session_id, const std::string &base_card_id) const
bool ShowPanel(size_t session_id, const std::string &base_card_id)
size_t GetActiveSessionId() const
#define LOG_ERROR(category, format,...)
#define LOG_WARN(category, format,...)
#define LOG_INFO(category, format,...)
DockSplitNeeds ComputeSplitNeeds(const PanelLayoutPreset &preset)
void ShowDefaultPanelsForEditor(PanelManager *registry, EditorType type)
DockNodeIds BuildDockTree(ImGuiID dockspace_id, const DockSplitNeeds &needs, const DockSplitConfig &cfg)
DockPosition
Preferred dock position for a card in a layout.
Metadata for an editor panel (formerly PanelInfo)
std::string GetWindowTitle() const
Get the effective window title for DockBuilder.
Defines default panel visibility for an editor type.
std::unordered_map< std::string, DockPosition > panel_positions