From 9b07e13fb636d1a9af51ae91f6f0fe866adc04a1 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Wed, 24 Nov 2021 13:18:52 +0100 Subject: [PATCH] LibGUI: Add GUI::Toolbar::try_add_action() This is a fallible variant of add_action() that returns ErrorOr. It's careful to not fail with a partially added action. --- Userland/Libraries/LibGUI/Toolbar.cpp | 20 +++++++++++++++----- Userland/Libraries/LibGUI/Toolbar.h | 2 ++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/Userland/Libraries/LibGUI/Toolbar.cpp b/Userland/Libraries/LibGUI/Toolbar.cpp index adce583bc6..29c02ed4bb 100644 --- a/Userland/Libraries/LibGUI/Toolbar.cpp +++ b/Userland/Libraries/LibGUI/Toolbar.cpp @@ -88,19 +88,29 @@ private: } }; -GUI::Button& Toolbar::add_action(Action& action) +ErrorOr> Toolbar::try_add_action(Action& action) { - auto item = make(); + auto item = TRY(adopt_nonnull_own_or_enomem(new (nothrow) Item)); item->type = Item::Type::Action; item->action = action; - auto& button = add(action); - button.set_fixed_size(m_button_size + 8, m_button_size + 8); + // NOTE: Grow the m_items capacity before potentially adding a child widget. + // This avoids having to untangle the child widget in case of allocation failure. + TRY(m_items.try_ensure_capacity(m_items.size() + 1)); - m_items.append(move(item)); + auto button = TRY(try_add(action)); + button->set_fixed_size(m_button_size + 8, m_button_size + 8); + + m_items.unchecked_append(move(item)); return button; } +GUI::Button& Toolbar::add_action(Action& action) +{ + auto button = MUST(try_add_action(action)); + return *button; +} + void Toolbar::add_separator() { auto item = make(); diff --git a/Userland/Libraries/LibGUI/Toolbar.h b/Userland/Libraries/LibGUI/Toolbar.h index c7f6e8c556..91fba6b029 100644 --- a/Userland/Libraries/LibGUI/Toolbar.h +++ b/Userland/Libraries/LibGUI/Toolbar.h @@ -7,6 +7,7 @@ #pragma once #include +#include #include namespace GUI { @@ -16,6 +17,7 @@ class Toolbar : public Widget { public: virtual ~Toolbar() override; + ErrorOr> try_add_action(GUI::Action&); GUI::Button& add_action(GUI::Action&); void add_separator();