new_editor: remove tree panel behavior layer

This commit is contained in:
2026-04-22 18:37:05 +08:00
parent 6d97f4fc3a
commit c1e7a0d49f
12 changed files with 567 additions and 398 deletions

View File

@@ -8,7 +8,6 @@
#include "Ports/SystemInteractionPort.h"
#include "Project/EditorProjectRuntime.h"
#include "State/EditorCommandFocusService.h"
#include <XCEditor/Collections/UIEditorTreePanelBehavior.h>
#include <XCEditor/Fields/UIEditorFieldStyle.h>
#include <XCEditor/Foundation/UIEditorPanelInputFilter.h>
#include <XCEditor/Fields/UIEditorTextField.h>
@@ -478,12 +477,10 @@ UIRect ProjectPanel::BuildRenameBounds(
}
const Widgets::UIEditorTextFieldMetrics hostedMetrics =
BuildUIEditorPropertyGridTextFieldMetrics(
ResolveUIEditorPropertyGridMetrics(),
ResolveUIEditorTextFieldMetrics());
ResolveUIEditorTreeViewHostedTextFieldMetrics();
if (surface == RenameSurface::Tree) {
return BuildUIEditorTreePanelInlineRenameBounds(
return BuildUIEditorTreeViewInlineRenameBounds(
m_treeFrame.layout,
GetWindowTreeItems(),
itemId,
@@ -541,28 +538,12 @@ bool ProjectPanel::TryStartQueuedRenameSession() {
const UIRect bounds =
BuildRenameBounds(m_pendingRenameItemId, m_pendingRenameSurface);
if (!HasValidBounds(bounds)) {
return false;
}
const Widgets::UIEditorTextFieldMetrics textFieldMetrics =
BuildUIEditorInlineRenameTextFieldMetrics(
bounds,
BuildUIEditorPropertyGridTextFieldMetrics(
ResolveUIEditorPropertyGridMetrics(),
ResolveUIEditorTextFieldMetrics()));
UIEditorInlineRenameSessionRequest request = {};
request.beginSession = true;
request.itemId = m_pendingRenameItemId;
request.initialText = initialText;
request.bounds = bounds;
m_renameFrame = UpdateUIEditorInlineRenameSession(
m_renameState,
request,
{},
textFieldMetrics);
if (!m_renameFrame.result.sessionStarted) {
if (!TryStartUIEditorTreeViewInlineRenameSession(
m_renameState,
m_renameFrame,
m_pendingRenameItemId,
std::move(initialText),
bounds)) {
return false;
}
@@ -579,27 +560,16 @@ void ProjectPanel::UpdateRenameSession(
}
const UIRect bounds = BuildRenameBounds(m_renameState.itemId, m_activeRenameSurface);
if (!HasValidBounds(bounds)) {
if (!HasUIEditorTreeViewValidBounds(bounds)) {
ClearRenameState();
return;
}
const Widgets::UIEditorTextFieldMetrics textFieldMetrics =
BuildUIEditorInlineRenameTextFieldMetrics(
bounds,
BuildUIEditorPropertyGridTextFieldMetrics(
ResolveUIEditorPropertyGridMetrics(),
ResolveUIEditorTextFieldMetrics()));
UIEditorInlineRenameSessionRequest request = {};
request.itemId = m_renameState.itemId;
request.initialText = m_renameState.textFieldSpec.value;
request.bounds = bounds;
m_renameFrame = UpdateUIEditorInlineRenameSession(
UpdateUIEditorTreeViewInlineRenameSession(
m_renameState,
request,
inputEvents,
textFieldMetrics);
m_renameFrame,
bounds,
inputEvents);
if (!m_renameFrame.result.sessionCommitted) {
if (m_renameFrame.result.sessionCanceled) {
m_activeRenameSurface = RenameSurface::None;
@@ -1066,20 +1036,13 @@ std::vector<UIInputEvent> ProjectPanel::BuildTreeInteractionInputEvents(
const UIRect& bounds,
const UIEditorHostedPanelDispatchEntry& dispatchEntry) const {
const std::vector<UIInputEvent> rawEvents =
BuildUIEditorPanelInputEvents(
BuildUIEditorHostedTreeViewInputEvents(
bounds,
inputEvents,
UIEditorPanelInputFilterOptions{
.allowPointerInBounds = dispatchEntry.allowInteraction,
.allowPointerWhileCaptured = HasActivePointerCapture(),
.allowKeyboardInput = dispatchEntry.focused,
.allowFocusEvents =
dispatchEntry.focused ||
HasActivePointerCapture() ||
dispatchEntry.focusGained ||
dispatchEntry.focusLost,
.includePointerLeave =
dispatchEntry.allowInteraction || HasActivePointerCapture()
UIEditorHostedTreeViewInputOptions{
.allowInteraction = dispatchEntry.allowInteraction,
.hasInputFocus = dispatchEntry.focused,
.captureActive = HasActivePointerCapture()
},
dispatchEntry.focusGained,
dispatchEntry.focusLost);
@@ -1093,11 +1056,12 @@ std::vector<UIInputEvent> ProjectPanel::BuildTreeInteractionInputEvents(
m_folderExpansion,
ResolveUIEditorTreeViewMetrics(),
m_treeInteractionState.verticalOffset);
return BuildUIEditorTreePanelInteractionInputEvents(
return TreeDrag::BuildInteractionInputEvents(
m_treeDragState,
layout,
GetWindowTreeItems(),
rawEvents,
TreeDrag::kDefaultDragThreshold,
m_splitterDragging || m_assetDragState.dragging);
}
@@ -1645,11 +1609,11 @@ void ProjectPanel::Update(
m_treeDragState,
m_treeFrame.layout,
GetWindowTreeItems(),
FilterUIEditorTreePanelPointerInputEvents(
filteredEvents,
m_splitterDragging || m_assetDragState.dragging),
filteredEvents,
m_layout.treeRect,
treeDragCallbacks);
treeDragCallbacks,
TreeDrag::kDefaultDragThreshold,
m_splitterDragging || m_assetDragState.dragging);
if (treeDragResult.dropCommitted) {
const bool hadAssetSelection = ResolveProjectRuntime()->HasSelection();
CloseContextMenu();
@@ -2206,45 +2170,29 @@ void ProjectPanel::Append(UIDrawList& drawList) const {
treePalette,
treeMetrics);
if (m_treeDragState.dragging && m_treeDragState.validDropTarget) {
if (m_treeDragState.dropToRoot) {
drawList.AddRectOutline(
m_treeFrame.layout.bounds,
kDropPreviewColor,
1.0f,
0.0f);
} else {
const std::size_t visibleIndex = FindUIEditorTreePanelVisibleItemIndex(
m_treeFrame.layout,
GetWindowTreeItems(),
m_treeDragState.dropTargetItemId);
if (visibleIndex != Widgets::UIEditorTreeViewInvalidIndex &&
visibleIndex < m_treeFrame.layout.rowRects.size()) {
drawList.AddRectOutline(
m_treeFrame.layout.rowRects[visibleIndex],
kDropPreviewColor,
1.0f,
0.0f);
}
}
}
AppendUIEditorTreeViewDropPreview(
drawList,
m_treeFrame.layout,
GetWindowTreeItems(),
m_treeDragState.dragging && m_treeDragState.validDropTarget,
m_treeDragState.dropToRoot,
m_treeDragState.dropTargetItemId,
kDropPreviewColor,
1.0f,
0.0f);
if (m_assetDragState.dragging &&
m_assetDragState.validDropTarget &&
m_assetDropTargetSurface == DropTargetSurface::Tree) {
const std::size_t visibleIndex = FindUIEditorTreePanelVisibleItemIndex(
m_treeFrame.layout,
GetWindowTreeItems(),
m_assetDragState.dropTargetItemId);
if (visibleIndex != Widgets::UIEditorTreeViewInvalidIndex &&
visibleIndex < m_treeFrame.layout.rowRects.size()) {
drawList.AddRectOutline(
m_treeFrame.layout.rowRects[visibleIndex],
kDropPreviewColor,
1.0f,
0.0f);
}
}
AppendUIEditorTreeViewDropPreview(
drawList,
m_treeFrame.layout,
GetWindowTreeItems(),
m_assetDragState.dragging &&
m_assetDragState.validDropTarget &&
m_assetDropTargetSurface == DropTargetSurface::Tree,
false,
m_assetDragState.dropTargetItemId,
kDropPreviewColor,
1.0f,
0.0f);
drawList.PushClipRect(m_layout.browserHeaderRect);
for (std::size_t index = 0u; index < m_layout.breadcrumbItems.size(); ++index) {
@@ -2334,22 +2282,16 @@ void ProjectPanel::Append(UIDrawList& drawList) const {
}
if (m_renameState.active) {
const Widgets::UIEditorTextFieldPalette textFieldPalette =
BuildUIEditorPropertyGridTextFieldPalette(
ResolveUIEditorPropertyGridPalette(),
ResolveUIEditorTextFieldPalette());
const Widgets::UIEditorTextFieldMetrics textFieldMetrics =
BuildUIEditorInlineRenameTextFieldMetrics(
BuildRenameBounds(m_renameState.itemId, m_activeRenameSurface),
BuildUIEditorPropertyGridTextFieldMetrics(
ResolveUIEditorPropertyGridMetrics(),
ResolveUIEditorTextFieldMetrics()));
AppendUIEditorInlineRenameSession(
drawList,
m_renameFrame,
m_renameState,
textFieldPalette,
textFieldMetrics);
const UIRect renameBounds =
BuildRenameBounds(m_renameState.itemId, m_activeRenameSurface);
if (HasUIEditorTreeViewValidBounds(renameBounds)) {
AppendUIEditorInlineRenameSession(
drawList,
m_renameFrame,
m_renameState,
ResolveUIEditorTreeViewInlineRenamePalette(),
BuildUIEditorTreeViewInlineRenameMetrics(renameBounds));
}
}
if (assetEntries.empty()) {