new_editor: isolate project panel state and harden runtime reset

This commit is contained in:
2026-04-22 00:19:35 +08:00
parent fff33185b9
commit 8bfca5e8f2
11 changed files with 144 additions and 61 deletions

View File

@@ -306,12 +306,26 @@ const ProjectPanel::BrowserModel& ProjectPanel::GetBrowserModel() const {
return ResolveProjectRuntime()->GetBrowserModel();
}
void ProjectPanel::RebuildWindowTreeItems() {
m_windowTreeItems.clear();
if (!HasProjectRuntime()) {
return;
}
m_windowTreeItems = GetBrowserModel().GetTreeItems();
const UITextureHandle folderIcon = ResolveFolderIcon(m_icons);
for (Widgets::UIEditorTreeViewItem& item : m_windowTreeItems) {
item.leadingIcon = folderIcon;
}
}
const std::vector<Widgets::UIEditorTreeViewItem>& ProjectPanel::GetWindowTreeItems() const {
return m_windowTreeItems;
}
void ProjectPanel::Initialize(const std::filesystem::path& repoRoot) {
m_ownedProjectRuntime = std::make_unique<EditorProjectRuntime>();
m_ownedProjectRuntime->Initialize(repoRoot);
if (m_icons != nullptr) {
m_ownedProjectRuntime->SetFolderIcon(ResolveFolderIcon(m_icons));
}
SyncCurrentFolderSelection();
SyncAssetSelectionFromRuntime();
}
@@ -322,9 +336,6 @@ void ProjectPanel::SetProjectRuntime(EditorProjectRuntime* projectRuntime) {
}
m_projectRuntime = projectRuntime;
if (m_projectRuntime != nullptr && m_icons != nullptr) {
m_projectRuntime->SetFolderIcon(ResolveFolderIcon(m_icons));
}
SyncCurrentFolderSelection();
SyncAssetSelectionFromRuntime();
}
@@ -341,10 +352,7 @@ void ProjectPanel::SetSystemInteractionHost(
void ProjectPanel::SetBuiltInIcons(BuiltInIcons* icons) {
m_icons = icons;
if (EditorProjectRuntime* runtime = ResolveProjectRuntime();
runtime != nullptr) {
runtime->SetFolderIcon(ResolveFolderIcon(m_icons));
}
RebuildWindowTreeItems();
}
void ProjectPanel::SetTextMeasurer(const UIEditorTextMeasurer* textMeasurer) {
@@ -490,7 +498,7 @@ UIRect ProjectPanel::BuildRenameBounds(
if (surface == RenameSurface::Tree) {
return BuildUIEditorTreePanelInlineRenameBounds(
m_treeFrame.layout,
GetBrowserModel().GetTreeItems(),
GetWindowTreeItems(),
itemId,
hostedMetrics);
}
@@ -673,10 +681,12 @@ const UIEditorPanelContentHostPanelState* ProjectPanel::FindMountedProjectPanel(
void ProjectPanel::SyncCurrentFolderSelection() {
if (!HasProjectRuntime()) {
m_windowTreeItems.clear();
m_folderSelection.ClearSelection();
return;
}
RebuildWindowTreeItems();
const std::string& currentFolderId = GetBrowserModel().GetCurrentFolderId();
if (currentFolderId.empty()) {
m_folderSelection.ClearSelection();
@@ -1103,14 +1113,14 @@ std::vector<UIInputEvent> ProjectPanel::BuildTreeInteractionInputEvents(
? m_treeFrame.layout
: Widgets::BuildUIEditorTreeViewLayout(
m_layout.treeRect,
GetBrowserModel().GetTreeItems(),
GetWindowTreeItems(),
m_folderExpansion,
ResolveUIEditorTreeViewMetrics(),
m_treeInteractionState.verticalOffset);
return BuildUIEditorTreePanelInteractionInputEvents(
m_treeDragState,
layout,
GetBrowserModel().GetTreeItems(),
GetWindowTreeItems(),
rawEvents,
m_splitterDragging || m_assetDragState.dragging);
}
@@ -1521,6 +1531,7 @@ void ProjectPanel::Update(
SyncAssetSelectionFromRuntime();
}
RebuildWindowTreeItems();
m_visible = true;
SyncAssetSelectionFromRuntime();
const std::vector<UIInputEvent> filteredEvents =
@@ -1551,7 +1562,7 @@ void ProjectPanel::Update(
const Widgets::UIEditorTreeViewMetrics treeMetrics = ResolveUIEditorTreeViewMetrics();
m_treeFrame.layout = Widgets::BuildUIEditorTreeViewLayout(
m_layout.treeRect,
GetBrowserModel().GetTreeItems(),
GetWindowTreeItems(),
m_folderExpansion,
treeMetrics,
m_treeInteractionState.verticalOffset);
@@ -1579,7 +1590,7 @@ void ProjectPanel::Update(
m_folderSelection,
m_folderExpansion,
m_layout.treeRect,
GetBrowserModel().GetTreeItems(),
GetWindowTreeItems(),
treeEvents,
treeMetrics);
@@ -1657,7 +1668,7 @@ void ProjectPanel::Update(
TreeDrag::ProcessInputEvents(
m_treeDragState,
m_treeFrame.layout,
GetBrowserModel().GetTreeItems(),
GetWindowTreeItems(),
FilterUIEditorTreePanelPointerInputEvents(
filteredEvents,
m_splitterDragging || m_assetDragState.dragging),
@@ -1677,7 +1688,7 @@ void ProjectPanel::Update(
m_layout = BuildLayout(panelState->bounds);
m_treeFrame.layout = Widgets::BuildUIEditorTreeViewLayout(
m_layout.treeRect,
GetBrowserModel().GetTreeItems(),
GetWindowTreeItems(),
m_folderExpansion,
treeMetrics,
m_treeInteractionState.verticalOffset);
@@ -1800,7 +1811,7 @@ void ProjectPanel::Update(
m_layout = BuildLayout(panelState->bounds);
m_treeFrame.layout = Widgets::BuildUIEditorTreeViewLayout(
m_layout.treeRect,
GetBrowserModel().GetTreeItems(),
GetWindowTreeItems(),
m_folderExpansion,
treeMetrics,
m_treeInteractionState.verticalOffset);
@@ -2148,13 +2159,13 @@ std::string ProjectPanel::ResolveAssetDropTargetItemId(
if (ContainsPoint(m_treeFrame.layout.bounds, point)) {
Widgets::UIEditorTreeViewHitTarget hitTarget =
Widgets::HitTestUIEditorTreeView(m_treeFrame.layout, point);
if (hitTarget.itemIndex < GetBrowserModel().GetTreeItems().size() &&
if (hitTarget.itemIndex < GetWindowTreeItems().size() &&
(hitTarget.kind == Widgets::UIEditorTreeViewHitTargetKind::Row ||
hitTarget.kind == Widgets::UIEditorTreeViewHitTargetKind::Disclosure)) {
if (surface != nullptr) {
*surface = DropTargetSurface::Tree;
}
return GetBrowserModel().GetTreeItems()[hitTarget.itemIndex].itemId;
return GetWindowTreeItems()[hitTarget.itemIndex].itemId;
}
}
@@ -2205,7 +2216,7 @@ void ProjectPanel::Append(UIDrawList& drawList) const {
AppendUIEditorTreeViewBackground(
drawList,
m_treeFrame.layout,
GetBrowserModel().GetTreeItems(),
GetWindowTreeItems(),
m_folderSelection,
m_treeInteractionState.treeViewState,
treePalette,
@@ -2213,7 +2224,7 @@ void ProjectPanel::Append(UIDrawList& drawList) const {
AppendUIEditorTreeViewForeground(
drawList,
m_treeFrame.layout,
GetBrowserModel().GetTreeItems(),
GetWindowTreeItems(),
treePalette,
treeMetrics);
@@ -2227,7 +2238,7 @@ void ProjectPanel::Append(UIDrawList& drawList) const {
} else {
const std::size_t visibleIndex = FindUIEditorTreePanelVisibleItemIndex(
m_treeFrame.layout,
GetBrowserModel().GetTreeItems(),
GetWindowTreeItems(),
m_treeDragState.dropTargetItemId);
if (visibleIndex != Widgets::UIEditorTreeViewInvalidIndex &&
visibleIndex < m_treeFrame.layout.rowRects.size()) {
@@ -2245,7 +2256,7 @@ void ProjectPanel::Append(UIDrawList& drawList) const {
m_assetDropTargetSurface == DropTargetSurface::Tree) {
const std::size_t visibleIndex = FindUIEditorTreePanelVisibleItemIndex(
m_treeFrame.layout,
GetBrowserModel().GetTreeItems(),
GetWindowTreeItems(),
m_assetDragState.dropTargetItemId);
if (visibleIndex != Widgets::UIEditorTreeViewInvalidIndex &&
visibleIndex < m_treeFrame.layout.rowRects.size()) {