From dfe06096c70a11cf23963c69373ffed636a6dd6e Mon Sep 17 00:00:00 2001 From: thankyouverycool <66646555+thankyouverycool@users.noreply.github.com> Date: Sat, 13 May 2023 05:06:46 -0400 Subject: [PATCH] LibGUI: Add Window::constrain_to_desktop() helper And a center_within(IntRect const&) overload --- Userland/Libraries/LibGUI/Window.cpp | 22 ++++++++++++++++++++++ Userland/Libraries/LibGUI/Window.h | 3 +++ 2 files changed, 25 insertions(+) diff --git a/Userland/Libraries/LibGUI/Window.cpp b/Userland/Libraries/LibGUI/Window.cpp index d28d92db95..3ac4057450 100644 --- a/Userland/Libraries/LibGUI/Window.cpp +++ b/Userland/Libraries/LibGUI/Window.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -319,6 +320,27 @@ void Window::center_within(Window const& other) set_rect(rect().centered_within(other.rect())); } +void Window::center_within(Gfx::IntRect const& other) +{ + set_rect(rect().centered_within(other)); +} + +void Window::constrain_to_desktop() +{ + auto desktop_rect = Desktop::the().rect().shrunken(0, 0, Desktop::the().taskbar_height(), 0); + auto titlebar = Application::the()->palette().window_title_height(); + auto border = Application::the()->palette().window_border_thickness(); + auto constexpr margin = 1; + + auto framed_rect = rect().inflated(border + titlebar + margin, border, border, border); + if (desktop_rect.contains(framed_rect)) + return; + + auto constrained = framed_rect.constrained_to(desktop_rect); + constrained.shrink(border + titlebar + margin, border, border, border); + set_rect(constrained.x(), constrained.y(), rect().width(), rect().height()); +} + void Window::set_window_type(WindowType window_type) { m_window_type = window_type; diff --git a/Userland/Libraries/LibGUI/Window.h b/Userland/Libraries/LibGUI/Window.h index 57f75b2e10..45d771594a 100644 --- a/Userland/Libraries/LibGUI/Window.h +++ b/Userland/Libraries/LibGUI/Window.h @@ -129,7 +129,10 @@ public: void resize(Gfx::IntSize size) { set_rect({ position(), size }); } void center_on_screen(); + void constrain_to_desktop(); + void center_within(Window const&); + void center_within(Gfx::IntRect const&); virtual void event(Core::Event&) override;