refactor(new_editor): streamline internal layout and command routing
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
#include "Platform/Win32/EditorWindowManager.h"
|
||||
|
||||
#include "Platform/Win32/WindowManager/CrossWindowDropInternal.h"
|
||||
#include "State/EditorContext.h"
|
||||
#include "Platform/Win32/EditorWindow.h"
|
||||
|
||||
namespace XCEngine::UI::Editor::App {
|
||||
|
||||
using Win32::Internal::CrossWindowDockDropTarget;
|
||||
using Win32::Internal::TryResolveCrossWindowDockDropTarget;
|
||||
using ::XCEngine::UI::UIPoint;
|
||||
|
||||
bool EditorWindowManager::HandleGlobalTabDragPointerButtonUp(HWND hwnd) {
|
||||
if (!m_globalTabDragSession.active) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const EditorWindow* ownerWindow = FindWindow(m_globalTabDragSession.panelWindowId);
|
||||
if (ownerWindow == nullptr || ownerWindow->GetHwnd() != hwnd) {
|
||||
return false;
|
||||
}
|
||||
|
||||
POINT screenPoint = m_globalTabDragSession.screenPoint;
|
||||
GetCursorPos(&screenPoint);
|
||||
|
||||
const std::string panelWindowId = m_globalTabDragSession.panelWindowId;
|
||||
const std::string sourceNodeId = m_globalTabDragSession.sourceNodeId;
|
||||
const std::string panelId = m_globalTabDragSession.panelId;
|
||||
EndGlobalTabDragSession();
|
||||
|
||||
EditorWindow* targetWindow = FindTopmostWindowAtScreenPoint(screenPoint, panelWindowId);
|
||||
if (targetWindow == nullptr || targetWindow->GetHwnd() == nullptr) {
|
||||
return true;
|
||||
}
|
||||
|
||||
const UIPoint targetPoint =
|
||||
targetWindow->ConvertScreenPixelsToClientDips(screenPoint);
|
||||
const Widgets::UIEditorDockHostLayout& targetLayout =
|
||||
targetWindow->GetShellFrame()
|
||||
.workspaceInteractionFrame
|
||||
.dockHostFrame
|
||||
.layout;
|
||||
CrossWindowDockDropTarget dropTarget = {};
|
||||
if (!TryResolveCrossWindowDockDropTarget(targetLayout, targetPoint, dropTarget)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
UIEditorWindowWorkspaceController windowWorkspaceController =
|
||||
BuildLiveWindowWorkspaceController(targetWindow->GetWindowId());
|
||||
const UIEditorWindowWorkspaceOperationResult result =
|
||||
dropTarget.placement == UIEditorWorkspaceDockPlacement::Center
|
||||
? windowWorkspaceController.MovePanelToStack(
|
||||
panelWindowId,
|
||||
sourceNodeId,
|
||||
panelId,
|
||||
targetWindow->GetWindowId(),
|
||||
dropTarget.nodeId,
|
||||
dropTarget.insertionIndex)
|
||||
: windowWorkspaceController.DockPanelRelative(
|
||||
panelWindowId,
|
||||
sourceNodeId,
|
||||
panelId,
|
||||
targetWindow->GetWindowId(),
|
||||
dropTarget.nodeId,
|
||||
dropTarget.placement);
|
||||
if (result.status != UIEditorWindowWorkspaceOperationStatus::Changed) {
|
||||
LogRuntimeTrace("drag", "cross-window drop rejected: " + result.message);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!SynchronizeWindowsFromController(
|
||||
windowWorkspaceController,
|
||||
{},
|
||||
screenPoint)) {
|
||||
LogRuntimeTrace("drag", "failed to synchronize windows after cross-window drop");
|
||||
return true;
|
||||
}
|
||||
|
||||
if (targetWindow->GetHwnd() != nullptr) {
|
||||
SetForegroundWindow(targetWindow->GetHwnd());
|
||||
}
|
||||
LogRuntimeTrace(
|
||||
"drag",
|
||||
"committed cross-window drop panel '" + panelId +
|
||||
"' into window '" + std::string(targetWindow->GetWindowId()) + "'");
|
||||
return true;
|
||||
}
|
||||
|
||||
} // namespace XCEngine::UI::Editor::App
|
||||
Reference in New Issue
Block a user