diff --git a/Userland/Libraries/LibGUI/Button.cpp b/Userland/Libraries/LibGUI/Button.cpp index 553b14c69d..735d40e86f 100644 --- a/Userland/Libraries/LibGUI/Button.cpp +++ b/Userland/Libraries/LibGUI/Button.cpp @@ -215,10 +215,22 @@ void Button::set_menu(RefPtr menu) void Button::mousedown_event(MouseEvent& event) { if (m_menu) { - if (button_style() == Gfx::ButtonStyle::Tray) - m_menu->popup(screen_relative_rect().top_right()); - else + switch (m_menu_position) { + case TopLeft: m_menu->popup(screen_relative_rect().top_left()); + break; + case TopRight: + m_menu->popup(screen_relative_rect().top_right()); + break; + case BottomLeft: + m_menu->popup(screen_relative_rect().bottom_left()); + break; + case BottomRight: + m_menu->popup(screen_relative_rect().bottom_right()); + break; + default: + VERIFY_NOT_REACHED(); + } update(); return; } diff --git a/Userland/Libraries/LibGUI/Button.h b/Userland/Libraries/LibGUI/Button.h index c714c90237..ca8f79ff1f 100644 --- a/Userland/Libraries/LibGUI/Button.h +++ b/Userland/Libraries/LibGUI/Button.h @@ -19,6 +19,13 @@ class Button : public AbstractButton { C_OBJECT(Button); public: + enum MenuPosition { + TopLeft, + TopRight, + BottomLeft, + BottomRight + }; + virtual ~Button() override; void set_icon(RefPtr); @@ -59,6 +66,9 @@ public: void set_mimic_pressed(bool mimic_pressed); bool is_mimic_pressed() const { return m_mimic_pressed; }; + MenuPosition menu_position() const { return m_menu_position; } + void set_menu_position(MenuPosition position) { m_menu_position = position; } + virtual Optional calculated_min_size() const override; protected: @@ -78,6 +88,7 @@ private: int m_icon_spacing { 4 }; bool m_another_button_has_focus { false }; bool m_mimic_pressed { false }; + MenuPosition m_menu_position { MenuPosition::TopLeft }; }; class DialogButton final : public Button { diff --git a/Userland/Libraries/LibGUI/Statusbar.cpp b/Userland/Libraries/LibGUI/Statusbar.cpp index 75c7fcc841..c5dd6075dc 100644 --- a/Userland/Libraries/LibGUI/Statusbar.cpp +++ b/Userland/Libraries/LibGUI/Statusbar.cpp @@ -133,6 +133,7 @@ Statusbar::Segment::Segment() set_focus_policy(GUI::FocusPolicy::NoFocus); set_button_style(Gfx::ButtonStyle::Tray); set_text_alignment(Gfx::TextAlignment::CenterLeft); + set_menu_position(GUI::Button::MenuPosition::TopRight); } void Statusbar::Segment::paint_event(PaintEvent& event)