mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 17:17:45 +00:00
Browser+LibGUI+WindowServer: Open Button menus uniformly
Instead of letting buttons determine the relative position of their menus, a workaround only used by Statusbar segments, open them all uniformly for a nice, consistent UI. Passing a rect to popup() now routes to open_button_menu(), an analog to open_menubar_menu(), which adjusts the menu's popup position in the same way. Fixes button menus obscuring the buttons which spawn them and jutting out at odd corners depending on screen position.
This commit is contained in:
parent
0fc1925cd7
commit
35e557c657
12 changed files with 34 additions and 31 deletions
|
@ -215,22 +215,7 @@ void Button::set_menu(RefPtr<GUI::Menu> menu)
|
|||
void Button::mousedown_event(MouseEvent& event)
|
||||
{
|
||||
if (m_menu) {
|
||||
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();
|
||||
}
|
||||
m_menu->popup(screen_relative_rect().bottom_left(), {}, rect());
|
||||
update();
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -66,9 +66,6 @@ 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<UISize> calculated_min_size() const override;
|
||||
|
||||
protected:
|
||||
|
@ -88,7 +85,6 @@ 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 {
|
||||
|
|
|
@ -116,10 +116,10 @@ void Menu::realize_if_needed(RefPtr<Action> const& default_action)
|
|||
realize_menu(default_action);
|
||||
}
|
||||
|
||||
void Menu::popup(Gfx::IntPoint const& screen_position, RefPtr<Action> const& default_action)
|
||||
void Menu::popup(Gfx::IntPoint const& screen_position, RefPtr<Action> const& default_action, Gfx::IntRect const& button_rect)
|
||||
{
|
||||
realize_if_needed(default_action);
|
||||
ConnectionToWindowServer::the().async_popup_menu(m_menu_id, screen_position);
|
||||
ConnectionToWindowServer::the().async_popup_menu(m_menu_id, screen_position, button_rect);
|
||||
}
|
||||
|
||||
void Menu::dismiss()
|
||||
|
|
|
@ -41,7 +41,7 @@ public:
|
|||
Menu& add_submenu(String name);
|
||||
void remove_all_actions();
|
||||
|
||||
void popup(Gfx::IntPoint const& screen_position, RefPtr<Action> const& default_action = nullptr);
|
||||
void popup(Gfx::IntPoint const& screen_position, RefPtr<Action> const& default_action = nullptr, Gfx::IntRect const& button_rect = {});
|
||||
void dismiss();
|
||||
|
||||
void visibility_did_change(Badge<ConnectionToWindowServer>, bool visible);
|
||||
|
|
|
@ -146,7 +146,6 @@ 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)
|
||||
|
|
|
@ -159,7 +159,7 @@ Optional<UISize> Toolbar::calculated_min_size() const
|
|||
ErrorOr<void> Toolbar::create_overflow_objects()
|
||||
{
|
||||
m_overflow_action = Action::create("Overflow Menu", { Mod_Ctrl | Mod_Shift, Key_O }, TRY(Gfx::Bitmap::try_load_from_file("/res/icons/16x16/overflow-menu.png"sv)), [&](auto&) {
|
||||
m_overflow_menu->popup(m_overflow_button->screen_relative_rect().bottom_left());
|
||||
m_overflow_menu->popup(m_overflow_button->screen_relative_rect().bottom_left(), {}, m_overflow_button->rect());
|
||||
});
|
||||
m_overflow_action->set_status_tip("Show hidden toolbar actions");
|
||||
m_overflow_action->set_enabled(false);
|
||||
|
@ -168,7 +168,6 @@ ErrorOr<void> Toolbar::create_overflow_objects()
|
|||
|
||||
m_overflow_button = TRY(try_add_action(*m_overflow_action));
|
||||
m_overflow_button->set_visible(false);
|
||||
m_overflow_button->set_menu_position(Button::MenuPosition::BottomLeft);
|
||||
|
||||
return {};
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue