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;
117 case EditorType::kDungeon:
124 case EditorType::kOverworld:
143 ImGuiID left_top = 0;
144 ImGuiID left_bottom = 0;
145 ImGuiID right_top = 0;
146 ImGuiID right_bottom = 0;
154 bool left_top =
false;
155 bool left_bottom =
false;
156 bool right_top =
false;
157 bool right_bottom =
false;
178 needs.left_top =
true;
182 needs.left_bottom =
true;
186 needs.right_top =
true;
190 needs.right_bottom =
true;
203 ids.
center = dockspace_id;
206 ids.left = ImGui::DockBuilderSplitNode(ids.center, ImGuiDir_Left, cfg.
left,
207 nullptr, &ids.center);
210 ids.right = ImGui::DockBuilderSplitNode(ids.center, ImGuiDir_Right,
211 cfg.
right,
nullptr, &ids.center);
214 ids.bottom = ImGui::DockBuilderSplitNode(ids.center, ImGuiDir_Down,
215 cfg.
bottom,
nullptr, &ids.center);
218 ids.top = ImGui::DockBuilderSplitNode(ids.center, ImGuiDir_Up, cfg.
top,
219 nullptr, &ids.center);
223 ids.left_bottom = ImGui::DockBuilderSplitNode(
224 ids.left, ImGuiDir_Down, cfg.
vertical_split,
nullptr, &ids.left_top);
228 ids.right_bottom = ImGui::DockBuilderSplitNode(
229 ids.right, ImGuiDir_Down, cfg.
vertical_split,
nullptr, &ids.right_top);
242 "PanelManager not available, skipping dock layout for type %d",
243 static_cast<int>(type));
247 const size_t session_id =
250 DockSplitNeeds needs = ComputeSplitNeeds(preset);
251 DockSplitConfig cfg = DockSplitConfig::ForEditor(type);
252 DockNodeIds ids = BuildDockTree(dockspace_id, needs, cfg);
257 return ids.left ? ids.left : ids.center;
259 return ids.right ? ids.right : ids.center;
261 return ids.bottom ? ids.bottom : ids.center;
263 return ids.top ? ids.top : ids.center;
265 return ids.left_top ? ids.left_top
266 : (ids.left ? ids.left : ids.center);
268 return ids.left_bottom ? ids.left_bottom
269 : (ids.left ? ids.left : ids.center);
271 return ids.right_top ? ids.right_top
272 : (ids.right ? ids.right : ids.center);
274 return ids.right_bottom ? ids.right_bottom
275 : (ids.right ? ids.right : ids.center);
283 for (
const auto& [panel_id, position] : preset.panel_positions) {
290 "Preset references panel '%s' that is not registered (session "
292 panel_id.c_str(), session_id);
297 if (window_title.empty()) {
299 "Cannot dock panel '%s': missing window title (session %zu)",
300 panel_id.c_str(), session_id);
304 ImGui::DockBuilderDockWindow(window_title.c_str(), get_dock_id(position));
324 LOG_INFO(
"LayoutManager",
"Saving layout: %s", name.c_str());
330 LOG_INFO(
"LayoutManager",
"Loading layout: %s", name.c_str());
335 LOG_INFO(
"LayoutManager",
"Reset layout for editor type %d",
336 static_cast<int>(type));
346 LOG_INFO(
"LayoutManager",
"Marked layout for editor type %d as initialized",
347 static_cast<int>(type));
352 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
static DockSplitConfig ForEditor(EditorType type)