diff options
author | thankyouverycool <66646555+thankyouverycool@users.noreply.github.com> | 2020-08-25 18:13:32 -0400 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-08-26 08:53:14 +0200 |
commit | 208cb995babb13e0af07bb9d3219f0a9fe7bca7d (patch) | |
tree | 7f524134bd5878b99ce5612ac5a2c183558720fb | |
parent | 1ab8939077ad2a1137a1808b902ebb66d0663a66 (diff) | |
download | serenity-208cb995babb13e0af07bb9d3219f0a9fe7bca7d.zip |
WindowServer+LibGfx: Move title bar button layout to WindowTheme
-rw-r--r-- | Libraries/LibGfx/ClassicWindowTheme.cpp | 28 | ||||
-rw-r--r-- | Libraries/LibGfx/ClassicWindowTheme.h | 4 | ||||
-rw-r--r-- | Libraries/LibGfx/WindowTheme.h | 2 | ||||
-rw-r--r-- | Services/WindowServer/WindowFrame.cpp | 26 |
4 files changed, 36 insertions, 24 deletions
diff --git a/Libraries/LibGfx/ClassicWindowTheme.cpp b/Libraries/LibGfx/ClassicWindowTheme.cpp index ce4d26f2d4..bc16191067 100644 --- a/Libraries/LibGfx/ClassicWindowTheme.cpp +++ b/Libraries/LibGfx/ClassicWindowTheme.cpp @@ -177,4 +177,32 @@ IntRect ClassicWindowTheme::frame_rect_for_window(WindowType window_type, const } } +Vector<IntRect> ClassicWindowTheme::layout_buttons(WindowType window_type, const IntRect& window_rect, const Palette& palette, size_t buttons) const +{ + int window_button_width = palette.window_title_button_width(); + int window_button_height = palette.window_title_button_height(); + int pos; + Vector<IntRect> button_rects; + if (window_type == WindowType::Notification) + pos = title_bar_rect(window_type, window_rect, palette).top() + 2; + else + pos = title_bar_text_rect(window_type, window_rect, palette).right() + 1; + + for (size_t i = 0; i < buttons; i++) { + if (window_type == WindowType::Notification) { + // The button height & width have to be equal or it leaks out of its area + Gfx::IntRect rect { 0, pos, window_button_height, window_button_height }; + rect.center_horizontally_within(title_bar_rect(window_type, window_rect, palette)); + button_rects.append(rect); + pos += window_button_height; + } else { + pos -= window_button_width; + Gfx::IntRect rect { pos, 0, window_button_width, window_button_height }; + rect.center_vertically_within(title_bar_text_rect(window_type, window_rect, palette)); + button_rects.append(rect); + } + } + return button_rects; +} + } diff --git a/Libraries/LibGfx/ClassicWindowTheme.h b/Libraries/LibGfx/ClassicWindowTheme.h index d27110b056..1a842ab15e 100644 --- a/Libraries/LibGfx/ClassicWindowTheme.h +++ b/Libraries/LibGfx/ClassicWindowTheme.h @@ -26,8 +26,8 @@ #pragma once -#include <LibGfx/WindowTheme.h> #include <LibGfx/Color.h> +#include <LibGfx/WindowTheme.h> namespace Gfx { @@ -45,6 +45,8 @@ public: virtual IntRect frame_rect_for_window(WindowType, const IntRect& window_rect, const Palette&) const override; + virtual Vector<IntRect> layout_buttons(WindowType, const IntRect& window_rect, const Palette&, size_t buttons) const override; + private: struct FrameColors { Color title_color; diff --git a/Libraries/LibGfx/WindowTheme.h b/Libraries/LibGfx/WindowTheme.h index d94d89621c..b6d137af71 100644 --- a/Libraries/LibGfx/WindowTheme.h +++ b/Libraries/LibGfx/WindowTheme.h @@ -59,6 +59,8 @@ public: virtual IntRect frame_rect_for_window(WindowType, const IntRect& window_rect, const Palette&) const = 0; + virtual Vector<IntRect> layout_buttons(WindowType, const IntRect& window_rect, const Palette&, size_t buttons) const = 0; + protected: WindowTheme() { } }; diff --git a/Services/WindowServer/WindowFrame.cpp b/Services/WindowServer/WindowFrame.cpp index b12e0e8b63..b1cd459f29 100644 --- a/Services/WindowServer/WindowFrame.cpp +++ b/Services/WindowServer/WindowFrame.cpp @@ -261,29 +261,9 @@ void WindowFrame::notify_window_rect_changed(const Gfx::IntRect& old_rect, const void WindowFrame::layout_buttons() { - auto palette = WindowManager::the().palette(); - int window_button_width = palette.window_title_button_width(); - int window_button_height = palette.window_title_button_height(); - int pos; - if (m_window.type() == WindowType::Notification) - pos = title_bar_rect().top() + 2; - else - pos = title_bar_text_rect().right() + 1; - - for (auto& button : m_buttons) { - if (m_window.type() == WindowType::Notification) { - // The button height & width have to be equal or it leaks out of its area - Gfx::IntRect rect { 0, pos, window_button_height, window_button_height }; - rect.center_horizontally_within(title_bar_rect()); - button.set_relative_rect(rect); - pos += window_button_height; - } else { - pos -= window_button_width; - Gfx::IntRect rect { pos, 0, window_button_width, window_button_height }; - rect.center_vertically_within(title_bar_text_rect()); - button.set_relative_rect(rect); - } - } + auto button_rects = Gfx::WindowTheme::current().layout_buttons(to_theme_window_type(m_window.type()), m_window.rect(), WindowManager::the().palette(), m_buttons.size()); + for (size_t i = 0; i < m_buttons.size(); i++) + m_buttons[i].set_relative_rect(button_rects[i]); } void WindowFrame::on_mouse_event(const MouseEvent& event) |