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,7 +2,9 @@
#include "Project/EditorProjectRuntime.h"
#include <XCEditor/Collections/UIEditorTreePanelBehavior.h>
#include <XCEditor/Fields/UIEditorFieldStyle.h>
#include <XCEditor/Foundation/UIEditorPanelInputFilter.h>
#include <XCEditor/Fields/UIEditorTextField.h>
#include "Internal/StringEncoding.h"
@@ -358,22 +360,11 @@ UIRect ProjectPanel::BuildRenameBounds(
ResolveUIEditorTextFieldMetrics());
if (surface == RenameSurface::Tree) {
const std::size_t visibleIndex = TreeDrag::FindVisibleIndexForItemId(
return BuildUIEditorTreePanelInlineRenameBounds(
m_treeFrame.layout,
GetBrowserModel().GetTreeItems(),
itemId);
if (visibleIndex == Widgets::UIEditorTreeViewInvalidIndex ||
visibleIndex >= m_treeFrame.layout.rowRects.size() ||
visibleIndex >= m_treeFrame.layout.labelRects.size()) {
return {};
}
const UIRect& rowRect = m_treeFrame.layout.rowRects[visibleIndex];
const UIRect& labelRect = m_treeFrame.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);
itemId,
hostedMetrics);
}
if (surface == RenameSurface::Grid) {
@@ -962,14 +953,16 @@ std::vector<UIInputEvent> ProjectPanel::BuildTreeInteractionInputEvents(
bool allowInteraction,
bool panelActive) const {
const std::vector<UIInputEvent> rawEvents =
FilterProjectPanelInputEvents(
FilterUIEditorPanelInputEvents(
bounds,
inputEvents,
allowInteraction,
panelActive,
HasActivePointerCapture());
const std::vector<UIInputEvent> treeRawEvents =
FilterTreeInputEvents(rawEvents, m_splitterDragging || m_assetDragState.dragging);
UIEditorPanelInputFilterOptions{
.allowPointerInBounds = allowInteraction,
.allowPointerWhileCaptured = HasActivePointerCapture(),
.allowKeyboardInput = panelActive,
.allowFocusEvents = panelActive || HasActivePointerCapture(),
.includePointerLeave = allowInteraction || HasActivePointerCapture()
});
const Widgets::UIEditorTreeViewLayout layout =
m_treeFrame.layout.bounds.width > 0.0f
@@ -979,11 +972,12 @@ std::vector<UIInputEvent> ProjectPanel::BuildTreeInteractionInputEvents(
GetBrowserModel().GetTreeItems(),
m_folderExpansion,
ResolveUIEditorTreeViewMetrics());
return TreeDrag::BuildInteractionInputEvents(
return BuildUIEditorTreePanelInteractionInputEvents(
m_treeDragState,
layout,
GetBrowserModel().GetTreeItems(),
treeRawEvents);
rawEvents,
m_splitterDragging || m_assetDragState.dragging);
}
UIEditorHostCommandEvaluationResult ProjectPanel::EvaluateAssetCommand(
@@ -1360,12 +1354,16 @@ void ProjectPanel::Update(
m_visible = true;
SyncAssetSelectionFromRuntime();
const std::vector<UIInputEvent> filteredEvents =
FilterProjectPanelInputEvents(
FilterUIEditorPanelInputEvents(
panelState->bounds,
inputEvents,
allowInteraction,
panelActive,
HasActivePointerCapture());
UIEditorPanelInputFilterOptions{
.allowPointerInBounds = allowInteraction,
.allowPointerWhileCaptured = HasActivePointerCapture(),
.allowKeyboardInput = panelActive,
.allowFocusEvents = panelActive || HasActivePointerCapture(),
.includePointerLeave = allowInteraction || HasActivePointerCapture()
});
m_navigationWidth = ClampNavigationWidth(m_navigationWidth, panelState->bounds.width);
m_layout = BuildLayout(panelState->bounds);
@@ -1482,7 +1480,9 @@ void ProjectPanel::Update(
m_treeDragState,
m_treeFrame.layout,
GetBrowserModel().GetTreeItems(),
FilterTreeInputEvents(filteredEvents, m_splitterDragging || m_assetDragState.dragging),
FilterUIEditorTreePanelPointerInputEvents(
filteredEvents,
m_splitterDragging || m_assetDragState.dragging),
m_layout.treeRect,
treeDragCallbacks);
if (treeDragResult.dropCommitted) {
@@ -2041,7 +2041,7 @@ void ProjectPanel::Append(UIDrawList& drawList) const {
1.0f,
0.0f);
} else {
const std::size_t visibleIndex = TreeDrag::FindVisibleIndexForItemId(
const std::size_t visibleIndex = FindUIEditorTreePanelVisibleItemIndex(
m_treeFrame.layout,
GetBrowserModel().GetTreeItems(),
m_treeDragState.dropTargetItemId);
@@ -2059,7 +2059,7 @@ void ProjectPanel::Append(UIDrawList& drawList) const {
if (m_assetDragState.dragging &&
m_assetDragState.validDropTarget &&
m_assetDropTargetSurface == DropTargetSurface::Tree) {
const std::size_t visibleIndex = TreeDrag::FindVisibleIndexForItemId(
const std::size_t visibleIndex = FindUIEditorTreePanelVisibleItemIndex(
m_treeFrame.layout,
GetBrowserModel().GetTreeItems(),
m_assetDragState.dropTargetItemId);
@@ -2157,18 +2157,10 @@ void ProjectPanel::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);
}