瀏覽代碼

LibGUI: Add GUI::Menu::try_add_submenu()

This is a fallible variant of add_submenu() that returns ErrorOr.
Andreas Kling 3 年之前
父節點
當前提交
a18631c5e7
共有 2 個文件被更改,包括 15 次插入5 次删除
  1. 13 4
      Userland/Libraries/LibGUI/Menu.cpp
  2. 2 1
      Userland/Libraries/LibGUI/Menu.h

+ 13 - 4
Userland/Libraries/LibGUI/Menu.cpp

@@ -66,18 +66,27 @@ void Menu::add_action(NonnullRefPtr<Action> action)
     MUST(try_add_action(move(action)));
 }
 
-Menu& Menu::add_submenu(const String& name)
+ErrorOr<NonnullRefPtr<Menu>> Menu::try_add_submenu(String name)
 {
-    auto submenu = Menu::construct(name);
+    // NOTE: We grow the vector first, to get allocation failure handled immediately.
+    TRY(m_items.try_ensure_capacity(m_items.size() + 1));
 
-    auto item = make<MenuItem>(m_menu_id, submenu);
+    auto submenu = TRY(Menu::try_create(name));
+
+    auto item = TRY(adopt_nonnull_own_or_enomem(new (nothrow) MenuItem(m_menu_id, submenu)));
     if (m_menu_id != -1)
         realize_menu_item(*item, m_items.size());
-    m_items.append(move(item));
 
+    m_items.unchecked_append(move(item));
     return submenu;
 }
 
+Menu& Menu::add_submenu(String name)
+{
+    auto menu = MUST(try_add_submenu(move(name)));
+    return menu;
+}
+
 ErrorOr<void> Menu::try_add_separator()
 {
     // NOTE: We grow the vector first, to get allocation failure handled immediately.

+ 2 - 1
Userland/Libraries/LibGUI/Menu.h

@@ -34,10 +34,11 @@ public:
 
     ErrorOr<void> try_add_action(NonnullRefPtr<Action>);
     ErrorOr<void> try_add_separator();
+    ErrorOr<NonnullRefPtr<Menu>> try_add_submenu(String name);
 
     void add_action(NonnullRefPtr<Action>);
     void add_separator();
-    Menu& add_submenu(const String& name);
+    Menu& add_submenu(String name);
 
     void popup(const Gfx::IntPoint& screen_position, const RefPtr<Action>& default_action = nullptr);
     void dismiss();