feat: update asset browser

This commit is contained in:
2026-10-30 10:16:17 +01:00
parent 9cf9242c2a
commit de7e489cc0
18 changed files with 2088 additions and 571 deletions
+36 -2
View File
@@ -33,6 +33,33 @@ namespace {
std::ranges::sort(scenes);
return scenes;
}
// Layouts saved while the scene tree was part of the inspector have no spot for it, split one off the inspector
void DockSceneTreeIntoSavedLayout(ImGuiID dockspaceId)
{
const ImGuiWindowSettings* inspector = ImGui::FindWindowSettingsByID(ImHashStr("Inspector"));
if (ImGui::FindWindowSettingsByID(ImHashStr("Scene Tree")) != nullptr || inspector == nullptr) {
return;
}
const ImGuiID oldNode = inspector->DockId;
const ImGuiDockNode* node = ImGui::DockBuilderGetNode(oldNode);
if (node == nullptr || node->IsSplitNode()) {
return;
}
ImGuiID inspectorNode = 0;
const ImGuiID sceneTreeNode = ImGui::DockBuilderSplitNode(oldNode, ImGuiDir_Up, 0.4f, nullptr, &inspectorNode);
// Windows aren't bound to their nodes yet, the ones tabbed with the inspector would point at the split node
ImGuiContext& context = *ImGui::GetCurrentContext();
for (ImGuiWindowSettings* settings = context.SettingsWindows.begin(); settings != nullptr;
settings = context.SettingsWindows.next_chunk(settings)) {
if (settings->DockId == oldNode) {
settings->DockId = inspectorNode;
}
}
ImGui::DockBuilderDockWindow("Scene Tree", sceneTreeNode);
ImGui::DockBuilderFinish(dockspaceId);
}
}
void Editor::DrawDockSpace()
@@ -42,20 +69,26 @@ void Editor::DrawDockSpace()
const ImGuiViewport* mainViewport = ImGui::GetMainViewport();
ImGui::DockSpaceOverViewport(dockspaceId, mainViewport);
if (hasSavedLayout) {
if (!std::exchange(m_DockLayoutChecked, true)) {
DockSceneTreeIntoSavedLayout(dockspaceId);
}
return;
}
m_DockLayoutChecked = true;
// First run without an imgui.ini: scene in the middle, inspector right, tools left, assets below
// First run without an imgui.ini: scene in the middle, scene tree and inspector right, tools left, assets below
ImGui::DockBuilderRemoveNode(dockspaceId);
ImGui::DockBuilderAddNode(dockspaceId, ImGuiDockNodeFlags_DockSpace);
ImGui::DockBuilderSetNodeSize(dockspaceId, mainViewport->WorkSize);
ImGuiID center = dockspaceId;
const ImGuiID right = ImGui::DockBuilderSplitNode(center, ImGuiDir_Right, 0.25f, nullptr, &center);
ImGuiID right = ImGui::DockBuilderSplitNode(center, ImGuiDir_Right, 0.25f, nullptr, &center);
const ImGuiID left = ImGui::DockBuilderSplitNode(center, ImGuiDir_Left, 0.2f, nullptr, &center);
const ImGuiID bottom = ImGui::DockBuilderSplitNode(center, ImGuiDir_Down, 0.28f, nullptr, &center);
const ImGuiID rightTop = ImGui::DockBuilderSplitNode(right, ImGuiDir_Up, 0.4f, nullptr, &right);
ImGui::DockBuilderDockWindow("Viewport", center);
ImGui::DockBuilderDockWindow("Scene Tree", rightTop);
ImGui::DockBuilderDockWindow("Inspector", right);
ImGui::DockBuilderDockWindow("Stats", left);
ImGui::DockBuilderDockWindow("Physics", left);
@@ -155,6 +188,7 @@ void Editor::DrawViewMenu()
return;
}
ImGui::MenuItem("Scene Tree", nullptr, &m_Panels.sceneTree);
ImGui::MenuItem("Inspector", nullptr, &m_Panels.inspector);
ImGui::MenuItem("Assets", nullptr, &m_Panels.assets);
ImGui::MenuItem("Stats", nullptr, &m_Panels.stats);