From 8e7dc2a91ea0578a9e349975c41b1a020323453a Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Wed, 11 Feb 2026 23:55:18 +0100 Subject: [PATCH] Fix using new window docking system with old non-SDL platform #2800 --- .../GUI/Docking/FloatWindowDockPanel.cs | 12 ++- Source/Editor/GUI/Docking/WindowDragHelper.cs | 80 ++++++++++++++----- 2 files changed, 72 insertions(+), 20 deletions(-) diff --git a/Source/Editor/GUI/Docking/FloatWindowDockPanel.cs b/Source/Editor/GUI/Docking/FloatWindowDockPanel.cs index 1c75da2c8..e53b9000b 100644 --- a/Source/Editor/GUI/Docking/FloatWindowDockPanel.cs +++ b/Source/Editor/GUI/Docking/FloatWindowDockPanel.cs @@ -108,7 +108,11 @@ namespace FlaxEditor.GUI.Docking return; // Create docking hint window - WindowDragHelper.StartDragging(this); + Window dragSourceWindow = null; +#if !PLATFORM_SDL + dragSourceWindow = _window?.Window; +#endif + WindowDragHelper.StartDragging(this, dragSourceWindow); } /// @@ -127,11 +131,15 @@ namespace FlaxEditor.GUI.Docking settings.Title = title; settings.Size = size; settings.Position = location; - settings.MinimumSize = new Float2(200, 150); + settings.MinimumSize = new Float2(100, 100); settings.MaximumSize = Float2.Zero; // Unlimited size settings.Fullscreen = false; settings.HasBorder = true; +#if PLATFORM_SDL settings.SupportsTransparency = true; +#else + settings.SupportsTransparency = false; +#endif settings.ActivateWhenFirstShown = true; settings.AllowInput = true; settings.AllowMinimize = true; diff --git a/Source/Editor/GUI/Docking/WindowDragHelper.cs b/Source/Editor/GUI/Docking/WindowDragHelper.cs index 12587b061..6650560b5 100644 --- a/Source/Editor/GUI/Docking/WindowDragHelper.cs +++ b/Source/Editor/GUI/Docking/WindowDragHelper.cs @@ -44,13 +44,33 @@ namespace FlaxEditor.GUI.Docking _toMove = toMove; _toSet = DockState.Float; var window = toMove.Window.Window; + var mousePos = Platform.MousePosition; + + // Check if window is maximized and restore window for correct dragging + if (window.IsMaximized) + { + var windowMousePos = mousePos - window.Position; + var previousSize = window.Size; + window.Restore(); + window.Position = mousePos - windowMousePos * window.Size / previousSize; + } + + // When drag starts from a tabs the window might not be shown yet + if (!window.IsVisible) + { + window.Show(); + window.Position = mousePos - new Float2(40, 10); + } // Bind events FlaxEngine.Scripting.Update += OnUpdate; window.MouseUp += OnMouseUp; - +#if !PLATFORM_SDL + window.StartTrackingMouse(false); +#endif + // Update rectangles - UpdateRects(Platform.MousePosition); + UpdateRects(mousePos); // Ensure the dragged window stays on top of every other window window.IsAlwaysOnTop = true; @@ -58,13 +78,21 @@ namespace FlaxEditor.GUI.Docking _dragSourceWindow = dragSourceWindow; if (_dragSourceWindow != null) // Detaching a tab from existing window { +#if PLATFORM_SDL _dragOffset = new Float2(window.Size.X / 2, 10.0f); - - _dragSourceWindow.MouseUp += OnMouseUp; // The mouse up event is sent to the source window on Windows +#else + _dragOffset = mousePos - window.Position; +#endif + + // The mouse up event is sent to the source window on Windows + _dragSourceWindow.MouseUp += OnMouseUp; // TODO: when detaching tab in floating window (not main window), the drag source window is still main window? var dragSourceWindowWayland = toMove.MasterPanel?.RootWindow.Window ?? Editor.Instance.Windows.MainWindow; window.DoDragDrop(window.Title, _dragOffset, dragSourceWindowWayland); +#if !PLATFORM_SDL + _dragSourceWindow.BringToFront(); +#endif } else { @@ -84,7 +112,12 @@ namespace FlaxEditor.GUI.Docking // Unbind events FlaxEngine.Scripting.Update -= OnUpdate; if (window != null) + { window.MouseUp -= OnMouseUp; +#if !PLATFORM_SDL + window.EndTrackingMouse(); +#endif + } if (_dragSourceWindow != null) _dragSourceWindow.MouseUp -= OnMouseUp; @@ -160,13 +193,14 @@ namespace FlaxEditor.GUI.Docking /// Start dragging a floating dock panel. /// /// Floating dock panel to move. + /// The window where dragging started from. /// The window drag helper object. - public static WindowDragHelper StartDragging(FloatWindowDockPanel toMove) + public static WindowDragHelper StartDragging(FloatWindowDockPanel toMove, Window dragSourceWindow = null) { if (toMove == null) throw new ArgumentNullException(); - return new WindowDragHelper(toMove, null); + return new WindowDragHelper(toMove, dragSourceWindow); } /// @@ -268,7 +302,8 @@ namespace FlaxEditor.GUI.Docking } // Prefer panel in the same window we hit earlier - if (dockPanel?.RootWindow != _toDock?.RootWindow) + // TODO: this doesn't allow docking window into another floating window over the main window + /*if (dockPanel?.RootWindow != _toDock?.RootWindow) { foreach (var hit in hitResults) { @@ -278,7 +313,7 @@ namespace FlaxEditor.GUI.Docking break; } } - } + }*/ } if (dockPanel != _toDock) @@ -291,10 +326,16 @@ namespace FlaxEditor.GUI.Docking _toDock?.RootWindow.Window.BringToFront(); //_toDock?.RootWindow.Window.Focus(); +#if PLATFORM_SDL // Make the dragged window transparent when dock hints are visible _toMove.Window.Window.Opacity = _toDock == null ? 1.0f : DragWindowOpacity; +#else + // Bring the drop source always to the top + if (_dragSourceWindow != null) + _dragSourceWindow.BringToFront(); +#endif } - + // Check dock state to use bool showProxyHints = _toDock != null; bool showBorderHints = showProxyHints; @@ -441,18 +482,21 @@ namespace FlaxEditor.GUI.Docking private void OnUpdate() { + // If the engine lost focus during dragging, end the action + if (!Engine.HasFocus) + { + Dispose(); + return; + } + var mousePos = Platform.MousePosition; - if (_mouse != mousePos) - OnMouseMove(mousePos); - } - - private void OnMouseMove(Float2 mousePos) - { - if (_dragSourceWindow != null) - _toMove.Window.Window.Position = mousePos - _dragOffset; + { + if (_dragSourceWindow != null) + _toMove.Window.Window.Position = mousePos - _dragOffset; - UpdateRects(mousePos); + UpdateRects(mousePos); + } } } }