Refactor new editor scene viewport tools

This commit is contained in:
2026-04-18 18:55:19 +08:00
parent b8e84001fa
commit f544b2792b
17 changed files with 3414 additions and 14 deletions

View File

@@ -2,6 +2,9 @@
#include "Composition/EditorShellAssetBuilder.h"
#include "Scene/EditorSceneRuntime.h"
#include "State/EditorSelectionStamp.h"
#include <XCEditor/App/EditorPanelIds.h>
#include <sstream>
#include <utility>
@@ -11,6 +14,9 @@ namespace XCEngine::UI::Editor::App {
namespace {
using ::XCEngine::UI::Editor::BuildEditorShellShortcutManager;
using ::XCEngine::UI::Editor::UIEditorWorkspacePanelPresentationModel;
using ::XCEngine::UI::Editor::Widgets::UIEditorViewportSlotToolItem;
using ::XCEngine::UI::Editor::Widgets::UIEditorViewportSlotToolSlot;
std::string ComposeStatusText(
std::string_view status,
@@ -26,6 +32,64 @@ std::string ComposeStatusText(
return std::string(status) + ": " + std::string(message);
}
UIEditorWorkspacePanelPresentationModel* FindMutablePresentation(
std::vector<UIEditorWorkspacePanelPresentationModel>& presentations,
std::string_view panelId) {
for (UIEditorWorkspacePanelPresentationModel& presentation : presentations) {
if (presentation.panelId == panelId) {
return &presentation;
}
}
return nullptr;
}
UIEditorViewportSlotToolItem BuildSceneToolItem(
std::string itemId,
std::string label,
UIEditorViewportSlotToolSlot slot,
bool selected,
float desiredWidth) {
UIEditorViewportSlotToolItem item = {};
item.itemId = std::move(itemId);
item.label = std::move(label);
item.slot = slot;
item.enabled = true;
item.selected = selected;
item.desiredWidth = desiredWidth;
return item;
}
std::vector<UIEditorViewportSlotToolItem> BuildSceneViewportTopBarItems(
const EditorSceneRuntime& sceneRuntime) {
return {
BuildSceneToolItem(
"scene.pivot.pivot",
"Pivot",
UIEditorViewportSlotToolSlot::Leading,
sceneRuntime.GetToolPivotMode() == SceneToolPivotMode::Pivot,
52.0f),
BuildSceneToolItem(
"scene.pivot.center",
"Center",
UIEditorViewportSlotToolSlot::Leading,
sceneRuntime.GetToolPivotMode() == SceneToolPivotMode::Center,
58.0f),
BuildSceneToolItem(
"scene.space.world",
"World",
UIEditorViewportSlotToolSlot::Leading,
sceneRuntime.GetToolSpaceMode() == SceneToolSpaceMode::World,
58.0f),
BuildSceneToolItem(
"scene.space.local",
"Local",
UIEditorViewportSlotToolSlot::Leading,
sceneRuntime.GetToolSpaceMode() == SceneToolSpaceMode::Local,
56.0f)
};
}
} // namespace
bool EditorContext::Initialize(const std::filesystem::path& repoRoot) {
@@ -38,6 +102,8 @@ bool EditorContext::Initialize(const std::filesystem::path& repoRoot) {
m_session = {};
m_session.repoRoot = repoRoot;
m_session.projectRoot = (repoRoot / "project").lexically_normal();
m_projectRuntime = {};
m_projectRuntime.Initialize(repoRoot);
m_sceneRuntime = {};
m_sceneRuntime.Initialize(m_session.projectRoot);
m_hostCommandBridge.BindSession(m_session);
@@ -57,8 +123,14 @@ void EditorContext::AttachTextMeasurer(
void EditorContext::BindEditCommandRoutes(
EditorEditCommandRoute* hierarchyRoute,
EditorEditCommandRoute* projectRoute) {
m_hostCommandBridge.BindEditCommandRoutes(hierarchyRoute, projectRoute);
EditorEditCommandRoute* projectRoute,
EditorEditCommandRoute* sceneRoute,
EditorEditCommandRoute* inspectorRoute) {
m_hostCommandBridge.BindEditCommandRoutes(
hierarchyRoute,
projectRoute,
sceneRoute,
inspectorRoute);
}
void EditorContext::SetExitRequestHandler(std::function<void()> handler) {
@@ -86,6 +158,14 @@ const EditorSession& EditorContext::GetSession() const {
return m_session;
}
EditorProjectRuntime& EditorContext::GetProjectRuntime() {
return m_projectRuntime;
}
const EditorProjectRuntime& EditorContext::GetProjectRuntime() const {
return m_projectRuntime;
}
EditorSceneRuntime& EditorContext::GetSceneRuntime() {
return m_sceneRuntime;
}
@@ -95,11 +175,17 @@ const EditorSceneRuntime& EditorContext::GetSceneRuntime() const {
}
void EditorContext::SetSelection(EditorSelectionState selection) {
selection.stamp = GenerateEditorSelectionStamp();
m_session.selection = std::move(selection);
}
void EditorContext::ClearSelection() {
m_session.selection = {};
m_session.selection.stamp = GenerateEditorSelectionStamp();
}
void EditorContext::SyncSessionFromProjectRuntime() {
m_session.selection = m_projectRuntime.GetSelection();
}
UIEditorWorkspaceController EditorContext::BuildWorkspaceController() const {
@@ -117,12 +203,27 @@ UIEditorShellInteractionDefinition EditorContext::BuildShellDefinition(
const UIEditorWorkspaceController& workspaceController,
std::string_view captureText,
EditorShellVariant variant) const {
return BuildEditorApplicationShellInteractionDefinition(
UIEditorShellInteractionDefinition definition =
BuildEditorApplicationShellInteractionDefinition(
m_shellAsset,
workspaceController,
ComposeStatusText(m_lastStatus, m_lastMessage),
captureText,
variant);
if (UIEditorWorkspacePanelPresentationModel* scenePresentation =
FindMutablePresentation(definition.workspacePresentations, kScenePanelId);
scenePresentation != nullptr) {
scenePresentation->viewportShellModel.spec.chrome.showTopBar = true;
scenePresentation->viewportShellModel.spec.toolItems =
BuildSceneViewportTopBarItems(m_sceneRuntime);
scenePresentation->viewportShellModel.spec.visualState.hoveredToolIndex =
m_sceneRuntime.GetToolState().toolbarHoveredIndex;
scenePresentation->viewportShellModel.spec.visualState.activeToolIndex =
m_sceneRuntime.GetToolState().toolbarActiveIndex;
}
return definition;
}
std::string EditorContext::DescribeWorkspaceState(