浏览代码

LibGUI: Allow adding previously constructed menus to Menubar

thankyouverycool 2 年之前
父节点
当前提交
c88d77361c

+ 6 - 0
Userland/Libraries/LibGUI/Menubar.cpp

@@ -10,6 +10,12 @@
 
 namespace GUI {
 
+ErrorOr<void> Menubar::try_add_menu(Badge<Window>, NonnullRefPtr<Menu> menu)
+{
+    TRY(m_menus.try_append(menu));
+    return {};
+}
+
 ErrorOr<NonnullRefPtr<Menu>> Menubar::try_add_menu(Badge<Window>, String name)
 {
     auto menu = TRY(try_add<Menu>(move(name)));

+ 1 - 0
Userland/Libraries/LibGUI/Menubar.h

@@ -23,6 +23,7 @@ class Menubar : public Core::Object {
 public:
     virtual ~Menubar() override = default;
 
+    ErrorOr<void> try_add_menu(Badge<Window>, NonnullRefPtr<Menu>);
     ErrorOr<NonnullRefPtr<Menu>> try_add_menu(Badge<Window>, String name);
     Menu& add_menu(Badge<Window>, String name);
 

+ 10 - 0
Userland/Libraries/LibGUI/Window.cpp

@@ -1272,6 +1272,16 @@ Gfx::Bitmap* Window::back_bitmap()
     return m_back_store ? &m_back_store->bitmap() : nullptr;
 }
 
+ErrorOr<void> Window::try_add_menu(NonnullRefPtr<Menu> menu)
+{
+    TRY(m_menubar->try_add_menu({}, move(menu)));
+    if (m_window_id) {
+        menu->realize_menu_if_needed();
+        ConnectionToWindowServer::the().async_add_menu(m_window_id, menu->menu_id());
+    }
+    return {};
+}
+
 ErrorOr<NonnullRefPtr<Menu>> Window::try_add_menu(String name)
 {
     auto menu = TRY(m_menubar->try_add_menu({}, move(name)));

+ 1 - 0
Userland/Libraries/LibGUI/Window.h

@@ -222,6 +222,7 @@ public:
 
     Menu& add_menu(String name);
     ErrorOr<NonnullRefPtr<Menu>> try_add_menu(String name);
+    ErrorOr<void> try_add_menu(NonnullRefPtr<Menu> menu);
     void flash_menubar_menu_for(MenuItem const&);
 
     void flush_pending_paints_immediately();