Explorar o código

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.
Andreas Kling %!s(int64=3) %!d(string=hai) anos
pai
achega
9b07e13fb6
Modificáronse 2 ficheiros con 17 adicións e 5 borrados
  1. 15 5
      Userland/Libraries/LibGUI/Toolbar.cpp
  2. 2 0
      Userland/Libraries/LibGUI/Toolbar.h

+ 15 - 5
Userland/Libraries/LibGUI/Toolbar.cpp

@@ -88,19 +88,29 @@ private:
     }
 };
 
-GUI::Button& Toolbar::add_action(Action& action)
+ErrorOr<NonnullRefPtr<GUI::Button>> Toolbar::try_add_action(Action& action)
 {
-    auto item = make<Item>();
+    auto item = TRY(adopt_nonnull_own_or_enomem(new (nothrow) Item));
     item->type = Item::Type::Action;
     item->action = action;
 
-    auto& button = add<ToolbarButton>(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<ToolbarButton>(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<Item>();

+ 2 - 0
Userland/Libraries/LibGUI/Toolbar.h

@@ -7,6 +7,7 @@
 #pragma once
 
 #include <AK/NonnullOwnPtrVector.h>
+#include <LibGUI/Button.h>
 #include <LibGUI/Widget.h>
 
 namespace GUI {
@@ -16,6 +17,7 @@ class Toolbar : public Widget {
 public:
     virtual ~Toolbar() override;
 
+    ErrorOr<NonnullRefPtr<GUI::Button>> try_add_action(GUI::Action&);
     GUI::Button& add_action(GUI::Action&);
     void add_separator();