Procházet zdrojové kódy

PDFViewer: Propagate errors from OutlineModel construction

This follows the same idea that Andreas was doing in this latest videos,
where construction-time TRY()s were not present but should have been.
Like Andreas did, moving the initialisation of such fields to the
factory function, which then returns ErrorOr solves the issue.
Rodrigo Tobar před 2 roky
rodič
revize
2ea8d2547e

+ 5 - 4
Userland/Applications/PDFViewer/OutlineModel.cpp

@@ -7,16 +7,17 @@
 #include "OutlineModel.h"
 #include <LibGfx/Font/FontDatabase.h>
 
-NonnullRefPtr<OutlineModel> OutlineModel::create(NonnullRefPtr<PDF::OutlineDict> const& outline)
+ErrorOr<NonnullRefPtr<OutlineModel>> OutlineModel::create(NonnullRefPtr<PDF::OutlineDict> const& outline)
 {
-    return adopt_ref(*new OutlineModel(outline));
+    auto outline_model = adopt_ref(*new OutlineModel(outline));
+    outline_model->m_closed_item_icon.set_bitmap_for_size(16, TRY(Gfx::Bitmap::try_load_from_file("/res/icons/16x16/book.png"sv)));
+    outline_model->m_open_item_icon.set_bitmap_for_size(16, TRY(Gfx::Bitmap::try_load_from_file("/res/icons/16x16/book-open.png"sv)));
+    return outline_model;
 }
 
 OutlineModel::OutlineModel(NonnullRefPtr<PDF::OutlineDict> const& outline)
     : m_outline(outline)
 {
-    m_closed_item_icon.set_bitmap_for_size(16, Gfx::Bitmap::try_load_from_file("/res/icons/16x16/book.png"sv).release_value_but_fixme_should_propagate_errors());
-    m_open_item_icon.set_bitmap_for_size(16, Gfx::Bitmap::try_load_from_file("/res/icons/16x16/book-open.png"sv).release_value_but_fixme_should_propagate_errors());
 }
 
 void OutlineModel::set_index_open_state(const GUI::ModelIndex& index, bool is_open)

+ 1 - 1
Userland/Applications/PDFViewer/OutlineModel.h

@@ -12,7 +12,7 @@
 
 class OutlineModel final : public GUI::Model {
 public:
-    static NonnullRefPtr<OutlineModel> create(NonnullRefPtr<PDF::OutlineDict> const& outline);
+    static ErrorOr<NonnullRefPtr<OutlineModel>> create(NonnullRefPtr<PDF::OutlineDict> const& outline);
 
     void set_index_open_state(const GUI::ModelIndex& index, bool is_open);
 

+ 2 - 2
Userland/Applications/PDFViewer/PDFViewerWidget.cpp

@@ -376,11 +376,11 @@ PDF::PDFErrorOr<void> PDFViewerWidget::try_open_file(Core::File& file)
 
     if (document->outline()) {
         auto outline = document->outline();
-        m_sidebar->set_outline(outline.release_nonnull());
+        TRY(m_sidebar->set_outline(outline.release_nonnull()));
         m_sidebar->set_visible(true);
         m_sidebar_open = true;
     } else {
-        m_sidebar->set_outline({});
+        TRY(m_sidebar->set_outline({}));
         m_sidebar->set_visible(false);
         m_sidebar_open = false;
     }

+ 3 - 2
Userland/Applications/PDFViewer/SidebarWidget.h

@@ -16,15 +16,16 @@ class SidebarWidget final : public GUI::Widget {
 public:
     ~SidebarWidget() override = default;
 
-    void set_outline(RefPtr<PDF::OutlineDict> outline)
+    ErrorOr<void> set_outline(RefPtr<PDF::OutlineDict> outline)
     {
         if (outline) {
-            m_model = OutlineModel::create(outline.release_nonnull());
+            m_model = TRY(OutlineModel::create(outline.release_nonnull()));
             m_outline_tree_view->set_model(m_model);
         } else {
             m_model = RefPtr<OutlineModel> {};
             m_outline_tree_view->set_model({});
         }
+        return {};
     }
 
 private: