mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 01:12:44 +00:00 
			
		
		
		
	PixelPaint: Propagate errors from making tool property widgets
This commit is contained in:
		
							parent
							
								
									b409a40377
								
							
						
					
					
						commit
						be717edd33
					
				
					 41 changed files with 499 additions and 468 deletions
				
			
		|  | @ -9,6 +9,7 @@ | ||||||
| #include "Tools/Tool.h" | #include "Tools/Tool.h" | ||||||
| #include <LibGUI/BoxLayout.h> | #include <LibGUI/BoxLayout.h> | ||||||
| #include <LibGUI/GroupBox.h> | #include <LibGUI/GroupBox.h> | ||||||
|  | #include <LibGUI/Label.h> | ||||||
| 
 | 
 | ||||||
| REGISTER_WIDGET(PixelPaint, ToolPropertiesWidget); | REGISTER_WIDGET(PixelPaint, ToolPropertiesWidget); | ||||||
| 
 | 
 | ||||||
|  | @ -23,6 +24,8 @@ ToolPropertiesWidget::ToolPropertiesWidget() | ||||||
|     layout.set_margins({ 8 }); |     layout.set_margins({ 8 }); | ||||||
|     m_tool_widget_stack = m_group_box->add<GUI::StackWidget>(); |     m_tool_widget_stack = m_group_box->add<GUI::StackWidget>(); | ||||||
|     m_blank_widget = m_tool_widget_stack->add<GUI::Widget>(); |     m_blank_widget = m_tool_widget_stack->add<GUI::Widget>(); | ||||||
|  |     m_error_label = m_tool_widget_stack->add<GUI::Label>(); | ||||||
|  |     m_error_label->set_enabled(false); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ToolPropertiesWidget::set_active_tool(Tool* tool) | void ToolPropertiesWidget::set_active_tool(Tool* tool) | ||||||
|  | @ -31,8 +34,14 @@ void ToolPropertiesWidget::set_active_tool(Tool* tool) | ||||||
|         return; |         return; | ||||||
| 
 | 
 | ||||||
