From 70fe126d01ef824922986c7cd23c1a8753f9ef73 Mon Sep 17 00:00:00 2001 From: Ben Wiederhake Date: Mon, 27 Jul 2020 01:57:09 +0200 Subject: [PATCH] LibGUI: Enable icons for SubMenus It doesn't make sense for a top-level menu to have an icon, however we do not have dedicated classes to distinguish these. Furthermore, the only other place to store an icon is MenuItem. Storing it there would be highly confusing, as MenuItem-with-Action then would have two icons: one in Action and one in MenuItem. And because we need to be able to replace the icon during realization, this would need to write-through to Action somehow. That's why I went with Menu, not MenuItem. --- Libraries/LibGUI/Menu.cpp | 8 +++++++- Libraries/LibGUI/Menu.h | 3 +++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Libraries/LibGUI/Menu.cpp b/Libraries/LibGUI/Menu.cpp index 5ded8931fd2..49d01773c1f 100644 --- a/Libraries/LibGUI/Menu.cpp +++ b/Libraries/LibGUI/Menu.cpp @@ -63,6 +63,11 @@ Menu::~Menu() unrealize_menu(); } +void Menu::set_icon(const Gfx::Bitmap* icon) +{ + m_icon = icon; +} + void Menu::add_action(NonnullRefPtr action) { m_items.append(make(m_menu_id, move(action))); @@ -143,7 +148,8 @@ int Menu::realize_menu(RefPtr default_action) if (item.type() == MenuItem::Type::Submenu) { auto& submenu = *item.submenu(); submenu.realize_if_needed(default_action); - WindowServerConnection::the().send_sync(m_menu_id, i, submenu.menu_id(), submenu.name(), true, false, false, false, "", -1, false); + int icon_buffer_id = ensure_realized_icon(submenu); + WindowServerConnection::the().send_sync(m_menu_id, i, submenu.menu_id(), submenu.name(), true, false, false, false, "", icon_buffer_id, false); continue; } if (item.type() == MenuItem::Type::Action) { diff --git a/Libraries/LibGUI/Menu.h b/Libraries/LibGUI/Menu.h index 211e174798b..1031112830e 100644 --- a/Libraries/LibGUI/Menu.h +++ b/Libraries/LibGUI/Menu.h @@ -47,6 +47,8 @@ public: int menu_id() const { return m_menu_id; } const String& name() const { return m_name; } + const Gfx::Bitmap* icon() const { return m_icon.ptr(); } + void set_icon(const Gfx::Bitmap*); Action* action_at(size_t); @@ -66,6 +68,7 @@ private: int m_menu_id { -1 }; String m_name; + RefPtr m_icon; NonnullOwnPtrVector m_items; WeakPtr m_last_default_action; };