From b7d6f535919e348bc694bd0d30094ce2f8630138 Mon Sep 17 00:00:00 2001 From: atdunbg Date: Mon, 5 Oct 2026 00:47:33 +0800 Subject: [PATCH] Editor: rework default layout to UE5 arrangement Panels renamed to UE semantics (docking identity change): Hierarchy -> Outliner, Inspector -> Details, Asset Browser -> Content Browser. Default DockBuilder layout now matches UE5 factory layout: Details docked right (full height), Content Browser docked bottom spanning left+center, Outliner top-left, Viewport center with Stats as a side tab. Legacy imgui.ini (old window names, no new names) is removed once at Init so the new default rebuilds cleanly; fresh or new-style ini is untouched. --- App/editor/AssetBrowserPanel.cpp | 2 +- App/editor/Editor.cpp | 69 +++++++++++++++++++++++--------- App/editor/Editor.h | 5 ++- App/editor/HierarchyPanel.cpp | 2 +- App/editor/InspectorPanel.cpp | 2 +- 5 files changed, 56 insertions(+), 24 deletions(-) diff --git a/App/editor/AssetBrowserPanel.cpp b/App/editor/AssetBrowserPanel.cpp index ab779b2..6e4c6ec 100644 --- a/App/editor/AssetBrowserPanel.cpp +++ b/App/editor/AssetBrowserPanel.cpp @@ -85,7 +85,7 @@ namespace { void AssetBrowserPanel::Draw(const EditorContext& ctx) { - if (!ImGui::Begin("Asset Browser")) + if (!ImGui::Begin("Content Browser")) { ImGui::End(); return; diff --git a/App/editor/Editor.cpp b/App/editor/Editor.cpp index 946b2cd..7eeffdb 100644 --- a/App/editor/Editor.cpp +++ b/App/editor/Editor.cpp @@ -1,12 +1,14 @@ // // Editor.cpp:docking 骨架实现。 // -// 布局方案(首帧 DockBuilder 一次,之后 imgui.ini 接管): -// ┌──────────────────────────────┬───────────────┐ -// │ Hierarchy │ │ -// ├──────────────────────────────┤ Inspector │ -// │ Stats │ (28%) │ -// └──────────────────────────────┴───────────────┘ +// 默认布局 = UE5 出厂布局(首帧 DockBuilder 一次,之后 imgui.ini 接管): +// ┌──────────┬──────────────────────┬───────────┐ +// │ Outliner │ │ │ +// │ │ Viewport │ Details │ +// │ │ (+Stats tab) │ │ +// ├──────────┴──────────────────────┤ │ +// │ Content Browser(左+中通栏) │ │ +// └─────────────────────────────────┴───────────┘ // #include "Editor.h" @@ -27,6 +29,7 @@ #include #include +#include using namespace Engine; // kDisplayViewport / kDisplayDirect(SceneTypes.h) @@ -45,6 +48,32 @@ void Editor::Init(const EditorContext& ctx) m_Viewport = std::make_unique(); m_Stats = std::make_unique(); m_AssetBrowser = std::make_unique(); + + // 旧布局一次性迁移:面板改名(Hierarchy→Outliner / Inspector→Details / + // Asset Browser→Content Browser)= docking 身份全变,旧 imgui.ini 对 + // 新窗口名失效(新窗口首启浮动,而默认布局又因 dock node 非空不再 + // 重建)。检测"有旧名无新名" → 删 ini 让 UE 默认布局重建一次。 + // 此刻 ImGui 首帧 NewFrame 还未读盘(NewFrame 内才 LoadIniSettings), + // 删文件干净无副作用;新式 ini 或无 ini 不动 + if (ImGui::GetCurrentContext() && ImGui::GetIO().IniFilename) + { + const char* path = ImGui::GetIO().IniFilename; + std::ifstream file(path); + if (file) + { + const std::string content((std::istreambuf_iterator(file)), + std::istreambuf_iterator()); + file.close(); + if (content.find("[Window][Hierarchy]") != std::string::npos && + content.find("[Window][Outliner]") == std::string::npos) + { + std::error_code ec; + std::filesystem::remove(path, ec); + ENGINE_INFO("Editor: legacy imgui.ini removed, " + "UE5 default layout will be rebuilt"); + } + } + } } // ---- PIE(Play-In-Editor)---- @@ -259,11 +288,11 @@ void Editor::DrawMenuBar() if (ImGui::BeginMenu("View")) { - ImGui::MenuItem("Hierarchy", nullptr, &m_ShowHierarchy); - ImGui::MenuItem("Inspector", nullptr, &m_ShowInspector); + ImGui::MenuItem("Outliner", nullptr, &m_ShowHierarchy); + ImGui::MenuItem("Details", nullptr, &m_ShowInspector); ImGui::MenuItem("Viewport", nullptr, &m_ShowViewport); ImGui::MenuItem("Stats", nullptr, &m_ShowStats); - ImGui::MenuItem("Asset Browser", nullptr, &m_ShowAssetBrowser); + ImGui::MenuItem("Content Browser", nullptr, &m_ShowAssetBrowser); ImGui::EndMenu(); } @@ -284,19 +313,21 @@ void Editor::DrawDockSpace() ImGui::DockBuilderAddNode(dockspaceId, ImGuiDockNodeFlags_DockSpace); ImGui::DockBuilderSetNodeSize(dockspaceId, ImGui::GetMainViewport()->Size); - ImGuiID dockLeft = 0, dockRight = 0, dockCenter = 0, dockStats = 0; - ImGui::DockBuilderSplitNode(dockspaceId, ImGuiDir_Left, 0.20f, - &dockLeft, &dockCenter); - ImGui::DockBuilderSplitNode(dockCenter, ImGuiDir_Right, 0.28f, + // UE5 出厂布局:Details 右列通栏 → Content Browser 底部通栏 + //(左+中)→ Outliner 左列 → 剩余全给 Viewport(Stats 作其 tab) + ImGuiID dockRight = 0, dockBottom = 0, dockLeft = 0, dockCenter = 0; + ImGui::DockBuilderSplitNode(dockspaceId, ImGuiDir_Right, 0.26f, &dockRight, &dockCenter); - ImGui::DockBuilderSplitNode(dockLeft, ImGuiDir_Down, 0.38f, - &dockStats, &dockLeft); + ImGui::DockBuilderSplitNode(dockCenter, ImGuiDir_Down, 0.30f, + &dockBottom, &dockCenter); + ImGui::DockBuilderSplitNode(dockCenter, ImGuiDir_Left, 0.22f, + &dockLeft, &dockCenter); - ImGui::DockBuilderDockWindow("Hierarchy", dockLeft); - ImGui::DockBuilderDockWindow("Stats", dockStats); - ImGui::DockBuilderDockWindow("Asset Browser", dockStats); - ImGui::DockBuilderDockWindow("Inspector", dockRight); + ImGui::DockBuilderDockWindow("Outliner", dockLeft); ImGui::DockBuilderDockWindow("Viewport", dockCenter); + ImGui::DockBuilderDockWindow("Stats", dockCenter); // Viewport 旁 tab + ImGui::DockBuilderDockWindow("Content Browser", dockBottom); + ImGui::DockBuilderDockWindow("Details", dockRight); ImGui::DockBuilderFinish(dockspaceId); } diff --git a/App/editor/Editor.h b/App/editor/Editor.h index dd7ae57..77cad87 100644 --- a/App/editor/Editor.h +++ b/App/editor/Editor.h @@ -6,8 +6,9 @@ // - 实体选中状态(entt::entity,Hierarchy 写 / Inspector 读) // - 退出确认模态框(窗口关闭 → RequestQuit → Yes 时 Close) // -// 面板窗口名(Hierarchy/Inspector/Viewport/Stats)即 docking 身份, -// imgui.ini 持久化布局;默认布局只在 dock node 为空时构建一次。 +// 面板窗口名(Outliner/Details/Viewport/Stats/Content Browser)即 +// docking 身份,imgui.ini 持久化布局;默认布局只在 dock node 为空时 +// 构建一次(旧名 ini 由 Init 一次性迁移删除,见 Editor.cpp)。 // #ifndef HELLOVULKAN_EDITOR_H diff --git a/App/editor/HierarchyPanel.cpp b/App/editor/HierarchyPanel.cpp index 58d2b4e..88dec7d 100644 --- a/App/editor/HierarchyPanel.cpp +++ b/App/editor/HierarchyPanel.cpp @@ -146,7 +146,7 @@ namespace { void HierarchyPanel::Draw(const EditorContext& ctx, entt::entity& selected) { - ImGui::Begin("Hierarchy"); + ImGui::Begin("Outliner"); // 工具栏:创建实体(在遍历之前,不修改遍历中的注册表结构) if (ImGui::Button("+ Create Entity")) diff --git a/App/editor/InspectorPanel.cpp b/App/editor/InspectorPanel.cpp index b10dea4..74e9a48 100644 --- a/App/editor/InspectorPanel.cpp +++ b/App/editor/InspectorPanel.cpp @@ -154,7 +154,7 @@ namespace void InspectorPanel::Draw(const EditorContext& ctx, entt::entity selected) { - ImGui::Begin("Inspector"); + ImGui::Begin("Details"); auto& reg = ctx.scene->GetRegistry(); if (selected == entt::null || !reg.valid(selected))