new_editor: isolate project panel state and harden runtime reset
This commit is contained in:
@@ -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()) {
|
||||
|
||||
Reference in New Issue
Block a user