new_editor: retire xcui editor lib and narrow project reconcile

This commit is contained in:
2026-04-22 22:50:56 +08:00
parent 3048c7cc90
commit 39b083f7f7
8 changed files with 337 additions and 653 deletions

View File

@@ -324,8 +324,7 @@ const std::vector<Widgets::UIEditorTreeViewItem>& ProjectPanel::GetWindowTreeIte
void ProjectPanel::Initialize(const std::filesystem::path& repoRoot) {
m_ownedProjectRuntime = std::make_unique<EditorProjectRuntime>();
m_ownedProjectRuntime->Initialize(repoRoot);
SyncCurrentFolderSelection();
SyncAssetSelectionFromRuntime();
SyncSelectionsFromRuntime();
}
void ProjectPanel::SetProjectRuntime(EditorProjectRuntime* projectRuntime) {
@@ -334,8 +333,7 @@ void ProjectPanel::SetProjectRuntime(EditorProjectRuntime* projectRuntime) {
}
m_projectRuntime = projectRuntime;
SyncCurrentFolderSelection();
SyncAssetSelectionFromRuntime();
SyncSelectionsFromRuntime();
}
void ProjectPanel::SetCommandFocusService(
@@ -386,7 +384,8 @@ ProjectPanel::CursorKind ProjectPanel::GetCursorKind() const {
bool ProjectPanel::HasActivePointerCapture() const {
return m_splitterDragging ||
GridDrag::HasActivePointerCapture(m_assetDragState) ||
TreeDrag::HasActivePointerCapture(m_treeDragState);
TreeDrag::HasActivePointerCapture(m_treeDragState) ||
HasActiveUIEditorTreeViewPointerCapture(m_treeInteractionState);
}
const std::vector<ProjectPanel::Event>& ProjectPanel::GetFrameEvents() const {
@@ -647,6 +646,11 @@ void ProjectPanel::SyncCurrentFolderSelection() {
m_folderSelection.SetSelection(currentFolderId);
}
void ProjectPanel::SyncSelectionsFromRuntime() {
SyncCurrentFolderSelection();
SyncAssetSelectionFromRuntime();
}
void ProjectPanel::SyncAssetSelectionFromRuntime() {
const EditorProjectRuntime* runtime = ResolveProjectRuntime();
if (runtime == nullptr || !runtime->HasSelection()) {
@@ -662,13 +666,24 @@ void ProjectPanel::SyncAssetSelectionFromRuntime() {
m_assetSelection.ClearSelection();
}
Widgets::UIEditorTreeViewMetrics ProjectPanel::RebuildPanelLayout(const UIRect& bounds) {
const Widgets::UIEditorTreeViewMetrics treeMetrics = ResolveUIEditorTreeViewMetrics();
m_layout = BuildLayout(bounds);
m_treeFrame.layout = Widgets::BuildUIEditorTreeViewLayout(
m_layout.treeRect,
GetWindowTreeItems(),
m_folderExpansion,
treeMetrics,
m_treeInteractionState.verticalOffset);
return treeMetrics;
}
bool ProjectPanel::NavigateToFolder(std::string_view itemId, EventSource source) {
if (!ResolveProjectRuntime()->NavigateToFolder(itemId)) {
return false;
}
SyncCurrentFolderSelection();
SyncAssetSelectionFromRuntime();
SyncSelectionsFromRuntime();
m_hoveredAssetItemId.clear();
m_lastPrimaryClickedAssetId.clear();
EmitEvent(
@@ -687,9 +702,8 @@ bool ProjectPanel::OpenProjectItem(std::string_view itemId, EventSource source)
if (asset->directory) {
const bool navigated = ResolveProjectRuntime()->OpenItem(asset->itemId);
if (navigated && HasValidBounds(m_layout.bounds)) {
SyncCurrentFolderSelection();
SyncAssetSelectionFromRuntime();
m_layout = BuildLayout(m_layout.bounds);
SyncSelectionsFromRuntime();
RebuildPanelLayout(m_layout.bounds);
m_hoveredAssetItemId.clear();
EmitEvent(
EventKind::FolderNavigated,
@@ -1147,12 +1161,11 @@ UIEditorHostCommandDispatchResult ProjectPanel::DispatchAssetCommand(
const auto finalizeCreatedAsset =
[this](std::string_view createdItemId) {
ClearRenameState();
SyncCurrentFolderSelection();
m_hoveredAssetItemId.clear();
m_lastPrimaryClickedAssetId = std::string(createdItemId);
m_lastPrimaryClickTime = {};
ResolveProjectRuntime()->SetSelection(createdItemId);
SyncAssetSelectionFromRuntime();
SyncSelectionsFromRuntime();
const AssetEntry* createdAsset = FindAssetEntry(createdItemId);
if (createdAsset == nullptr) {
@@ -1184,7 +1197,7 @@ UIEditorHostCommandDispatchResult ProjectPanel::DispatchAssetCommand(
if (target.containerFolder->itemId != GetBrowserModel().GetCurrentFolderId()) {
NavigateToFolder(target.containerFolder->itemId, EventSource::GridSecondary);
if (HasValidBounds(m_layout.bounds)) {
m_layout = BuildLayout(m_layout.bounds);
RebuildPanelLayout(m_layout.bounds);
}
}
@@ -1216,7 +1229,7 @@ UIEditorHostCommandDispatchResult ProjectPanel::DispatchAssetCommand(
if (target.containerFolder->itemId != GetBrowserModel().GetCurrentFolderId()) {
NavigateToFolder(target.containerFolder->itemId, EventSource::GridSecondary);
if (HasValidBounds(m_layout.bounds)) {
m_layout = BuildLayout(m_layout.bounds);
RebuildPanelLayout(m_layout.bounds);
}
}
@@ -1370,8 +1383,7 @@ UIEditorHostCommandDispatchResult ProjectPanel::DispatchEditCommand(
}
ClearRenameState();
SyncCurrentFolderSelection();
SyncAssetSelectionFromRuntime();
SyncSelectionsFromRuntime();
m_hoveredAssetItemId.clear();
m_lastPrimaryClickedAssetId.clear();
m_lastPrimaryClickTime = {};
@@ -1439,8 +1451,7 @@ void ProjectPanel::Update(
if (GetBrowserModel().GetTreeItems().empty()) {
ResolveProjectRuntime()->Refresh();
SyncCurrentFolderSelection();
SyncAssetSelectionFromRuntime();
SyncSelectionsFromRuntime();
}
RebuildWindowTreeItems();
@@ -1472,17 +1483,11 @@ void ProjectPanel::Update(
dispatchEntry.allowInteraction);
m_navigationWidth = ClampNavigationWidth(m_navigationWidth, dispatchEntry.bounds.width);
m_layout = BuildLayout(dispatchEntry.bounds);
const Widgets::UIEditorTreeViewMetrics treeMetrics =
RebuildPanelLayout(dispatchEntry.bounds);
if (m_contextMenu.open) {
RebuildContextMenu();
}
const Widgets::UIEditorTreeViewMetrics treeMetrics = ResolveUIEditorTreeViewMetrics();
m_treeFrame.layout = Widgets::BuildUIEditorTreeViewLayout(
m_layout.treeRect,
GetWindowTreeItems(),
m_folderExpansion,
treeMetrics,
m_treeInteractionState.verticalOffset);
m_treeFrame.result = {};
if ((m_renameState.active || !m_pendingRenameItemId.empty()) &&
@@ -1516,7 +1521,7 @@ void ProjectPanel::Update(
m_treeFrame.result.selectedItemId != GetBrowserModel().GetCurrentFolderId()) {
CloseContextMenu();
NavigateToFolder(m_treeFrame.result.selectedItemId, EventSource::Tree);
m_layout = BuildLayout(dispatchEntry.bounds);
RebuildPanelLayout(dispatchEntry.bounds);
}
if (m_treeFrame.result.renameRequested &&
!m_treeFrame.result.renameItemId.empty()) {
@@ -1595,20 +1600,13 @@ void ProjectPanel::Update(
const bool hadAssetSelection = ResolveProjectRuntime()->HasSelection();
CloseContextMenu();
ResolveProjectRuntime()->ClearSelection();
SyncAssetSelectionFromRuntime();
SyncSelectionsFromRuntime();
m_hoveredAssetItemId.clear();
m_lastPrimaryClickedAssetId.clear();
if (hadAssetSelection && !ResolveProjectRuntime()->HasSelection()) {
EmitSelectionClearedEvent(EventSource::Tree);
}
SyncCurrentFolderSelection();
m_layout = BuildLayout(dispatchEntry.bounds);
m_treeFrame.layout = Widgets::BuildUIEditorTreeViewLayout(
m_layout.treeRect,
GetWindowTreeItems(),
m_folderExpansion,
treeMetrics,
m_treeInteractionState.verticalOffset);
RebuildPanelLayout(dispatchEntry.bounds);
}
struct ProjectAssetDragCallbacks {
@@ -1707,7 +1705,6 @@ void ProjectPanel::Update(
m_hoveredAssetItemId.clear();
m_lastPrimaryClickedAssetId.clear();
m_lastPrimaryClickTime = {};
SyncCurrentFolderSelection();
const std::string movedItemId = assetDragCallbacks.movedItemId.empty()
? assetDragResult.draggedItemId
@@ -1715,23 +1712,17 @@ void ProjectPanel::Update(
if (const AssetEntry* movedAsset = FindAssetEntry(movedItemId);
movedAsset != nullptr) {
ResolveProjectRuntime()->SetSelection(movedItemId);
SyncAssetSelectionFromRuntime();
SyncSelectionsFromRuntime();
EmitEvent(EventKind::AssetSelected, EventSource::GridDrag, movedAsset);
} else {
ResolveProjectRuntime()->ClearSelection();
SyncAssetSelectionFromRuntime();
SyncSelectionsFromRuntime();
if (hadAssetSelection && !ResolveProjectRuntime()->HasSelection()) {
EmitSelectionClearedEvent(EventSource::GridDrag);
}
}
m_layout = BuildLayout(dispatchEntry.bounds);
m_treeFrame.layout = Widgets::BuildUIEditorTreeViewLayout(
m_layout.treeRect,
GetWindowTreeItems(),
m_folderExpansion,
treeMetrics,
m_treeInteractionState.verticalOffset);
RebuildPanelLayout(dispatchEntry.bounds);
}
const bool suppressPanelPointerEvents =
@@ -1900,7 +1891,7 @@ void ProjectPanel::Update(
m_layout.breadcrumbItems[releasedBreadcrumbIndex];
if (item.clickable) {
NavigateToFolder(item.targetFolderId, EventSource::Breadcrumb);
m_layout = BuildLayout(dispatchEntry.bounds);
RebuildPanelLayout(dispatchEntry.bounds);
}
}
m_pressedBreadcrumbIndex = kInvalidLayoutIndex;