Files
XCEngine/new_editor/app/Platform/Win32/EditorWindowManagerCrossWindowDrop.cpp

90 lines
3.2 KiB
C++
Raw Normal View History

#include "EditorWindowManager.h"
#include "Platform/Win32/EditorWindowManagerCrossWindowDropSupport.h"
#include "State/EditorContext.h"
#include "EditorWindow.h"
namespace XCEngine::UI::Editor::App {
using EditorWindowManagerCrossWindowDropSupport::CrossWindowDockDropTarget;
using EditorWindowManagerCrossWindowDropSupport::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