From aa5e5748725b773d1efb7b5cd762925421874229 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?kleines=20Filmr=C3=B6llchen?= Date: Wed, 14 Dec 2022 13:33:28 +0100 Subject: [PATCH] Help+LibManual: Make the children accessor fallible This is convenient for the section node which might compute children on the fly. --- Userland/Applications/Help/ManualModel.cpp | 20 +++++++++++++++----- Userland/Libraries/LibManual/Node.h | 2 +- Userland/Libraries/LibManual/PageNode.cpp | 4 ++-- Userland/Libraries/LibManual/PageNode.h | 2 +- Userland/Libraries/LibManual/SectionNode.h | 6 +++--- 5 files changed, 22 insertions(+), 12 deletions(-) diff --git a/Userland/Applications/Help/ManualModel.cpp b/Userland/Applications/Help/ManualModel.cpp index 14df270453..7809a0dd12 100644 --- a/Userland/Applications/Help/ManualModel.cpp +++ b/Userland/Applications/Help/ManualModel.cpp @@ -109,8 +109,11 @@ GUI::ModelIndex ManualModel::index(int row, int column, const GUI::ModelIndex& p if (!parent_index.is_valid()) return create_index(row, column, Manual::sections[row].ptr()); auto* parent = static_cast(parent_index.internal_data()); - auto* child = &parent->children()[row]; - return create_index(row, column, child); + auto const children = parent->children(); + if (children.is_error()) + return {}; + auto child = children.value()[row]; + return create_index(row, column, child.ptr()); } GUI::ModelIndex ManualModel::parent_index(const GUI::ModelIndex& index) const @@ -128,8 +131,12 @@ GUI::ModelIndex ManualModel::parent_index(const GUI::ModelIndex& index) const return create_index(row, 0, parent); VERIFY_NOT_REACHED(); } - for (size_t row = 0; row < parent->parent()->children().size(); row++) { - Manual::Node* child_at_row = &parent->parent()->children()[row]; + auto maybe_children = parent->parent()->children(); + if (maybe_children.is_error()) + return {}; + auto children = maybe_children.release_value(); + for (size_t row = 0; row < children.size(); row++) { + Manual::Node* child_at_row = children[row]; if (child_at_row == parent) return create_index(row, 0, parent); } @@ -141,7 +148,10 @@ int ManualModel::row_count(const GUI::ModelIndex& index) const if (!index.is_valid()) return static_cast(Manual::sections.size()); auto* node = static_cast(index.internal_data()); - return node->children().size(); + auto maybe_children = node->children(); + if (maybe_children.is_error()) + return 0; + return static_cast(maybe_children.value().size()); } int ManualModel::column_count(const GUI::ModelIndex&) const diff --git a/Userland/Libraries/LibManual/Node.h b/Userland/Libraries/LibManual/Node.h index 46347bd8e4..cf72a984a2 100644 --- a/Userland/Libraries/LibManual/Node.h +++ b/Userland/Libraries/LibManual/Node.h @@ -20,7 +20,7 @@ class Node : public RefCounted { public: virtual ~Node() = default; - virtual NonnullRefPtrVector& children() const = 0; + virtual ErrorOr>> children() const = 0; virtual Node const* parent() const = 0; virtual ErrorOr name() const = 0; virtual bool is_page() const { return false; } diff --git a/Userland/Libraries/LibManual/PageNode.cpp b/Userland/Libraries/LibManual/PageNode.cpp index 800598e69d..398eedb53c 100644 --- a/Userland/Libraries/LibManual/PageNode.cpp +++ b/Userland/Libraries/LibManual/PageNode.cpp @@ -16,10 +16,10 @@ Node const* PageNode::parent() const return m_section.ptr(); } -NonnullRefPtrVector& PageNode::children() const +ErrorOr>> PageNode::children() const { static NonnullRefPtrVector empty_vector; - return empty_vector; + return empty_vector.span(); } ErrorOr PageNode::path() const diff --git a/Userland/Libraries/LibManual/PageNode.h b/Userland/Libraries/LibManual/PageNode.h index 66976a593f..e505e228a0 100644 --- a/Userland/Libraries/LibManual/PageNode.h +++ b/Userland/Libraries/LibManual/PageNode.h @@ -23,7 +23,7 @@ public: { } - virtual NonnullRefPtrVector& children() const override; + virtual ErrorOr>> children() const override; virtual Node const* parent() const override; virtual ErrorOr name() const override { return m_page; }; virtual bool is_page() const override { return true; } diff --git a/Userland/Libraries/LibManual/SectionNode.h b/Userland/Libraries/LibManual/SectionNode.h index 414e03b17c..14ddd5bbda 100644 --- a/Userland/Libraries/LibManual/SectionNode.h +++ b/Userland/Libraries/LibManual/SectionNode.h @@ -23,10 +23,10 @@ public: { } - virtual NonnullRefPtrVector& children() const override + virtual ErrorOr>> children() const override { - MUST(reify_if_needed()); - return m_children; + TRY(reify_if_needed()); + return m_children.span(); } virtual Node const* parent() const override { return nullptr; }