From a18631c5e765d7f3148e13a66341b3499c69bf4a Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Wed, 24 Nov 2021 22:23:26 +0100 Subject: [PATCH] LibGUI: Add GUI::Menu::try_add_submenu() This is a fallible variant of add_submenu() that returns ErrorOr. --- Userland/Libraries/LibGUI/Menu.cpp | 17 +++++++++++++---- Userland/Libraries/LibGUI/Menu.h | 3 ++- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/Userland/Libraries/LibGUI/Menu.cpp b/Userland/Libraries/LibGUI/Menu.cpp index 4790a477d9..d5e6da3dd9 100644 --- a/Userland/Libraries/LibGUI/Menu.cpp +++ b/Userland/Libraries/LibGUI/Menu.cpp @@ -66,18 +66,27 @@ void Menu::add_action(NonnullRefPtr action) MUST(try_add_action(move(action))); } -Menu& Menu::add_submenu(const String& name) +ErrorOr> 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(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 Menu::try_add_separator() { // NOTE: We grow the vector first, to get allocation failure handled immediately. diff --git a/Userland/Libraries/LibGUI/Menu.h b/Userland/Libraries/LibGUI/Menu.h index 8b2b8dccea..de83bdb167 100644 --- a/Userland/Libraries/LibGUI/Menu.h +++ b/Userland/Libraries/LibGUI/Menu.h @@ -34,10 +34,11 @@ public: ErrorOr try_add_action(NonnullRefPtr); ErrorOr try_add_separator(); + ErrorOr> try_add_submenu(String name); void add_action(NonnullRefPtr); void add_separator(); - Menu& add_submenu(const String& name); + Menu& add_submenu(String name); void popup(const Gfx::IntPoint& screen_position, const RefPtr& default_action = nullptr); void dismiss();