diff --git a/Userland/Applications/ThemeEditor/MainWidget.cpp b/Userland/Applications/ThemeEditor/MainWidget.cpp index 0349710209..c532b53f47 100644 --- a/Userland/Applications/ThemeEditor/MainWidget.cpp +++ b/Userland/Applications/ThemeEditor/MainWidget.cpp @@ -206,21 +206,30 @@ static const PropertyTab color_scheme_tab { } }; -MainWidget::MainWidget() - : m_current_palette(GUI::Application::the()->palette()) +ErrorOr> MainWidget::try_create() { - load_from_gml(theme_editor_gml); + auto alignment_model = TRY(AlignmentModel::try_create()); - m_alignment_model = MUST(AlignmentModel::try_create()); + auto main_widget = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) MainWidget(move(alignment_model)))); - m_preview_widget = find_descendant_of_type_named("preview_widget"); - m_property_tabs = find_descendant_of_type_named("property_tabs"); - add_property_tab(window_tab); - add_property_tab(widgets_tab); - add_property_tab(syntax_highlighting_tab); - add_property_tab(color_scheme_tab); + TRY(main_widget->try_load_from_gml(theme_editor_gml)); + main_widget->m_preview_widget = main_widget->find_descendant_of_type_named("preview_widget"); + main_widget->m_property_tabs = main_widget->find_descendant_of_type_named("property_tabs"); - build_override_controls(); + TRY(main_widget->add_property_tab(window_tab)); + TRY(main_widget->add_property_tab(widgets_tab)); + TRY(main_widget->add_property_tab(syntax_highlighting_tab)); + TRY(main_widget->add_property_tab(color_scheme_tab)); + + main_widget->build_override_controls(); + + return main_widget; +} + +MainWidget::MainWidget(NonnullRefPtr alignment_model) + : m_current_palette(GUI::Application::the()->palette()) + , m_alignment_model(move(alignment_model)) +{ } ErrorOr MainWidget::initialize_menubar(GUI::Window& window) @@ -418,31 +427,31 @@ void MainWidget::build_override_controls() }; } -void MainWidget::add_property_tab(PropertyTab const& property_tab) +ErrorOr MainWidget::add_property_tab(PropertyTab const& property_tab) { - auto& scrollable_container = m_property_tabs->add_tab(property_tab.title); - scrollable_container.set_should_hide_unnecessary_scrollbars(true); + auto scrollable_container = TRY(m_property_tabs->try_add_tab(property_tab.title)); + scrollable_container->set_should_hide_unnecessary_scrollbars(true); - auto properties_list = GUI::Widget::construct(); - scrollable_container.set_widget(properties_list); - properties_list->set_layout(); + auto properties_list = TRY(GUI::Widget::try_create()); + scrollable_container->set_widget(properties_list); + (void)TRY(properties_list->try_set_layout()); properties_list->layout()->set_spacing(12); properties_list->layout()->set_margins({ 8 }); for (auto const& group : property_tab.property_groups) { - NonnullRefPtr group_box = properties_list->add(group.title); - group_box->set_layout(); + NonnullRefPtr group_box = TRY(properties_list->try_add(group.title)); + (void)TRY(group_box->try_set_layout()); group_box->layout()->set_spacing(12); // 1px less on the left makes the text line up with the group title. group_box->layout()->set_margins({ 8, 8, 8, 7 }); group_box->set_preferred_height(GUI::SpecialDimension::Fit); for (auto const& property : group.properties) { - NonnullRefPtr row_widget = group_box->add(); + NonnullRefPtr row_widget = TRY(group_box->try_add()); row_widget->set_fixed_height(22); - property.role.visit( - [&](Gfx::AlignmentRole role) { - row_widget->load_from_gml(alignment_property_gml); + TRY(property.role.visit( + [&](Gfx::AlignmentRole role) -> ErrorOr { + TRY(row_widget->try_load_from_gml(alignment_property_gml)); auto& name_label = *row_widget->find_descendant_of_type_named("name"); name_label.set_text(to_string(role)); @@ -456,9 +465,10 @@ void MainWidget::add_property_tab(PropertyTab const& property_tab) VERIFY(m_alignment_inputs[to_underlying(role)].is_null()); m_alignment_inputs[to_underlying(role)] = alignment_picker; + return {}; }, - [&](Gfx::ColorRole role) { - row_widget->load_from_gml(color_property_gml); + [&](Gfx::ColorRole role) -> ErrorOr { + TRY(row_widget->try_load_from_gml(color_property_gml)); auto& name_label = *row_widget->find_descendant_of_type_named("name"); name_label.set_text(to_string(role)); @@ -471,9 +481,10 @@ void MainWidget::add_property_tab(PropertyTab const& property_tab) VERIFY(m_color_inputs[to_underlying(role)].is_null()); m_color_inputs[to_underlying(role)] = color_input; + return {}; }, - [&](Gfx::FlagRole role) { - row_widget->load_from_gml(flag_property_gml); + [&](Gfx::FlagRole role) -> ErrorOr { + TRY(row_widget->try_load_from_gml(flag_property_gml)); auto& checkbox = *row_widget->find_descendant_of_type_named("checkbox"); checkbox.set_text(to_string(role)); @@ -484,9 +495,10 @@ void MainWidget::add_property_tab(PropertyTab const& property_tab) VERIFY(m_flag_inputs[to_underlying(role)].is_null()); m_flag_inputs[to_underlying(role)] = checkbox; + return {}; }, - [&](Gfx::MetricRole role) { - row_widget->load_from_gml(metric_property_gml); + [&](Gfx::MetricRole role) -> ErrorOr { + TRY(row_widget->try_load_from_gml(metric_property_gml)); auto& name_label = *row_widget->find_descendant_of_type_named("name"); name_label.set_text(to_string(role)); @@ -499,9 +511,10 @@ void MainWidget::add_property_tab(PropertyTab const& property_tab) VERIFY(m_metric_inputs[to_underlying(role)].is_null()); m_metric_inputs[to_underlying(role)] = spin_box; + return {}; }, - [&](Gfx::PathRole role) { - row_widget->load_from_gml(path_property_gml); + [&](Gfx::PathRole role) -> ErrorOr { + TRY(row_widget->try_load_from_gml(path_property_gml)); auto& name_label = *row_widget->find_descendant_of_type_named("name"); name_label.set_text(to_string(role)); @@ -520,9 +533,12 @@ void MainWidget::add_property_tab(PropertyTab const& property_tab) VERIFY(m_path_inputs[to_underlying(role)].is_null()); m_path_inputs[to_underlying(role)] = path_input; - }); + return {}; + })); } } + + return {}; } void MainWidget::set_alignment(Gfx::AlignmentRole role, Gfx::TextAlignment value) diff --git a/Userland/Applications/ThemeEditor/MainWidget.h b/Userland/Applications/ThemeEditor/MainWidget.h index f9bac73729..786adb414d 100644 --- a/Userland/Applications/ThemeEditor/MainWidget.h +++ b/Userland/Applications/ThemeEditor/MainWidget.h @@ -77,9 +77,10 @@ struct PropertyTab { }; class MainWidget final : public GUI::Widget { - C_OBJECT(MainWidget); + C_OBJECT_ABSTRACT(MainWidget); public: + static ErrorOr> try_create(); virtual ~MainWidget() override = default; ErrorOr initialize_menubar(GUI::Window&); @@ -88,7 +89,7 @@ public: ErrorOr load_from_file(Core::File&); private: - MainWidget(); + explicit MainWidget(NonnullRefPtr); void save_to_file(Core::File&); ErrorOr encode(); @@ -96,7 +97,7 @@ private: void build_override_controls(); - void add_property_tab(PropertyTab const&); + ErrorOr add_property_tab(PropertyTab const&); void set_alignment(Gfx::AlignmentRole, Gfx::TextAlignment); void set_color(Gfx::ColorRole, Gfx::Color); void set_flag(Gfx::FlagRole, bool); diff --git a/Userland/Applications/ThemeEditor/PreviewWidget.cpp b/Userland/Applications/ThemeEditor/PreviewWidget.cpp index 45b19d45e2..074f7bb0a4 100644 --- a/Userland/Applications/ThemeEditor/PreviewWidget.cpp +++ b/Userland/Applications/ThemeEditor/PreviewWidget.cpp @@ -23,9 +23,22 @@ REGISTER_WIDGET(ThemeEditor, PreviewWidget); namespace ThemeEditor { class MiniWidgetGallery final : public GUI::Widget { - C_OBJECT(MiniWidgetGallery); + C_OBJECT_ABSTRACT(MiniWidgetGallery); public: + static ErrorOr> try_create() + { + auto gallery = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) MiniWidgetGallery())); + TRY(gallery->try_load_from_gml(window_preview_gml)); + + gallery->for_each_child_widget([](auto& child) { + child.set_focus_policy(GUI::FocusPolicy::NoFocus); + return IterationDecision::Continue; + }); + + return gallery; + } + void set_preview_palette(Gfx::Palette const& palette) { set_palette(palette); @@ -42,19 +55,19 @@ public: private: MiniWidgetGallery() { - load_from_gml(window_preview_gml); - - for_each_child_widget([](auto& child) { - child.set_focus_policy(GUI::FocusPolicy::NoFocus); - return IterationDecision::Continue; - }); } }; -PreviewWidget::PreviewWidget(Gfx::Palette const& initial_preview_palette) - : GUI::AbstractThemePreview(initial_preview_palette) +ErrorOr> PreviewWidget::try_create() +{ + auto preview_widget = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) PreviewWidget())); + preview_widget->m_gallery = TRY(preview_widget->try_add()); + return preview_widget; +} + +PreviewWidget::PreviewWidget() + : GUI::AbstractThemePreview(GUI::Application::the()->palette()) { - m_gallery = add(); set_greedy_for_hits(true); } diff --git a/Userland/Applications/ThemeEditor/PreviewWidget.h b/Userland/Applications/ThemeEditor/PreviewWidget.h index 3ffba902fb..0ba05d4b02 100644 --- a/Userland/Applications/ThemeEditor/PreviewWidget.h +++ b/Userland/Applications/ThemeEditor/PreviewWidget.h @@ -24,15 +24,16 @@ class MiniWidgetGallery; class PreviewWidget final : public GUI::AbstractThemePreview , public GUI::ColorFilterer { - C_OBJECT(PreviewWidget); + C_OBJECT_ABSTRACT(PreviewWidget); public: + static ErrorOr> try_create(); virtual ~PreviewWidget() override = default; virtual void set_color_filter(OwnPtr) override; private: - explicit PreviewWidget(Gfx::Palette const& = GUI::Application::the()->palette()); + PreviewWidget(); virtual void paint_preview(GUI::PaintEvent&) override; virtual void second_paint_event(GUI::PaintEvent&) override;