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