refactor(new_editor): unify panel input and rename primitives

This commit is contained in:
2026-04-19 03:23:16 +08:00
parent c59cd83c38
commit 78bcd2e9ca
17 changed files with 652 additions and 338 deletions

View File

@@ -2,6 +2,7 @@
#include "Scene/EditorSceneRuntime.h"
#include <XCEditor/Collections/UIEditorTreePanelBehavior.h>
#include <XCEditor/Fields/UIEditorFieldStyle.h>
#include <XCEditor/Fields/UIEditorTextField.h>
@@ -321,28 +322,15 @@ void HierarchyPanel::SyncTreeFocusState(
UIRect HierarchyPanel::BuildRenameBounds(
std::string_view itemId,
const Widgets::UIEditorTreeViewLayout& layout) const {
if (itemId.empty()) {
return {};
}
const std::size_t visibleIndex =
FindVisibleIndexForItemId(layout, m_treeItems, itemId);
if (visibleIndex == UIEditorTreeViewInvalidIndex ||
visibleIndex >= layout.rowRects.size() ||
visibleIndex >= layout.labelRects.size()) {
return {};
}
const Widgets::UIEditorTextFieldMetrics hostedMetrics =
BuildUIEditorPropertyGridTextFieldMetrics(
ResolveUIEditorPropertyGridMetrics(),
ResolveUIEditorTextFieldMetrics());
const UIRect& rowRect = layout.rowRects[visibleIndex];
const UIRect& labelRect = layout.labelRects[visibleIndex];
const float x = (std::max)(rowRect.x, labelRect.x - hostedMetrics.valueTextInsetX);
const float right = rowRect.x + rowRect.width - 8.0f;
const float width = (std::max)(120.0f, right - x);
return UIRect(x, rowRect.y, width, rowRect.height);
return BuildUIEditorTreePanelInlineRenameBounds(
layout,
m_treeItems,
itemId,
hostedMetrics);
}
bool HierarchyPanel::WantsHostPointerCapture() const {
@@ -464,12 +452,14 @@ void HierarchyPanel::ProcessDragAndFrameEvents(
const UIRect& bounds,
bool allowInteraction,
bool panelActive) {
const std::vector<UIInputEvent> filteredEvents = FilterHierarchyInputEvents(
const std::vector<UIInputEvent> filteredEvents = FilterUIEditorTreePanelInputEvents(
bounds,
inputEvents,
allowInteraction,
panelActive,
HasActivePointerCapture());
UIEditorTreePanelInputFilterOptions{
.allowInteraction = allowInteraction,
.panelActive = panelActive,
.captureActive = HasActivePointerCapture()
});
if (m_treeFrame.result.selectionChanged) {
SyncSceneRuntimeSelectionFromTree();
@@ -565,12 +555,14 @@ void HierarchyPanel::Update(
}
m_visible = true;
const std::vector<UIInputEvent> filteredEvents = FilterHierarchyInputEvents(
const std::vector<UIInputEvent> filteredEvents = FilterUIEditorTreePanelInputEvents(
panelState->bounds,
inputEvents,
allowInteraction,
panelActive,
HasActivePointerCapture());
UIEditorTreePanelInputFilterOptions{
.allowInteraction = allowInteraction,
.panelActive = panelActive,
.captureActive = HasActivePointerCapture()
});
SyncTreeFocusState(filteredEvents);
const Widgets::UIEditorTreeViewMetrics treeMetrics =
@@ -591,11 +583,12 @@ void HierarchyPanel::Update(
}
const std::vector<UIInputEvent> interactionEvents =
TreeDrag::BuildInteractionInputEvents(
BuildUIEditorTreePanelInteractionInputEvents(
m_dragState,
layout,
m_treeItems,
filteredEvents,
false,
kDragThreshold);
m_treeFrame = UpdateUIEditorTreeViewInteraction(
m_treeInteractionState,
@@ -655,18 +648,10 @@ void HierarchyPanel::Append(UIDrawList& drawList) const {
BuildUIEditorPropertyGridTextFieldMetrics(
ResolveUIEditorPropertyGridMetrics(),
ResolveUIEditorTextFieldMetrics()));
Widgets::AppendUIEditorTextFieldBackground(
AppendUIEditorInlineRenameSession(
drawList,
m_renameFrame.layout,
m_renameState.textFieldSpec,
m_renameState.textFieldInteraction.textFieldState,
textFieldPalette,
textFieldMetrics);
Widgets::AppendUIEditorTextFieldForeground(
drawList,
m_renameFrame.layout,
m_renameState.textFieldSpec,
m_renameState.textFieldInteraction.textFieldState,
m_renameFrame,
m_renameState,
textFieldPalette,
textFieldMetrics);
}
@@ -684,11 +669,11 @@ void HierarchyPanel::Append(UIDrawList& drawList) const {
return;
}
const std::size_t visibleIndex = TreeDrag::FindVisibleIndexForItemId(
const std::size_t visibleIndex = FindUIEditorTreePanelVisibleItemIndex(
m_treeFrame.layout,
m_treeItems,
m_dragState.dropTargetItemId);
if (visibleIndex == UIEditorTreeViewInvalidIndex ||
if (visibleIndex == Widgets::UIEditorTreeViewInvalidIndex ||
visibleIndex >= m_treeFrame.layout.rowRects.size()) {
return;
}