mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 01:27:43 +00:00
LibGUI+WindowServer: Make it possible to have checkable GActions.
They show up as checkable GButtons in GToolBar, and with (or without) check marks in menus. There are a bunch of places to make use of this. This patch only takes advantage of it in the FileManager for the view type actions.
This commit is contained in:
parent
9ff36afeaa
commit
8f81a3f9dd
15 changed files with 148 additions and 20 deletions
|
@ -106,3 +106,16 @@ void GAction::set_enabled(bool enabled)
|
|||
item.set_enabled(enabled);
|
||||
});
|
||||
}
|
||||
|
||||
void GAction::set_checked(bool checked)
|
||||
{
|
||||
if (m_checked == checked)
|
||||
return;
|
||||
m_checked = checked;
|
||||
for_each_toolbar_button([checked] (GButton& button) {
|
||||
button.set_checked(checked);
|
||||
});
|
||||
for_each_menu_item([checked] (GMenuItem& item) {
|
||||
item.set_checked(checked);
|
||||
});
|
||||
}
|
||||
|
|
|
@ -59,6 +59,12 @@ public:
|
|||
bool is_enabled() const { return m_enabled; }
|
||||
void set_enabled(bool);
|
||||
|
||||
bool is_checkable() const { return m_checkable; }
|
||||
void set_checkable(bool checkable) { m_checkable = checkable; }
|
||||
|
||||
bool is_checked() const { ASSERT(is_checkable()); return m_checked; }
|
||||
void set_checked(bool);
|
||||
|
||||
void register_button(Badge<GButton>, GButton&);
|
||||
void unregister_button(Badge<GButton>, GButton&);
|
||||
void register_menu_item(Badge<GMenuItem>, GMenuItem&);
|
||||
|
@ -79,6 +85,8 @@ private:
|
|||
RetainPtr<GraphicsBitmap> m_icon;
|
||||
GShortcut m_shortcut;
|
||||
bool m_enabled { true };
|
||||
bool m_checkable { false };
|
||||
bool m_checked { false };
|
||||
ShortcutScope m_scope { ShortcutScope::None };
|
||||
|
||||
HashTable<GButton*> m_buttons;
|
||||
|
|
|
@ -133,6 +133,9 @@ void GButton::set_action(GAction& action)
|
|||
m_action = action.make_weak_ptr();
|
||||
action.register_button({ }, *this);
|
||||
set_enabled(action.is_enabled());
|
||||
set_checkable(action.is_checkable());
|
||||
if (action.is_checkable())
|
||||
set_checked(action.is_checked());
|
||||
}
|
||||
|
||||
void GButton::set_icon(RetainPtr<GraphicsBitmap>&& icon)
|
||||
|
|
|
@ -90,6 +90,9 @@ int GMenu::realize_menu()
|
|||
request.menu.menu_id = m_menu_id;
|
||||
request.menu.identifier = i;
|
||||
request.menu.enabled = action.is_enabled();
|
||||
request.menu.checkable = action.is_checkable();
|
||||
if (action.is_checkable())
|
||||
request.menu.checked = action.is_checked();
|
||||
ASSERT(action.text().length() < (ssize_t)sizeof(request.text));
|
||||
strcpy(request.text, action.text().characters());
|
||||
request.text_length = action.text().length();
|
||||
|
|
|
@ -16,6 +16,9 @@ GMenuItem::GMenuItem(unsigned menu_id, Retained<GAction>&& action)
|
|||
{
|
||||
m_action->register_menu_item({ }, *this);
|
||||
m_enabled = m_action->is_enabled();
|
||||
m_checkable = m_action->is_checkable();
|
||||
if (m_checkable)
|
||||
m_checked = m_action->is_checked();
|
||||
}
|
||||
|
||||
GMenuItem::~GMenuItem()
|
||||
|
@ -32,6 +35,15 @@ void GMenuItem::set_enabled(bool enabled)
|
|||
update_window_server();
|
||||
}
|
||||
|
||||
void GMenuItem::set_checked(bool checked)
|
||||
{
|
||||
ASSERT(is_checkable());
|
||||
if (m_checked == checked)
|
||||
return;
|
||||
m_checked = checked;
|
||||
update_window_server();
|
||||
}
|
||||
|
||||
void GMenuItem::update_window_server()
|
||||
{
|
||||
auto& action = *m_action;
|
||||
|
@ -40,6 +52,9 @@ void GMenuItem::update_window_server()
|
|||
request.menu.menu_id = m_menu_id;
|
||||
request.menu.identifier = m_identifier;
|
||||
request.menu.enabled = action.is_enabled();
|
||||
request.menu.checkable = action.is_checkable();
|
||||
if (action.is_checkable())
|
||||
request.menu.checked = action.is_checked();
|
||||
ASSERT(action.text().length() < (ssize_t)sizeof(request.text));
|
||||
strcpy(request.text, action.text().characters());
|
||||
request.text_length = action.text().length();
|
||||
|
|
|
@ -20,6 +20,12 @@ public:
|
|||
GAction* action() { return m_action.ptr(); }
|
||||
unsigned identifier() const { return m_identifier; }
|
||||
|
||||
bool is_checkable() const { return m_checkable; }
|
||||
void set_checkable(bool checkable) { m_checkable = checkable; }
|
||||
|
||||
bool is_checked() const { return m_checked; }
|
||||
void set_checked(bool);
|
||||
|
||||
bool is_enabled() const { return m_enabled; }
|
||||
void set_enabled(bool);
|
||||
|
||||
|
@ -33,6 +39,8 @@ private:
|
|||
unsigned m_menu_id { 0 };
|
||||
unsigned m_identifier { 0 };
|
||||
bool m_enabled { true };
|
||||
bool m_checkable { false };
|
||||
bool m_checked { false };
|
||||
RetainPtr<GAction> m_action;
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue