diff --git a/Userland/Libraries/LibGUI/Action.cpp b/Userland/Libraries/LibGUI/Action.cpp
index 678ee44915..8b50211017 100644
--- a/Userland/Libraries/LibGUI/Action.cpp
+++ b/Userland/Libraries/LibGUI/Action.cpp
@@ -228,6 +228,19 @@ void Action::set_enabled(bool enabled)
});
}
+void Action::set_visible(bool visible)
+{
+ if (m_visible == visible)
+ return;
+ m_visible = visible;
+ for_each_toolbar_button([visible](auto& button) {
+ button.set_visible(visible);
+ });
+ for_each_menu_item([visible](auto& item) {
+ item.set_visible(visible);
+ });
+}
+
void Action::set_checked(bool checked)
{
if (m_checked == checked)
diff --git a/Userland/Libraries/LibGUI/Action.h b/Userland/Libraries/LibGUI/Action.h
index d8367a5dd4..f5e615048c 100644
--- a/Userland/Libraries/LibGUI/Action.h
+++ b/Userland/Libraries/LibGUI/Action.h
@@ -105,6 +105,9 @@ public:
bool is_enabled() const { return m_enabled; }
void set_enabled(bool);
+ bool is_visible() const { return m_visible; }
+ void set_visible(bool);
+
bool is_checkable() const { return m_checkable; }
void set_checkable(bool checkable) { m_checkable = checkable; }
@@ -146,6 +149,7 @@ private:
Shortcut m_shortcut;
Shortcut m_alternate_shortcut;
bool m_enabled { true };
+ bool m_visible { true };
bool m_checkable { false };
bool m_checked { false };
bool m_swallow_key_event_when_disabled { false };
diff --git a/Userland/Libraries/LibGUI/Button.cpp b/Userland/Libraries/LibGUI/Button.cpp
index 226bd9b27f..5a19df7772 100644
--- a/Userland/Libraries/LibGUI/Button.cpp
+++ b/Userland/Libraries/LibGUI/Button.cpp
@@ -165,6 +165,7 @@ void Button::set_action(Action& action)
{
m_action = action;
action.register_button({}, *this);
+ set_visible(action.is_visible());
set_enabled(action.is_enabled());
set_checkable(action.is_checkable());
if (action.is_checkable())
diff --git a/Userland/Libraries/LibGUI/Menu.cpp b/Userland/Libraries/LibGUI/Menu.cpp
index 74dcf7a73e..d57141a68c 100644
--- a/Userland/Libraries/LibGUI/Menu.cpp
+++ b/Userland/Libraries/LibGUI/Menu.cpp
@@ -201,14 +201,14 @@ void Menu::realize_menu_item(MenuItem& item, int item_id)
bool exclusive = action.group() && action.group()->is_exclusive() && action.is_checkable();
bool is_default = (m_current_default_action.ptr() == &action);
auto icon = action.icon() ? action.icon()->to_shareable_bitmap() : Gfx::ShareableBitmap();
- ConnectionToWindowServer::the().async_add_menu_item(m_menu_id, item_id, -1, action.text(), action.is_enabled(), action.is_checkable(), action.is_checkable() ? action.is_checked() : false, is_default, shortcut_text, icon, exclusive);
+ ConnectionToWindowServer::the().async_add_menu_item(m_menu_id, item_id, -1, action.text(), action.is_enabled(), action.is_visible(), action.is_checkable(), action.is_checkable() ? action.is_checked() : false, is_default, shortcut_text, icon, exclusive);
break;
}
case MenuItem::Type::Submenu: {
auto& submenu = *item.submenu();
submenu.realize_if_needed(m_current_default_action.strong_ref());
auto icon = submenu.icon() ? submenu.icon()->to_shareable_bitmap() : Gfx::ShareableBitmap();
- ConnectionToWindowServer::the().async_add_menu_item(m_menu_id, item_id, submenu.menu_id(), submenu.name(), true, false, false, false, "", icon, false);
+ ConnectionToWindowServer::the().async_add_menu_item(m_menu_id, item_id, submenu.menu_id(), submenu.name(), true, true, false, false, false, "", icon, false);
break;
}
case MenuItem::Type::Invalid:
diff --git a/Userland/Libraries/LibGUI/MenuItem.cpp b/Userland/Libraries/LibGUI/MenuItem.cpp
index 426c5492eb..79d20db10a 100644
--- a/Userland/Libraries/LibGUI/MenuItem.cpp
+++ b/Userland/Libraries/LibGUI/MenuItem.cpp
@@ -50,6 +50,14 @@ void MenuItem::set_enabled(bool enabled)
update_window_server();
}
+void MenuItem::set_visible(bool visible)
+{
+ if (m_visible == visible)
+ return;
+ m_visible = visible;
+ update_window_server();
+}
+
void MenuItem::set_checked(bool checked)
{
VERIFY(is_checkable());
@@ -75,7 +83,7 @@ void MenuItem::update_window_server()
auto& action = *m_action;
auto shortcut_text = action.shortcut().is_valid() ? action.shortcut().to_deprecated_string() : DeprecatedString();
auto icon = action.icon() ? action.icon()->to_shareable_bitmap() : Gfx::ShareableBitmap();
- ConnectionToWindowServer::the().async_update_menu_item(m_menu_id, m_identifier, -1, action.text(), action.is_enabled(), action.is_checkable(), action.is_checkable() ? action.is_checked() : false, m_default, shortcut_text, icon);
+ ConnectionToWindowServer::the().async_update_menu_item(m_menu_id, m_identifier, -1, action.text(), action.is_enabled(), action.is_visible(), action.is_checkable(), action.is_checkable() ? action.is_checked() : false, m_default, shortcut_text, icon);
}
void MenuItem::set_menu_id(Badge