Files
XCEngine/new_editor/app/Platform/Win32/WindowManager/CrossWindowDrop.cpp

94 lines
3.4 KiB
C++
Raw Normal View History

#include "Platform/Win32/WindowManager/Internal.h"
#include "Platform/Win32/WindowManager/CrossWindowDropInternal.h"
#include "State/EditorContext.h"
#include "Platform/Win32/EditorWindow.h"
#include <XCEditor/Workspace/UIEditorWindowWorkspaceController.h>
namespace XCEngine::UI::Editor::App::Internal {
using Win32::Internal::CrossWindowDockDropTarget;
using Win32::Internal::TryResolveCrossWindowDockDropTarget;
using ::XCEngine::UI::UIPoint;
bool EditorWindowWorkspaceCoordinator::HandleGlobalTabDragPointerButtonUp(HWND hwnd) {
if (!m_globalTabDragSession.active) {
return false;
}
const EditorWindow* ownerWindow = m_hostRuntime.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 (EditorWindow* updatedTargetWindow = m_hostRuntime.FindWindow(targetWindow->GetWindowId());
updatedTargetWindow != nullptr &&
updatedTargetWindow->GetHwnd() != nullptr) {
SetForegroundWindow(updatedTargetWindow->GetHwnd());
}
LogRuntimeTrace(
"drag",
"committed cross-window drop panel '" + panelId +
"' into window '" + std::string(targetWindow->GetWindowId()) + "'");
return true;
}
} // namespace XCEngine::UI::Editor::App::Internal