From be717edd339c6d8c1c94e2ff1b203e443e5c36b3 Mon Sep 17 00:00:00 2001 From: Karol Kosek Date: Sun, 12 Feb 2023 00:04:02 +0100 Subject: [PATCH] PixelPaint: Propagate errors from making tool property widgets --- .../PixelPaint/ToolPropertiesWidget.cpp | 13 +- .../PixelPaint/ToolPropertiesWidget.h | 1 + .../PixelPaint/Tools/BrushTool.cpp | 55 ++++----- .../Applications/PixelPaint/Tools/BrushTool.h | 2 +- .../PixelPaint/Tools/BucketTool.cpp | 29 ++--- .../PixelPaint/Tools/BucketTool.h | 2 +- .../PixelPaint/Tools/CloneTool.cpp | 51 ++++---- .../Applications/PixelPaint/Tools/CloneTool.h | 2 +- .../PixelPaint/Tools/EllipseTool.cpp | 85 ++++++------- .../PixelPaint/Tools/EllipseTool.h | 2 +- .../PixelPaint/Tools/EraseTool.cpp | 101 ++++++++-------- .../Applications/PixelPaint/Tools/EraseTool.h | 2 +- .../PixelPaint/Tools/GradientTool.cpp | 45 +++---- .../PixelPaint/Tools/GradientTool.h | 2 +- .../PixelPaint/Tools/GuideTool.cpp | 31 ++--- .../Applications/PixelPaint/Tools/GuideTool.h | 2 +- .../PixelPaint/Tools/LassoSelectTool.cpp | 31 ++--- .../PixelPaint/Tools/LassoSelectTool.h | 2 +- .../PixelPaint/Tools/LineTool.cpp | 47 ++++---- .../Applications/PixelPaint/Tools/LineTool.h | 2 +- .../PixelPaint/Tools/MoveTool.cpp | 31 ++--- .../Applications/PixelPaint/Tools/MoveTool.h | 2 +- .../Applications/PixelPaint/Tools/PenTool.cpp | 29 ++--- .../Applications/PixelPaint/Tools/PenTool.h | 2 +- .../PixelPaint/Tools/PickerTool.cpp | 13 +- .../PixelPaint/Tools/PickerTool.h | 2 +- .../PixelPaint/Tools/PolygonalSelectTool.cpp | 31 ++--- .../PixelPaint/Tools/PolygonalSelectTool.h | 2 +- .../PixelPaint/Tools/RectangleSelectTool.cpp | 63 +++++----- .../PixelPaint/Tools/RectangleSelectTool.h | 2 +- .../PixelPaint/Tools/RectangleTool.cpp | 112 +++++++++--------- .../PixelPaint/Tools/RectangleTool.h | 2 +- .../PixelPaint/Tools/SprayTool.cpp | 51 ++++---- .../Applications/PixelPaint/Tools/SprayTool.h | 2 +- .../PixelPaint/Tools/TextTool.cpp | 18 +-- .../Applications/PixelPaint/Tools/TextTool.h | 2 +- Userland/Applications/PixelPaint/Tools/Tool.h | 2 +- .../PixelPaint/Tools/WandSelectTool.cpp | 61 +++++----- .../PixelPaint/Tools/WandSelectTool.h | 2 +- .../PixelPaint/Tools/ZoomTool.cpp | 29 ++--- .../Applications/PixelPaint/Tools/ZoomTool.h | 2 +- 41 files changed, 499 insertions(+), 468 deletions(-) diff --git a/Userland/Applications/PixelPaint/ToolPropertiesWidget.cpp b/Userland/Applications/PixelPaint/ToolPropertiesWidget.cpp index e69a3f4bb8..cd0642165e 100644 --- a/Userland/Applications/PixelPaint/ToolPropertiesWidget.cpp +++ b/Userland/Applications/PixelPaint/ToolPropertiesWidget.cpp @@ -9,6 +9,7 @@ #include "Tools/Tool.h" #include #include +#include REGISTER_WIDGET(PixelPaint, ToolPropertiesWidget); @@ -23,6 +24,8 @@ ToolPropertiesWidget::ToolPropertiesWidget() layout.set_margins({ 8 }); m_tool_widget_stack = m_group_box->add(); m_blank_widget = m_tool_widget_stack->add(); + m_error_label = m_tool_widget_stack->add(); + m_error_label->set_enabled(false); } void ToolPropertiesWidget::set_active_tool(Tool* tool) @@ -31,8 +34,14 @@ void ToolPropertiesWidget::set_active_tool(Tool* tool) return; m_active_tool = tool; - m_active_tool_widget = tool->get_properties_widget(); - + auto active_tool_widget_or_error = tool->get_properties_widget(); + if (active_tool_widget_or_error.is_error()) { + m_active_tool_widget = nullptr; + m_error_label->set_text(DeprecatedString::formatted("Error creating tool properties: {}", active_tool_widget_or_error.release_error())); + m_tool_widget_stack->set_active_widget(m_error_label); + return; + } + m_active_tool_widget = active_tool_widget_or_error.release_value(); if (m_active_tool_widget == nullptr) { m_tool_widget_stack->set_active_widget(m_blank_widget); return; diff --git a/Userland/Applications/PixelPaint/ToolPropertiesWidget.h b/Userland/Applications/PixelPaint/ToolPropertiesWidget.h index 8a3506eb31..0ec49b774c 100644 --- a/Userland/Applications/PixelPaint/ToolPropertiesWidget.h +++ b/Userland/Applications/PixelPaint/ToolPropertiesWidget.h @@ -32,6 +32,7 @@ private: Tool* m_active_tool { nullptr }; RefPtr m_tool_widget_stack; RefPtr m_blank_widget; + RefPtr m_error_label; GUI::Widget* m_active_tool_widget { nullptr }; }; diff --git a/Userland/Applications/PixelPaint/Tools/BrushTool.cpp b/Userland/Applications/PixelPaint/Tools/BrushTool.cpp index a4eff7ebd5..4520ecae66 100644 --- a/Userland/Applications/PixelPaint/Tools/BrushTool.cpp +++ b/Userland/Applications/PixelPaint/Tools/BrushTool.cpp @@ -137,48 +137,49 @@ void BrushTool::draw_line(Gfx::Bitmap& bitmap, Gfx::Color color, Gfx::IntPoint s } } -GUI::Widget* BrushTool::get_properties_widget() +ErrorOr BrushTool::get_properties_widget() { if (!m_properties_widget) { - m_properties_widget = GUI::Widget::construct(); - m_properties_widget->set_layout(); + auto properties_widget = TRY(GUI::Widget::try_create()); + (void)TRY(properties_widget->try_set_layout()); - auto& size_container = m_properties_widget->add(); - size_container.set_fixed_height(20); - size_container.set_layout(); + auto size_container = TRY(properties_widget->try_add()); + size_container->set_fixed_height(20); + (void)TRY(size_container->try_set_layout()); - auto& size_label = size_container.add("Size:"); - size_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); - size_label.set_fixed_size(80, 20); + auto size_label = TRY(size_container->try_add("Size:")); + size_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); + size_label->set_fixed_size(80, 20); - auto& size_slider = size_container.add(Orientation::Horizontal, String::from_utf8_short_string("px"sv)); - size_slider.set_range(1, 100); - size_slider.set_value(m_size); - size_slider.set_override_cursor(cursor()); + auto size_slider = TRY(size_container->try_add(Orientation::Horizontal, String::from_utf8_short_string("px"sv))); + size_slider->set_range(1, 100); + size_slider->set_value(m_size); + size_slider->set_override_cursor(cursor()); - size_slider.on_change = [&](int value) { + size_slider->on_change = [this, size_slider](int value) { set_size(value); // Update cursor to provide an instant preview for the selected size. - size_slider.set_override_cursor(cursor()); + size_slider->set_override_cursor(cursor()); }; - set_primary_slider(&size_slider); + set_primary_slider(size_slider); - auto& hardness_container = m_properties_widget->add(); - hardness_container.set_fixed_height(20); - hardness_container.set_layout(); + auto hardness_container = TRY(properties_widget->try_add()); + hardness_container->set_fixed_height(20); + (void)TRY(hardness_container->try_set_layout()); - auto& hardness_label = hardness_container.add("Hardness:"); - hardness_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); - hardness_label.set_fixed_size(80, 20); + auto hardness_label = TRY(hardness_container->try_add("Hardness:")); + hardness_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); + hardness_label->set_fixed_size(80, 20); - auto& hardness_slider = hardness_container.add(Orientation::Horizontal, String::from_utf8_short_string("%"sv)); - hardness_slider.set_range(1, 100); - hardness_slider.set_value(m_hardness); + auto hardness_slider = TRY(hardness_container->try_add(Orientation::Horizontal, String::from_utf8_short_string("%"sv))); + hardness_slider->set_range(1, 100); + hardness_slider->set_value(m_hardness); - hardness_slider.on_change = [&](int value) { + hardness_slider->on_change = [this](int value) { set_hardness(value); }; - set_secondary_slider(&hardness_slider); + set_secondary_slider(hardness_slider); + m_properties_widget = properties_widget; } return m_properties_widget.ptr(); diff --git a/Userland/Applications/PixelPaint/Tools/BrushTool.h b/Userland/Applications/PixelPaint/Tools/BrushTool.h index 5baab83850..646b6452b7 100644 --- a/Userland/Applications/PixelPaint/Tools/BrushTool.h +++ b/Userland/Applications/PixelPaint/Tools/BrushTool.h @@ -22,7 +22,7 @@ public: virtual void on_mousedown(Layer*, MouseEvent&) override; virtual void on_mousemove(Layer*, MouseEvent&) override; virtual void on_mouseup(Layer*, MouseEvent&) override; - virtual GUI::Widget* get_properties_widget() override; + virtual ErrorOr get_properties_widget() override; virtual Variant> cursor() override { if (m_editor && m_editor->scale() != m_scale_last_created_cursor) diff --git a/Userland/Applications/PixelPaint/Tools/BucketTool.cpp b/Userland/Applications/PixelPaint/Tools/BucketTool.cpp index 9ec1b85158..ee71fd15c2 100644 --- a/Userland/Applications/PixelPaint/Tools/BucketTool.cpp +++ b/Userland/Applications/PixelPaint/Tools/BucketTool.cpp @@ -61,28 +61,29 @@ void BucketTool::on_mousedown(Layer* layer, MouseEvent& event) m_editor->did_complete_action(tool_name()); } -GUI::Widget* BucketTool::get_properties_widget() +ErrorOr BucketTool::get_properties_widget() { if (!m_properties_widget) { - m_properties_widget = GUI::Widget::construct(); - m_properties_widget->set_layout(); + auto properties_widget = TRY(GUI::Widget::try_create()); + (void)TRY(properties_widget->try_set_layout()); - auto& threshold_container = m_properties_widget->add(); - threshold_container.set_fixed_height(20); - threshold_container.set_layout(); + auto threshold_container = TRY(properties_widget->try_add()); + threshold_container->set_fixed_height(20); + (void)TRY(threshold_container->try_set_layout()); - auto& threshold_label = threshold_container.add("Threshold:"); - threshold_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); - threshold_label.set_fixed_size(80, 20); + auto threshold_label = TRY(threshold_container->try_add("Threshold:")); + threshold_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); + threshold_label->set_fixed_size(80, 20); - auto& threshold_slider = threshold_container.add(Orientation::Horizontal, String::from_utf8_short_string("%"sv)); - threshold_slider.set_range(0, 100); - threshold_slider.set_value(m_threshold); + auto threshold_slider = TRY(threshold_container->try_add(Orientation::Horizontal, String::from_utf8_short_string("%"sv))); + threshold_slider->set_range(0, 100); + threshold_slider->set_value(m_threshold); - threshold_slider.on_change = [&](int value) { + threshold_slider->on_change = [this](int value) { m_threshold = value; }; - set_primary_slider(&threshold_slider); + set_primary_slider(threshold_slider); + m_properties_widget = properties_widget; } return m_properties_widget.ptr(); diff --git a/Userland/Applications/PixelPaint/Tools/BucketTool.h b/Userland/Applications/PixelPaint/Tools/BucketTool.h index 08fb9875ae..a5c5dcddb3 100644 --- a/Userland/Applications/PixelPaint/Tools/BucketTool.h +++ b/Userland/Applications/PixelPaint/Tools/BucketTool.h @@ -17,7 +17,7 @@ public: virtual ~BucketTool() override = default; virtual void on_mousedown(Layer*, MouseEvent&) override; - virtual GUI::Widget* get_properties_widget() override; + virtual ErrorOr get_properties_widget() override; virtual Variant> cursor() override { return m_cursor; } private: diff --git a/Userland/Applications/PixelPaint/Tools/CloneTool.cpp b/Userland/Applications/PixelPaint/Tools/CloneTool.cpp index 0fdf32690b..f2872140b8 100644 --- a/Userland/Applications/PixelPaint/Tools/CloneTool.cpp +++ b/Userland/Applications/PixelPaint/Tools/CloneTool.cpp @@ -133,44 +133,45 @@ void CloneTool::on_keyup(GUI::KeyEvent& event) } } -GUI::Widget* CloneTool::get_properties_widget() +ErrorOr CloneTool::get_properties_widget() { if (!m_properties_widget) { - m_properties_widget = GUI::Widget::construct(); - m_properties_widget->set_layout(); + auto properties_widget = TRY(GUI::Widget::try_create()); + (void)TRY(properties_widget->try_set_layout()); - auto& size_container = m_properties_widget->add(); - size_container.set_fixed_height(20); - size_container.set_layout(); + auto size_container = TRY(properties_widget->try_add()); + size_container->set_fixed_height(20); + (void)TRY(size_container->try_set_layout()); - auto& size_label = size_container.add("Size:"); - size_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); - size_label.set_fixed_size(80, 20); + auto size_label = TRY(size_container->try_add("Size:")); + size_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); + size_label->set_fixed_size(80, 20); - auto& size_slider = size_container.add(Orientation::Horizontal, String::from_utf8_short_string("px"sv)); - size_slider.set_range(1, 100); - size_slider.set_value(size()); + auto size_slider = TRY(size_container->try_add(Orientation::Horizontal, String::from_utf8_short_string("px"sv))); + size_slider->set_range(1, 100); + size_slider->set_value(size()); - size_slider.on_change = [&](int value) { + size_slider->on_change = [this](int value) { set_size(value); }; - set_primary_slider(&size_slider); + set_primary_slider(size_slider); - auto& hardness_container = m_properties_widget->add(); - hardness_container.set_fixed_height(20); - hardness_container.set_layout(); + auto hardness_container = TRY(properties_widget->try_add()); + hardness_container->set_fixed_height(20); + (void)TRY(hardness_container->try_set_layout()); - auto& hardness_label = hardness_container.add("Hardness:"); - hardness_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); - hardness_label.set_fixed_size(80, 20); + auto hardness_label = TRY(hardness_container->try_add("Hardness:")); + hardness_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); + hardness_label->set_fixed_size(80, 20); - auto& hardness_slider = hardness_container.add(Orientation::Horizontal, String::from_utf8_short_string("%"sv)); - hardness_slider.set_range(1, 100); - hardness_slider.on_change = [&](int value) { + auto hardness_slider = TRY(hardness_container->try_add(Orientation::Horizontal, String::from_utf8_short_string("%"sv))); + hardness_slider->set_range(1, 100); + hardness_slider->on_change = [&](int value) { set_hardness(value); }; - hardness_slider.set_value(100); - set_secondary_slider(&hardness_slider); + hardness_slider->set_value(100); + set_secondary_slider(hardness_slider); + m_properties_widget = properties_widget; } return m_properties_widget.ptr(); diff --git a/Userland/Applications/PixelPaint/Tools/CloneTool.h b/Userland/Applications/PixelPaint/Tools/CloneTool.h index f120101cee..7785444878 100644 --- a/Userland/Applications/PixelPaint/Tools/CloneTool.h +++ b/Userland/Applications/PixelPaint/Tools/CloneTool.h @@ -15,7 +15,7 @@ public: CloneTool() = default; virtual ~CloneTool() override = default; - virtual GUI::Widget* get_properties_widget() override; + virtual ErrorOr get_properties_widget() override; virtual Variant> cursor() override; virtual bool is_overriding_alt() override { return true; } diff --git a/Userland/Applications/PixelPaint/Tools/EllipseTool.cpp b/Userland/Applications/PixelPaint/Tools/EllipseTool.cpp index d349ae0705..d46888b0e5 100644 --- a/Userland/Applications/PixelPaint/Tools/EllipseTool.cpp +++ b/Userland/Applications/PixelPaint/Tools/EllipseTool.cpp @@ -126,68 +126,68 @@ bool EllipseTool::on_keydown(GUI::KeyEvent& event) return Tool::on_keydown(event); } -GUI::Widget* EllipseTool::get_properties_widget() +ErrorOr EllipseTool::get_properties_widget() { if (!m_properties_widget) { - m_properties_widget = GUI::Widget::construct(); - m_properties_widget->set_layout(); + auto properties_widget = TRY(GUI::Widget::try_create()); + (void)TRY(properties_widget->try_set_layout()); - auto& thickness_container = m_properties_widget->add(); - thickness_container.set_fixed_height(20); - thickness_container.set_layout(); + auto thickness_container = TRY(properties_widget->try_add()); + thickness_container->set_fixed_height(20); + (void)TRY(thickness_container->try_set_layout()); - auto& thickness_label = thickness_container.add("Thickness:"); - thickness_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); - thickness_label.set_fixed_size(80, 20); + auto thickness_label = TRY(thickness_container->try_add("Thickness:")); + thickness_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); + thickness_label->set_fixed_size(80, 20); - auto& thickness_slider = thickness_container.add(Orientation::Horizontal, String::from_utf8_short_string("px"sv)); - thickness_slider.set_range(1, 10); - thickness_slider.set_value(m_thickness); + auto thickness_slider = TRY(thickness_container->try_add(Orientation::Horizontal, String::from_utf8_short_string("px"sv))); + thickness_slider->set_range(1, 10); + thickness_slider->set_value(m_thickness); - thickness_slider.on_change = [&](int value) { + thickness_slider->on_change = [this](int value) { m_thickness = value; }; - set_primary_slider(&thickness_slider); + set_primary_slider(thickness_slider); - auto& mode_container = m_properties_widget->add(); - mode_container.set_fixed_height(70); - mode_container.set_layout(); - auto& mode_label = mode_container.add("Mode:"); - mode_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); + auto mode_container = TRY(properties_widget->try_add()); + mode_container->set_fixed_height(70); + (void)TRY(mode_container->try_set_layout()); + auto mode_label = TRY(mode_container->try_add("Mode:")); + mode_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); - auto& mode_radio_container = mode_container.add(); - mode_radio_container.set_layout(); - auto& outline_mode_radio = mode_radio_container.add(String::from_utf8_short_string("Outline"sv)); - auto& fill_mode_radio = mode_radio_container.add(String::from_utf8_short_string("Fill"sv)); - auto& aa_enable_checkbox = mode_radio_container.add(String::from_utf8("Anti-alias"sv).release_value_but_fixme_should_propagate_errors()); + auto mode_radio_container = TRY(mode_container->try_add()); + (void)TRY(mode_radio_container->try_set_layout()); + auto outline_mode_radio = TRY(mode_radio_container->try_add(String::from_utf8_short_string("Outline"sv))); + auto fill_mode_radio = TRY(mode_radio_container->try_add(String::from_utf8_short_string("Fill"sv))); + auto aa_enable_checkbox = TRY(mode_radio_container->try_add(TRY(String::from_utf8("Anti-alias"sv)))); - aa_enable_checkbox.on_checked = [&](bool checked) { + aa_enable_checkbox->on_checked = [this](bool checked) { m_antialias_enabled = checked; }; - outline_mode_radio.on_checked = [&](bool checked) { + outline_mode_radio->on_checked = [this](bool checked) { if (checked) m_fill_mode = FillMode::Outline; }; - fill_mode_radio.on_checked = [&](bool checked) { + fill_mode_radio->on_checked = [this](bool checked) { if (checked) m_fill_mode = FillMode::Fill; }; - aa_enable_checkbox.set_checked(true); - outline_mode_radio.set_checked(true); + aa_enable_checkbox->set_checked(true); + outline_mode_radio->set_checked(true); - auto& aspect_container = m_properties_widget->add(); - aspect_container.set_fixed_height(20); - aspect_container.set_layout(); + auto aspect_container = TRY(properties_widget->try_add()); + aspect_container->set_fixed_height(20); + (void)TRY(aspect_container->try_set_layout()); - auto& aspect_label = aspect_container.add("Aspect Ratio:"); - aspect_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); - aspect_label.set_fixed_size(80, 20); + auto aspect_label = TRY(aspect_container->try_add("Aspect Ratio:")); + aspect_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); + aspect_label->set_fixed_size(80, 20); - m_aspect_w_textbox = aspect_container.add(); + m_aspect_w_textbox = TRY(aspect_container->try_add()); m_aspect_w_textbox->set_fixed_height(20); m_aspect_w_textbox->set_fixed_width(25); - m_aspect_w_textbox->on_change = [&] { + m_aspect_w_textbox->on_change = [this] { auto x = m_aspect_w_textbox->text().to_int().value_or(0); auto y = m_aspect_h_textbox->text().to_int().value_or(0); if (x > 0 && y > 0) { @@ -197,14 +197,15 @@ GUI::Widget* EllipseTool::get_properties_widget() } }; - auto& multiply_label = aspect_container.add("x"); - multiply_label.set_text_alignment(Gfx::TextAlignment::Center); - multiply_label.set_fixed_size(10, 20); + auto multiply_label = TRY(aspect_container->try_add("x")); + multiply_label->set_text_alignment(Gfx::TextAlignment::Center); + multiply_label->set_fixed_size(10, 20); - m_aspect_h_textbox = aspect_container.add(); + m_aspect_h_textbox = TRY(aspect_container->try_add()); m_aspect_h_textbox->set_fixed_height(20); m_aspect_h_textbox->set_fixed_width(25); - m_aspect_h_textbox->on_change = [&] { m_aspect_w_textbox->on_change(); }; + m_aspect_h_textbox->on_change = [this] { m_aspect_w_textbox->on_change(); }; + m_properties_widget = properties_widget; } return m_properties_widget.ptr(); diff --git a/Userland/Applications/PixelPaint/Tools/EllipseTool.h b/Userland/Applications/PixelPaint/Tools/EllipseTool.h index 40a7569ec8..cc3c6ccb26 100644 --- a/Userland/Applications/PixelPaint/Tools/EllipseTool.h +++ b/Userland/Applications/PixelPaint/Tools/EllipseTool.h @@ -25,7 +25,7 @@ public: virtual void on_mouseup(Layer*, MouseEvent&) override; virtual void on_second_paint(Layer const*, GUI::PaintEvent&) override; virtual bool on_keydown(GUI::KeyEvent&) override; - virtual GUI::Widget* get_properties_widget() override; + virtual ErrorOr get_properties_widget() override; virtual Variant> cursor() override { return Gfx::StandardCursor::Crosshair; } private: diff --git a/Userland/Applications/PixelPaint/Tools/EraseTool.cpp b/Userland/Applications/PixelPaint/Tools/EraseTool.cpp index 8d22fa4836..e28ffc905f 100644 --- a/Userland/Applications/PixelPaint/Tools/EraseTool.cpp +++ b/Userland/Applications/PixelPaint/Tools/EraseTool.cpp @@ -53,84 +53,85 @@ void EraseTool::draw_point(Gfx::Bitmap& bitmap, Gfx::Color color, Gfx::IntPoint } } -GUI::Widget* EraseTool::get_properties_widget() +ErrorOr EraseTool::get_properties_widget() { if (!m_properties_widget) { - m_properties_widget = GUI::Widget::construct(); - m_properties_widget->set_layout(); + auto properties_widget = TRY(GUI::Widget::try_create()); + (void)TRY(properties_widget->try_set_layout()); - auto& size_container = m_properties_widget->add(); - size_container.set_fixed_height(20); - size_container.set_layout(); + auto size_container = TRY(properties_widget->try_add()); + size_container->set_fixed_height(20); + (void)TRY(size_container->try_set_layout()); - auto& size_label = size_container.add("Size:"); - size_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); - size_label.set_fixed_size(80, 20); + auto size_label = TRY(size_container->try_add("Size:")); + size_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); + size_label->set_fixed_size(80, 20); - auto& size_slider = size_container.add(Orientation::Horizontal, String::from_utf8_short_string("px"sv)); - size_slider.set_range(1, 100); - size_slider.set_value(size()); + auto size_slider = TRY(size_container->try_add(Orientation::Horizontal, String::from_utf8_short_string("px"sv))); + size_slider->set_range(1, 100); + size_slider->set_value(size()); - size_slider.on_change = [&](int value) { + size_slider->on_change = [this, size_slider](int value) { set_size(value); - size_slider.set_override_cursor(cursor()); + size_slider->set_override_cursor(cursor()); }; - set_primary_slider(&size_slider); + set_primary_slider(size_slider); - auto& hardness_container = m_properties_widget->add(); - hardness_container.set_fixed_height(20); - hardness_container.set_layout(); + auto hardness_container = TRY(properties_widget->try_add()); + hardness_container->set_fixed_height(20); + (void)TRY(hardness_container->try_set_layout()); - auto& hardness_label = hardness_container.add("Hardness:"); - hardness_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); - hardness_label.set_fixed_size(80, 20); + auto hardness_label = TRY(hardness_container->try_add("Hardness:")); + hardness_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); + hardness_label->set_fixed_size(80, 20); - auto& hardness_slider = hardness_container.add(Orientation::Horizontal, String::from_utf8_short_string("%"sv)); - hardness_slider.set_range(1, 100); - hardness_slider.set_value(hardness()); + auto hardness_slider = TRY(hardness_container->try_add(Orientation::Horizontal, String::from_utf8_short_string("%"sv))); + hardness_slider->set_range(1, 100); + hardness_slider->set_value(hardness()); - hardness_slider.on_change = [&](int value) { + hardness_slider->on_change = [this](int value) { set_hardness(value); }; - set_secondary_slider(&hardness_slider); + set_secondary_slider(hardness_slider); - auto& secondary_color_container = m_properties_widget->add(); - secondary_color_container.set_fixed_height(20); - secondary_color_container.set_layout(); + auto secondary_color_container = TRY(properties_widget->try_add()); + secondary_color_container->set_fixed_height(20); + (void)TRY(secondary_color_container->try_set_layout()); - auto& use_secondary_color_checkbox = secondary_color_container.add(); - use_secondary_color_checkbox.set_checked(m_use_secondary_color); - use_secondary_color_checkbox.set_text(String::from_utf8("Use secondary color"sv).release_value_but_fixme_should_propagate_errors()); - use_secondary_color_checkbox.on_checked = [&](bool checked) { + auto use_secondary_color_checkbox = TRY(secondary_color_container->try_add()); + use_secondary_color_checkbox->set_checked(m_use_secondary_color); + use_secondary_color_checkbox->set_text(TRY(String::from_utf8("Use secondary color"sv))); + use_secondary_color_checkbox->on_checked = [this](bool checked) { m_use_secondary_color = checked; }; - auto& mode_container = m_properties_widget->add(); - mode_container.set_fixed_height(46); - mode_container.set_layout(); - auto& mode_label = mode_container.add("Draw Mode:"); - mode_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); - mode_label.set_fixed_size(80, 20); + auto mode_container = TRY(properties_widget->try_add()); + mode_container->set_fixed_height(46); + (void)TRY(mode_container->try_set_layout()); + auto mode_label = TRY(mode_container->try_add("Draw Mode:")); + mode_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); + mode_label->set_fixed_size(80, 20); - auto& mode_radio_container = mode_container.add(); - mode_radio_container.set_layout(); - auto& pencil_mode_radio = mode_radio_container.add(String::from_utf8_short_string("Pencil"sv)); - auto& brush_mode_radio = mode_radio_container.add(String::from_utf8_short_string("Brush"sv)); + auto mode_radio_container = TRY(mode_container->try_add()); + (void)TRY(mode_radio_container->try_set_layout()); + auto pencil_mode_radio = TRY(mode_radio_container->try_add(String::from_utf8_short_string("Pencil"sv))); + auto brush_mode_radio = TRY(mode_radio_container->try_add(String::from_utf8_short_string("Brush"sv))); - pencil_mode_radio.on_checked = [&](bool) { + pencil_mode_radio->on_checked = [this, hardness_slider, size_slider](bool) { m_draw_mode = DrawMode::Pencil; - hardness_slider.set_enabled(false); + hardness_slider->set_enabled(false); refresh_editor_cursor(); - size_slider.set_override_cursor(cursor()); + size_slider->set_override_cursor(cursor()); }; - brush_mode_radio.on_checked = [&](bool) { + brush_mode_radio->on_checked = [this, hardness_slider, size_slider](bool) { m_draw_mode = DrawMode::Brush; - hardness_slider.set_enabled(true); + hardness_slider->set_enabled(true); refresh_editor_cursor(); - size_slider.set_override_cursor(cursor()); + size_slider->set_override_cursor(cursor()); }; - pencil_mode_radio.set_checked(true); + pencil_mode_radio->set_checked(true); + m_properties_widget = properties_widget; } return m_properties_widget.ptr(); diff --git a/Userland/Applications/PixelPaint/Tools/EraseTool.h b/Userland/Applications/PixelPaint/Tools/EraseTool.h index 3d1889e0bc..a85196c080 100644 --- a/Userland/Applications/PixelPaint/Tools/EraseTool.h +++ b/Userland/Applications/PixelPaint/Tools/EraseTool.h @@ -20,7 +20,7 @@ public: EraseTool() = default; virtual ~EraseTool() override = default; - virtual GUI::Widget* get_properties_widget() override; + virtual ErrorOr get_properties_widget() override; protected: virtual Color color_for(GUI::MouseEvent const& event) override; diff --git a/Userland/Applications/PixelPaint/Tools/GradientTool.cpp b/Userland/Applications/PixelPaint/Tools/GradientTool.cpp index 8ee6594bd2..10d1867c58 100644 --- a/Userland/Applications/PixelPaint/Tools/GradientTool.cpp +++ b/Userland/Applications/PixelPaint/Tools/GradientTool.cpp @@ -181,46 +181,47 @@ void GradientTool::on_tool_activation() reset(); } -GUI::Widget* GradientTool::get_properties_widget() +ErrorOr GradientTool::get_properties_widget() { if (!m_properties_widget) { - m_properties_widget = GUI::Widget::construct(); - m_properties_widget->set_layout(); + auto properties_widget = TRY(GUI::Widget::try_create()); + (void)TRY(properties_widget->try_set_layout()); - auto& size_container = m_properties_widget->add(); - size_container.set_fixed_height(20); - size_container.set_layout(); + auto size_container = TRY(properties_widget->try_add()); + size_container->set_fixed_height(20); + (void)TRY(size_container->try_set_layout()); - auto& size_label = size_container.add("Opacity:"); - size_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); - size_label.set_fixed_size(80, 20); + auto size_label = TRY(size_container->try_add("Opacity:")); + size_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); + size_label->set_fixed_size(80, 20); - auto& opacity_slider = size_container.add(); - opacity_slider.set_range(1, 100); - opacity_slider.set_value(100); + auto opacity_slider = TRY(size_container->try_add()); + opacity_slider->set_range(1, 100); + opacity_slider->set_value(100); - opacity_slider.on_change = [&](int value) { + opacity_slider->on_change = [this](int value) { m_opacity = value; m_editor->update(); }; - set_primary_slider(&opacity_slider); + set_primary_slider(opacity_slider); - auto& use_secondary_color_checkbox = m_properties_widget->add(String::from_utf8("Use secondary color"sv).release_value_but_fixme_should_propagate_errors()); - use_secondary_color_checkbox.on_checked = [this](bool checked) { + auto use_secondary_color_checkbox = TRY(properties_widget->try_add(TRY(String::from_utf8("Use secondary color"sv)))); + use_secondary_color_checkbox->on_checked = [this](bool checked) { m_use_secondary_color = checked; m_editor->update(); }; - auto& button_container = m_properties_widget->add(); - button_container.set_fixed_height(22); - auto& button_container_layout = button_container.set_layout(); - button_container_layout.add_spacer(); + auto button_container = TRY(properties_widget->try_add()); + button_container->set_fixed_height(22); + auto button_container_layout = TRY(button_container->try_set_layout()); + button_container_layout->add_spacer(); - auto& apply_button = button_container.add(String::from_utf8_short_string("Apply"sv)); - apply_button.on_click = [this](auto) { + auto apply_button = TRY(button_container->try_add(String::from_utf8_short_string("Apply"sv))); + apply_button->on_click = [this](auto) { rasterize_gradient(); }; + m_properties_widget = properties_widget; } return m_properties_widget.ptr(); diff --git a/Userland/Applications/PixelPaint/Tools/GradientTool.h b/Userland/Applications/PixelPaint/Tools/GradientTool.h index f9b2e4e9be..eb48b479bc 100644 --- a/Userland/Applications/PixelPaint/Tools/GradientTool.h +++ b/Userland/Applications/PixelPaint/Tools/GradientTool.h @@ -23,7 +23,7 @@ public: virtual void on_primary_color_change(Color) override; virtual void on_secondary_color_change(Color) override; virtual void on_tool_activation() override; - virtual GUI::Widget* get_properties_widget() override; + virtual ErrorOr get_properties_widget() override; virtual Variant> cursor() override; virtual void on_second_paint(Layer const*, GUI::PaintEvent&) override; diff --git a/Userland/Applications/PixelPaint/Tools/GuideTool.cpp b/Userland/Applications/PixelPaint/Tools/GuideTool.cpp index c4dd237907..67d3c15e23 100644 --- a/Userland/Applications/PixelPaint/Tools/GuideTool.cpp +++ b/Userland/Applications/PixelPaint/Tools/GuideTool.cpp @@ -176,29 +176,30 @@ void GuideTool::on_tool_activation() m_editor->set_guide_visibility(true); } -GUI::Widget* GuideTool::get_properties_widget() +ErrorOr GuideTool::get_properties_widget() { if (!m_properties_widget) { - m_properties_widget = GUI::Widget::construct(); - m_properties_widget->set_layout(); + auto properties_widget = TRY(GUI::Widget::try_create()); + (void)TRY(properties_widget->try_set_layout()); - auto& snapping_container = m_properties_widget->add(); - snapping_container.set_fixed_height(20); - snapping_container.set_layout(); + auto snapping_container = TRY(properties_widget->try_add()); + snapping_container->set_fixed_height(20); + (void)TRY(snapping_container->try_set_layout()); - auto& snapping_label = snapping_container.add("Snap offset:"); - snapping_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); - snapping_label.set_fixed_size(80, 20); - snapping_label.set_tooltip("Press Shift to snap"); + auto snapping_label = TRY(snapping_container->try_add("Snap offset:")); + snapping_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); + snapping_label->set_fixed_size(80, 20); + snapping_label->set_tooltip("Press Shift to snap"); - auto& snapping_slider = snapping_container.add(Orientation::Horizontal, String::from_utf8_short_string("px"sv)); - snapping_slider.set_range(0, 50); - snapping_slider.set_value(m_snap_size); + auto snapping_slider = TRY(snapping_container->try_add(Orientation::Horizontal, String::from_utf8_short_string("px"sv))); + snapping_slider->set_range(0, 50); + snapping_slider->set_value(m_snap_size); - snapping_slider.on_change = [&](int value) { + snapping_slider->on_change = [this](int value) { m_snap_size = value; }; - set_primary_slider(&snapping_slider); + set_primary_slider(snapping_slider); + m_properties_widget = properties_widget; } return m_properties_widget.ptr(); diff --git a/Userland/Applications/PixelPaint/Tools/GuideTool.h b/Userland/Applications/PixelPaint/Tools/GuideTool.h index 2de370c2dd..40ea2e194a 100644 --- a/Userland/Applications/PixelPaint/Tools/GuideTool.h +++ b/Userland/Applications/PixelPaint/Tools/GuideTool.h @@ -27,7 +27,7 @@ public: virtual void on_tool_activation() override; - virtual GUI::Widget* get_properties_widget() override; + virtual ErrorOr get_properties_widget() override; virtual Variant> cursor() override { return Gfx::StandardCursor::Crosshair; } private: diff --git a/Userland/Applications/PixelPaint/Tools/LassoSelectTool.cpp b/Userland/Applications/PixelPaint/Tools/LassoSelectTool.cpp index a30efbfcb1..b4e6243a6c 100644 --- a/Userland/Applications/PixelPaint/Tools/LassoSelectTool.cpp +++ b/Userland/Applications/PixelPaint/Tools/LassoSelectTool.cpp @@ -171,23 +171,23 @@ bool LassoSelectTool::on_keydown(GUI::KeyEvent& key_event) return Tool::on_keydown(key_event); } -GUI::Widget* LassoSelectTool::get_properties_widget() +ErrorOr LassoSelectTool::get_properties_widget() { if (m_properties_widget) { return m_properties_widget.ptr(); } - m_properties_widget = GUI::Widget::construct(); - m_properties_widget->set_layout(); + auto properties_widget = TRY(GUI::Widget::try_create()); + (void)TRY(properties_widget->try_set_layout()); - auto& mode_container = m_properties_widget->add(); - mode_container.set_fixed_height(20); - mode_container.set_layout(); + auto mode_container = TRY(properties_widget->try_add()); + mode_container->set_fixed_height(20); + (void)TRY(mode_container->try_set_layout()); - auto& mode_label = mode_container.add(); - mode_label.set_text("Mode:"); - mode_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); - mode_label.set_fixed_size(80, 20); + auto mode_label = TRY(mode_container->try_add()); + mode_label->set_text("Mode:"); + mode_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); + mode_label->set_fixed_size(80, 20); static constexpr auto s_merge_mode_names = [] { Array names; @@ -212,17 +212,18 @@ GUI::Widget* LassoSelectTool::get_properties_widget() return names; }(); - auto& mode_combo = mode_container.add(); - mode_combo.set_only_allow_values_from_model(true); - mode_combo.set_model(*GUI::ItemListModel::create(s_merge_mode_names)); - mode_combo.set_selected_index((int)m_merge_mode); - mode_combo.on_change = [this](auto&&, GUI::ModelIndex const& index) { + auto mode_combo = TRY(mode_container->try_add()); + mode_combo->set_only_allow_values_from_model(true); + mode_combo->set_model(*GUI::ItemListModel::create(s_merge_mode_names)); + mode_combo->set_selected_index((int)m_merge_mode); + mode_combo->on_change = [this](auto&&, GUI::ModelIndex const& index) { VERIFY(index.row() >= 0); VERIFY(index.row() < (int)Selection::MergeMode::__Count); m_merge_mode = (Selection::MergeMode)index.row(); }; + m_properties_widget = properties_widget; return m_properties_widget.ptr(); } diff --git a/Userland/Applications/PixelPaint/Tools/LassoSelectTool.h b/Userland/Applications/PixelPaint/Tools/LassoSelectTool.h index a72723da24..689bb2ae80 100644 --- a/Userland/Applications/PixelPaint/Tools/LassoSelectTool.h +++ b/Userland/Applications/PixelPaint/Tools/LassoSelectTool.h @@ -25,7 +25,7 @@ public: virtual void on_mousemove(Layer*, MouseEvent& event) override; virtual bool on_keydown(GUI::KeyEvent&) override; virtual void on_second_paint(Layer const*, GUI::PaintEvent&) override; - virtual GUI::Widget* get_properties_widget() override; + virtual ErrorOr get_properties_widget() override; private: virtual StringView tool_name() const override { return "Lasso Select Tool"sv; } diff --git a/Userland/Applications/PixelPaint/Tools/LineTool.cpp b/Userland/Applications/PixelPaint/Tools/LineTool.cpp index da7fd8db3c..7aa170cc97 100644 --- a/Userland/Applications/PixelPaint/Tools/LineTool.cpp +++ b/Userland/Applications/PixelPaint/Tools/LineTool.cpp @@ -119,42 +119,43 @@ bool LineTool::on_keydown(GUI::KeyEvent& event) return Tool::on_keydown(event); } -GUI::Widget* LineTool::get_properties_widget() +ErrorOr LineTool::get_properties_widget() { if (!m_properties_widget) { - m_properties_widget = GUI::Widget::construct(); - m_properties_widget->set_layout(); + auto properties_widget = TRY(GUI::Widget::try_create()); + (void)TRY(properties_widget->try_set_layout()); - auto& thickness_container = m_properties_widget->add(); - thickness_container.set_fixed_height(20); - thickness_container.set_layout(); + auto thickness_container = TRY(properties_widget->try_add()); + thickness_container->set_fixed_height(20); + (void)TRY(thickness_container->try_set_layout()); - auto& thickness_label = thickness_container.add("Thickness:"); - thickness_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); - thickness_label.set_fixed_size(80, 20); + auto thickness_label = TRY(thickness_container->try_add("Thickness:")); + thickness_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); + thickness_label->set_fixed_size(80, 20); - auto& thickness_slider = thickness_container.add(Orientation::Horizontal, String::from_utf8_short_string("px"sv)); - thickness_slider.set_range(1, 10); - thickness_slider.set_value(m_thickness); + auto thickness_slider = TRY(thickness_container->try_add(Orientation::Horizontal, String::from_utf8_short_string("px"sv))); + thickness_slider->set_range(1, 10); + thickness_slider->set_value(m_thickness); - thickness_slider.on_change = [&](int value) { + thickness_slider->on_change = [this](int value) { m_thickness = value; }; - set_primary_slider(&thickness_slider); + set_primary_slider(thickness_slider); - auto& mode_container = m_properties_widget->add(); - mode_container.set_fixed_height(20); - mode_container.set_layout(); + auto mode_container = TRY(properties_widget->try_add()); + mode_container->set_fixed_height(20); + (void)TRY(mode_container->try_set_layout()); - auto& mode_label = mode_container.add("Mode:"); - mode_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); - mode_label.set_fixed_size(80, 20); + auto mode_label = TRY(mode_container->try_add("Mode:")); + mode_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); + mode_label->set_fixed_size(80, 20); - auto& aa_enable_checkbox = mode_container.add(String::from_utf8("Anti-alias"sv).release_value_but_fixme_should_propagate_errors()); - aa_enable_checkbox.on_checked = [&](bool checked) { + auto aa_enable_checkbox = TRY(mode_container->try_add(TRY(String::from_utf8("Anti-alias"sv)))); + aa_enable_checkbox->on_checked = [this](bool checked) { m_antialias_enabled = checked; }; - aa_enable_checkbox.set_checked(true); + aa_enable_checkbox->set_checked(true); + m_properties_widget = properties_widget; } return m_properties_widget.ptr(); diff --git a/Userland/Applications/PixelPaint/Tools/LineTool.h b/Userland/Applications/PixelPaint/Tools/LineTool.h index 55d44578ac..0f63006501 100644 --- a/Userland/Applications/PixelPaint/Tools/LineTool.h +++ b/Userland/Applications/PixelPaint/Tools/LineTool.h @@ -23,7 +23,7 @@ public: virtual void on_mouseup(Layer*, MouseEvent&) override; virtual void on_second_paint(Layer const*, GUI::PaintEvent&) override; virtual bool on_keydown(GUI::KeyEvent&) override; - virtual GUI::Widget* get_properties_widget() override; + virtual ErrorOr get_properties_widget() override; virtual Variant> cursor() override { return Gfx::StandardCursor::Crosshair; } void draw_using(GUI::Painter&, Gfx::IntPoint start_position, Gfx::IntPoint end_position, Color color, int thickness); diff --git a/Userland/Applications/PixelPaint/Tools/MoveTool.cpp b/Userland/Applications/PixelPaint/Tools/MoveTool.cpp index 0816e3939d..835e4727e4 100644 --- a/Userland/Applications/PixelPaint/Tools/MoveTool.cpp +++ b/Userland/Applications/PixelPaint/Tools/MoveTool.cpp @@ -289,33 +289,34 @@ Variant> MoveTool::cursor() return Gfx::StandardCursor::Move; } -GUI::Widget* MoveTool::get_properties_widget() +ErrorOr MoveTool::get_properties_widget() { if (!m_properties_widget) { - m_properties_widget = GUI::Widget::construct(); - m_properties_widget->set_layout(); + auto properties_widget = TRY(GUI::Widget::try_create()); + (void)TRY(properties_widget->try_set_layout()); - auto& selection_mode_container = m_properties_widget->add(); - selection_mode_container.set_layout(); - selection_mode_container.set_fixed_height(46); - auto& selection_mode_label = selection_mode_container.add("Selection Mode:"); - selection_mode_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); - selection_mode_label.set_fixed_size(80, 40); + auto selection_mode_container = TRY(properties_widget->try_add()); + (void)TRY(selection_mode_container->try_set_layout()); + selection_mode_container->set_fixed_height(46); + auto selection_mode_label = TRY(selection_mode_container->try_add("Selection Mode:")); + selection_mode_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); + selection_mode_label->set_fixed_size(80, 40); - auto& mode_radio_container = selection_mode_container.add(); - mode_radio_container.set_layout(); - m_selection_mode_foreground = mode_radio_container.add(String::from_utf8("Foreground"sv).release_value_but_fixme_should_propagate_errors()); + auto mode_radio_container = TRY(selection_mode_container->try_add()); + (void)TRY(mode_radio_container->try_set_layout()); + m_selection_mode_foreground = TRY(mode_radio_container->try_add(TRY(String::from_utf8("Foreground"sv)))); - m_selection_mode_active = mode_radio_container.add(String::from_utf8("Active Layer"sv).release_value_but_fixme_should_propagate_errors()); + m_selection_mode_active = TRY(mode_radio_container->try_add(TRY(String::from_utf8("Active Layer"sv)))); - m_selection_mode_foreground->on_checked = [&](bool) { + m_selection_mode_foreground->on_checked = [this](bool) { m_layer_selection_mode = LayerSelectionMode::ForegroundLayer; }; - m_selection_mode_active->on_checked = [&](bool) { + m_selection_mode_active->on_checked = [this](bool) { m_layer_selection_mode = LayerSelectionMode::ActiveLayer; }; m_selection_mode_foreground->set_checked(true); + m_properties_widget = properties_widget; } return m_properties_widget.ptr(); diff --git a/Userland/Applications/PixelPaint/Tools/MoveTool.h b/Userland/Applications/PixelPaint/Tools/MoveTool.h index 4a02025022..a5224c714e 100644 --- a/Userland/Applications/PixelPaint/Tools/MoveTool.h +++ b/Userland/Applications/PixelPaint/Tools/MoveTool.h @@ -35,7 +35,7 @@ public: virtual bool on_keydown(GUI::KeyEvent&) override; virtual void on_keyup(GUI::KeyEvent&) override; virtual void on_second_paint(Layer const*, GUI::PaintEvent&) override; - virtual GUI::Widget* get_properties_widget() override; + virtual ErrorOr get_properties_widget() override; virtual Variant> cursor() override; virtual bool is_overriding_alt() override { return true; } LayerSelectionMode layer_selection_mode() const { return m_layer_selection_mode; } diff --git a/Userland/Applications/PixelPaint/Tools/PenTool.cpp b/Userland/Applications/PixelPaint/Tools/PenTool.cpp index 8342a20ea4..e6233c971b 100644 --- a/Userland/Applications/PixelPaint/Tools/PenTool.cpp +++ b/Userland/Applications/PixelPaint/Tools/PenTool.cpp @@ -35,28 +35,29 @@ void PenTool::draw_line(Gfx::Bitmap& bitmap, Gfx::Color color, Gfx::IntPoint sta painter.draw_line(start, end, color, size()); } -GUI::Widget* PenTool::get_properties_widget() +ErrorOr PenTool::get_properties_widget() { if (!m_properties_widget) { - m_properties_widget = GUI::Widget::construct(); - m_properties_widget->set_layout(); + auto properties_widget = TRY(GUI::Widget::try_create()); + (void)TRY(properties_widget->try_set_layout()); - auto& size_container = m_properties_widget->add(); - size_container.set_fixed_height(20); - size_container.set_layout(); + auto size_container = TRY(properties_widget->try_add()); + size_container->set_fixed_height(20); + (void)TRY(size_container->try_set_layout()); - auto& size_label = size_container.add("Thickness:"); - size_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); - size_label.set_fixed_size(80, 20); + auto size_label = TRY(size_container->try_add("Thickness:")); + size_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); + size_label->set_fixed_size(80, 20); - auto& size_slider = size_container.add(Orientation::Horizontal, String::from_utf8_short_string("px"sv)); - size_slider.set_range(1, 20); - size_slider.set_value(size()); + auto size_slider = TRY(size_container->try_add(Orientation::Horizontal, String::from_utf8_short_string("px"sv))); + size_slider->set_range(1, 20); + size_slider->set_value(size()); - size_slider.on_change = [&](int value) { + size_slider->on_change = [this](int value) { set_size(value); }; - set_primary_slider(&size_slider); + set_primary_slider(size_slider); + m_properties_widget = properties_widget; } return m_properties_widget.ptr(); diff --git a/Userland/Applications/PixelPaint/Tools/PenTool.h b/Userland/Applications/PixelPaint/Tools/PenTool.h index ae3234a9b4..4aa1a2986b 100644 --- a/Userland/Applications/PixelPaint/Tools/PenTool.h +++ b/Userland/Applications/PixelPaint/Tools/PenTool.h @@ -19,7 +19,7 @@ public: PenTool(); virtual ~PenTool() override = default; virtual Variant> cursor() override { return Gfx::StandardCursor::Crosshair; } - virtual GUI::Widget* get_properties_widget() override; + virtual ErrorOr get_properties_widget() override; protected: virtual void draw_point(Gfx::Bitmap& bitmap, Gfx::Color color, Gfx::IntPoint point) override; diff --git a/Userland/Applications/PixelPaint/Tools/PickerTool.cpp b/Userland/Applications/PixelPaint/Tools/PickerTool.cpp index e78bc6852e..5f95194300 100644 --- a/Userland/Applications/PixelPaint/Tools/PickerTool.cpp +++ b/Userland/Applications/PixelPaint/Tools/PickerTool.cpp @@ -40,17 +40,18 @@ void PickerTool::on_mousemove(Layer* layer, MouseEvent& event) m_editor->set_editor_color_to_color_at_mouse_position(layer_event, m_sample_all_layers); } -GUI::Widget* PickerTool::get_properties_widget() +ErrorOr PickerTool::get_properties_widget() { if (!m_properties_widget) { - m_properties_widget = GUI::Widget::construct(); - m_properties_widget->set_layout(); + auto properties_widget = TRY(GUI::Widget::try_create()); + (void)TRY(properties_widget->try_set_layout()); - auto& sample_checkbox = m_properties_widget->add(String::from_utf8("Sample all layers"sv).release_value_but_fixme_should_propagate_errors()); - sample_checkbox.set_checked(m_sample_all_layers); - sample_checkbox.on_checked = [&](bool value) { + auto sample_checkbox = TRY(properties_widget->try_add(TRY(String::from_utf8("Sample all layers"sv)))); + sample_checkbox->set_checked(m_sample_all_layers); + sample_checkbox->on_checked = [this](bool value) { m_sample_all_layers = value; }; + m_properties_widget = properties_widget; } return m_properties_widget.ptr(); diff --git a/Userland/Applications/PixelPaint/Tools/PickerTool.h b/Userland/Applications/PixelPaint/Tools/PickerTool.h index f45a8a404e..c6a87fb5af 100644 --- a/Userland/Applications/PixelPaint/Tools/PickerTool.h +++ b/Userland/Applications/PixelPaint/Tools/PickerTool.h @@ -21,7 +21,7 @@ public: virtual void on_mouseup(Layer*, MouseEvent&) override; virtual void on_mousemove(Layer*, MouseEvent&) override; - virtual GUI::Widget* get_properties_widget() override; + virtual ErrorOr get_properties_widget() override; virtual Variant> cursor() override { return Gfx::StandardCursor::Eyedropper; } private: diff --git a/Userland/Applications/PixelPaint/Tools/PolygonalSelectTool.cpp b/Userland/Applications/PixelPaint/Tools/PolygonalSelectTool.cpp index 998b74fadf..2f4a60aa4f 100644 --- a/Userland/Applications/PixelPaint/Tools/PolygonalSelectTool.cpp +++ b/Userland/Applications/PixelPaint/Tools/PolygonalSelectTool.cpp @@ -177,22 +177,22 @@ bool PolygonalSelectTool::on_keydown(GUI::KeyEvent& key_event) return Tool::on_keydown(key_event); } -GUI::Widget* PolygonalSelectTool::get_properties_widget() +ErrorOr PolygonalSelectTool::get_properties_widget() { if (m_properties_widget) return m_properties_widget.ptr(); - m_properties_widget = GUI::Widget::construct(); - m_properties_widget->set_layout(); + auto properties_widget = TRY(GUI::Widget::try_create()); + (void)TRY(properties_widget->try_set_layout()); - auto& mode_container = m_properties_widget->add(); - mode_container.set_fixed_height(20); - mode_container.set_layout(); + auto mode_container = TRY(properties_widget->try_add()); + mode_container->set_fixed_height(20); + (void)TRY(mode_container->try_set_layout()); - auto& mode_label = mode_container.add(); - mode_label.set_text("Mode:"); - mode_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); - mode_label.set_fixed_size(80, 20); + auto mode_label = TRY(mode_container->try_add()); + mode_label->set_text("Mode:"); + mode_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); + mode_label->set_fixed_size(80, 20); static constexpr auto s_merge_mode_names = [] { Array names; @@ -217,17 +217,18 @@ GUI::Widget* PolygonalSelectTool::get_properties_widget() return names; }(); - auto& mode_combo = mode_container.add(); - mode_combo.set_only_allow_values_from_model(true); - mode_combo.set_model(*GUI::ItemListModel::create(s_merge_mode_names)); - mode_combo.set_selected_index((int)m_merge_mode); - mode_combo.on_change = [this](auto&&, GUI::ModelIndex const& index) { + auto mode_combo = TRY(mode_container->try_add()); + mode_combo->set_only_allow_values_from_model(true); + mode_combo->set_model(*GUI::ItemListModel::create(s_merge_mode_names)); + mode_combo->set_selected_index((int)m_merge_mode); + mode_combo->on_change = [this](auto&&, GUI::ModelIndex const& index) { VERIFY(index.row() >= 0); VERIFY(index.row() < (int)Selection::MergeMode::__Count); m_merge_mode = (Selection::MergeMode)index.row(); }; + m_properties_widget = properties_widget; return m_properties_widget.ptr(); } diff --git a/Userland/Applications/PixelPaint/Tools/PolygonalSelectTool.h b/Userland/Applications/PixelPaint/Tools/PolygonalSelectTool.h index f7bc6bccb3..bcdca79c3f 100644 --- a/Userland/Applications/PixelPaint/Tools/PolygonalSelectTool.h +++ b/Userland/Applications/PixelPaint/Tools/PolygonalSelectTool.h @@ -22,7 +22,7 @@ public: virtual void on_mousemove(Layer*, MouseEvent& event) override; virtual bool on_keydown(GUI::KeyEvent&) override; virtual void on_second_paint(Layer const*, GUI::PaintEvent&) override; - virtual GUI::Widget* get_properties_widget() override; + virtual ErrorOr get_properties_widget() override; virtual Variant> cursor() override { return Gfx::StandardCursor::Crosshair; } virtual Gfx::IntPoint point_position_to_preferred_cell(Gfx::FloatPoint position) const override; diff --git a/Userland/Applications/PixelPaint/Tools/RectangleSelectTool.cpp b/Userland/Applications/PixelPaint/Tools/RectangleSelectTool.cpp index d1d5ec458f..0375b3b26c 100644 --- a/Userland/Applications/PixelPaint/Tools/RectangleSelectTool.cpp +++ b/Userland/Applications/PixelPaint/Tools/RectangleSelectTool.cpp @@ -147,73 +147,74 @@ void RectangleSelectTool::on_second_paint(Layer const*, GUI::PaintEvent& event) m_editor->draw_marching_ants(painter, rect_in_editor.to_rounded()); } -GUI::Widget* RectangleSelectTool::get_properties_widget() +ErrorOr RectangleSelectTool::get_properties_widget() { if (m_properties_widget) { return m_properties_widget.ptr(); } - m_properties_widget = GUI::Widget::construct(); - m_properties_widget->set_layout(); + auto properties_widget = TRY(GUI::Widget::try_create()); + (void)TRY(properties_widget->try_set_layout()); - auto& feather_container = m_properties_widget->add(); - feather_container.set_fixed_height(20); - feather_container.set_layout(); + auto feather_container = TRY(properties_widget->try_add()); + feather_container->set_fixed_height(20); + (void)TRY(feather_container->try_set_layout()); - auto& feather_label = feather_container.add(); - feather_label.set_text("Feather:"); - feather_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); - feather_label.set_fixed_size(80, 20); + auto feather_label = TRY(feather_container->try_add()); + feather_label->set_text("Feather:"); + feather_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); + feather_label->set_fixed_size(80, 20); int const feather_slider_max = 100; - auto& feather_slider = feather_container.add(Orientation::Horizontal, String::from_utf8_short_string("%"sv)); - feather_slider.set_range(0, feather_slider_max); - feather_slider.set_value((int)floorf(m_edge_feathering * (float)feather_slider_max)); + auto feather_slider = TRY(feather_container->try_add(Orientation::Horizontal, String::from_utf8_short_string("%"sv))); + feather_slider->set_range(0, feather_slider_max); + feather_slider->set_value((int)floorf(m_edge_feathering * (float)feather_slider_max)); - feather_slider.on_change = [&](int value) { + feather_slider->on_change = [this](int value) { m_edge_feathering = (float)value / (float)feather_slider_max; }; - set_primary_slider(&feather_slider); + set_primary_slider(feather_slider); - auto& mode_container = m_properties_widget->add(); - mode_container.set_fixed_height(20); - mode_container.set_layout(); + auto mode_container = TRY(properties_widget->try_add()); + mode_container->set_fixed_height(20); + (void)TRY(mode_container->try_set_layout()); - auto& mode_label = mode_container.add(); - mode_label.set_text("Mode:"); - mode_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); - mode_label.set_fixed_size(80, 20); + auto mode_label = TRY(mode_container->try_add()); + mode_label->set_text("Mode:"); + mode_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); + mode_label->set_fixed_size(80, 20); for (int i = 0; i < (int)Selection::MergeMode::__Count; i++) { switch ((Selection::MergeMode)i) { case Selection::MergeMode::Set: - m_merge_mode_names.append("Set"); + TRY(m_merge_mode_names.try_append("Set")); break; case Selection::MergeMode::Add: - m_merge_mode_names.append("Add"); + TRY(m_merge_mode_names.try_append("Add")); break; case Selection::MergeMode::Subtract: - m_merge_mode_names.append("Subtract"); + TRY(m_merge_mode_names.try_append("Subtract")); break; case Selection::MergeMode::Intersect: - m_merge_mode_names.append("Intersect"); + TRY(m_merge_mode_names.try_append("Intersect")); break; default: VERIFY_NOT_REACHED(); } } - auto& mode_combo = mode_container.add(); - mode_combo.set_only_allow_values_from_model(true); - mode_combo.set_model(*GUI::ItemListModel::create(m_merge_mode_names)); - mode_combo.set_selected_index((int)m_merge_mode); - mode_combo.on_change = [this](auto&&, GUI::ModelIndex const& index) { + auto mode_combo = TRY(mode_container->try_add()); + mode_combo->set_only_allow_values_from_model(true); + mode_combo->set_model(*GUI::ItemListModel::create(m_merge_mode_names)); + mode_combo->set_selected_index((int)m_merge_mode); + mode_combo->on_change = [this](auto&&, GUI::ModelIndex const& index) { VERIFY(index.row() >= 0); VERIFY(index.row() < (int)Selection::MergeMode::__Count); m_merge_mode = (Selection::MergeMode)index.row(); }; + m_properties_widget = properties_widget; return m_properties_widget.ptr(); } diff --git a/Userland/Applications/PixelPaint/Tools/RectangleSelectTool.h b/Userland/Applications/PixelPaint/Tools/RectangleSelectTool.h index 44fb5b18b3..4ef9b28d9d 100644 --- a/Userland/Applications/PixelPaint/Tools/RectangleSelectTool.h +++ b/Userland/Applications/PixelPaint/Tools/RectangleSelectTool.h @@ -26,7 +26,7 @@ public: virtual bool on_keydown(GUI::KeyEvent&) override; virtual void on_keyup(GUI::KeyEvent&) override; virtual void on_second_paint(Layer const*, GUI::PaintEvent&) override; - virtual GUI::Widget* get_properties_widget() override; + virtual ErrorOr get_properties_widget() override; virtual Variant> cursor() override { return Gfx::StandardCursor::Crosshair; } virtual Gfx::IntPoint point_position_to_preferred_cell(Gfx::FloatPoint position) const override; diff --git a/Userland/Applications/PixelPaint/Tools/RectangleTool.cpp b/Userland/Applications/PixelPaint/Tools/RectangleTool.cpp index 7c08ff7273..d41d26f0b8 100644 --- a/Userland/Applications/PixelPaint/Tools/RectangleTool.cpp +++ b/Userland/Applications/PixelPaint/Tools/RectangleTool.cpp @@ -140,34 +140,34 @@ bool RectangleTool::on_keydown(GUI::KeyEvent& event) return Tool::on_keydown(event); } -GUI::Widget* RectangleTool::get_properties_widget() +ErrorOr RectangleTool::get_properties_widget() { if (!m_properties_widget) { - m_properties_widget = GUI::Widget::construct(); - m_properties_widget->set_layout(); + auto properties_widget = TRY(GUI::Widget::try_create()); + (void)TRY(properties_widget->try_set_layout()); - auto& thickness_or_radius_container = m_properties_widget->add(); - thickness_or_radius_container.set_fixed_height(20); - thickness_or_radius_container.set_layout(); + auto thickness_or_radius_container = TRY(properties_widget->try_add()); + thickness_or_radius_container->set_fixed_height(20); + (void)TRY(thickness_or_radius_container->try_set_layout()); - auto& thickness_or_radius_label = thickness_or_radius_container.add(); - thickness_or_radius_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); - thickness_or_radius_label.set_fixed_size(80, 20); + auto thickness_or_radius_label = TRY(thickness_or_radius_container->try_add()); + thickness_or_radius_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); + thickness_or_radius_label->set_fixed_size(80, 20); - auto& thickness_or_radius_slider = thickness_or_radius_container.add(Orientation::Horizontal, String::from_utf8_short_string("px"sv)); + auto thickness_or_radius_slider = TRY(thickness_or_radius_container->try_add(Orientation::Horizontal, String::from_utf8_short_string("px"sv))); - thickness_or_radius_slider.on_change = [&](int value) { + thickness_or_radius_slider->on_change = [&](int value) { if (m_fill_mode == FillMode::RoundedCorners) { m_corner_radius = value; } else m_thickness = value; }; - auto update_slider = [&] { + auto update_slider = [this, thickness_or_radius_label, thickness_or_radius_slider] { auto update_values = [&](auto label, int value, int range_min, int range_max = 10) { - thickness_or_radius_label.set_text(label); - thickness_or_radius_slider.set_range(range_min, range_max); - thickness_or_radius_slider.set_value(value); + thickness_or_radius_label->set_text(label); + thickness_or_radius_slider->set_range(range_min, range_max); + thickness_or_radius_slider->set_value(value); }; if (m_fill_mode == FillMode::RoundedCorners) update_values("Radius:", m_corner_radius, 0, 50); @@ -176,67 +176,67 @@ GUI::Widget* RectangleTool::get_properties_widget() }; update_slider(); - set_primary_slider(&thickness_or_radius_slider); + set_primary_slider(thickness_or_radius_slider); - auto& mode_container = m_properties_widget->add(); - mode_container.set_fixed_height(90); - mode_container.set_layout(); - auto& mode_label = mode_container.add("Mode:"); - mode_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); - mode_label.set_fixed_size(30, 20); + auto mode_container = TRY(properties_widget->try_add()); + mode_container->set_fixed_height(90); + (void)TRY(mode_container->try_set_layout()); + auto mode_label = TRY(mode_container->try_add("Mode:")); + mode_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); + mode_label->set_fixed_size(30, 20); - auto& mode_radio_container = mode_container.add(); - mode_radio_container.set_layout(); - auto& outline_mode_radio = mode_radio_container.add(String::from_utf8_short_string("Outline"sv)); - auto& fill_mode_radio = mode_radio_container.add(String::from_utf8_short_string("Fill"sv)); - auto& gradient_mode_radio = mode_radio_container.add(String::from_utf8("Gradient"sv).release_value_but_fixme_should_propagate_errors()); - mode_radio_container.set_fixed_width(70); + auto mode_radio_container = TRY(mode_container->try_add()); + (void)TRY(mode_radio_container->try_set_layout()); + auto outline_mode_radio = TRY(mode_radio_container->try_add(String::from_utf8_short_string("Outline"sv))); + auto fill_mode_radio = TRY(mode_radio_container->try_add(String::from_utf8_short_string("Fill"sv))); + auto gradient_mode_radio = TRY(mode_radio_container->try_add(TRY(String::from_utf8("Gradient"sv)))); + mode_radio_container->set_fixed_width(70); - auto& rounded_corners_mode_radio = mode_radio_container.add(String::from_utf8_short_string("Rounded"sv)); + auto rounded_corners_mode_radio = TRY(mode_radio_container->try_add(String::from_utf8_short_string("Rounded"sv))); - outline_mode_radio.on_checked = [&, update_slider](bool) { + outline_mode_radio->on_checked = [this, update_slider](bool) { m_fill_mode = FillMode::Outline; update_slider(); }; - fill_mode_radio.on_checked = [&, update_slider](bool) { + fill_mode_radio->on_checked = [this, update_slider](bool) { m_fill_mode = FillMode::Fill; update_slider(); }; - gradient_mode_radio.on_checked = [&, update_slider](bool) { + gradient_mode_radio->on_checked = [this, update_slider](bool) { m_fill_mode = FillMode::Gradient; update_slider(); }; - rounded_corners_mode_radio.on_checked = [&, update_slider](bool) { + rounded_corners_mode_radio->on_checked = [this, update_slider](bool) { m_fill_mode = FillMode::RoundedCorners; update_slider(); }; - outline_mode_radio.set_checked(true); + outline_mode_radio->set_checked(true); - auto& mode_extras_container = mode_container.add(); - mode_extras_container.set_layout(); + auto mode_extras_container = TRY(mode_container->try_add()); + (void)TRY(mode_extras_container->try_set_layout()); - auto& aa_enable_checkbox = mode_extras_container.add(String::from_utf8("Anti-alias"sv).release_value_but_fixme_should_propagate_errors()); - aa_enable_checkbox.on_checked = [&](bool checked) { + auto aa_enable_checkbox = TRY(mode_extras_container->try_add(TRY(String::from_utf8("Anti-alias"sv)))); + aa_enable_checkbox->on_checked = [this](bool checked) { m_antialias_enabled = checked; }; - aa_enable_checkbox.set_checked(true); + aa_enable_checkbox->set_checked(true); - auto& aspect_container = mode_extras_container.add(); - aspect_container.set_layout(); - aspect_container.set_fixed_width(75); + auto aspect_container = TRY(mode_extras_container->try_add()); + (void)TRY(aspect_container->try_set_layout()); + aspect_container->set_fixed_width(75); - auto& aspect_label = aspect_container.add("Aspect Ratio:"); - aspect_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); - aspect_label.set_fixed_size(75, 20); + auto aspect_label = TRY(aspect_container->try_add("Aspect Ratio:")); + aspect_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); + aspect_label->set_fixed_size(75, 20); - auto& aspect_fields_container = aspect_container.add(); - aspect_fields_container.set_fixed_width(75); - aspect_fields_container.set_layout(); + auto aspect_fields_container = TRY(aspect_container->try_add()); + aspect_fields_container->set_fixed_width(75); + (void)TRY(aspect_fields_container->try_set_layout()); - m_aspect_w_textbox = aspect_fields_container.add(); + m_aspect_w_textbox = TRY(aspect_fields_container->try_add()); m_aspect_w_textbox->set_fixed_height(20); m_aspect_w_textbox->set_fixed_width(25); - m_aspect_w_textbox->on_change = [&] { + m_aspect_w_textbox->on_change = [this] { auto x = m_aspect_w_textbox->text().to_int().value_or(0); auto y = m_aspect_h_textbox->text().to_int().value_or(0); if (x > 0 && y > 0) { @@ -246,14 +246,16 @@ GUI::Widget* RectangleTool::get_properties_widget() } }; - auto& multiply_label = aspect_fields_container.add("x"); - multiply_label.set_text_alignment(Gfx::TextAlignment::Center); - multiply_label.set_fixed_size(10, 20); + auto multiply_label = TRY(aspect_fields_container->try_add("x")); + multiply_label->set_text_alignment(Gfx::TextAlignment::Center); + multiply_label->set_fixed_size(10, 20); - m_aspect_h_textbox = aspect_fields_container.add(); + m_aspect_h_textbox = TRY(aspect_fields_container->try_add()); m_aspect_h_textbox->set_fixed_height(20); m_aspect_h_textbox->set_fixed_width(25); - m_aspect_h_textbox->on_change = [&] { m_aspect_w_textbox->on_change(); }; + m_aspect_h_textbox->on_change = [this] { m_aspect_w_textbox->on_change(); }; + + m_properties_widget = properties_widget; } return m_properties_widget.ptr(); diff --git a/Userland/Applications/PixelPaint/Tools/RectangleTool.h b/Userland/Applications/PixelPaint/Tools/RectangleTool.h index 756bb0b281..eb042b3e87 100644 --- a/Userland/Applications/PixelPaint/Tools/RectangleTool.h +++ b/Userland/Applications/PixelPaint/Tools/RectangleTool.h @@ -24,7 +24,7 @@ public: virtual void on_mouseup(Layer*, MouseEvent&) override; virtual void on_second_paint(Layer const*, GUI::PaintEvent&) override; virtual bool on_keydown(GUI::KeyEvent&) override; - virtual GUI::Widget* get_properties_widget() override; + virtual ErrorOr get_properties_widget() override; virtual Variant> cursor() override { return Gfx::StandardCursor::Crosshair; } private: diff --git a/Userland/Applications/PixelPaint/Tools/SprayTool.cpp b/Userland/Applications/PixelPaint/Tools/SprayTool.cpp index 4290d25212..aaf2ef652d 100644 --- a/Userland/Applications/PixelPaint/Tools/SprayTool.cpp +++ b/Userland/Applications/PixelPaint/Tools/SprayTool.cpp @@ -90,45 +90,46 @@ void SprayTool::on_mouseup(Layer*, MouseEvent&) } } -GUI::Widget* SprayTool::get_properties_widget() +ErrorOr SprayTool::get_properties_widget() { if (!m_properties_widget) { - m_properties_widget = GUI::Widget::construct(); - m_properties_widget->set_layout(); + auto properties_widget = TRY(GUI::Widget::try_create()); + (void)TRY(properties_widget->try_set_layout()); - auto& size_container = m_properties_widget->add(); - size_container.set_fixed_height(20); - size_container.set_layout(); + auto size_container = TRY(properties_widget->try_add()); + size_container->set_fixed_height(20); + (void)TRY(size_container->try_set_layout()); - auto& size_label = size_container.add("Size:"); - size_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); - size_label.set_fixed_size(80, 20); + auto size_label = TRY(size_container->try_add("Size:")); + size_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); + size_label->set_fixed_size(80, 20); - auto& size_slider = size_container.add(Orientation::Horizontal, String::from_utf8_short_string("px"sv)); - size_slider.set_range(1, 20); - size_slider.set_value(m_thickness); + auto size_slider = TRY(size_container->try_add(Orientation::Horizontal, String::from_utf8_short_string("px"sv))); + size_slider->set_range(1, 20); + size_slider->set_value(m_thickness); - size_slider.on_change = [&](int value) { + size_slider->on_change = [this](int value) { m_thickness = value; }; - set_primary_slider(&size_slider); + set_primary_slider(size_slider); - auto& density_container = m_properties_widget->add(); - density_container.set_fixed_height(20); - density_container.set_layout(); + auto density_container = TRY(properties_widget->try_add()); + density_container->set_fixed_height(20); + (void)TRY(density_container->try_set_layout()); - auto& density_label = density_container.add("Density:"); - density_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); - density_label.set_fixed_size(80, 20); + auto density_label = TRY(density_container->try_add("Density:")); + density_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); + density_label->set_fixed_size(80, 20); - auto& density_slider = density_container.add(Orientation::Horizontal, String::from_utf8_short_string("%"sv)); - density_slider.set_range(1, 100); - density_slider.set_value(m_density); + auto density_slider = TRY(density_container->try_add(Orientation::Horizontal, String::from_utf8_short_string("%"sv))); + density_slider->set_range(1, 100); + density_slider->set_value(m_density); - density_slider.on_change = [&](int value) { + density_slider->on_change = [this](int value) { m_density = value; }; - set_secondary_slider(&density_slider); + set_secondary_slider(density_slider); + m_properties_widget = properties_widget; } return m_properties_widget.ptr(); diff --git a/Userland/Applications/PixelPaint/Tools/SprayTool.h b/Userland/Applications/PixelPaint/Tools/SprayTool.h index 20d602be9f..9a0c586eb6 100644 --- a/Userland/Applications/PixelPaint/Tools/SprayTool.h +++ b/Userland/Applications/PixelPaint/Tools/SprayTool.h @@ -22,7 +22,7 @@ public: virtual void on_mousedown(Layer*, MouseEvent&) override; virtual void on_mouseup(Layer*, MouseEvent&) override; virtual void on_mousemove(Layer*, MouseEvent&) override; - virtual GUI::Widget* get_properties_widget() override; + virtual ErrorOr get_properties_widget() override; virtual Variant> cursor() override { return Gfx::StandardCursor::Crosshair; } private: diff --git a/Userland/Applications/PixelPaint/Tools/TextTool.cpp b/Userland/Applications/PixelPaint/Tools/TextTool.cpp index 67a8c89787..df62724f45 100644 --- a/Userland/Applications/PixelPaint/Tools/TextTool.cpp +++ b/Userland/Applications/PixelPaint/Tools/TextTool.cpp @@ -97,21 +97,21 @@ void TextTool::on_mousedown(Layer*, MouseEvent& event) } } -GUI::Widget* TextTool::get_properties_widget() +ErrorOr TextTool::get_properties_widget() { if (m_properties_widget) return m_properties_widget.ptr(); - m_properties_widget = GUI::Widget::construct(); - m_properties_widget->set_layout(); + auto properties_widget = TRY(GUI::Widget::try_create()); + (void)TRY(properties_widget->try_set_layout()); - auto& font_header = m_properties_widget->add("Current Font:"); - font_header.set_text_alignment(Gfx::TextAlignment::CenterLeft); + auto font_header = TRY(properties_widget->try_add("Current Font:")); + font_header->set_text_alignment(Gfx::TextAlignment::CenterLeft); - m_font_label = m_properties_widget->add(m_selected_font->human_readable_name()); + m_font_label = TRY(properties_widget->try_add(m_selected_font->human_readable_name())); - auto& change_font_button = m_properties_widget->add(String::from_utf8("Change Font..."sv).release_value_but_fixme_should_propagate_errors()); - change_font_button.on_click = [&](auto) { + auto change_font_button = TRY(properties_widget->try_add(TRY(String::from_utf8("Change Font..."sv)))); + change_font_button->on_click = [this](auto) { auto picker = GUI::FontPicker::construct(nullptr, m_selected_font, false); if (picker->exec() == GUI::Dialog::ExecResult::OK) { m_font_label->set_text(picker->font()->human_readable_name()); @@ -120,6 +120,8 @@ GUI::Widget* TextTool::get_properties_widget() m_editor->set_focus(true); } }; + + m_properties_widget = properties_widget; return m_properties_widget.ptr(); } diff --git a/Userland/Applications/PixelPaint/Tools/TextTool.h b/Userland/Applications/PixelPaint/Tools/TextTool.h index e94573dc4d..9f80be38b8 100644 --- a/Userland/Applications/PixelPaint/Tools/TextTool.h +++ b/Userland/Applications/PixelPaint/Tools/TextTool.h @@ -40,7 +40,7 @@ public: virtual void on_primary_color_change(Color) override; virtual void on_tool_deactivation() override; virtual Variant> cursor() override; - virtual GUI::Widget* get_properties_widget() override; + virtual ErrorOr get_properties_widget() override; private: virtual StringView tool_name() const override { return "Text Tool"sv; } diff --git a/Userland/Applications/PixelPaint/Tools/Tool.h b/Userland/Applications/PixelPaint/Tools/Tool.h index 0c7d093040..0d240b9656 100644 --- a/Userland/Applications/PixelPaint/Tools/Tool.h +++ b/Userland/Applications/PixelPaint/Tools/Tool.h @@ -67,7 +67,7 @@ public: virtual void on_secondary_color_change(Color) { } virtual void on_tool_activation() { } virtual void on_tool_deactivation() { } - virtual GUI::Widget* get_properties_widget() { return nullptr; } + virtual ErrorOr get_properties_widget() { return nullptr; } virtual Variant> cursor() { return Gfx::StandardCursor::None; } virtual Gfx::IntPoint point_position_to_preferred_cell(Gfx::FloatPoint position) const { return position.to_type(); } diff --git a/Userland/Applications/PixelPaint/Tools/WandSelectTool.cpp b/Userland/Applications/PixelPaint/Tools/WandSelectTool.cpp index 750b0a4c26..45bf033ac6 100644 --- a/Userland/Applications/PixelPaint/Tools/WandSelectTool.cpp +++ b/Userland/Applications/PixelPaint/Tools/WandSelectTool.cpp @@ -64,71 +64,72 @@ void WandSelectTool::on_mousedown(Layer* layer, MouseEvent& event) m_editor->did_complete_action(tool_name()); } -GUI::Widget* WandSelectTool::get_properties_widget() +ErrorOr WandSelectTool::get_properties_widget() { if (m_properties_widget) { return m_properties_widget.ptr(); } - m_properties_widget = GUI::Widget::construct(); - m_properties_widget->set_layout(); + auto properties_widget = TRY(GUI::Widget::try_create()); + (void)TRY(properties_widget->try_set_layout()); - auto& threshold_container = m_properties_widget->add(); - threshold_container.set_fixed_height(20); - threshold_container.set_layout(); + auto threshold_container = TRY(properties_widget->try_add()); + threshold_container->set_fixed_height(20); + (void)TRY(threshold_container->try_set_layout()); - auto& threshold_label = threshold_container.add("Threshold:"); - threshold_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); - threshold_label.set_fixed_size(80, 20); + auto threshold_label = TRY(threshold_container->try_add("Threshold:")); + threshold_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); + threshold_label->set_fixed_size(80, 20); - auto& threshold_slider = threshold_container.add(Orientation::Horizontal, String::from_utf8_short_string("%"sv)); - threshold_slider.set_range(0, 100); - threshold_slider.set_value(m_threshold); + auto threshold_slider = TRY(threshold_container->try_add(Orientation::Horizontal, String::from_utf8_short_string("%"sv))); + threshold_slider->set_range(0, 100); + threshold_slider->set_value(m_threshold); - threshold_slider.on_change = [&](int value) { + threshold_slider->on_change = [this](int value) { m_threshold = value; }; - set_primary_slider(&threshold_slider); + set_primary_slider(threshold_slider); - auto& mode_container = m_properties_widget->add(); - mode_container.set_fixed_height(20); - mode_container.set_layout(); + auto mode_container = TRY(properties_widget->try_add()); + mode_container->set_fixed_height(20); + (void)TRY(mode_container->try_set_layout()); - auto& mode_label = mode_container.add(); - mode_label.set_text("Mode:"); - mode_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); - mode_label.set_fixed_size(80, 20); + auto mode_label = TRY(mode_container->try_add()); + mode_label->set_text("Mode:"); + mode_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); + mode_label->set_fixed_size(80, 20); for (int i = 0; i < (int)Selection::MergeMode::__Count; i++) { switch ((Selection::MergeMode)i) { case Selection::MergeMode::Set: - m_merge_mode_names.append("Set"); + TRY(m_merge_mode_names.try_append("Set")); break; case Selection::MergeMode::Add: - m_merge_mode_names.append("Add"); + TRY(m_merge_mode_names.try_append("Add")); break; case Selection::MergeMode::Subtract: - m_merge_mode_names.append("Subtract"); + TRY(m_merge_mode_names.try_append("Subtract")); break; case Selection::MergeMode::Intersect: - m_merge_mode_names.append("Intersect"); + TRY(m_merge_mode_names.try_append("Intersect")); break; default: VERIFY_NOT_REACHED(); } } - auto& mode_combo = mode_container.add(); - mode_combo.set_only_allow_values_from_model(true); - mode_combo.set_model(*GUI::ItemListModel::create(m_merge_mode_names)); - mode_combo.set_selected_index((int)m_merge_mode); - mode_combo.on_change = [this](auto&&, GUI::ModelIndex const& index) { + auto mode_combo = TRY(mode_container->try_add()); + mode_combo->set_only_allow_values_from_model(true); + mode_combo->set_model(*GUI::ItemListModel::create(m_merge_mode_names)); + mode_combo->set_selected_index((int)m_merge_mode); + mode_combo->on_change = [this](auto&&, GUI::ModelIndex const& index) { VERIFY(index.row() >= 0); VERIFY(index.row() < (int)Selection::MergeMode::__Count); m_merge_mode = (Selection::MergeMode)index.row(); }; + m_properties_widget = properties_widget; return m_properties_widget.ptr(); } diff --git a/Userland/Applications/PixelPaint/Tools/WandSelectTool.h b/Userland/Applications/PixelPaint/Tools/WandSelectTool.h index 2a16a4cd26..5c4c8a5e37 100644 --- a/Userland/Applications/PixelPaint/Tools/WandSelectTool.h +++ b/Userland/Applications/PixelPaint/Tools/WandSelectTool.h @@ -23,7 +23,7 @@ public: virtual void on_mousedown(Layer*, MouseEvent& event) override; virtual bool on_keydown(GUI::KeyEvent&) override; - virtual GUI::Widget* get_properties_widget() override; + virtual ErrorOr get_properties_widget() override; virtual Variant> cursor() override { return Gfx::StandardCursor::Crosshair; } private: diff --git a/Userland/Applications/PixelPaint/Tools/ZoomTool.cpp b/Userland/Applications/PixelPaint/Tools/ZoomTool.cpp index 0e1d0b60ee..78ad3c4829 100644 --- a/Userland/Applications/PixelPaint/Tools/ZoomTool.cpp +++ b/Userland/Applications/PixelPaint/Tools/ZoomTool.cpp @@ -23,28 +23,29 @@ void ZoomTool::on_mousedown(Layer*, MouseEvent& event) m_editor->scale_centered(new_scale, raw_event.position()); } -GUI::Widget* ZoomTool::get_properties_widget() +ErrorOr ZoomTool::get_properties_widget() { if (!m_properties_widget) { - m_properties_widget = GUI::Widget::construct(); - m_properties_widget->set_layout(); + auto properties_widget = TRY(GUI::Widget::try_create()); + (void)TRY(properties_widget->try_set_layout()); - auto& sensitivity_container = m_properties_widget->add(); - sensitivity_container.set_fixed_height(20); - sensitivity_container.set_layout(); + auto sensitivity_container = TRY(properties_widget->try_add()); + sensitivity_container->set_fixed_height(20); + (void)TRY(sensitivity_container->try_set_layout()); - auto& sensitivity_label = sensitivity_container.add("Sensitivity:"); - sensitivity_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); - sensitivity_label.set_fixed_size(80, 20); + auto sensitivity_label = TRY(sensitivity_container->try_add("Sensitivity:")); + sensitivity_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); + sensitivity_label->set_fixed_size(80, 20); - auto& sensitivity_slider = sensitivity_container.add(Orientation::Horizontal, String::from_utf8_short_string("%"sv)); - sensitivity_slider.set_range(1, 100); - sensitivity_slider.set_value(100 * m_sensitivity); + auto sensitivity_slider = TRY(sensitivity_container->try_add(Orientation::Horizontal, String::from_utf8_short_string("%"sv))); + sensitivity_slider->set_range(1, 100); + sensitivity_slider->set_value(100 * m_sensitivity); - sensitivity_slider.on_change = [&](int value) { + sensitivity_slider->on_change = [this](int value) { m_sensitivity = value / 100.0f; }; - set_primary_slider(&sensitivity_slider); + set_primary_slider(sensitivity_slider); + m_properties_widget = properties_widget; } return m_properties_widget.ptr(); diff --git a/Userland/Applications/PixelPaint/Tools/ZoomTool.h b/Userland/Applications/PixelPaint/Tools/ZoomTool.h index cdc068adc2..85fdcc02f0 100644 --- a/Userland/Applications/PixelPaint/Tools/ZoomTool.h +++ b/Userland/Applications/PixelPaint/Tools/ZoomTool.h @@ -18,7 +18,7 @@ public: virtual ~ZoomTool() override = default; virtual void on_mousedown(Layer*, MouseEvent&) override; - virtual GUI::Widget* get_properties_widget() override; + virtual ErrorOr get_properties_widget() override; virtual Variant> cursor() override { return Gfx::StandardCursor::Zoom; } private: