From ec73247e90a05d96cb16b5c85b7e41bb32e9d2a7 Mon Sep 17 00:00:00 2001 From: Mustafa Quraish Date: Tue, 7 Sep 2021 23:25:15 -0400 Subject: [PATCH] PixelPaint: Make EraseTool inherit from BrushTool This removes all the code to handle events that was essentially duplicated from BrushTool anyway :^) I've also renamed "thickness"->"size" to have consistent terminology. --- .../Applications/PixelPaint/EraseTool.cpp | 91 ++++++------------- Userland/Applications/PixelPaint/EraseTool.h | 15 ++- 2 files changed, 33 insertions(+), 73 deletions(-) diff --git a/Userland/Applications/PixelPaint/EraseTool.cpp b/Userland/Applications/PixelPaint/EraseTool.cpp index cf2881fac1c..88f2cb32697 100644 --- a/Userland/Applications/PixelPaint/EraseTool.cpp +++ b/Userland/Applications/PixelPaint/EraseTool.cpp @@ -1,5 +1,6 @@ /* * Copyright (c) 2018-2020, Andreas Kling + * Copyright (c) 2021, Mustafa Quraish * * SPDX-License-Identifier: BSD-2-Clause */ @@ -26,89 +27,49 @@ EraseTool::~EraseTool() { } -Gfx::IntRect EraseTool::build_rect(Gfx::IntPoint const& pos, Gfx::IntRect const& widget_rect) -{ - const int eraser_size = m_thickness; - const int eraser_radius = eraser_size / 2; - const auto ex = pos.x(); - const auto ey = pos.y(); - return Gfx::IntRect(ex - eraser_radius, ey - eraser_radius, eraser_size, eraser_size).intersected(widget_rect); -} - -void EraseTool::on_mousedown(Layer* layer, MouseEvent& event) -{ - if (!layer) - return; - - auto& layer_event = event.layer_event(); - if (layer_event.button() != GUI::MouseButton::Left && layer_event.button() != GUI::MouseButton::Right) - return; - Gfx::IntRect r = build_rect(layer_event.position(), layer->rect()); - GUI::Painter painter(layer->bitmap()); - painter.clear_rect(r, get_color()); - layer->did_modify_bitmap(r.inflated(2, 2)); -} - -void EraseTool::on_mousemove(Layer* layer, MouseEvent& event) -{ - if (!layer) - return; - - auto& layer_event = event.layer_event(); - if (layer_event.buttons() & GUI::MouseButton::Left || layer_event.buttons() & GUI::MouseButton::Right) { - Gfx::IntRect r = build_rect(layer_event.position(), layer->rect()); - GUI::Painter painter(layer->bitmap()); - painter.clear_rect(r, get_color()); - layer->did_modify_bitmap(r.inflated(2, 2)); - } -} - -void EraseTool::on_mouseup(Layer* layer, MouseEvent& event) -{ - if (!layer) - return; - - auto& layer_event = event.layer_event(); - if (layer_event.button() != GUI::MouseButton::Left && layer_event.button() != GUI::MouseButton::Right) - return; - m_editor->did_complete_action(); -} - -Color EraseTool::get_color() const +Color EraseTool::color_for(GUI::MouseEvent const&) { if (m_use_secondary_color) return m_editor->secondary_color(); return Color(255, 255, 255, 0); } +void EraseTool::draw_point(Gfx::Bitmap& bitmap, Gfx::Color const& color, Gfx::IntPoint const& point) +{ + int radius = size() / 2; + Gfx::IntRect rect { point.x() - radius, point.y() - radius, size(), size() }; + GUI::Painter painter(bitmap); + painter.clear_rect(rect, color); +} + GUI::Widget* EraseTool::get_properties_widget() { if (!m_properties_widget) { m_properties_widget = GUI::Widget::construct(); m_properties_widget->set_layout(); - auto& thickness_container = m_properties_widget->add(); - thickness_container.set_fixed_height(20); - thickness_container.set_layout(); + auto& size_container = m_properties_widget->add(); + size_container.set_fixed_height(20); + size_container.set_layout(); - auto& thickness_label = thickness_container.add("Size:"); - thickness_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); - thickness_label.set_fixed_size(80, 20); + auto& size_label = size_container.add("Size:"); + size_label.set_text_alignment(Gfx::TextAlignment::CenterLeft); + size_label.set_fixed_size(80, 20); - auto& thickness_slider = thickness_container.add(Orientation::Horizontal, "px"); - thickness_slider.set_range(1, 50); - thickness_slider.set_value(m_thickness); + auto& size_slider = size_container.add(Orientation::Horizontal, "px"); + size_slider.set_range(1, 100); + size_slider.set_value(size()); - thickness_slider.on_change = [&](int value) { - m_thickness = value; + size_slider.on_change = [&](int value) { + set_size(value); }; - set_primary_slider(&thickness_slider); + set_primary_slider(&size_slider); - auto& checkbox_container = m_properties_widget->add(); - checkbox_container.set_fixed_height(20); - checkbox_container.set_layout(); + auto& secondary_color_container = m_properties_widget->add(); + secondary_color_container.set_fixed_height(20); + secondary_color_container.set_layout(); - auto& use_secondary_color_checkbox = checkbox_container.add(); + auto& use_secondary_color_checkbox = secondary_color_container.add(); use_secondary_color_checkbox.set_checked(m_use_secondary_color); use_secondary_color_checkbox.set_text("Use secondary color"); use_secondary_color_checkbox.on_checked = [&](bool checked) { diff --git a/Userland/Applications/PixelPaint/EraseTool.h b/Userland/Applications/PixelPaint/EraseTool.h index 683c1f1b814..b8fa8a6ff27 100644 --- a/Userland/Applications/PixelPaint/EraseTool.h +++ b/Userland/Applications/PixelPaint/EraseTool.h @@ -1,35 +1,34 @@ /* * Copyright (c) 2018-2020, Andreas Kling + * Copyright (c) 2021, Mustafa Quraish * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once -#include "Tool.h" +#include "BrushTool.h" #include #include #include namespace PixelPaint { -class EraseTool final : public Tool { +class EraseTool final : public BrushTool { public: EraseTool(); virtual ~EraseTool() override; - virtual void on_mousedown(Layer*, MouseEvent& event) override; - virtual void on_mousemove(Layer*, MouseEvent& event) override; - virtual void on_mouseup(Layer*, MouseEvent& event) override; virtual GUI::Widget* get_properties_widget() override; +protected: + virtual Color color_for(GUI::MouseEvent const& event) override; + virtual void draw_point(Gfx::Bitmap& bitmap, Gfx::Color const& color, Gfx::IntPoint const& point) override; + private: - Gfx::Color get_color() const; - Gfx::IntRect build_rect(Gfx::IntPoint const& pos, Gfx::IntRect const& widget_rect); RefPtr m_properties_widget; bool m_use_secondary_color { false }; - int m_thickness { 1 }; }; }