From 56c4f0aff57068383130b494a66c2c3d07238228 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 28 Nov 2021 08:24:37 +0100 Subject: [PATCH] LibGUI: Add fallible variants of the GUI::Layout add/insert APIs --- Userland/Libraries/LibGUI/Layout.cpp | 50 ++++++++++++++++++++-------- Userland/Libraries/LibGUI/Layout.h | 9 +++-- 2 files changed, 43 insertions(+), 16 deletions(-) diff --git a/Userland/Libraries/LibGUI/Layout.cpp b/Userland/Libraries/LibGUI/Layout.cpp index c5ea4f9240..8ee264a046 100644 --- a/Userland/Libraries/LibGUI/Layout.cpp +++ b/Userland/Libraries/LibGUI/Layout.cpp @@ -54,18 +54,28 @@ void Layout::notify_disowned(Badge, Widget& widget) m_owner.clear(); } -void Layout::add_entry(Entry&& entry) +ErrorOr Layout::try_add_entry(Entry&& entry) { - m_entries.append(move(entry)); + TRY(m_entries.try_append(move(entry))); if (m_owner) m_owner->notify_layout_changed({}); + return {}; +} + +void Layout::add_entry(Entry&& entry) +{ + MUST(try_add_entry(move(entry))); +} + +ErrorOr Layout::try_add_spacer() +{ + TRY(try_add_entry(Entry { .type = Entry::Type::Spacer })); + return {}; } void Layout::add_spacer() { - Entry entry; - entry.type = Entry::Type::Spacer; - add_entry(move(entry)); + MUST(try_add_spacer()); } void Layout::add_layout(OwnPtr&& layout) @@ -76,24 +86,36 @@ void Layout::add_layout(OwnPtr&& layout) add_entry(move(entry)); } +ErrorOr Layout::try_add_widget(Widget& widget) +{ + TRY(try_add_entry(Entry { + .type = Entry::Type::Widget, + .widget = widget, + })); + return {}; +} + void Layout::add_widget(Widget& widget) +{ + MUST(try_add_widget(widget)); +} + +ErrorOr Layout::try_insert_widget_before(Widget& widget, Widget& before_widget) { Entry entry; entry.type = Entry::Type::Widget; entry.widget = widget; - add_entry(move(entry)); + TRY(m_entries.try_insert_before_matching(move(entry), [&](auto& existing_entry) { + return existing_entry.type == Entry::Type::Widget && existing_entry.widget.ptr() == &before_widget; + })); + if (m_owner) + m_owner->notify_layout_changed({}); + return {}; } void Layout::insert_widget_before(Widget& widget, Widget& before_widget) { - Entry entry; - entry.type = Entry::Type::Widget; - entry.widget = widget; - m_entries.insert_before_matching(move(entry), [&](auto& existing_entry) { - return existing_entry.type == Entry::Type::Widget && existing_entry.widget.ptr() == &before_widget; - }); - if (m_owner) - m_owner->notify_layout_changed({}); + MUST(try_insert_widget_before(widget, before_widget)); } void Layout::remove_widget(Widget& widget) diff --git a/Userland/Libraries/LibGUI/Layout.h b/Userland/Libraries/LibGUI/Layout.h index f65683cf08..cd2fa5f23b 100644 --- a/Userland/Libraries/LibGUI/Layout.h +++ b/Userland/Libraries/LibGUI/Layout.h @@ -41,6 +41,10 @@ public: void add_layout(OwnPtr&&); void add_spacer(); + ErrorOr try_add_widget(Widget&); + ErrorOr try_insert_widget_before(Widget& widget, Widget& before_widget); + ErrorOr try_add_spacer(); + void remove_widget(Widget&); virtual void run(Widget&) = 0; @@ -67,10 +71,11 @@ protected: }; Type type { Type::Invalid }; - WeakPtr widget; - OwnPtr layout; + WeakPtr widget {}; + OwnPtr layout {}; }; void add_entry(Entry&&); + ErrorOr try_add_entry(Entry&&); WeakPtr m_owner; Vector m_entries;