Fix using dock window panels on macOS in Editor

This commit is contained in:
Wojtek Figat
2023-10-23 15:59:09 +02:00
parent f28947f59b
commit 9c4382dffb
3 changed files with 46 additions and 11 deletions

View File

@@ -44,11 +44,11 @@ namespace FlaxEditor.GUI.Docking
var mousePos = window.MousePosition; var mousePos = window.MousePosition;
var previousSize = window.Size; var previousSize = window.Size;
window.Restore(); window.Restore();
window.Position = FlaxEngine.Input.MouseScreenPosition - mousePos * window.Size / previousSize; window.Position = Platform.MousePosition - mousePos * window.Size / previousSize;
} }
// Calculate dragging offset and move window to the destination position // Calculate dragging offset and move window to the destination position
var mouseScreenPosition = FlaxEngine.Input.MouseScreenPosition; var mouseScreenPosition = Platform.MousePosition;
// If the _toMove window was not focused when initializing this window, the result vector only contains zeros // If the _toMove window was not focused when initializing this window, the result vector only contains zeros
// and to prevent a failure, we need to perform an update for the drag offset at later time which will be done in the OnMouseMove event handler. // and to prevent a failure, we need to perform an update for the drag offset at later time which will be done in the OnMouseMove event handler.
@@ -114,7 +114,7 @@ namespace FlaxEditor.GUI.Docking
var window = _toMove.Window?.Window; var window = _toMove.Window?.Window;
if (window == null) if (window == null)
return; return;
var mouse = FlaxEngine.Input.MouseScreenPosition; var mouse = Platform.MousePosition;
// Move base window // Move base window
window.Position = mouse - _dragOffset; window.Position = mouse - _dragOffset;
@@ -194,7 +194,7 @@ namespace FlaxEditor.GUI.Docking
// Move window to the mouse position (with some offset for caption bar) // Move window to the mouse position (with some offset for caption bar)
var window = (WindowRootControl)toMove.Root; var window = (WindowRootControl)toMove.Root;
var mouse = FlaxEngine.Input.MouseScreenPosition; var mouse = Platform.MousePosition;
window.Window.Position = mouse - new Float2(8, 8); window.Window.Position = mouse - new Float2(8, 8);
// Get floating panel // Get floating panel
@@ -245,7 +245,7 @@ namespace FlaxEditor.GUI.Docking
private void UpdateRects() private void UpdateRects()
{ {
// Cache mouse position // Cache mouse position
_mouse = FlaxEngine.Input.MouseScreenPosition; _mouse = Platform.MousePosition;
// Check intersection with any dock panel // Check intersection with any dock panel
var uiMouse = _mouse; var uiMouse = _mouse;

View File

@@ -498,7 +498,9 @@ static void ConvertNSRect(NSScreen *screen, NSRect *r)
{ {
if (IsWindowInvalid(Window)) return; if (IsWindowInvalid(Window)) return;
Float2 mousePos = GetMousePosition(Window, event); Float2 mousePos = GetMousePosition(Window, event);
if (!Window->IsMouseTracking() && !IsMouseOver) if (Window->IsMouseTracking())
return; // Skip mouse events when tracking mouse (handled in MacWindow::OnUpdate)
if (!IsMouseOver)
return; return;
Input::Mouse->OnMouseMove(Window->ClientToScreen(mousePos), Window); Input::Mouse->OnMouseMove(Window->ClientToScreen(mousePos), Window);
} }
@@ -521,11 +523,12 @@ static void ConvertNSRect(NSScreen *screen, NSRect *r)
{ {
if (IsWindowInvalid(Window)) return; if (IsWindowInvalid(Window)) return;
Float2 mousePos = GetMousePosition(Window, event); Float2 mousePos = GetMousePosition(Window, event);
mousePos = Window->ClientToScreen(mousePos);
MouseButton mouseButton = MouseButton::Left; MouseButton mouseButton = MouseButton::Left;
if ([event clickCount] == 2) if ([event clickCount] == 2)
Input::Mouse->OnMouseDoubleClick(Window->ClientToScreen(mousePos), mouseButton, Window); Input::Mouse->OnMouseDoubleClick(mousePos, mouseButton, Window);
else else
Input::Mouse->OnMouseDown(Window->ClientToScreen(mousePos), mouseButton, Window); Input::Mouse->OnMouseDown(mousePos, mouseButton, Window);
} }
- (void)mouseDragged:(NSEvent*)event - (void)mouseDragged:(NSEvent*)event
@@ -537,8 +540,21 @@ static void ConvertNSRect(NSScreen *screen, NSRect *r)
{ {
if (IsWindowInvalid(Window)) return; if (IsWindowInvalid(Window)) return;
Float2 mousePos = GetMousePosition(Window, event); Float2 mousePos = GetMousePosition(Window, event);
mousePos = Window->ClientToScreen(mousePos);
MouseButton mouseButton = MouseButton::Left; MouseButton mouseButton = MouseButton::Left;
Input::Mouse->OnMouseUp(Window->ClientToScreen(mousePos), mouseButton, Window); Input::Mouse->OnMouseUp(mousePos, mouseButton, Window);
// Redirect event to any window that tracks the mouse (eg. dock window in Editor)
WindowsManager::WindowsLocker.Lock();
for (auto* win : WindowsManager::Windows)
{
if (win->IsVisible() && win->IsMouseTracking() && win != Window)
{
Input::Mouse->OnMouseUp(mousePos, mouseButton, win);
break;
}
}
WindowsManager::WindowsLocker.Unlock();
} }
- (void)rightMouseDown:(NSEvent*)event - (void)rightMouseDown:(NSEvent*)event
@@ -788,7 +804,6 @@ void MacWindow::SetIsMouseOver(bool value)
// Refresh cursor typet // Refresh cursor typet
SetCursor(CursorType::Default); SetCursor(CursorType::Default);
SetCursor(cursor); SetCursor(cursor);
} }
else else
{ {
@@ -803,6 +818,22 @@ void* MacWindow::GetNativePtr() const
return _window; return _window;
} }
void MacWindow::OnUpdate(float dt)
{
if (IsMouseTracking())
{
// Keep sending mouse movement events no matter if window has focus
Float2 mousePos = Platform::GetMousePosition();
if (_mouseTrackPos != mousePos)
{
_mouseTrackPos = mousePos;
Input::Mouse->OnMouseMove(mousePos, this);
}
}
WindowBase::OnUpdate(dt);
}
void MacWindow::Show() void MacWindow::Show()
{ {
if (!_visible) if (!_visible)
@@ -838,7 +869,7 @@ void MacWindow::Hide()
// Hide // Hide
NSWindow* window = (NSWindow*)_window; NSWindow* window = (NSWindow*)_window;
[window orderOut:nil]; [window orderOut:window];
// Base // Base
WindowBase::Hide(); WindowBase::Hide();
@@ -1044,6 +1075,7 @@ void MacWindow::StartTrackingMouse(bool useMouseScreenOffset)
_isTrackingMouse = true; _isTrackingMouse = true;
_trackingMouseOffset = Float2::Zero; _trackingMouseOffset = Float2::Zero;
_isUsingMouseOffset = useMouseScreenOffset; _isUsingMouseOffset = useMouseScreenOffset;
_mouseTrackPos = Float2::Minimum;
} }
void MacWindow::EndTrackingMouse() void MacWindow::EndTrackingMouse()

View File

@@ -6,6 +6,7 @@
#include "Engine/Platform/Base/WindowBase.h" #include "Engine/Platform/Base/WindowBase.h"
#include "Engine/Platform/Platform.h" #include "Engine/Platform/Platform.h"
#include "Engine/Core/Math/Vector2.h"
/// <summary> /// <summary>
/// Implementation of the window class for Mac platform. /// Implementation of the window class for Mac platform.
@@ -16,6 +17,7 @@ private:
void* _window = nullptr; void* _window = nullptr;
void* _view = nullptr; void* _view = nullptr;
bool _isMouseOver = false; bool _isMouseOver = false;
Float2 _mouseTrackPos = Float2::Minimum;
String _dragText; String _dragText;
public: public:
@@ -32,6 +34,7 @@ public:
public: public:
// [WindowBase] // [WindowBase]
void* GetNativePtr() const override; void* GetNativePtr() const override;
void OnUpdate(float dt) override;
void Show() override; void Show() override;
void Hide() override; void Hide() override;
void Minimize() override; void Minimize() override;