Refine project panel runtime ownership
This commit is contained in:
@@ -15,7 +15,6 @@
|
||||
#include <XCEngine/Input/InputTypes.h>
|
||||
#include <XCEngine/UI/Widgets/UIPopupOverlayModel.h>
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <utility>
|
||||
|
||||
namespace XCEngine::UI::Editor::App {
|
||||
@@ -342,28 +341,16 @@ Widgets::UIEditorMenuPopupState PreserveContextMenuWidgetState(
|
||||
|
||||
} // namespace
|
||||
|
||||
EditorProjectRuntime* ProjectPanel::ResolveProjectRuntime() {
|
||||
return m_projectRuntime != nullptr
|
||||
? m_projectRuntime
|
||||
: m_ownedProjectRuntime.get();
|
||||
}
|
||||
|
||||
const EditorProjectRuntime* ProjectPanel::ResolveProjectRuntime() const {
|
||||
return m_projectRuntime != nullptr
|
||||
? m_projectRuntime
|
||||
: m_ownedProjectRuntime.get();
|
||||
}
|
||||
|
||||
bool ProjectPanel::HasProjectRuntime() const {
|
||||
return ResolveProjectRuntime() != nullptr;
|
||||
return m_projectRuntime != nullptr;
|
||||
}
|
||||
|
||||
ProjectPanel::BrowserModel& ProjectPanel::GetBrowserModel() {
|
||||
return ResolveProjectRuntime()->GetBrowserModel();
|
||||
return m_projectRuntime->GetBrowserModel();
|
||||
}
|
||||
|
||||
const ProjectPanel::BrowserModel& ProjectPanel::GetBrowserModel() const {
|
||||
return ResolveProjectRuntime()->GetBrowserModel();
|
||||
return m_projectRuntime->GetBrowserModel();
|
||||
}
|
||||
|
||||
void ProjectPanel::RebuildWindowTreeItems() {
|
||||
@@ -400,12 +387,6 @@ ProjectPanel::GetPresentedWindowTreeExpansionModel() const {
|
||||
return ResolveUIEditorFilterableTreeHostExpansionModel(m_treeFilterHostFrame);
|
||||
}
|
||||
|
||||
void ProjectPanel::Initialize(const std::filesystem::path& projectRoot) {
|
||||
m_ownedProjectRuntime = std::make_unique<EditorProjectRuntime>();
|
||||
m_ownedProjectRuntime->Initialize(projectRoot);
|
||||
SyncSelectionsFromRuntime();
|
||||
}
|
||||
|
||||
void ProjectPanel::SetProjectRuntime(EditorProjectRuntime* projectRuntime) {
|
||||
if (m_projectRuntime == projectRuntime) {
|
||||
return;
|
||||
@@ -478,16 +459,14 @@ const std::vector<ProjectPanel::Event>& ProjectPanel::GetFrameEvents() const {
|
||||
}
|
||||
|
||||
const ProjectPanel::FolderEntry* ProjectPanel::FindFolderEntry(std::string_view itemId) const {
|
||||
const EditorProjectRuntime* runtime = ResolveProjectRuntime();
|
||||
return runtime != nullptr
|
||||
? runtime->FindFolderEntry(itemId)
|
||||
return m_projectRuntime != nullptr
|
||||
? m_projectRuntime->FindFolderEntry(itemId)
|
||||
: nullptr;
|
||||
}
|
||||
|
||||
const ProjectPanel::AssetEntry* ProjectPanel::FindAssetEntry(std::string_view itemId) const {
|
||||
const EditorProjectRuntime* runtime = ResolveProjectRuntime();
|
||||
return runtime != nullptr
|
||||
? runtime->FindAssetEntry(itemId)
|
||||
return m_projectRuntime != nullptr
|
||||
? m_projectRuntime->FindAssetEntry(itemId)
|
||||
: nullptr;
|
||||
}
|
||||
|
||||
@@ -498,15 +477,14 @@ ProjectPanel::AssetCommandTarget ProjectPanel::ResolveAssetCommandTarget(
|
||||
return {};
|
||||
}
|
||||
|
||||
return ResolveProjectRuntime()->ResolveAssetCommandTarget(
|
||||
return m_projectRuntime->ResolveAssetCommandTarget(
|
||||
explicitItemId,
|
||||
forceCurrentFolder);
|
||||
}
|
||||
|
||||
const ProjectPanel::AssetEntry* ProjectPanel::GetSelectedAssetEntry() const {
|
||||
const EditorProjectRuntime* runtime = ResolveProjectRuntime();
|
||||
return runtime != nullptr && runtime->HasSelection()
|
||||
? runtime->FindAssetEntry(runtime->GetSelection().itemId)
|
||||
return m_projectRuntime != nullptr && m_projectRuntime->HasSelection()
|
||||
? m_projectRuntime->FindAssetEntry(m_projectRuntime->GetSelection().itemId)
|
||||
: nullptr;
|
||||
}
|
||||
|
||||
@@ -666,7 +644,7 @@ void ProjectPanel::UpdateRenameSession(
|
||||
|
||||
std::string renamedItemId = {};
|
||||
if (m_renameFrame.result.valueChanged &&
|
||||
!ResolveProjectRuntime()->RenameItem(
|
||||
!m_projectRuntime->RenameItem(
|
||||
m_renameFrame.result.itemId,
|
||||
m_renameFrame.result.valueAfter,
|
||||
&renamedItemId)) {
|
||||
@@ -704,7 +682,7 @@ std::optional<ProjectPanel::EditCommandTarget> ProjectPanel::ResolveEditCommandT
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
return ResolveProjectRuntime()->ResolveEditCommandTarget(
|
||||
return m_projectRuntime->ResolveEditCommandTarget(
|
||||
explicitItemId,
|
||||
forceCurrentFolder);
|
||||
}
|
||||
@@ -737,14 +715,13 @@ void ProjectPanel::SyncSelectionsFromRuntime() {
|
||||
}
|
||||
|
||||
void ProjectPanel::SyncAssetSelectionFromRuntime() {
|
||||
const EditorProjectRuntime* runtime = ResolveProjectRuntime();
|
||||
if (runtime == nullptr || !runtime->HasSelection()) {
|
||||
if (m_projectRuntime == nullptr || !m_projectRuntime->HasSelection()) {
|
||||
m_assetSelection.ClearSelection();
|
||||
return;
|
||||
}
|
||||
|
||||
if (FindAssetEntry(runtime->GetSelection().itemId) != nullptr) {
|
||||
m_assetSelection.SetSelection(runtime->GetSelection().itemId);
|
||||
if (FindAssetEntry(m_projectRuntime->GetSelection().itemId) != nullptr) {
|
||||
m_assetSelection.SetSelection(m_projectRuntime->GetSelection().itemId);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -862,7 +839,7 @@ void ProjectPanel::RebuildBrowserScrollLayout() {
|
||||
}
|
||||
|
||||
bool ProjectPanel::NavigateToFolder(std::string_view itemId, EventSource source) {
|
||||
if (!ResolveProjectRuntime()->NavigateToFolder(itemId)) {
|
||||
if (!m_projectRuntime->NavigateToFolder(itemId)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -883,7 +860,7 @@ bool ProjectPanel::OpenProjectItem(std::string_view itemId, EventSource source)
|
||||
}
|
||||
|
||||
if (asset->directory) {
|
||||
const bool navigated = ResolveProjectRuntime()->OpenItem(asset->itemId);
|
||||
const bool navigated = m_projectRuntime->OpenItem(asset->itemId);
|
||||
if (navigated && HasValidBounds(m_layout.bounds)) {
|
||||
SyncSelectionsFromRuntime();
|
||||
RebuildPanelLayout(m_layout.bounds);
|
||||
@@ -901,7 +878,7 @@ bool ProjectPanel::OpenProjectItem(std::string_view itemId, EventSource source)
|
||||
return navigated;
|
||||
}
|
||||
|
||||
if (!ResolveProjectRuntime()->OpenItem(asset->itemId)) {
|
||||
if (!m_projectRuntime->OpenItem(asset->itemId)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -1365,7 +1342,7 @@ UIEditorHostCommandDispatchResult ProjectPanel::DispatchAssetCommand(
|
||||
m_hoveredAssetItemId.clear();
|
||||
m_lastPrimaryClickedAssetId = std::string(createdItemId);
|
||||
m_lastPrimaryClickTime = {};
|
||||
ResolveProjectRuntime()->SetSelection(createdItemId);
|
||||
m_projectRuntime->SetSelection(createdItemId);
|
||||
SyncSelectionsFromRuntime();
|
||||
|
||||
const AssetEntry* createdAsset = FindAssetEntry(createdItemId);
|
||||
@@ -1388,7 +1365,7 @@ UIEditorHostCommandDispatchResult ProjectPanel::DispatchAssetCommand(
|
||||
}
|
||||
|
||||
std::string createdFolderId = {};
|
||||
if (!ResolveProjectRuntime()->CreateFolder(
|
||||
if (!m_projectRuntime->CreateFolder(
|
||||
target.containerFolder->itemId,
|
||||
"New Folder",
|
||||
&createdFolderId)) {
|
||||
@@ -1425,7 +1402,7 @@ UIEditorHostCommandDispatchResult ProjectPanel::DispatchAssetCommand(
|
||||
}
|
||||
|
||||
std::string createdItemId = {};
|
||||
if (!ResolveProjectRuntime()->CreateMaterial(
|
||||
if (!m_projectRuntime->CreateMaterial(
|
||||
target.containerFolder->itemId,
|
||||
"New Material",
|
||||
&createdItemId)) {
|
||||
@@ -1588,8 +1565,8 @@ UIEditorHostCommandDispatchResult ProjectPanel::DispatchEditCommand(
|
||||
|
||||
if (commandId == "edit.delete") {
|
||||
const std::string previousCurrentFolderId = GetBrowserModel().GetCurrentFolderId();
|
||||
const bool hadAssetSelection = ResolveProjectRuntime()->HasSelection();
|
||||
if (!ResolveProjectRuntime()->DeleteItem(target->itemId)) {
|
||||
const bool hadAssetSelection = m_projectRuntime->HasSelection();
|
||||
if (!m_projectRuntime->DeleteItem(target->itemId)) {
|
||||
return BuildDispatchResult(false, "Failed to delete the selected project item.");
|
||||
}
|
||||
|
||||
@@ -1606,7 +1583,7 @@ UIEditorHostCommandDispatchResult ProjectPanel::DispatchEditCommand(
|
||||
m_browserScrollFrame.layout.contentRect,
|
||||
m_browserVerticalOffset);
|
||||
}
|
||||
if (hadAssetSelection && !ResolveProjectRuntime()->HasSelection()) {
|
||||
if (hadAssetSelection && !m_projectRuntime->HasSelection()) {
|
||||
EmitSelectionClearedEvent(EventSource::GridPrimary);
|
||||
}
|
||||
if (previousCurrentFolderId != GetBrowserModel().GetCurrentFolderId()) {
|
||||
@@ -1669,7 +1646,7 @@ void ProjectPanel::Update(
|
||||
}
|
||||
|
||||
if (GetBrowserModel().GetFolderEntries().empty()) {
|
||||
ResolveProjectRuntime()->Refresh();
|
||||
m_projectRuntime->Refresh();
|
||||
SyncSelectionsFromRuntime();
|
||||
}
|
||||
|
||||
@@ -1837,7 +1814,7 @@ void ProjectPanel::Update(
|
||||
}
|
||||
return true;
|
||||
}
|
||||
} treeDragCallbacks{ m_folderSelection, m_folderExpansion, *ResolveProjectRuntime() };
|
||||
} treeDragCallbacks{ m_folderSelection, m_folderExpansion, *m_projectRuntime };
|
||||
const TreeDrag::ProcessResult treeDragResult =
|
||||
TreeDrag::ProcessInputEvents(
|
||||
m_treeDragState,
|
||||
@@ -1849,13 +1826,13 @@ void ProjectPanel::Update(
|
||||
TreeDrag::kDefaultDragThreshold,
|
||||
m_splitterDragging || m_assetDragState.dragging);
|
||||
if (treeDragResult.dropCommitted) {
|
||||
const bool hadAssetSelection = ResolveProjectRuntime()->HasSelection();
|
||||
const bool hadAssetSelection = m_projectRuntime->HasSelection();
|
||||
CloseContextMenu();
|
||||
ResolveProjectRuntime()->ClearSelection();
|
||||
m_projectRuntime->ClearSelection();
|
||||
SyncSelectionsFromRuntime();
|
||||
m_hoveredAssetItemId.clear();
|
||||
m_lastPrimaryClickedAssetId.clear();
|
||||
if (hadAssetSelection && !ResolveProjectRuntime()->HasSelection()) {
|
||||
if (hadAssetSelection && !m_projectRuntime->HasSelection()) {
|
||||
EmitSelectionClearedEvent(EventSource::Tree);
|
||||
}
|
||||
RebuildPanelLayout(dispatchEntry.bounds);
|
||||
@@ -1928,7 +1905,7 @@ void ProjectPanel::Update(
|
||||
} assetDragCallbacks{
|
||||
m_assetSelection,
|
||||
m_folderExpansion,
|
||||
*ResolveProjectRuntime(),
|
||||
*m_projectRuntime,
|
||||
m_layout,
|
||||
GetBrowserModel().GetAssetEntries(),
|
||||
[this](const UIPoint& point, DropTargetSurface* surface) {
|
||||
@@ -1954,7 +1931,7 @@ void ProjectPanel::Update(
|
||||
}
|
||||
}
|
||||
if (assetDragResult.dropCommitted) {
|
||||
const bool hadAssetSelection = ResolveProjectRuntime()->HasSelection();
|
||||
const bool hadAssetSelection = m_projectRuntime->HasSelection();
|
||||
CloseContextMenu();
|
||||
ClearRenameState();
|
||||
m_hoveredAssetItemId.clear();
|
||||
@@ -1966,13 +1943,13 @@ void ProjectPanel::Update(
|
||||
: assetDragCallbacks.movedItemId;
|
||||
if (const AssetEntry* movedAsset = FindAssetEntry(movedItemId);
|
||||
movedAsset != nullptr) {
|
||||
ResolveProjectRuntime()->SetSelection(movedItemId);
|
||||
m_projectRuntime->SetSelection(movedItemId);
|
||||
SyncSelectionsFromRuntime();
|
||||
EmitEvent(EventKind::AssetSelected, EventSource::GridDrag, movedAsset);
|
||||
} else {
|
||||
ResolveProjectRuntime()->ClearSelection();
|
||||
m_projectRuntime->ClearSelection();
|
||||
SyncSelectionsFromRuntime();
|
||||
if (hadAssetSelection && !ResolveProjectRuntime()->HasSelection()) {
|
||||
if (hadAssetSelection && !m_projectRuntime->HasSelection()) {
|
||||
EmitSelectionClearedEvent(EventSource::GridDrag);
|
||||
}
|
||||
}
|
||||
@@ -2069,8 +2046,8 @@ void ProjectPanel::Update(
|
||||
const auto& assetEntries = GetBrowserModel().GetAssetEntries();
|
||||
const std::size_t hitIndex = HitTestAssetTile(event.position);
|
||||
if (hitIndex >= assetEntries.size()) {
|
||||
if (ResolveProjectRuntime()->HasSelection()) {
|
||||
ResolveProjectRuntime()->ClearSelection();
|
||||
if (m_projectRuntime->HasSelection()) {
|
||||
m_projectRuntime->ClearSelection();
|
||||
SyncAssetSelectionFromRuntime();
|
||||
EmitSelectionClearedEvent(EventSource::Background);
|
||||
}
|
||||
@@ -2079,7 +2056,7 @@ void ProjectPanel::Update(
|
||||
|
||||
const AssetEntry& assetEntry = assetEntries[hitIndex];
|
||||
const bool alreadySelected = m_assetSelection.IsSelected(assetEntry.itemId);
|
||||
const bool selectionChanged = ResolveProjectRuntime()->SetSelection(assetEntry.itemId);
|
||||
const bool selectionChanged = m_projectRuntime->SetSelection(assetEntry.itemId);
|
||||
SyncAssetSelectionFromRuntime();
|
||||
if (selectionChanged) {
|
||||
EmitEvent(EventKind::AssetSelected, EventSource::GridPrimary, &assetEntry);
|
||||
@@ -2117,7 +2094,7 @@ void ProjectPanel::Update(
|
||||
|
||||
const AssetEntry& assetEntry = assetEntries[hitIndex];
|
||||
if (!m_assetSelection.IsSelected(assetEntry.itemId)) {
|
||||
ResolveProjectRuntime()->SetSelection(assetEntry.itemId);
|
||||
m_projectRuntime->SetSelection(assetEntry.itemId);
|
||||
SyncAssetSelectionFromRuntime();
|
||||
EmitEvent(EventKind::AssetSelected, EventSource::GridSecondary, &assetEntry);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user