|     m_active_tool = tool; |     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) { |     if (m_active_tool_widget == nullptr) { | ||||||
|         m_tool_widget_stack->set_active_widget(m_blank_widget); |         m_tool_widget_stack->set_active_widget(m_blank_widget); | ||||||
|         return; |         return; | ||||||
|  |  | ||||||
|  | @ -32,6 +32,7 @@ private: | ||||||
|     Tool* m_active_tool { nullptr }; |     Tool* m_active_tool { nullptr }; | ||||||
|     RefPtr<GUI::StackWidget> m_tool_widget_stack; |     RefPtr<GUI::StackWidget> m_tool_widget_stack; | ||||||
|     RefPtr<GUI::Widget> m_blank_widget; |     RefPtr<GUI::Widget> m_blank_widget; | ||||||
|  |     RefPtr<GUI::Label> m_error_label; | ||||||
|     GUI::Widget* m_active_tool_widget { nullptr }; |     GUI::Widget* m_active_tool_widget { nullptr }; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -137,48 +137,49 @@ void BrushTool::draw_line(Gfx::Bitmap& bitmap, Gfx::Color color, Gfx::IntPoint s | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| GUI::Widget* BrushTool::get_properties_widget() | ErrorOr<GUI::Widget*> BrushTool::get_properties_widget() | ||||||
| { | { | ||||||
|     if (!m_properties_widget) { |     if (!m_properties_widget) { | ||||||
|         m_properties_widget = GUI::Widget::construct(); |         auto properties_widget = TRY(GUI::Widget::try_create()); | ||||||
|         m_properties_widget->set_layout<GUI::VerticalBoxLayout>(); |         (void)TRY(properties_widget->try_set_layout<GUI::VerticalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         auto& size_container = m_properties_widget->add<GUI::Widget>(); |         auto size_container = TRY(properties_widget->try_add<GUI::Widget>()); | ||||||
|         size_container.set_fixed_height(20); |         size_container->set_fixed_height(20); | ||||||
|         size_container.set_layout<GUI::HorizontalBoxLayout>(); |         (void)TRY(size_container->try_set_layout<GUI::HorizontalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         auto& size_label = size_container.add<GUI::Label>("Size:"); |         auto size_label = TRY(size_container->try_add<GUI::Label>("Size:")); | ||||||
|         size_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); |         size_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); | ||||||
|         size_label.set_fixed_size(80, 20); |         size_label->set_fixed_size(80, 20); | ||||||
| 
 | 
 | ||||||
|         auto& size_slider = size_container.add<GUI::ValueSlider>(Orientation::Horizontal, String::from_utf8_short_string("px"sv)); |         auto size_slider = TRY(size_container->try_add<GUI::ValueSlider>(Orientation::Horizontal, String::from_utf8_short_string("px"sv))); | ||||||
|         size_slider.set_range(1, 100); |         size_slider->set_range(1, 100); | ||||||
|         size_slider.set_value(m_size); |         size_slider->set_value(m_size); | ||||||
|         size_slider.set_override_cursor(cursor()); |         size_slider->set_override_cursor(cursor()); | ||||||
| 
 | 
 | ||||||
|         size_slider.on_change = [&](int value) { |         size_slider->on_change = [this, size_slider](int value) { | ||||||
|             set_size(value); |             set_size(value); | ||||||
|             // Update cursor to provide an instant preview for the selected size.
 |             // 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<GUI::Widget>(); |         auto hardness_container = TRY(properties_widget->try_add<GUI::Widget>()); | ||||||
|         hardness_container.set_fixed_height(20); |         hardness_container->set_fixed_height(20); | ||||||
|         hardness_container.set_layout<GUI::HorizontalBoxLayout>(); |         (void)TRY(hardness_container->try_set_layout<GUI::HorizontalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         auto& hardness_label = hardness_container.add<GUI::Label>("Hardness:"); |         auto hardness_label = TRY(hardness_container->try_add<GUI::Label>("Hardness:")); | ||||||
|         hardness_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); |         hardness_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); | ||||||
|         hardness_label.set_fixed_size(80, 20); |         hardness_label->set_fixed_size(80, 20); | ||||||
| 
 | 
 | ||||||
|         auto& hardness_slider = hardness_container.add<GUI::ValueSlider>(Orientation::Horizontal, String::from_utf8_short_string("%"sv)); |         auto hardness_slider = TRY(hardness_container->try_add<GUI::ValueSlider>(Orientation::Horizontal, String::from_utf8_short_string("%"sv))); | ||||||
|         hardness_slider.set_range(1, 100); |         hardness_slider->set_range(1, 100); | ||||||
|         hardness_slider.set_value(m_hardness); |         hardness_slider->set_value(m_hardness); | ||||||
| 
 | 
 | ||||||
|         hardness_slider.on_change = [&](int value) { |         hardness_slider->on_change = [this](int value) { | ||||||
|             set_hardness(value); |             set_hardness(value); | ||||||
|         }; |         }; | ||||||
|         set_secondary_slider(&hardness_slider); |         set_secondary_slider(hardness_slider); | ||||||
|  |         m_properties_widget = properties_widget; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return m_properties_widget.ptr(); |     return m_properties_widget.ptr(); | ||||||
|  |  | ||||||
|  | @ -22,7 +22,7 @@ public: | ||||||
|     virtual void on_mousedown(Layer*, MouseEvent&) override; |     virtual void on_mousedown(Layer*, MouseEvent&) override; | ||||||
|     virtual void on_mousemove(Layer*, MouseEvent&) override; |     virtual void on_mousemove(Layer*, MouseEvent&) override; | ||||||
|     virtual void on_mouseup(Layer*, MouseEvent&) override; |     virtual void on_mouseup(Layer*, MouseEvent&) override; | ||||||
|     virtual GUI::Widget* get_properties_widget() override; |     virtual ErrorOr<GUI::Widget*> get_properties_widget() override; | ||||||
|     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override |     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override | ||||||
|     { |     { | ||||||
|         if (m_editor && m_editor->scale() != m_scale_last_created_cursor) |         if (m_editor && m_editor->scale() != m_scale_last_created_cursor) | ||||||
|  |  | ||||||
|  | @ -61,28 +61,29 @@ void BucketTool::on_mousedown(Layer* layer, MouseEvent& event) | ||||||
|     m_editor->did_complete_action(tool_name()); |     m_editor->did_complete_action(tool_name()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| GUI::Widget* BucketTool::get_properties_widget() | ErrorOr<GUI::Widget*> BucketTool::get_properties_widget() | ||||||
| { | { | ||||||
|     if (!m_properties_widget) { |     if (!m_properties_widget) { | ||||||
|         m_properties_widget = GUI::Widget::construct(); |         auto properties_widget = TRY(GUI::Widget::try_create()); | ||||||
|         m_properties_widget->set_layout<GUI::VerticalBoxLayout>(); |         (void)TRY(properties_widget->try_set_layout<GUI::VerticalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         auto& threshold_container = m_properties_widget->add<GUI::Widget>(); |         auto threshold_container = TRY(properties_widget->try_add<GUI::Widget>()); | ||||||
|         threshold_container.set_fixed_height(20); |         threshold_container->set_fixed_height(20); | ||||||
|         threshold_container.set_layout<GUI::HorizontalBoxLayout>(); |         (void)TRY(threshold_container->try_set_layout<GUI::HorizontalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         auto& threshold_label = threshold_container.add<GUI::Label>("Threshold:"); |         auto threshold_label = TRY(threshold_container->try_add<GUI::Label>("Threshold:")); | ||||||
|         threshold_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); |         threshold_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); | ||||||
|         threshold_label.set_fixed_size(80, 20); |         threshold_label->set_fixed_size(80, 20); | ||||||
| 
 | 
 | ||||||
|         auto& threshold_slider = threshold_container.add<GUI::ValueSlider>(Orientation::Horizontal, String::from_utf8_short_string("%"sv)); |         auto threshold_slider = TRY(threshold_container->try_add<GUI::ValueSlider>(Orientation::Horizontal, String::from_utf8_short_string("%"sv))); | ||||||
|         threshold_slider.set_range(0, 100); |         threshold_slider->set_range(0, 100); | ||||||
|         threshold_slider.set_value(m_threshold); |         threshold_slider->set_value(m_threshold); | ||||||
| 
 | 
 | ||||||
|         threshold_slider.on_change = [&](int value) { |         threshold_slider->on_change = [this](int value) { | ||||||
|             m_threshold = value; |             m_threshold = value; | ||||||
|         }; |         }; | ||||||
|         set_primary_slider(&threshold_slider); |         set_primary_slider(threshold_slider); | ||||||
|  |         m_properties_widget = properties_widget; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return m_properties_widget.ptr(); |     return m_properties_widget.ptr(); | ||||||
|  |  | ||||||
|  | @ -17,7 +17,7 @@ public: | ||||||
|     virtual ~BucketTool() override = default; |     virtual ~BucketTool() override = default; | ||||||
| 
 | 
 | ||||||
|     virtual void on_mousedown(Layer*, MouseEvent&) override; |     virtual void on_mousedown(Layer*, MouseEvent&) override; | ||||||
|     virtual GUI::Widget* get_properties_widget() override; |     virtual ErrorOr<GUI::Widget*> get_properties_widget() override; | ||||||
|     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override { return m_cursor; } |     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override { return m_cursor; } | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|  |  | ||||||
|  | @ -133,44 +133,45 @@ void CloneTool::on_keyup(GUI::KeyEvent& event) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| GUI::Widget* CloneTool::get_properties_widget() | ErrorOr<GUI::Widget*> CloneTool::get_properties_widget() | ||||||
| { | { | ||||||
|     if (!m_properties_widget) { |     if (!m_properties_widget) { | ||||||
|         m_properties_widget = GUI::Widget::construct(); |         auto properties_widget = TRY(GUI::Widget::try_create()); | ||||||
|         m_properties_widget->set_layout<GUI::VerticalBoxLayout>(); |         (void)TRY(properties_widget->try_set_layout<GUI::VerticalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         auto& size_container = m_properties_widget->add<GUI::Widget>(); |         auto size_container = TRY(properties_widget->try_add<GUI::Widget>()); | ||||||
|         size_container.set_fixed_height(20); |         size_container->set_fixed_height(20); | ||||||
|         size_container.set_layout<GUI::HorizontalBoxLayout>(); |         (void)TRY(size_container->try_set_layout<GUI::HorizontalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         auto& size_label = size_container.add<GUI::Label>("Size:"); |         auto size_label = TRY(size_container->try_add<GUI::Label>("Size:")); | ||||||
|         size_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); |         size_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); | ||||||
|         size_label.set_fixed_size(80, 20); |         size_label->set_fixed_size(80, 20); | ||||||
| 
 | 
 | ||||||
|         auto& size_slider = size_container.add<GUI::ValueSlider>(Orientation::Horizontal, String::from_utf8_short_string("px"sv)); |         auto size_slider = TRY(size_container->try_add<GUI::ValueSlider>(Orientation::Horizontal, String::from_utf8_short_string("px"sv))); | ||||||
|         size_slider.set_range(1, 100); |         size_slider->set_range(1, 100); | ||||||
|         size_slider.set_value(size()); |         size_slider->set_value(size()); | ||||||
| 
 | 
 | ||||||
|         size_slider.on_change = [&](int value) { |         size_slider->on_change = [this](int value) { | ||||||
|             set_size(value); |             set_size(value); | ||||||
|         }; |         }; | ||||||
|         set_primary_slider(&size_slider); |         set_primary_slider(size_slider); | ||||||
| 
 | 
 | ||||||
|         auto& hardness_container = m_properties_widget->add<GUI::Widget>(); |         auto hardness_container = TRY(properties_widget->try_add<GUI::Widget>()); | ||||||
|         hardness_container.set_fixed_height(20); |         hardness_container->set_fixed_height(20); | ||||||
|         hardness_container.set_layout<GUI::HorizontalBoxLayout>(); |         (void)TRY(hardness_container->try_set_layout<GUI::HorizontalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         auto& hardness_label = hardness_container.add<GUI::Label>("Hardness:"); |         auto hardness_label = TRY(hardness_container->try_add<GUI::Label>("Hardness:")); | ||||||
|         hardness_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); |         hardness_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); | ||||||
|         hardness_label.set_fixed_size(80, 20); |         hardness_label->set_fixed_size(80, 20); | ||||||
| 
 | 
 | ||||||
|         auto& hardness_slider = hardness_container.add<GUI::ValueSlider>(Orientation::Horizontal, String::from_utf8_short_string("%"sv)); |         auto hardness_slider = TRY(hardness_container->try_add<GUI::ValueSlider>(Orientation::Horizontal, String::from_utf8_short_string("%"sv))); | ||||||
|         hardness_slider.set_range(1, 100); |         hardness_slider->set_range(1, 100); | ||||||
|         hardness_slider.on_change = [&](int value) { |         hardness_slider->on_change = [&](int value) { | ||||||
|             set_hardness(value); |             set_hardness(value); | ||||||
|         }; |         }; | ||||||
|         hardness_slider.set_value(100); |         hardness_slider->set_value(100); | ||||||
|         set_secondary_slider(&hardness_slider); |         set_secondary_slider(hardness_slider); | ||||||
|  |         m_properties_widget = properties_widget; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return m_properties_widget.ptr(); |     return m_properties_widget.ptr(); | ||||||
|  |  | ||||||
|  | @ -15,7 +15,7 @@ public: | ||||||
|     CloneTool() = default; |     CloneTool() = default; | ||||||
|     virtual ~CloneTool() override = default; |     virtual ~CloneTool() override = default; | ||||||
| 
 | 
 | ||||||
|     virtual GUI::Widget* get_properties_widget() override; |     virtual ErrorOr<GUI::Widget*> get_properties_widget() override; | ||||||
|     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override; |     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override; | ||||||
| 
 | 
 | ||||||
|     virtual bool is_overriding_alt() override { return true; } |     virtual bool is_overriding_alt() override { return true; } | ||||||
|  |  | ||||||
|  | @ -126,68 +126,68 @@ bool EllipseTool::on_keydown(GUI::KeyEvent& event) | ||||||
|     return Tool::on_keydown(event); |     return Tool::on_keydown(event); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| GUI::Widget* EllipseTool::get_properties_widget() | ErrorOr<GUI::Widget*> EllipseTool::get_properties_widget() | ||||||
| { | { | ||||||
|     if (!m_properties_widget) { |     if (!m_properties_widget) { | ||||||
|         m_properties_widget = GUI::Widget::construct(); |         auto properties_widget = TRY(GUI::Widget::try_create()); | ||||||
|         m_properties_widget->set_layout<GUI::VerticalBoxLayout>(); |         (void)TRY(properties_widget->try_set_layout<GUI::VerticalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         auto& thickness_container = m_properties_widget->add<GUI::Widget>(); |         auto thickness_container = TRY(properties_widget->try_add<GUI::Widget>()); | ||||||
|         thickness_container.set_fixed_height(20); |         thickness_container->set_fixed_height(20); | ||||||
|         thickness_container.set_layout<GUI::HorizontalBoxLayout>(); |         (void)TRY(thickness_container->try_set_layout<GUI::HorizontalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         auto& thickness_label = thickness_container.add<GUI::Label>("Thickness:"); |         auto thickness_label = TRY(thickness_container->try_add<GUI::Label>("Thickness:")); | ||||||
|         thickness_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); |         thickness_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); | ||||||
|         thickness_label.set_fixed_size(80, 20); |         thickness_label->set_fixed_size(80, 20); | ||||||
| 
 | 
 | ||||||
|         auto& thickness_slider = thickness_container.add<GUI::ValueSlider>(Orientation::Horizontal, String::from_utf8_short_string("px"sv)); |         auto thickness_slider = TRY(thickness_container->try_add<GUI::ValueSlider>(Orientation::Horizontal, String::from_utf8_short_string("px"sv))); | ||||||
|         thickness_slider.set_range(1, 10); |         thickness_slider->set_range(1, 10); | ||||||
|         thickness_slider.set_value(m_thickness); |         thickness_slider->set_value(m_thickness); | ||||||
| 
 | 
 | ||||||
|         thickness_slider.on_change = [&](int value) { |         thickness_slider->on_change = [this](int value) { | ||||||
|             m_thickness = value; |             m_thickness = value; | ||||||
|         }; |         }; | ||||||
|         set_primary_slider(&thickness_slider); |         set_primary_slider(thickness_slider); | ||||||
| 
 | 
 | ||||||
|         auto& mode_container = m_properties_widget->add<GUI::Widget>(); |         auto mode_container = TRY(properties_widget->try_add<GUI::Widget>()); | ||||||
|         mode_container.set_fixed_height(70); |         mode_container->set_fixed_height(70); | ||||||
|         mode_container.set_layout<GUI::HorizontalBoxLayout>(); |         (void)TRY(mode_container->try_set_layout<GUI::HorizontalBoxLayout>()); | ||||||
|         auto& mode_label = mode_container.add<GUI::Label>("Mode:"); |         auto mode_label = TRY(mode_container->try_add<GUI::Label>("Mode:")); | ||||||
|         mode_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); |         mode_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); | ||||||
| 
 | 
 | ||||||
|         auto& mode_radio_container = mode_container.add<GUI::Widget>(); |         auto mode_radio_container = TRY(mode_container->try_add<GUI::Widget>()); | ||||||
|         mode_radio_container.set_layout<GUI::VerticalBoxLayout>(); |         (void)TRY(mode_radio_container->try_set_layout<GUI::VerticalBoxLayout>()); | ||||||
|         auto& outline_mode_radio = mode_radio_container.add<GUI::RadioButton>(String::from_utf8_short_string("Outline"sv)); |         auto outline_mode_radio = TRY(mode_radio_container->try_add<GUI::RadioButton>(String::from_utf8_short_string("Outline"sv))); | ||||||
|         auto& fill_mode_radio = mode_radio_container.add<GUI::RadioButton>(String::from_utf8_short_string("Fill"sv)); |         auto fill_mode_radio = TRY(mode_radio_container->try_add<GUI::RadioButton>(String::from_utf8_short_string("Fill"sv))); | ||||||
|         auto& aa_enable_checkbox = mode_radio_container.add<GUI::CheckBox>(String::from_utf8("Anti-alias"sv).release_value_but_fixme_should_propagate_errors()); |         auto aa_enable_checkbox = TRY(mode_radio_container->try_add<GUI::CheckBox>(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; |             m_antialias_enabled = checked; | ||||||
|         }; |         }; | ||||||
|         outline_mode_radio.on_checked = [&](bool checked) { |         outline_mode_radio->on_checked = [this](bool checked) { | ||||||
|             if (checked) |             if (checked) | ||||||
|                 m_fill_mode = FillMode::Outline; |                 m_fill_mode = FillMode::Outline; | ||||||
|         }; |         }; | ||||||
|         fill_mode_radio.on_checked = [&](bool checked) { |         fill_mode_radio->on_checked = [this](bool checked) { | ||||||
|             if (checked) |             if (checked) | ||||||
|                 m_fill_mode = FillMode::Fill; |                 m_fill_mode = FillMode::Fill; | ||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
|         aa_enable_checkbox.set_checked(true); |         aa_enable_checkbox->set_checked(true); | ||||||
|         outline_mode_radio.set_checked(true); |         outline_mode_radio->set_checked(true); | ||||||
| 
 | 
 | ||||||
|         auto& aspect_container = m_properties_widget->add<GUI::Widget>(); |         auto aspect_container = TRY(properties_widget->try_add<GUI::Widget>()); | ||||||
|         aspect_container.set_fixed_height(20); |         aspect_container->set_fixed_height(20); | ||||||
|         aspect_container.set_layout<GUI::HorizontalBoxLayout>(); |         (void)TRY(aspect_container->try_set_layout<GUI::HorizontalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         auto& aspect_label = aspect_container.add<GUI::Label>("Aspect Ratio:"); |         auto aspect_label = TRY(aspect_container->try_add<GUI::Label>("Aspect Ratio:")); | ||||||
|         aspect_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); |         aspect_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); | ||||||
|         aspect_label.set_fixed_size(80, 20); |         aspect_label->set_fixed_size(80, 20); | ||||||
| 
 | 
 | ||||||
|         m_aspect_w_textbox = aspect_container.add<GUI::TextBox>(); |         m_aspect_w_textbox = TRY(aspect_container->try_add<GUI::TextBox>()); | ||||||
|         m_aspect_w_textbox->set_fixed_height(20); |         m_aspect_w_textbox->set_fixed_height(20); | ||||||
|         m_aspect_w_textbox->set_fixed_width(25); |         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 x = m_aspect_w_textbox->text().to_int().value_or(0); | ||||||
|             auto y = m_aspect_h_textbox->text().to_int().value_or(0); |             auto y = m_aspect_h_textbox->text().to_int().value_or(0); | ||||||
|             if (x > 0 && y > 0) { |             if (x > 0 && y > 0) { | ||||||
|  | @ -197,14 +197,15 @@ GUI::Widget* EllipseTool::get_properties_widget() | ||||||
|             } |             } | ||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
|         auto& multiply_label = aspect_container.add<GUI::Label>("x"); |         auto multiply_label = TRY(aspect_container->try_add<GUI::Label>("x")); | ||||||
|         multiply_label.set_text_alignment(Gfx::TextAlignment::Center); |         multiply_label->set_text_alignment(Gfx::TextAlignment::Center); | ||||||
|         multiply_label.set_fixed_size(10, 20); |         multiply_label->set_fixed_size(10, 20); | ||||||
| 
 | 
 | ||||||
|         m_aspect_h_textbox = aspect_container.add<GUI::TextBox>(); |         m_aspect_h_textbox = TRY(aspect_container->try_add<GUI::TextBox>()); | ||||||
|         m_aspect_h_textbox->set_fixed_height(20); |         m_aspect_h_textbox->set_fixed_height(20); | ||||||
|         m_aspect_h_textbox->set_fixed_width(25); |         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(); |     return m_properties_widget.ptr(); | ||||||
|  |  | ||||||
|  | @ -25,7 +25,7 @@ public: | ||||||
|     virtual void on_mouseup(Layer*, MouseEvent&) override; |     virtual void on_mouseup(Layer*, MouseEvent&) override; | ||||||
|     virtual void on_second_paint(Layer const*, GUI::PaintEvent&) override; |     virtual void on_second_paint(Layer const*, GUI::PaintEvent&) override; | ||||||
|     virtual bool on_keydown(GUI::KeyEvent&) override; |     virtual bool on_keydown(GUI::KeyEvent&) override; | ||||||
|     virtual GUI::Widget* get_properties_widget() override; |     virtual ErrorOr<GUI::Widget*> get_properties_widget() override; | ||||||
|     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override { return Gfx::StandardCursor::Crosshair; } |     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override { return Gfx::StandardCursor::Crosshair; } | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|  |  | ||||||
|  | @ -53,84 +53,85 @@ void EraseTool::draw_point(Gfx::Bitmap& bitmap, Gfx::Color color, Gfx::IntPoint | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| GUI::Widget* EraseTool::get_properties_widget() | ErrorOr<GUI::Widget*> EraseTool::get_properties_widget() | ||||||
| { | { | ||||||
|     if (!m_properties_widget) { |     if (!m_properties_widget) { | ||||||
|         m_properties_widget = GUI::Widget::construct(); |         auto properties_widget = TRY(GUI::Widget::try_create()); | ||||||
|         m_properties_widget->set_layout<GUI::VerticalBoxLayout>(); |         (void)TRY(properties_widget->try_set_layout<GUI::VerticalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         auto& size_container = m_properties_widget->add<GUI::Widget>(); |         auto size_container = TRY(properties_widget->try_add<GUI::Widget>()); | ||||||
|         size_container.set_fixed_height(20); |         size_container->set_fixed_height(20); | ||||||
|         size_container.set_layout<GUI::HorizontalBoxLayout>(); |         (void)TRY(size_container->try_set_layout<GUI::HorizontalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         auto& size_label = size_container.add<GUI::Label>("Size:"); |         auto size_label = TRY(size_container->try_add<GUI::Label>("Size:")); | ||||||
|         size_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); |         size_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); | ||||||
|         size_label.set_fixed_size(80, 20); |         size_label->set_fixed_size(80, 20); | ||||||
| 
 | 
 | ||||||
|         auto& size_slider = size_container.add<GUI::ValueSlider>(Orientation::Horizontal, String::from_utf8_short_string("px"sv)); |         auto size_slider = TRY(size_container->try_add<GUI::ValueSlider>(Orientation::Horizontal, String::from_utf8_short_string("px"sv))); | ||||||
|         size_slider.set_range(1, 100); |         size_slider->set_range(1, 100); | ||||||
|         size_slider.set_value(size()); |         size_slider->set_value(size()); | ||||||
| 
 | 
 | ||||||
|         size_slider.on_change = [&](int value) { |         size_slider->on_change = [this, size_slider](int value) { | ||||||
|             set_size(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<GUI::Widget>(); |         auto hardness_container = TRY(properties_widget->try_add<GUI::Widget>()); | ||||||
|         hardness_container.set_fixed_height(20); |         hardness_container->set_fixed_height(20); | ||||||
|         hardness_container.set_layout<GUI::HorizontalBoxLayout>(); |         (void)TRY(hardness_container->try_set_layout<GUI::HorizontalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         auto& hardness_label = hardness_container.add<GUI::Label>("Hardness:"); |         auto hardness_label = TRY(hardness_container->try_add<GUI::Label>("Hardness:")); | ||||||
|         hardness_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); |         hardness_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); | ||||||
|         hardness_label.set_fixed_size(80, 20); |         hardness_label->set_fixed_size(80, 20); | ||||||
| 
 | 
 | ||||||
|         auto& hardness_slider = hardness_container.add<GUI::ValueSlider>(Orientation::Horizontal, String::from_utf8_short_string("%"sv)); |         auto hardness_slider = TRY(hardness_container->try_add<GUI::ValueSlider>(Orientation::Horizontal, String::from_utf8_short_string("%"sv))); | ||||||
|         hardness_slider.set_range(1, 100); |         hardness_slider->set_range(1, 100); | ||||||
|         hardness_slider.set_value(hardness()); |         hardness_slider->set_value(hardness()); | ||||||
| 
 | 
 | ||||||
|         hardness_slider.on_change = [&](int value) { |         hardness_slider->on_change = [this](int value) { | ||||||
|             set_hardness(value); |             set_hardness(value); | ||||||
|         }; |         }; | ||||||
|         set_secondary_slider(&hardness_slider); |         set_secondary_slider(hardness_slider); | ||||||
| 
 | 
 | ||||||
|         auto& secondary_color_container = m_properties_widget->add<GUI::Widget>(); |         auto secondary_color_container = TRY(properties_widget->try_add<GUI::Widget>()); | ||||||
|         secondary_color_container.set_fixed_height(20); |         secondary_color_container->set_fixed_height(20); | ||||||
|         secondary_color_container.set_layout<GUI::HorizontalBoxLayout>(); |         (void)TRY(secondary_color_container->try_set_layout<GUI::HorizontalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         auto& use_secondary_color_checkbox = secondary_color_container.add<GUI::CheckBox>(); |         auto use_secondary_color_checkbox = TRY(secondary_color_container->try_add<GUI::CheckBox>()); | ||||||
|         use_secondary_color_checkbox.set_checked(m_use_secondary_color); |         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->set_text(TRY(String::from_utf8("Use secondary color"sv))); | ||||||
|         use_secondary_color_checkbox.on_checked = [&](bool checked) { |         use_secondary_color_checkbox->on_checked = [this](bool checked) { | ||||||
|             m_use_secondary_color = checked; |             m_use_secondary_color = checked; | ||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
|         auto& mode_container = m_properties_widget->add<GUI::Widget>(); |         auto mode_container = TRY(properties_widget->try_add<GUI::Widget>()); | ||||||
|         mode_container.set_fixed_height(46); |         mode_container->set_fixed_height(46); | ||||||
|         mode_container.set_layout<GUI::HorizontalBoxLayout>(); |         (void)TRY(mode_container->try_set_layout<GUI::HorizontalBoxLayout>()); | ||||||
|         auto& mode_label = mode_container.add<GUI::Label>("Draw Mode:"); |         auto mode_label = TRY(mode_container->try_add<GUI::Label>("Draw Mode:")); | ||||||
|         mode_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); |         mode_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); | ||||||
|         mode_label.set_fixed_size(80, 20); |         mode_label->set_fixed_size(80, 20); | ||||||
| 
 | 
 | ||||||
|         auto& mode_radio_container = mode_container.add<GUI::Widget>(); |         auto mode_radio_container = TRY(mode_container->try_add<GUI::Widget>()); | ||||||
|         mode_radio_container.set_layout<GUI::VerticalBoxLayout>(); |         (void)TRY(mode_radio_container->try_set_layout<GUI::VerticalBoxLayout>()); | ||||||
|         auto& pencil_mode_radio = mode_radio_container.add<GUI::RadioButton>(String::from_utf8_short_string("Pencil"sv)); |         auto pencil_mode_radio = TRY(mode_radio_container->try_add<GUI::RadioButton>(String::from_utf8_short_string("Pencil"sv))); | ||||||
|         auto& brush_mode_radio = mode_radio_container.add<GUI::RadioButton>(String::from_utf8_short_string("Brush"sv)); |         auto brush_mode_radio = TRY(mode_radio_container->try_add<GUI::RadioButton>(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; |             m_draw_mode = DrawMode::Pencil; | ||||||
|             hardness_slider.set_enabled(false); |             hardness_slider->set_enabled(false); | ||||||
|             refresh_editor_cursor(); |             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; |             m_draw_mode = DrawMode::Brush; | ||||||
|             hardness_slider.set_enabled(true); |             hardness_slider->set_enabled(true); | ||||||
|             refresh_editor_cursor(); |             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(); |     return m_properties_widget.ptr(); | ||||||
|  |  | ||||||
|  | @ -20,7 +20,7 @@ public: | ||||||
|     EraseTool() = default; |     EraseTool() = default; | ||||||
|     virtual ~EraseTool() override = default; |     virtual ~EraseTool() override = default; | ||||||
| 
 | 
 | ||||||
|     virtual GUI::Widget* get_properties_widget() override; |     virtual ErrorOr<GUI::Widget*> get_properties_widget() override; | ||||||
| 
 | 
 | ||||||
| protected: | protected: | ||||||
|     virtual Color color_for(GUI::MouseEvent const& event) override; |     virtual Color color_for(GUI::MouseEvent const& event) override; | ||||||
|  |  | ||||||
|  | @ -181,46 +181,47 @@ void GradientTool::on_tool_activation() | ||||||
|     reset(); |     reset(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| GUI::Widget* GradientTool::get_properties_widget() | ErrorOr<GUI::Widget*> GradientTool::get_properties_widget() | ||||||
| { | { | ||||||
|     if (!m_properties_widget) { |     if (!m_properties_widget) { | ||||||
|         m_properties_widget = GUI::Widget::construct(); |         auto properties_widget = TRY(GUI::Widget::try_create()); | ||||||
|         m_properties_widget->set_layout<GUI::VerticalBoxLayout>(); |         (void)TRY(properties_widget->try_set_layout<GUI::VerticalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         auto& size_container = m_properties_widget->add<GUI::Widget>(); |         auto size_container = TRY(properties_widget->try_add<GUI::Widget>()); | ||||||
|         size_container.set_fixed_height(20); |         size_container->set_fixed_height(20); | ||||||
|         size_container.set_layout<GUI::HorizontalBoxLayout>(); |         (void)TRY(size_container->try_set_layout<GUI::HorizontalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         auto& size_label = size_container.add<GUI::Label>("Opacity:"); |         auto size_label = TRY(size_container->try_add<GUI::Label>("Opacity:")); | ||||||
|         size_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); |         size_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); | ||||||
|         size_label.set_fixed_size(80, 20); |         size_label->set_fixed_size(80, 20); | ||||||
| 
 | 
 | ||||||
|         auto& opacity_slider = size_container.add<GUI::HorizontalOpacitySlider>(); |         auto opacity_slider = TRY(size_container->try_add<GUI::HorizontalOpacitySlider>()); | ||||||
|         opacity_slider.set_range(1, 100); |         opacity_slider->set_range(1, 100); | ||||||
|         opacity_slider.set_value(100); |         opacity_slider->set_value(100); | ||||||
| 
 | 
 | ||||||
|         opacity_slider.on_change = [&](int value) { |         opacity_slider->on_change = [this](int value) { | ||||||
|             m_opacity = value; |             m_opacity = value; | ||||||
|             m_editor->update(); |             m_editor->update(); | ||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
|         set_primary_slider(&opacity_slider); |         set_primary_slider(opacity_slider); | ||||||
| 
 | 
 | ||||||
|         auto& use_secondary_color_checkbox = m_properties_widget->add<GUI::CheckBox>(String::from_utf8("Use secondary color"sv).release_value_but_fixme_should_propagate_errors()); |         auto use_secondary_color_checkbox = TRY(properties_widget->try_add<GUI::CheckBox>(TRY(String::from_utf8("Use secondary color"sv)))); | ||||||
|         use_secondary_color_checkbox.on_checked = [this](bool checked) { |         use_secondary_color_checkbox->on_checked = [this](bool checked) { | ||||||
|             m_use_secondary_color = checked; |             m_use_secondary_color = checked; | ||||||
|             m_editor->update(); |             m_editor->update(); | ||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
|         auto& button_container = m_properties_widget->add<GUI::Widget>(); |         auto button_container = TRY(properties_widget->try_add<GUI::Widget>()); | ||||||
|         button_container.set_fixed_height(22); |         button_container->set_fixed_height(22); | ||||||
|         auto& button_container_layout = button_container.set_layout<GUI::HorizontalBoxLayout>(); |         auto button_container_layout = TRY(button_container->try_set_layout<GUI::HorizontalBoxLayout>()); | ||||||
|         button_container_layout.add_spacer(); |         button_container_layout->add_spacer(); | ||||||
| 
 | 
 | ||||||
|         auto& apply_button = button_container.add<GUI::DialogButton>(String::from_utf8_short_string("Apply"sv)); |         auto apply_button = TRY(button_container->try_add<GUI::DialogButton>(String::from_utf8_short_string("Apply"sv))); | ||||||
|         apply_button.on_click = [this](auto) { |         apply_button->on_click = [this](auto) { | ||||||
|             rasterize_gradient(); |             rasterize_gradient(); | ||||||
|         }; |         }; | ||||||
|  |         m_properties_widget = properties_widget; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return m_properties_widget.ptr(); |     return m_properties_widget.ptr(); | ||||||
|  |  | ||||||
|  | @ -23,7 +23,7 @@ public: | ||||||
|     virtual void on_primary_color_change(Color) override; |     virtual void on_primary_color_change(Color) override; | ||||||
|     virtual void on_secondary_color_change(Color) override; |     virtual void on_secondary_color_change(Color) override; | ||||||
|     virtual void on_tool_activation() override; |     virtual void on_tool_activation() override; | ||||||
|     virtual GUI::Widget* get_properties_widget() override; |     virtual ErrorOr<GUI::Widget*> get_properties_widget() override; | ||||||
| 
 | 
 | ||||||
|     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override; |     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override; | ||||||
|     virtual void on_second_paint(Layer const*, GUI::PaintEvent&) override; |     virtual void on_second_paint(Layer const*, GUI::PaintEvent&) override; | ||||||
|  |  | ||||||
|  | @ -176,29 +176,30 @@ void GuideTool::on_tool_activation() | ||||||
|         m_editor->set_guide_visibility(true); |         m_editor->set_guide_visibility(true); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| GUI::Widget* GuideTool::get_properties_widget() | ErrorOr<GUI::Widget*> GuideTool::get_properties_widget() | ||||||
| { | { | ||||||
|     if (!m_properties_widget) { |     if (!m_properties_widget) { | ||||||
|         m_properties_widget = GUI::Widget::construct(); |         auto properties_widget = TRY(GUI::Widget::try_create()); | ||||||
|         m_properties_widget->set_layout<GUI::VerticalBoxLayout>(); |         (void)TRY(properties_widget->try_set_layout<GUI::VerticalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         auto& snapping_container = m_properties_widget->add<GUI::Widget>(); |         auto snapping_container = TRY(properties_widget->try_add<GUI::Widget>()); | ||||||
|         snapping_container.set_fixed_height(20); |         snapping_container->set_fixed_height(20); | ||||||
|         snapping_container.set_layout<GUI::HorizontalBoxLayout>(); |         (void)TRY(snapping_container->try_set_layout<GUI::HorizontalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         auto& snapping_label = snapping_container.add<GUI::Label>("Snap offset:"); |         auto snapping_label = TRY(snapping_container->try_add<GUI::Label>("Snap offset:")); | ||||||
|         snapping_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); |         snapping_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); | ||||||
|         snapping_label.set_fixed_size(80, 20); |         snapping_label->set_fixed_size(80, 20); | ||||||
|         snapping_label.set_tooltip("Press Shift to snap"); |         snapping_label->set_tooltip("Press Shift to snap"); | ||||||
| 
 | 
 | ||||||
|         auto& snapping_slider = snapping_container.add<GUI::ValueSlider>(Orientation::Horizontal, String::from_utf8_short_string("px"sv)); |         auto snapping_slider = TRY(snapping_container->try_add<GUI::ValueSlider>(Orientation::Horizontal, String::from_utf8_short_string("px"sv))); | ||||||
|         snapping_slider.set_range(0, 50); |         snapping_slider->set_range(0, 50); | ||||||
|         snapping_slider.set_value(m_snap_size); |         snapping_slider->set_value(m_snap_size); | ||||||
| 
 | 
 | ||||||
|         snapping_slider.on_change = [&](int value) { |         snapping_slider->on_change = [this](int value) { | ||||||
|             m_snap_size = 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(); |     return m_properties_widget.ptr(); | ||||||
|  |  | ||||||
|  | @ -27,7 +27,7 @@ public: | ||||||
| 
 | 
 | ||||||
|     virtual void on_tool_activation() override; |     virtual void on_tool_activation() override; | ||||||
| 
 | 
 | ||||||
|     virtual GUI::Widget* get_properties_widget() override; |     virtual ErrorOr<GUI::Widget*> get_properties_widget() override; | ||||||
|     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override { return Gfx::StandardCursor::Crosshair; } |     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override { return Gfx::StandardCursor::Crosshair; } | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|  |  | ||||||
|  | @ -171,23 +171,23 @@ bool LassoSelectTool::on_keydown(GUI::KeyEvent& key_event) | ||||||
|     return Tool::on_keydown(key_event); |     return Tool::on_keydown(key_event); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| GUI::Widget* LassoSelectTool::get_properties_widget() | ErrorOr<GUI::Widget*> LassoSelectTool::get_properties_widget() | ||||||
| { | { | ||||||
|     if (m_properties_widget) { |     if (m_properties_widget) { | ||||||
|         return m_properties_widget.ptr(); |         return m_properties_widget.ptr(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     m_properties_widget = GUI::Widget::construct(); |     auto properties_widget = TRY(GUI::Widget::try_create()); | ||||||
|     m_properties_widget->set_layout<GUI::VerticalBoxLayout>(); |     (void)TRY(properties_widget->try_set_layout<GUI::VerticalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|     auto& mode_container = m_properties_widget->add<GUI::Widget>(); |     auto mode_container = TRY(properties_widget->try_add<GUI::Widget>()); | ||||||
|     mode_container.set_fixed_height(20); |     mode_container->set_fixed_height(20); | ||||||
|     mode_container.set_layout<GUI::HorizontalBoxLayout>(); |     (void)TRY(mode_container->try_set_layout<GUI::HorizontalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|     auto& mode_label = mode_container.add<GUI::Label>(); |     auto mode_label = TRY(mode_container->try_add<GUI::Label>()); | ||||||
|     mode_label.set_text("Mode:"); |     mode_label->set_text("Mode:"); | ||||||
|     mode_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); |     mode_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); | ||||||
|     mode_label.set_fixed_size(80, 20); |     mode_label->set_fixed_size(80, 20); | ||||||
| 
 | 
 | ||||||
|     static constexpr auto s_merge_mode_names = [] { |     static constexpr auto s_merge_mode_names = [] { | ||||||
|         Array<StringView, (int)Selection::MergeMode::__Count> names; |         Array<StringView, (int)Selection::MergeMode::__Count> names; | ||||||
|  | @ -212,17 +212,18 @@ GUI::Widget* LassoSelectTool::get_properties_widget() | ||||||
|         return names; |         return names; | ||||||
|     }(); |     }(); | ||||||
| 
 | 
 | ||||||
|     auto& mode_combo = mode_container.add<GUI::ComboBox>(); |     auto mode_combo = TRY(mode_container->try_add<GUI::ComboBox>()); | ||||||
|     mode_combo.set_only_allow_values_from_model(true); |     mode_combo->set_only_allow_values_from_model(true); | ||||||
|     mode_combo.set_model(*GUI::ItemListModel<StringView, decltype(s_merge_mode_names)>::create(s_merge_mode_names)); |     mode_combo->set_model(*GUI::ItemListModel<StringView, decltype(s_merge_mode_names)>::create(s_merge_mode_names)); | ||||||
|     mode_combo.set_selected_index((int)m_merge_mode); |     mode_combo->set_selected_index((int)m_merge_mode); | ||||||
|     mode_combo.on_change = [this](auto&&, GUI::ModelIndex const& index) { |     mode_combo->on_change = [this](auto&&, GUI::ModelIndex const& index) { | ||||||
|         VERIFY(index.row() >= 0); |         VERIFY(index.row() >= 0); | ||||||
|         VERIFY(index.row() < (int)Selection::MergeMode::__Count); |         VERIFY(index.row() < (int)Selection::MergeMode::__Count); | ||||||
| 
 | 
 | ||||||
|         m_merge_mode = (Selection::MergeMode)index.row(); |         m_merge_mode = (Selection::MergeMode)index.row(); | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|  |     m_properties_widget = properties_widget; | ||||||
|     return m_properties_widget.ptr(); |     return m_properties_widget.ptr(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -25,7 +25,7 @@ public: | ||||||
|     virtual void on_mousemove(Layer*, MouseEvent& event) override; |     virtual void on_mousemove(Layer*, MouseEvent& event) override; | ||||||
|     virtual bool on_keydown(GUI::KeyEvent&) override; |     virtual bool on_keydown(GUI::KeyEvent&) override; | ||||||
|     virtual void on_second_paint(Layer const*, GUI::PaintEvent&) override; |     virtual void on_second_paint(Layer const*, GUI::PaintEvent&) override; | ||||||
|     virtual GUI::Widget* get_properties_widget() override; |     virtual ErrorOr<GUI::Widget*> get_properties_widget() override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     virtual StringView tool_name() const override { return "Lasso Select Tool"sv; } |     virtual StringView tool_name() const override { return "Lasso Select Tool"sv; } | ||||||
|  |  | ||||||
|  | @ -119,42 +119,43 @@ bool LineTool::on_keydown(GUI::KeyEvent& event) | ||||||
|     return Tool::on_keydown(event); |     return Tool::on_keydown(event); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| GUI::Widget* LineTool::get_properties_widget() | ErrorOr<GUI::Widget*> LineTool::get_properties_widget() | ||||||
| { | { | ||||||
|     if (!m_properties_widget) { |     if (!m_properties_widget) { | ||||||
|         m_properties_widget = GUI::Widget::construct(); |         auto properties_widget = TRY(GUI::Widget::try_create()); | ||||||
|         m_properties_widget->set_layout<GUI::VerticalBoxLayout>(); |         (void)TRY(properties_widget->try_set_layout<GUI::VerticalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         auto& thickness_container = m_properties_widget->add<GUI::Widget>(); |         auto thickness_container = TRY(properties_widget->try_add<GUI::Widget>()); | ||||||
|         thickness_container.set_fixed_height(20); |         thickness_container->set_fixed_height(20); | ||||||
|         thickness_container.set_layout<GUI::HorizontalBoxLayout>(); |         (void)TRY(thickness_container->try_set_layout<GUI::HorizontalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         auto& thickness_label = thickness_container.add<GUI::Label>("Thickness:"); |         auto thickness_label = TRY(thickness_container->try_add<GUI::Label>("Thickness:")); | ||||||
|         thickness_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); |         thickness_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); | ||||||
|         thickness_label.set_fixed_size(80, 20); |         thickness_label->set_fixed_size(80, 20); | ||||||
| 
 | 
 | ||||||
|         auto& thickness_slider = thickness_container.add<GUI::ValueSlider>(Orientation::Horizontal, String::from_utf8_short_string("px"sv)); |         auto thickness_slider = TRY(thickness_container->try_add<GUI::ValueSlider>(Orientation::Horizontal, String::from_utf8_short_string("px"sv))); | ||||||
|         thickness_slider.set_range(1, 10); |         thickness_slider->set_range(1, 10); | ||||||
|         thickness_slider.set_value(m_thickness); |         thickness_slider->set_value(m_thickness); | ||||||
| 
 | 
 | ||||||
|         thickness_slider.on_change = [&](int value) { |         thickness_slider->on_change = [this](int value) { | ||||||
|             m_thickness = value; |             m_thickness = value; | ||||||
|         }; |         }; | ||||||
|         set_primary_slider(&thickness_slider); |         set_primary_slider(thickness_slider); | ||||||
| 
 | 
 | ||||||
|         auto& mode_container = m_properties_widget->add<GUI::Widget>(); |         auto mode_container = TRY(properties_widget->try_add<GUI::Widget>()); | ||||||
|         mode_container.set_fixed_height(20); |         mode_container->set_fixed_height(20); | ||||||
|         mode_container.set_layout<GUI::HorizontalBoxLayout>(); |         (void)TRY(mode_container->try_set_layout<GUI::HorizontalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         auto& mode_label = mode_container.add<GUI::Label>("Mode:"); |         auto mode_label = TRY(mode_container->try_add<GUI::Label>("Mode:")); | ||||||
|         mode_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); |         mode_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); | ||||||
|         mode_label.set_fixed_size(80, 20); |         mode_label->set_fixed_size(80, 20); | ||||||
| 
 | 
 | ||||||
|         auto& aa_enable_checkbox = mode_container.add<GUI::CheckBox>(String::from_utf8("Anti-alias"sv).release_value_but_fixme_should_propagate_errors()); |         auto aa_enable_checkbox = TRY(mode_container->try_add<GUI::CheckBox>(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; |             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(); |     return m_properties_widget.ptr(); | ||||||
|  |  | ||||||
|  | @ -23,7 +23,7 @@ public: | ||||||
|     virtual void on_mouseup(Layer*, MouseEvent&) override; |     virtual void on_mouseup(Layer*, MouseEvent&) override; | ||||||
|     virtual void on_second_paint(Layer const*, GUI::PaintEvent&) override; |     virtual void on_second_paint(Layer const*, GUI::PaintEvent&) override; | ||||||
|     virtual bool on_keydown(GUI::KeyEvent&) override; |     virtual bool on_keydown(GUI::KeyEvent&) override; | ||||||
|     virtual GUI::Widget* get_properties_widget() override; |     virtual ErrorOr<GUI::Widget*> get_properties_widget() override; | ||||||
|     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override { return Gfx::StandardCursor::Crosshair; } |     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override { return Gfx::StandardCursor::Crosshair; } | ||||||
| 
 | 
 | ||||||
|     void draw_using(GUI::Painter&, Gfx::IntPoint start_position, Gfx::IntPoint end_position, Color color, int thickness); |     void draw_using(GUI::Painter&, Gfx::IntPoint start_position, Gfx::IntPoint end_position, Color color, int thickness); | ||||||
|  |  | ||||||
|  | @ -289,33 +289,34 @@ Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> MoveTool::cursor() | ||||||
|     return Gfx::StandardCursor::Move; |     return Gfx::StandardCursor::Move; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| GUI::Widget* MoveTool::get_properties_widget() | ErrorOr<GUI::Widget*> MoveTool::get_properties_widget() | ||||||
| { | { | ||||||
|     if (!m_properties_widget) { |     if (!m_properties_widget) { | ||||||
|         m_properties_widget = GUI::Widget::construct(); |         auto properties_widget = TRY(GUI::Widget::try_create()); | ||||||
|         m_properties_widget->set_layout<GUI::VerticalBoxLayout>(); |         (void)TRY(properties_widget->try_set_layout<GUI::VerticalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         auto& selection_mode_container = m_properties_widget->add<GUI::Widget>(); |         auto selection_mode_container = TRY(properties_widget->try_add<GUI::Widget>()); | ||||||
|         selection_mode_container.set_layout<GUI::HorizontalBoxLayout>(); |         (void)TRY(selection_mode_container->try_set_layout<GUI::HorizontalBoxLayout>()); | ||||||
|         selection_mode_container.set_fixed_height(46); |         selection_mode_container->set_fixed_height(46); | ||||||
|         auto& selection_mode_label = selection_mode_container.add<GUI::Label>("Selection Mode:"); |         auto selection_mode_label = TRY(selection_mode_container->try_add<GUI::Label>("Selection Mode:")); | ||||||
|         selection_mode_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); |         selection_mode_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); | ||||||
|         selection_mode_label.set_fixed_size(80, 40); |         selection_mode_label->set_fixed_size(80, 40); | ||||||
| 
 | 
 | ||||||
|         auto& mode_radio_container = selection_mode_container.add<GUI::Widget>(); |         auto mode_radio_container = TRY(selection_mode_container->try_add<GUI::Widget>()); | ||||||
|         mode_radio_container.set_layout<GUI::VerticalBoxLayout>(); |         (void)TRY(mode_radio_container->try_set_layout<GUI::VerticalBoxLayout>()); | ||||||
|         m_selection_mode_foreground = mode_radio_container.add<GUI::RadioButton>(String::from_utf8("Foreground"sv).release_value_but_fixme_should_propagate_errors()); |         m_selection_mode_foreground = TRY(mode_radio_container->try_add<GUI::RadioButton>(TRY(String::from_utf8("Foreground"sv)))); | ||||||
| 
 | 
 | ||||||
|         m_selection_mode_active = mode_radio_container.add<GUI::RadioButton>(String::from_utf8("Active Layer"sv).release_value_but_fixme_should_propagate_errors()); |         m_selection_mode_active = TRY(mode_radio_container->try_add<GUI::RadioButton>(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_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_layer_selection_mode = LayerSelectionMode::ActiveLayer; | ||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
|         m_selection_mode_foreground->set_checked(true); |         m_selection_mode_foreground->set_checked(true); | ||||||
|  |         m_properties_widget = properties_widget; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return m_properties_widget.ptr(); |     return m_properties_widget.ptr(); | ||||||
|  |  | ||||||
|  | @ -35,7 +35,7 @@ public: | ||||||
|     virtual bool on_keydown(GUI::KeyEvent&) override; |     virtual bool on_keydown(GUI::KeyEvent&) override; | ||||||
|     virtual void on_keyup(GUI::KeyEvent&) override; |     virtual void on_keyup(GUI::KeyEvent&) override; | ||||||
|     virtual void on_second_paint(Layer const*, GUI::PaintEvent&) override; |     virtual void on_second_paint(Layer const*, GUI::PaintEvent&) override; | ||||||
|     virtual GUI::Widget* get_properties_widget() override; |     virtual ErrorOr<GUI::Widget*> get_properties_widget() override; | ||||||
|     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override; |     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override; | ||||||
|     virtual bool is_overriding_alt() override { return true; } |     virtual bool is_overriding_alt() override { return true; } | ||||||
|     LayerSelectionMode layer_selection_mode() const { return m_layer_selection_mode; } |     LayerSelectionMode layer_selection_mode() const { return m_layer_selection_mode; } | ||||||
|  |  | ||||||
|  | @ -35,28 +35,29 @@ void PenTool::draw_line(Gfx::Bitmap& bitmap, Gfx::Color color, Gfx::IntPoint sta | ||||||
|     painter.draw_line(start, end, color, size()); |     painter.draw_line(start, end, color, size()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| GUI::Widget* PenTool::get_properties_widget() | ErrorOr<GUI::Widget*> PenTool::get_properties_widget() | ||||||
| { | { | ||||||
|     if (!m_properties_widget) { |     if (!m_properties_widget) { | ||||||
|         m_properties_widget = GUI::Widget::construct(); |         auto properties_widget = TRY(GUI::Widget::try_create()); | ||||||
|         m_properties_widget->set_layout<GUI::VerticalBoxLayout>(); |         (void)TRY(properties_widget->try_set_layout<GUI::VerticalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         auto& size_container = m_properties_widget->add<GUI::Widget>(); |         auto size_container = TRY(properties_widget->try_add<GUI::Widget>()); | ||||||
|         size_container.set_fixed_height(20); |         size_container->set_fixed_height(20); | ||||||
|         size_container.set_layout<GUI::HorizontalBoxLayout>(); |         (void)TRY(size_container->try_set_layout<GUI::HorizontalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         auto& size_label = size_container.add<GUI::Label>("Thickness:"); |         auto size_label = TRY(size_container->try_add<GUI::Label>("Thickness:")); | ||||||
|         size_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); |         size_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); | ||||||
|         size_label.set_fixed_size(80, 20); |         size_label->set_fixed_size(80, 20); | ||||||
| 
 | 
 | ||||||
|         auto& size_slider = size_container.add<GUI::ValueSlider>(Orientation::Horizontal, String::from_utf8_short_string("px"sv)); |         auto size_slider = TRY(size_container->try_add<GUI::ValueSlider>(Orientation::Horizontal, String::from_utf8_short_string("px"sv))); | ||||||
|         size_slider.set_range(1, 20); |         size_slider->set_range(1, 20); | ||||||
|         size_slider.set_value(size()); |         size_slider->set_value(size()); | ||||||
| 
 | 
 | ||||||
|         size_slider.on_change = [&](int value) { |         size_slider->on_change = [this](int value) { | ||||||
|             set_size(value); |             set_size(value); | ||||||
|         }; |         }; | ||||||
|         set_primary_slider(&size_slider); |         set_primary_slider(size_slider); | ||||||
|  |         m_properties_widget = properties_widget; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return m_properties_widget.ptr(); |     return m_properties_widget.ptr(); | ||||||
|  |  | ||||||
|  | @ -19,7 +19,7 @@ public: | ||||||
|     PenTool(); |     PenTool(); | ||||||
|     virtual ~PenTool() override = default; |     virtual ~PenTool() override = default; | ||||||
|     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override { return Gfx::StandardCursor::Crosshair; } |     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override { return Gfx::StandardCursor::Crosshair; } | ||||||
|     virtual GUI::Widget* get_properties_widget() override; |     virtual ErrorOr<GUI::Widget*> get_properties_widget() override; | ||||||
| 
 | 
 | ||||||
| protected: | protected: | ||||||
|     virtual void draw_point(Gfx::Bitmap& bitmap, Gfx::Color color, Gfx::IntPoint point) override; |     virtual void draw_point(Gfx::Bitmap& bitmap, Gfx::Color color, Gfx::IntPoint point) override; | ||||||
|  |  | ||||||
|  | @ -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); |     m_editor->set_editor_color_to_color_at_mouse_position(layer_event, m_sample_all_layers); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| GUI::Widget* PickerTool::get_properties_widget() | ErrorOr<GUI::Widget*> PickerTool::get_properties_widget() | ||||||
| { | { | ||||||
|     if (!m_properties_widget) { |     if (!m_properties_widget) { | ||||||
|         m_properties_widget = GUI::Widget::construct(); |         auto properties_widget = TRY(GUI::Widget::try_create()); | ||||||
|         m_properties_widget->set_layout<GUI::VerticalBoxLayout>(); |         (void)TRY(properties_widget->try_set_layout<GUI::VerticalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         auto& sample_checkbox = m_properties_widget->add<GUI::CheckBox>(String::from_utf8("Sample all layers"sv).release_value_but_fixme_should_propagate_errors()); |         auto sample_checkbox = TRY(properties_widget->try_add<GUI::CheckBox>(TRY(String::from_utf8("Sample all layers"sv)))); | ||||||
|         sample_checkbox.set_checked(m_sample_all_layers); |         sample_checkbox->set_checked(m_sample_all_layers); | ||||||
|         sample_checkbox.on_checked = [&](bool value) { |         sample_checkbox->on_checked = [this](bool value) { | ||||||
|             m_sample_all_layers = value; |             m_sample_all_layers = value; | ||||||
|         }; |         }; | ||||||
|  |         m_properties_widget = properties_widget; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return m_properties_widget.ptr(); |     return m_properties_widget.ptr(); | ||||||
|  |  | ||||||
|  | @ -21,7 +21,7 @@ public: | ||||||
|     virtual void on_mouseup(Layer*, MouseEvent&) override; |     virtual void on_mouseup(Layer*, MouseEvent&) override; | ||||||
|     virtual void on_mousemove(Layer*, MouseEvent&) override; |     virtual void on_mousemove(Layer*, MouseEvent&) override; | ||||||
| 
 | 
 | ||||||
|     virtual GUI::Widget* get_properties_widget() override; |     virtual ErrorOr<GUI::Widget*> get_properties_widget() override; | ||||||
|     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override { return Gfx::StandardCursor::Eyedropper; } |     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override { return Gfx::StandardCursor::Eyedropper; } | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|  |  | ||||||
|  | @ -177,22 +177,22 @@ bool PolygonalSelectTool::on_keydown(GUI::KeyEvent& key_event) | ||||||
|     return Tool::on_keydown(key_event); |     return Tool::on_keydown(key_event); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| GUI::Widget* PolygonalSelectTool::get_properties_widget() | ErrorOr<GUI::Widget*> PolygonalSelectTool::get_properties_widget() | ||||||
| { | { | ||||||
|     if (m_properties_widget) |     if (m_properties_widget) | ||||||
|         return m_properties_widget.ptr(); |         return m_properties_widget.ptr(); | ||||||
| 
 | 
 | ||||||
|     m_properties_widget = GUI::Widget::construct(); |     auto properties_widget = TRY(GUI::Widget::try_create()); | ||||||
|     m_properties_widget->set_layout<GUI::VerticalBoxLayout>(); |     (void)TRY(properties_widget->try_set_layout<GUI::VerticalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|     auto& mode_container = m_properties_widget->add<GUI::Widget>(); |     auto mode_container = TRY(properties_widget->try_add<GUI::Widget>()); | ||||||
|     mode_container.set_fixed_height(20); |     mode_container->set_fixed_height(20); | ||||||
|     mode_container.set_layout<GUI::HorizontalBoxLayout>(); |     (void)TRY(mode_container->try_set_layout<GUI::HorizontalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|     auto& mode_label = mode_container.add<GUI::Label>(); |     auto mode_label = TRY(mode_container->try_add<GUI::Label>()); | ||||||
|     mode_label.set_text("Mode:"); |     mode_label->set_text("Mode:"); | ||||||
|     mode_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); |     mode_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); | ||||||
|     mode_label.set_fixed_size(80, 20); |     mode_label->set_fixed_size(80, 20); | ||||||
| 
 | 
 | ||||||
|     static constexpr auto s_merge_mode_names = [] { |     static constexpr auto s_merge_mode_names = [] { | ||||||
|         Array<StringView, (int)Selection::MergeMode::__Count> names; |         Array<StringView, (int)Selection::MergeMode::__Count> names; | ||||||
|  | @ -217,17 +217,18 @@ GUI::Widget* PolygonalSelectTool::get_properties_widget() | ||||||
|         return names; |         return names; | ||||||
|     }(); |     }(); | ||||||
| 
 | 
 | ||||||
|     auto& mode_combo = mode_container.add<GUI::ComboBox>(); |     auto mode_combo = TRY(mode_container->try_add<GUI::ComboBox>()); | ||||||
|     mode_combo.set_only_allow_values_from_model(true); |     mode_combo->set_only_allow_values_from_model(true); | ||||||
|     mode_combo.set_model(*GUI::ItemListModel<StringView, decltype(s_merge_mode_names)>::create(s_merge_mode_names)); |     mode_combo->set_model(*GUI::ItemListModel<StringView, decltype(s_merge_mode_names)>::create(s_merge_mode_names)); | ||||||
|     mode_combo.set_selected_index((int)m_merge_mode); |     mode_combo->set_selected_index((int)m_merge_mode); | ||||||
|     mode_combo.on_change = [this](auto&&, GUI::ModelIndex const& index) { |     mode_combo->on_change = [this](auto&&, GUI::ModelIndex const& index) { | ||||||
|         VERIFY(index.row() >= 0); |         VERIFY(index.row() >= 0); | ||||||
|         VERIFY(index.row() < (int)Selection::MergeMode::__Count); |         VERIFY(index.row() < (int)Selection::MergeMode::__Count); | ||||||
| 
 | 
 | ||||||
|         m_merge_mode = (Selection::MergeMode)index.row(); |         m_merge_mode = (Selection::MergeMode)index.row(); | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|  |     m_properties_widget = properties_widget; | ||||||
|     return m_properties_widget.ptr(); |     return m_properties_widget.ptr(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -22,7 +22,7 @@ public: | ||||||
|     virtual void on_mousemove(Layer*, MouseEvent& event) override; |     virtual void on_mousemove(Layer*, MouseEvent& event) override; | ||||||
|     virtual bool on_keydown(GUI::KeyEvent&) override; |     virtual bool on_keydown(GUI::KeyEvent&) override; | ||||||
|     virtual void on_second_paint(Layer const*, GUI::PaintEvent&) override; |     virtual void on_second_paint(Layer const*, GUI::PaintEvent&) override; | ||||||
|     virtual GUI::Widget* get_properties_widget() override; |     virtual ErrorOr<GUI::Widget*> get_properties_widget() override; | ||||||
|     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override { return Gfx::StandardCursor::Crosshair; } |     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override { return Gfx::StandardCursor::Crosshair; } | ||||||
|     virtual Gfx::IntPoint point_position_to_preferred_cell(Gfx::FloatPoint position) const override; |     virtual Gfx::IntPoint point_position_to_preferred_cell(Gfx::FloatPoint position) const override; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -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<int>()); |     m_editor->draw_marching_ants(painter, rect_in_editor.to_rounded<int>()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| GUI::Widget* RectangleSelectTool::get_properties_widget() | ErrorOr<GUI::Widget*> RectangleSelectTool::get_properties_widget() | ||||||
| { | { | ||||||
|     if (m_properties_widget) { |     if (m_properties_widget) { | ||||||
|         return m_properties_widget.ptr(); |         return m_properties_widget.ptr(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     m_properties_widget = GUI::Widget::construct(); |     auto properties_widget = TRY(GUI::Widget::try_create()); | ||||||
|     m_properties_widget->set_layout<GUI::VerticalBoxLayout>(); |     (void)TRY(properties_widget->try_set_layout<GUI::VerticalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|     auto& feather_container = m_properties_widget->add<GUI::Widget>(); |     auto feather_container = TRY(properties_widget->try_add<GUI::Widget>()); | ||||||
|     feather_container.set_fixed_height(20); |     feather_container->set_fixed_height(20); | ||||||
|     feather_container.set_layout<GUI::HorizontalBoxLayout>(); |     (void)TRY(feather_container->try_set_layout<GUI::HorizontalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|     auto& feather_label = feather_container.add<GUI::Label>(); |     auto feather_label = TRY(feather_container->try_add<GUI::Label>()); | ||||||
|     feather_label.set_text("Feather:"); |     feather_label->set_text("Feather:"); | ||||||
|     feather_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); |     feather_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); | ||||||
|     feather_label.set_fixed_size(80, 20); |     feather_label->set_fixed_size(80, 20); | ||||||
| 
 | 
 | ||||||
|     int const feather_slider_max = 100; |     int const feather_slider_max = 100; | ||||||
|     auto& feather_slider = feather_container.add<GUI::ValueSlider>(Orientation::Horizontal, String::from_utf8_short_string("%"sv)); |     auto feather_slider = TRY(feather_container->try_add<GUI::ValueSlider>(Orientation::Horizontal, String::from_utf8_short_string("%"sv))); | ||||||
|     feather_slider.set_range(0, feather_slider_max); |     feather_slider->set_range(0, feather_slider_max); | ||||||
|     feather_slider.set_value((int)floorf(m_edge_feathering * (float)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; |         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<GUI::Widget>(); |     auto mode_container = TRY(properties_widget->try_add<GUI::Widget>()); | ||||||
|     mode_container.set_fixed_height(20); |     mode_container->set_fixed_height(20); | ||||||
|     mode_container.set_layout<GUI::HorizontalBoxLayout>(); |     (void)TRY(mode_container->try_set_layout<GUI::HorizontalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|     auto& mode_label = mode_container.add<GUI::Label>(); |     auto mode_label = TRY(mode_container->try_add<GUI::Label>()); | ||||||
|     mode_label.set_text("Mode:"); |     mode_label->set_text("Mode:"); | ||||||
|     mode_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); |     mode_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); | ||||||
|     mode_label.set_fixed_size(80, 20); |     mode_label->set_fixed_size(80, 20); | ||||||
| 
 | 
 | ||||||
|     for (int i = 0; i < (int)Selection::MergeMode::__Count; i++) { |     for (int i = 0; i < (int)Selection::MergeMode::__Count; i++) { | ||||||
|         switch ((Selection::MergeMode)i) { |         switch ((Selection::MergeMode)i) { | ||||||
|         case Selection::MergeMode::Set: |         case Selection::MergeMode::Set: | ||||||
|             m_merge_mode_names.append("Set"); |             TRY(m_merge_mode_names.try_append("Set")); | ||||||
|             break; |             break; | ||||||
|         case Selection::MergeMode::Add: |         case Selection::MergeMode::Add: | ||||||
|             m_merge_mode_names.append("Add"); |             TRY(m_merge_mode_names.try_append("Add")); | ||||||
|             break; |             break; | ||||||
|         case Selection::MergeMode::Subtract: |         case Selection::MergeMode::Subtract: | ||||||
|             m_merge_mode_names.append("Subtract"); |             TRY(m_merge_mode_names.try_append("Subtract")); | ||||||
|             break; |             break; | ||||||
|         case Selection::MergeMode::Intersect: |         case Selection::MergeMode::Intersect: | ||||||
|             m_merge_mode_names.append("Intersect"); |             TRY(m_merge_mode_names.try_append("Intersect")); | ||||||
|             break; |             break; | ||||||
|         default: |         default: | ||||||
|             VERIFY_NOT_REACHED(); |             VERIFY_NOT_REACHED(); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     auto& mode_combo = mode_container.add<GUI::ComboBox>(); |     auto mode_combo = TRY(mode_container->try_add<GUI::ComboBox>()); | ||||||
|     mode_combo.set_only_allow_values_from_model(true); |     mode_combo->set_only_allow_values_from_model(true); | ||||||
|     mode_combo.set_model(*GUI::ItemListModel<DeprecatedString>::create(m_merge_mode_names)); |     mode_combo->set_model(*GUI::ItemListModel<DeprecatedString>::create(m_merge_mode_names)); | ||||||
|     mode_combo.set_selected_index((int)m_merge_mode); |     mode_combo->set_selected_index((int)m_merge_mode); | ||||||
|     mode_combo.on_change = [this](auto&&, GUI::ModelIndex const& index) { |     mode_combo->on_change = [this](auto&&, GUI::ModelIndex const& index) { | ||||||
|         VERIFY(index.row() >= 0); |         VERIFY(index.row() >= 0); | ||||||
|         VERIFY(index.row() < (int)Selection::MergeMode::__Count); |         VERIFY(index.row() < (int)Selection::MergeMode::__Count); | ||||||
| 
 | 
 | ||||||
|         m_merge_mode = (Selection::MergeMode)index.row(); |         m_merge_mode = (Selection::MergeMode)index.row(); | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|  |     m_properties_widget = properties_widget; | ||||||
|     return m_properties_widget.ptr(); |     return m_properties_widget.ptr(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -26,7 +26,7 @@ public: | ||||||
|     virtual bool on_keydown(GUI::KeyEvent&) override; |     virtual bool on_keydown(GUI::KeyEvent&) override; | ||||||
|     virtual void on_keyup(GUI::KeyEvent&) override; |     virtual void on_keyup(GUI::KeyEvent&) override; | ||||||
|     virtual void on_second_paint(Layer const*, GUI::PaintEvent&) override; |     virtual void on_second_paint(Layer const*, GUI::PaintEvent&) override; | ||||||
|     virtual GUI::Widget* get_properties_widget() override; |     virtual ErrorOr<GUI::Widget*> get_properties_widget() override; | ||||||
|     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override { return Gfx::StandardCursor::Crosshair; } |     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override { return Gfx::StandardCursor::Crosshair; } | ||||||
|     virtual Gfx::IntPoint point_position_to_preferred_cell(Gfx::FloatPoint position) const override; |     virtual Gfx::IntPoint point_position_to_preferred_cell(Gfx::FloatPoint position) const override; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -140,34 +140,34 @@ bool RectangleTool::on_keydown(GUI::KeyEvent& event) | ||||||
|     return Tool::on_keydown(event); |     return Tool::on_keydown(event); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| GUI::Widget* RectangleTool::get_properties_widget() | ErrorOr<GUI::Widget*> RectangleTool::get_properties_widget() | ||||||
| { | { | ||||||
|     if (!m_properties_widget) { |     if (!m_properties_widget) { | ||||||
|         m_properties_widget = GUI::Widget::construct(); |         auto properties_widget = TRY(GUI::Widget::try_create()); | ||||||
|         m_properties_widget->set_layout<GUI::VerticalBoxLayout>(); |         (void)TRY(properties_widget->try_set_layout<GUI::VerticalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         auto& thickness_or_radius_container = m_properties_widget->add<GUI::Widget>(); |         auto thickness_or_radius_container = TRY(properties_widget->try_add<GUI::Widget>()); | ||||||
|         thickness_or_radius_container.set_fixed_height(20); |         thickness_or_radius_container->set_fixed_height(20); | ||||||
|         thickness_or_radius_container.set_layout<GUI::HorizontalBoxLayout>(); |         (void)TRY(thickness_or_radius_container->try_set_layout<GUI::HorizontalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         auto& thickness_or_radius_label = thickness_or_radius_container.add<GUI::Label>(); |         auto thickness_or_radius_label = TRY(thickness_or_radius_container->try_add<GUI::Label>()); | ||||||
|         thickness_or_radius_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); |         thickness_or_radius_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); | ||||||
|         thickness_or_radius_label.set_fixed_size(80, 20); |         thickness_or_radius_label->set_fixed_size(80, 20); | ||||||
| 
 | 
 | ||||||
|         auto& thickness_or_radius_slider = thickness_or_radius_container.add<GUI::ValueSlider>(Orientation::Horizontal, String::from_utf8_short_string("px"sv)); |         auto thickness_or_radius_slider = TRY(thickness_or_radius_container->try_add<GUI::ValueSlider>(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) { |             if (m_fill_mode == FillMode::RoundedCorners) { | ||||||
|                 m_corner_radius = value; |                 m_corner_radius = value; | ||||||
|             } else |             } else | ||||||
|                 m_thickness = value; |                 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) { |             auto update_values = [&](auto label, int value, int range_min, int range_max = 10) { | ||||||
|                 thickness_or_radius_label.set_text(label); |                 thickness_or_radius_label->set_text(label); | ||||||
|                 thickness_or_radius_slider.set_range(range_min, range_max); |                 thickness_or_radius_slider->set_range(range_min, range_max); | ||||||
|                 thickness_or_radius_slider.set_value(value); |                 thickness_or_radius_slider->set_value(value); | ||||||
|             }; |             }; | ||||||
|             if (m_fill_mode == FillMode::RoundedCorners) |             if (m_fill_mode == FillMode::RoundedCorners) | ||||||
|                 update_values("Radius:", m_corner_radius, 0, 50); |                 update_values("Radius:", m_corner_radius, 0, 50); | ||||||
|  | @ -176,67 +176,67 @@ GUI::Widget* RectangleTool::get_properties_widget() | ||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
|         update_slider(); |         update_slider(); | ||||||
|         set_primary_slider(&thickness_or_radius_slider); |         set_primary_slider(thickness_or_radius_slider); | ||||||
| 
 | 
 | ||||||
|         auto& mode_container = m_properties_widget->add<GUI::Widget>(); |         auto mode_container = TRY(properties_widget->try_add<GUI::Widget>()); | ||||||
|         mode_container.set_fixed_height(90); |         mode_container->set_fixed_height(90); | ||||||
|         mode_container.set_layout<GUI::HorizontalBoxLayout>(); |         (void)TRY(mode_container->try_set_layout<GUI::HorizontalBoxLayout>()); | ||||||
|         auto& mode_label = mode_container.add<GUI::Label>("Mode:"); |         auto mode_label = TRY(mode_container->try_add<GUI::Label>("Mode:")); | ||||||
|         mode_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); |         mode_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); | ||||||
|         mode_label.set_fixed_size(30, 20); |         mode_label->set_fixed_size(30, 20); | ||||||
| 
 | 
 | ||||||
|         auto& mode_radio_container = mode_container.add<GUI::Widget>(); |         auto mode_radio_container = TRY(mode_container->try_add<GUI::Widget>()); | ||||||
|         mode_radio_container.set_layout<GUI::VerticalBoxLayout>(); |         (void)TRY(mode_radio_container->try_set_layout<GUI::VerticalBoxLayout>()); | ||||||
|         auto& outline_mode_radio = mode_radio_container.add<GUI::RadioButton>(String::from_utf8_short_string("Outline"sv)); |         auto outline_mode_radio = TRY(mode_radio_container->try_add<GUI::RadioButton>(String::from_utf8_short_string("Outline"sv))); | ||||||
|         auto& fill_mode_radio = mode_radio_container.add<GUI::RadioButton>(String::from_utf8_short_string("Fill"sv)); |         auto fill_mode_radio = TRY(mode_radio_container->try_add<GUI::RadioButton>(String::from_utf8_short_string("Fill"sv))); | ||||||
|         auto& gradient_mode_radio = mode_radio_container.add<GUI::RadioButton>(String::from_utf8("Gradient"sv).release_value_but_fixme_should_propagate_errors()); |         auto gradient_mode_radio = TRY(mode_radio_container->try_add<GUI::RadioButton>(TRY(String::from_utf8("Gradient"sv)))); | ||||||
|         mode_radio_container.set_fixed_width(70); |         mode_radio_container->set_fixed_width(70); | ||||||
| 
 | 
 | ||||||
|         auto& rounded_corners_mode_radio = mode_radio_container.add<GUI::RadioButton>(String::from_utf8_short_string("Rounded"sv)); |         auto rounded_corners_mode_radio = TRY(mode_radio_container->try_add<GUI::RadioButton>(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; |             m_fill_mode = FillMode::Outline; | ||||||
|             update_slider(); |             update_slider(); | ||||||
|         }; |         }; | ||||||
|         fill_mode_radio.on_checked = [&, update_slider](bool) { |         fill_mode_radio->on_checked = [this, update_slider](bool) { | ||||||
|             m_fill_mode = FillMode::Fill; |             m_fill_mode = FillMode::Fill; | ||||||
|             update_slider(); |             update_slider(); | ||||||
|         }; |         }; | ||||||
|         gradient_mode_radio.on_checked = [&, update_slider](bool) { |         gradient_mode_radio->on_checked = [this, update_slider](bool) { | ||||||
|             m_fill_mode = FillMode::Gradient; |             m_fill_mode = FillMode::Gradient; | ||||||
|             update_slider(); |             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; |             m_fill_mode = FillMode::RoundedCorners; | ||||||
|             update_slider(); |             update_slider(); | ||||||
|         }; |         }; | ||||||
|         outline_mode_radio.set_checked(true); |         outline_mode_radio->set_checked(true); | ||||||
| 
 | 
 | ||||||
|         auto& mode_extras_container = mode_container.add<GUI::Widget>(); |         auto mode_extras_container = TRY(mode_container->try_add<GUI::Widget>()); | ||||||
|         mode_extras_container.set_layout<GUI::VerticalBoxLayout>(); |         (void)TRY(mode_extras_container->try_set_layout<GUI::VerticalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         auto& aa_enable_checkbox = mode_extras_container.add<GUI::CheckBox>(String::from_utf8("Anti-alias"sv).release_value_but_fixme_should_propagate_errors()); |         auto aa_enable_checkbox = TRY(mode_extras_container->try_add<GUI::CheckBox>(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; |             m_antialias_enabled = checked; | ||||||
|         }; |         }; | ||||||
|         aa_enable_checkbox.set_checked(true); |         aa_enable_checkbox->set_checked(true); | ||||||
| 
 | 
 | ||||||
|         auto& aspect_container = mode_extras_container.add<GUI::Widget>(); |         auto aspect_container = TRY(mode_extras_container->try_add<GUI::Widget>()); | ||||||
|         aspect_container.set_layout<GUI::VerticalBoxLayout>(); |         (void)TRY(aspect_container->try_set_layout<GUI::VerticalBoxLayout>()); | ||||||
|         aspect_container.set_fixed_width(75); |         aspect_container->set_fixed_width(75); | ||||||
| 
 | 
 | ||||||
|         auto& aspect_label = aspect_container.add<GUI::Label>("Aspect Ratio:"); |         auto aspect_label = TRY(aspect_container->try_add<GUI::Label>("Aspect Ratio:")); | ||||||
|         aspect_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); |         aspect_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); | ||||||
|         aspect_label.set_fixed_size(75, 20); |         aspect_label->set_fixed_size(75, 20); | ||||||
| 
 | 
 | ||||||
|         auto& aspect_fields_container = aspect_container.add<GUI::Widget>(); |         auto aspect_fields_container = TRY(aspect_container->try_add<GUI::Widget>()); | ||||||
|         aspect_fields_container.set_fixed_width(75); |         aspect_fields_container->set_fixed_width(75); | ||||||
|         aspect_fields_container.set_layout<GUI::HorizontalBoxLayout>(); |         (void)TRY(aspect_fields_container->try_set_layout<GUI::HorizontalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         m_aspect_w_textbox = aspect_fields_container.add<GUI::TextBox>(); |         m_aspect_w_textbox = TRY(aspect_fields_container->try_add<GUI::TextBox>()); | ||||||
|         m_aspect_w_textbox->set_fixed_height(20); |         m_aspect_w_textbox->set_fixed_height(20); | ||||||
|         m_aspect_w_textbox->set_fixed_width(25); |         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 x = m_aspect_w_textbox->text().to_int().value_or(0); | ||||||
|             auto y = m_aspect_h_textbox->text().to_int().value_or(0); |             auto y = m_aspect_h_textbox->text().to_int().value_or(0); | ||||||
|             if (x > 0 && y > 0) { |             if (x > 0 && y > 0) { | ||||||
|  | @ -246,14 +246,16 @@ GUI::Widget* RectangleTool::get_properties_widget() | ||||||
|             } |             } | ||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
|         auto& multiply_label = aspect_fields_container.add<GUI::Label>("x"); |         auto multiply_label = TRY(aspect_fields_container->try_add<GUI::Label>("x")); | ||||||
|         multiply_label.set_text_alignment(Gfx::TextAlignment::Center); |         multiply_label->set_text_alignment(Gfx::TextAlignment::Center); | ||||||
|         multiply_label.set_fixed_size(10, 20); |         multiply_label->set_fixed_size(10, 20); | ||||||
| 
 | 
 | ||||||
|         m_aspect_h_textbox = aspect_fields_container.add<GUI::TextBox>(); |         m_aspect_h_textbox = TRY(aspect_fields_container->try_add<GUI::TextBox>()); | ||||||
|         m_aspect_h_textbox->set_fixed_height(20); |         m_aspect_h_textbox->set_fixed_height(20); | ||||||
|         m_aspect_h_textbox->set_fixed_width(25); |         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(); |     return m_properties_widget.ptr(); | ||||||
|  |  | ||||||
|  | @ -24,7 +24,7 @@ public: | ||||||
|     virtual void on_mouseup(Layer*, MouseEvent&) override; |     virtual void on_mouseup(Layer*, MouseEvent&) override; | ||||||
|     virtual void on_second_paint(Layer const*, GUI::PaintEvent&) override; |     virtual void on_second_paint(Layer const*, GUI::PaintEvent&) override; | ||||||
|     virtual bool on_keydown(GUI::KeyEvent&) override; |     virtual bool on_keydown(GUI::KeyEvent&) override; | ||||||
|     virtual GUI::Widget* get_properties_widget() override; |     virtual ErrorOr<GUI::Widget*> get_properties_widget() override; | ||||||
|     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override { return Gfx::StandardCursor::Crosshair; } |     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override { return Gfx::StandardCursor::Crosshair; } | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|  |  | ||||||
|  | @ -90,45 +90,46 @@ void SprayTool::on_mouseup(Layer*, MouseEvent&) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| GUI::Widget* SprayTool::get_properties_widget() | ErrorOr<GUI::Widget*> SprayTool::get_properties_widget() | ||||||
| { | { | ||||||
|     if (!m_properties_widget) { |     if (!m_properties_widget) { | ||||||
|         m_properties_widget = GUI::Widget::construct(); |         auto properties_widget = TRY(GUI::Widget::try_create()); | ||||||
|         m_properties_widget->set_layout<GUI::VerticalBoxLayout>(); |         (void)TRY(properties_widget->try_set_layout<GUI::VerticalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         auto& size_container = m_properties_widget->add<GUI::Widget>(); |         auto size_container = TRY(properties_widget->try_add<GUI::Widget>()); | ||||||
|         size_container.set_fixed_height(20); |         size_container->set_fixed_height(20); | ||||||
|         size_container.set_layout<GUI::HorizontalBoxLayout>(); |         (void)TRY(size_container->try_set_layout<GUI::HorizontalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         auto& size_label = size_container.add<GUI::Label>("Size:"); |         auto size_label = TRY(size_container->try_add<GUI::Label>("Size:")); | ||||||
|         size_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); |         size_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); | ||||||
|         size_label.set_fixed_size(80, 20); |         size_label->set_fixed_size(80, 20); | ||||||
| 
 | 
 | ||||||
|         auto& size_slider = size_container.add<GUI::ValueSlider>(Orientation::Horizontal, String::from_utf8_short_string("px"sv)); |         auto size_slider = TRY(size_container->try_add<GUI::ValueSlider>(Orientation::Horizontal, String::from_utf8_short_string("px"sv))); | ||||||
|         size_slider.set_range(1, 20); |         size_slider->set_range(1, 20); | ||||||
|         size_slider.set_value(m_thickness); |         size_slider->set_value(m_thickness); | ||||||
| 
 | 
 | ||||||
|         size_slider.on_change = [&](int value) { |         size_slider->on_change = [this](int value) { | ||||||
|             m_thickness = value; |             m_thickness = value; | ||||||
|         }; |         }; | ||||||
|         set_primary_slider(&size_slider); |         set_primary_slider(size_slider); | ||||||
| 
 | 
 | ||||||
|         auto& density_container = m_properties_widget->add<GUI::Widget>(); |         auto density_container = TRY(properties_widget->try_add<GUI::Widget>()); | ||||||
|         density_container.set_fixed_height(20); |         density_container->set_fixed_height(20); | ||||||
|         density_container.set_layout<GUI::HorizontalBoxLayout>(); |         (void)TRY(density_container->try_set_layout<GUI::HorizontalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         auto& density_label = density_container.add<GUI::Label>("Density:"); |         auto density_label = TRY(density_container->try_add<GUI::Label>("Density:")); | ||||||
|         density_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); |         density_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); | ||||||
|         density_label.set_fixed_size(80, 20); |         density_label->set_fixed_size(80, 20); | ||||||
| 
 | 
 | ||||||
|         auto& density_slider = density_container.add<GUI::ValueSlider>(Orientation::Horizontal, String::from_utf8_short_string("%"sv)); |         auto density_slider = TRY(density_container->try_add<GUI::ValueSlider>(Orientation::Horizontal, String::from_utf8_short_string("%"sv))); | ||||||
|         density_slider.set_range(1, 100); |         density_slider->set_range(1, 100); | ||||||
|         density_slider.set_value(m_density); |         density_slider->set_value(m_density); | ||||||
| 
 | 
 | ||||||
|         density_slider.on_change = [&](int value) { |         density_slider->on_change = [this](int value) { | ||||||
|             m_density = value; |             m_density = value; | ||||||
|         }; |         }; | ||||||
|         set_secondary_slider(&density_slider); |         set_secondary_slider(density_slider); | ||||||
|  |         m_properties_widget = properties_widget; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return m_properties_widget.ptr(); |     return m_properties_widget.ptr(); | ||||||
|  |  | ||||||
|  | @ -22,7 +22,7 @@ public: | ||||||
|     virtual void on_mousedown(Layer*, MouseEvent&) override; |     virtual void on_mousedown(Layer*, MouseEvent&) override; | ||||||
|     virtual void on_mouseup(Layer*, MouseEvent&) override; |     virtual void on_mouseup(Layer*, MouseEvent&) override; | ||||||
|     virtual void on_mousemove(Layer*, MouseEvent&) override; |     virtual void on_mousemove(Layer*, MouseEvent&) override; | ||||||
|     virtual GUI::Widget* get_properties_widget() override; |     virtual ErrorOr<GUI::Widget*> get_properties_widget() override; | ||||||
|     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override { return Gfx::StandardCursor::Crosshair; } |     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override { return Gfx::StandardCursor::Crosshair; } | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|  |  | ||||||
|  | @ -97,21 +97,21 @@ void TextTool::on_mousedown(Layer*, MouseEvent& event) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| GUI::Widget* TextTool::get_properties_widget() | ErrorOr<GUI::Widget*> TextTool::get_properties_widget() | ||||||
| { | { | ||||||
|     if (m_properties_widget) |     if (m_properties_widget) | ||||||
|         return m_properties_widget.ptr(); |         return m_properties_widget.ptr(); | ||||||
| 
 | 
 | ||||||
|     m_properties_widget = GUI::Widget::construct(); |     auto properties_widget = TRY(GUI::Widget::try_create()); | ||||||
|     m_properties_widget->set_layout<GUI::VerticalBoxLayout>(); |     (void)TRY(properties_widget->try_set_layout<GUI::VerticalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|     auto& font_header = m_properties_widget->add<GUI::Label>("Current Font:"); |     auto font_header = TRY(properties_widget->try_add<GUI::Label>("Current Font:")); | ||||||
|     font_header.set_text_alignment(Gfx::TextAlignment::CenterLeft); |     font_header->set_text_alignment(Gfx::TextAlignment::CenterLeft); | ||||||
| 
 | 
 | ||||||
|     m_font_label = m_properties_widget->add<GUI::Label>(m_selected_font->human_readable_name()); |     m_font_label = TRY(properties_widget->try_add<GUI::Label>(m_selected_font->human_readable_name())); | ||||||
| 
 | 
 | ||||||
|     auto& change_font_button = m_properties_widget->add<GUI::Button>(String::from_utf8("Change Font..."sv).release_value_but_fixme_should_propagate_errors()); |     auto change_font_button = TRY(properties_widget->try_add<GUI::Button>(TRY(String::from_utf8("Change Font..."sv)))); | ||||||
|     change_font_button.on_click = [&](auto) { |     change_font_button->on_click = [this](auto) { | ||||||
|         auto picker = GUI::FontPicker::construct(nullptr, m_selected_font, false); |         auto picker = GUI::FontPicker::construct(nullptr, m_selected_font, false); | ||||||
|         if (picker->exec() == GUI::Dialog::ExecResult::OK) { |         if (picker->exec() == GUI::Dialog::ExecResult::OK) { | ||||||
|             m_font_label->set_text(picker->font()->human_readable_name()); |             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_editor->set_focus(true); | ||||||
|         } |         } | ||||||
|     }; |     }; | ||||||
|  | 
 | ||||||
|  |     m_properties_widget = properties_widget; | ||||||
|     return m_properties_widget.ptr(); |     return m_properties_widget.ptr(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -40,7 +40,7 @@ public: | ||||||
|     virtual void on_primary_color_change(Color) override; |     virtual void on_primary_color_change(Color) override; | ||||||
|     virtual void on_tool_deactivation() override; |     virtual void on_tool_deactivation() override; | ||||||
|     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override; |     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override; | ||||||
|     virtual GUI::Widget* get_properties_widget() override; |     virtual ErrorOr<GUI::Widget*> get_properties_widget() override; | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     virtual StringView tool_name() const override { return "Text Tool"sv; } |     virtual StringView tool_name() const override { return "Text Tool"sv; } | ||||||
|  |  | ||||||
|  | @ -67,7 +67,7 @@ public: | ||||||
|     virtual void on_secondary_color_change(Color) { } |     virtual void on_secondary_color_change(Color) { } | ||||||
|     virtual void on_tool_activation() { } |     virtual void on_tool_activation() { } | ||||||
|     virtual void on_tool_deactivation() { } |     virtual void on_tool_deactivation() { } | ||||||
|     virtual GUI::Widget* get_properties_widget() { return nullptr; } |     virtual ErrorOr<GUI::Widget*> get_properties_widget() { return nullptr; } | ||||||
|     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() { return Gfx::StandardCursor::None; } |     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() { return Gfx::StandardCursor::None; } | ||||||
|     virtual Gfx::IntPoint point_position_to_preferred_cell(Gfx::FloatPoint position) const { return position.to_type<int>(); } |     virtual Gfx::IntPoint point_position_to_preferred_cell(Gfx::FloatPoint position) const { return position.to_type<int>(); } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -64,71 +64,72 @@ void WandSelectTool::on_mousedown(Layer* layer, MouseEvent& event) | ||||||
|     m_editor->did_complete_action(tool_name()); |     m_editor->did_complete_action(tool_name()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| GUI::Widget* WandSelectTool::get_properties_widget() | ErrorOr<GUI::Widget*> WandSelectTool::get_properties_widget() | ||||||
| { | { | ||||||
|     if (m_properties_widget) { |     if (m_properties_widget) { | ||||||
|         return m_properties_widget.ptr(); |         return m_properties_widget.ptr(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     m_properties_widget = GUI::Widget::construct(); |     auto properties_widget = TRY(GUI::Widget::try_create()); | ||||||
|     m_properties_widget->set_layout<GUI::VerticalBoxLayout>(); |     (void)TRY(properties_widget->try_set_layout<GUI::VerticalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|     auto& threshold_container = m_properties_widget->add<GUI::Widget>(); |     auto threshold_container = TRY(properties_widget->try_add<GUI::Widget>()); | ||||||
|     threshold_container.set_fixed_height(20); |     threshold_container->set_fixed_height(20); | ||||||
|     threshold_container.set_layout<GUI::HorizontalBoxLayout>(); |     (void)TRY(threshold_container->try_set_layout<GUI::HorizontalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|     auto& threshold_label = threshold_container.add<GUI::Label>("Threshold:"); |     auto threshold_label = TRY(threshold_container->try_add<GUI::Label>("Threshold:")); | ||||||
|     threshold_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); |     threshold_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); | ||||||
|     threshold_label.set_fixed_size(80, 20); |     threshold_label->set_fixed_size(80, 20); | ||||||
| 
 | 
 | ||||||
|     auto& threshold_slider = threshold_container.add<GUI::ValueSlider>(Orientation::Horizontal, String::from_utf8_short_string("%"sv)); |     auto threshold_slider = TRY(threshold_container->try_add<GUI::ValueSlider>(Orientation::Horizontal, String::from_utf8_short_string("%"sv))); | ||||||
|     threshold_slider.set_range(0, 100); |     threshold_slider->set_range(0, 100); | ||||||
|     threshold_slider.set_value(m_threshold); |     threshold_slider->set_value(m_threshold); | ||||||
| 
 | 
 | ||||||
|     threshold_slider.on_change = [&](int value) { |     threshold_slider->on_change = [this](int value) { | ||||||
|         m_threshold = value; |         m_threshold = value; | ||||||
|     }; |     }; | ||||||
|     set_primary_slider(&threshold_slider); |     set_primary_slider(threshold_slider); | ||||||
| 
 | 
 | ||||||
|     auto& mode_container = m_properties_widget->add<GUI::Widget>(); |     auto mode_container = TRY(properties_widget->try_add<GUI::Widget>()); | ||||||
|     mode_container.set_fixed_height(20); |     mode_container->set_fixed_height(20); | ||||||
|     mode_container.set_layout<GUI::HorizontalBoxLayout>(); |     (void)TRY(mode_container->try_set_layout<GUI::HorizontalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|     auto& mode_label = mode_container.add<GUI::Label>(); |     auto mode_label = TRY(mode_container->try_add<GUI::Label>()); | ||||||
|     mode_label.set_text("Mode:"); |     mode_label->set_text("Mode:"); | ||||||
|     mode_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); |     mode_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); | ||||||
|     mode_label.set_fixed_size(80, 20); |     mode_label->set_fixed_size(80, 20); | ||||||
| 
 | 
 | ||||||
|     for (int i = 0; i < (int)Selection::MergeMode::__Count; i++) { |     for (int i = 0; i < (int)Selection::MergeMode::__Count; i++) { | ||||||
|         switch ((Selection::MergeMode)i) { |         switch ((Selection::MergeMode)i) { | ||||||
|         case Selection::MergeMode::Set: |         case Selection::MergeMode::Set: | ||||||
|             m_merge_mode_names.append("Set"); |             TRY(m_merge_mode_names.try_append("Set")); | ||||||
|             break; |             break; | ||||||
|         case Selection::MergeMode::Add: |         case Selection::MergeMode::Add: | ||||||
|             m_merge_mode_names.append("Add"); |             TRY(m_merge_mode_names.try_append("Add")); | ||||||
|             break; |             break; | ||||||
|         case Selection::MergeMode::Subtract: |         case Selection::MergeMode::Subtract: | ||||||
|             m_merge_mode_names.append("Subtract"); |             TRY(m_merge_mode_names.try_append("Subtract")); | ||||||
|             break; |             break; | ||||||
|         case Selection::MergeMode::Intersect: |         case Selection::MergeMode::Intersect: | ||||||
|             m_merge_mode_names.append("Intersect"); |             TRY(m_merge_mode_names.try_append("Intersect")); | ||||||
|             break; |             break; | ||||||
|         default: |         default: | ||||||
|             VERIFY_NOT_REACHED(); |             VERIFY_NOT_REACHED(); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     auto& mode_combo = mode_container.add<GUI::ComboBox>(); |     auto mode_combo = TRY(mode_container->try_add<GUI::ComboBox>()); | ||||||
|     mode_combo.set_only_allow_values_from_model(true); |     mode_combo->set_only_allow_values_from_model(true); | ||||||
|     mode_combo.set_model(*GUI::ItemListModel<DeprecatedString>::create(m_merge_mode_names)); |     mode_combo->set_model(*GUI::ItemListModel<DeprecatedString>::create(m_merge_mode_names)); | ||||||
|     mode_combo.set_selected_index((int)m_merge_mode); |     mode_combo->set_selected_index((int)m_merge_mode); | ||||||
|     mode_combo.on_change = [this](auto&&, GUI::ModelIndex const& index) { |     mode_combo->on_change = [this](auto&&, GUI::ModelIndex const& index) { | ||||||
|         VERIFY(index.row() >= 0); |         VERIFY(index.row() >= 0); | ||||||
|         VERIFY(index.row() < (int)Selection::MergeMode::__Count); |         VERIFY(index.row() < (int)Selection::MergeMode::__Count); | ||||||
| 
 | 
 | ||||||
|         m_merge_mode = (Selection::MergeMode)index.row(); |         m_merge_mode = (Selection::MergeMode)index.row(); | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|  |     m_properties_widget = properties_widget; | ||||||
|     return m_properties_widget.ptr(); |     return m_properties_widget.ptr(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -23,7 +23,7 @@ public: | ||||||
| 
 | 
 | ||||||
|     virtual void on_mousedown(Layer*, MouseEvent& event) override; |     virtual void on_mousedown(Layer*, MouseEvent& event) override; | ||||||
|     virtual bool on_keydown(GUI::KeyEvent&) override; |     virtual bool on_keydown(GUI::KeyEvent&) override; | ||||||
|     virtual GUI::Widget* get_properties_widget() override; |     virtual ErrorOr<GUI::Widget*> get_properties_widget() override; | ||||||
|     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override { return Gfx::StandardCursor::Crosshair; } |     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override { return Gfx::StandardCursor::Crosshair; } | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|  |  | ||||||
|  | @ -23,28 +23,29 @@ void ZoomTool::on_mousedown(Layer*, MouseEvent& event) | ||||||
|     m_editor->scale_centered(new_scale, raw_event.position()); |     m_editor->scale_centered(new_scale, raw_event.position()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| GUI::Widget* ZoomTool::get_properties_widget() | ErrorOr<GUI::Widget*> ZoomTool::get_properties_widget() | ||||||
| { | { | ||||||
|     if (!m_properties_widget) { |     if (!m_properties_widget) { | ||||||
|         m_properties_widget = GUI::Widget::construct(); |         auto properties_widget = TRY(GUI::Widget::try_create()); | ||||||
|         m_properties_widget->set_layout<GUI::VerticalBoxLayout>(); |         (void)TRY(properties_widget->try_set_layout<GUI::VerticalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         auto& sensitivity_container = m_properties_widget->add<GUI::Widget>(); |         auto sensitivity_container = TRY(properties_widget->try_add<GUI::Widget>()); | ||||||
|         sensitivity_container.set_fixed_height(20); |         sensitivity_container->set_fixed_height(20); | ||||||
|         sensitivity_container.set_layout<GUI::HorizontalBoxLayout>(); |         (void)TRY(sensitivity_container->try_set_layout<GUI::HorizontalBoxLayout>()); | ||||||
| 
 | 
 | ||||||
|         auto& sensitivity_label = sensitivity_container.add<GUI::Label>("Sensitivity:"); |         auto sensitivity_label = TRY(sensitivity_container->try_add<GUI::Label>("Sensitivity:")); | ||||||
|         sensitivity_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); |         sensitivity_label->set_text_alignment(Gfx::TextAlignment::CenterLeft); | ||||||
|         sensitivity_label.set_fixed_size(80, 20); |         sensitivity_label->set_fixed_size(80, 20); | ||||||
| 
 | 
 | ||||||
|         auto& sensitivity_slider = sensitivity_container.add<GUI::ValueSlider>(Orientation::Horizontal, String::from_utf8_short_string("%"sv)); |         auto sensitivity_slider = TRY(sensitivity_container->try_add<GUI::ValueSlider>(Orientation::Horizontal, String::from_utf8_short_string("%"sv))); | ||||||
|         sensitivity_slider.set_range(1, 100); |         sensitivity_slider->set_range(1, 100); | ||||||
|         sensitivity_slider.set_value(100 * m_sensitivity); |         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; |             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(); |     return m_properties_widget.ptr(); | ||||||
|  |  | ||||||
|  | @ -18,7 +18,7 @@ public: | ||||||
|     virtual ~ZoomTool() override = default; |     virtual ~ZoomTool() override = default; | ||||||
| 
 | 
 | ||||||
|     virtual void on_mousedown(Layer*, MouseEvent&) override; |     virtual void on_mousedown(Layer*, MouseEvent&) override; | ||||||
|     virtual GUI::Widget* get_properties_widget() override; |     virtual ErrorOr<GUI::Widget*> get_properties_widget() override; | ||||||
|     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override { return Gfx::StandardCursor::Zoom; } |     virtual Variant<Gfx::StandardCursor, NonnullRefPtr<Gfx::Bitmap>> cursor() override { return Gfx::StandardCursor::Zoom; } | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Karol Kosek
						Karol Kosek