Add Window.IsAlwaysOnTop property

This commit is contained in:
2025-01-21 15:51:12 +02:00
parent 3dd9612ae4
commit 61f04110a6
5 changed files with 40 additions and 4 deletions

View File

@@ -164,6 +164,15 @@ void WindowBase::SetIsVisible(bool isVisible)
}
}
bool WindowBase::IsAlwaysOnTop() const
{
return false;
}
void WindowBase::SetIsAlwaysOnTop(bool isAlwaysOnTop)
{
}
String WindowBase::ToString() const
{
return GetTitle();

View File

@@ -157,6 +157,17 @@ public:
return _maximized;
}
/// <summary>
/// Gets a value that indicates whether a window is always on top of other windows.
/// </summary>
API_PROPERTY() virtual bool IsAlwaysOnTop() const;
/// <summary>
/// Sets a value that indicates whether a window is always on top of other windows.
/// </summary>
/// <param name="isAlwaysOnTop">True if always on top.</param>
API_PROPERTY() virtual void SetIsAlwaysOnTop(bool isAlwaysOnTop);
/// <summary>
/// Gets the native window handle.
/// </summary>

View File

@@ -306,7 +306,8 @@ void SDLPlatform::Tick()
draggedWindow->HandleEvent(buttonUpEvent);
//SDL_PushEvent(&buttonUpEvent);
SDL_SetWindowAlwaysOnTop(draggedWindow->GetSDLWindow(), false);
if (!draggedWindow->GetSettings().IsTopmost)
draggedWindow->SetIsAlwaysOnTop(false);
draggedWindow->BringToFront();
draggedWindow = nullptr;

View File

@@ -825,7 +825,7 @@ void SDLWindow::Show()
// Reused top-most windows (DockHintWindow) doesn't stay on top for some reason
if (_settings.IsTopmost && _settings.Type != WindowType::Tooltip)
SDL_SetWindowAlwaysOnTop(_window, true);
SetIsAlwaysOnTop(true);
if (_isTrackingMouse)
{
@@ -1051,12 +1051,25 @@ void SDLWindow::SetIsFullscreen(bool isFullscreen)
if (!isFullscreen)
{
// The window is set to always-on-top for some reason when leaving fullscreen
SDL_SetWindowAlwaysOnTop(_window, false);
SetIsAlwaysOnTop(false);
}
WindowBase::SetIsFullscreen(isFullscreen);
}
bool SDLWindow::IsAlwaysOnTop() const
{
SDL_WindowFlags flags = SDL_GetWindowFlags(_window);
return (flags & SDL_WINDOW_ALWAYS_ON_TOP) != 0;
}
void SDLWindow::SetIsAlwaysOnTop(bool isAlwaysOnTop)
{
if (!SDL_SetWindowAlwaysOnTop(_window, isAlwaysOnTop))
LOG(Warning, "SDL_SetWindowAlwaysOnTop failed: {0}", String(SDL_GetError()));
// Not sure if this should change _settings.IsTopmost to reflect the new value?
}
Float2 SDLWindow::GetPosition() const
{
Int2 topLeftBorder;
@@ -1332,7 +1345,7 @@ DragDropEffect SDLWindow::DoDragDrop(const StringView& data, const Float2& offse
else
#endif
{
SDL_SetWindowAlwaysOnTop(_window, true);
SetIsAlwaysOnTop(true);
Show();
//draggingActive = true;

View File

@@ -91,6 +91,8 @@ public:
void SetPosition(const Float2& position) override;
void SetClientPosition(const Float2& position) override;
void SetIsFullscreen(bool isFullscreen) override;
bool IsAlwaysOnTop() const override;
void SetIsAlwaysOnTop(bool isAlwaysOnTop) override;
Float2 GetPosition() const override;
Float2 GetSize() const override;
Float2 GetClientSize() const override;