Refactor new editor scene viewport tools
This commit is contained in:
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user