Refactor new editor state ownership model

This commit is contained in:
2026-04-19 04:36:52 +08:00
parent 48bfde28e3
commit f45b34a03a
46 changed files with 1979 additions and 217 deletions

View File

@@ -1,6 +1,7 @@
#include "HierarchyPanelInternal.h"
#include "Scene/EditorSceneRuntime.h"
#include "State/EditorCommandFocusService.h"
#include <XCEditor/Collections/UIEditorTreePanelBehavior.h>
#include <XCEditor/Fields/UIEditorFieldStyle.h>
@@ -37,6 +38,13 @@ bool HasValidBounds(const UIRect& bounds) {
return bounds.width > 0.0f && bounds.height > 0.0f;
}
bool ContainsPoint(const UIRect& rect, const UIPoint& point) {
return point.x >= rect.x &&
point.x <= rect.x + rect.width &&
point.y >= rect.y &&
point.y <= rect.y + rect.height;
}
} // namespace
void HierarchyPanel::Initialize() {
@@ -52,6 +60,11 @@ void HierarchyPanel::SetSceneRuntime(EditorSceneRuntime* sceneRuntime) {
SyncModelFromScene();
}
void HierarchyPanel::SetCommandFocusService(
EditorCommandFocusService* commandFocusService) {
m_commandFocusService = commandFocusService;
}
void HierarchyPanel::SetBuiltInIcons(const BuiltInIcons* icons) {
m_icons = icons;
RebuildItems();
@@ -319,6 +332,31 @@ void HierarchyPanel::SyncTreeFocusState(
}
}
void HierarchyPanel::ClaimCommandFocus(
const std::vector<UIInputEvent>& inputEvents,
const UIRect& bounds,
bool allowInteraction) {
if (m_commandFocusService == nullptr) {
return;
}
for (const UIInputEvent& event : inputEvents) {
if (event.type == ::XCEngine::UI::UIInputEventType::FocusGained) {
m_commandFocusService->ClaimFocus(EditorActionRoute::Hierarchy);
return;
}
if (!allowInteraction ||
event.type != ::XCEngine::UI::UIInputEventType::PointerButtonDown ||
!ContainsPoint(bounds, event.position)) {
continue;
}
m_commandFocusService->ClaimFocus(EditorActionRoute::Hierarchy);
return;
}
}
UIRect HierarchyPanel::BuildRenameBounds(
std::string_view itemId,
const Widgets::UIEditorTreeViewLayout& layout) const {
@@ -564,6 +602,7 @@ void HierarchyPanel::Update(
.captureActive = HasActivePointerCapture()
});
SyncTreeFocusState(filteredEvents);
ClaimCommandFocus(filteredEvents, panelState->bounds, allowInteraction);
const Widgets::UIEditorTreeViewMetrics treeMetrics =
ResolveUIEditorTreeViewMetrics();