diff --git a/Userland/Applications/PixelPaint/CMakeLists.txt b/Userland/Applications/PixelPaint/CMakeLists.txt index 55596694c4..48525211e7 100644 --- a/Userland/Applications/PixelPaint/CMakeLists.txt +++ b/Userland/Applications/PixelPaint/CMakeLists.txt @@ -52,6 +52,7 @@ set(SOURCES ProjectLoader.cpp ResizeImageDialog.cpp ResizeImageDialogGML.h + ScopeWidget.cpp Selection.cpp ToolPropertiesWidget.cpp ToolboxWidget.cpp diff --git a/Userland/Applications/PixelPaint/HistogramWidget.cpp b/Userland/Applications/PixelPaint/HistogramWidget.cpp index 6a9e7de66b..fb940caf76 100644 --- a/Userland/Applications/PixelPaint/HistogramWidget.cpp +++ b/Userland/Applications/PixelPaint/HistogramWidget.cpp @@ -16,25 +16,6 @@ REGISTER_WIDGET(PixelPaint, HistogramWidget); namespace PixelPaint { -HistogramWidget::~HistogramWidget() -{ - if (m_image) - m_image->remove_client(*this); -} - -void HistogramWidget::set_image(Image* image) -{ - if (m_image == image) - return; - if (m_image) - m_image->remove_client(*this); - m_image = image; - if (m_image) - m_image->add_client(*this); - - (void)rebuild_histogram_data(); -} - ErrorOr HistogramWidget::rebuild_histogram_data() { if (!m_image) @@ -81,16 +62,15 @@ ErrorOr HistogramWidget::rebuild_histogram_data() } // Scale the frequency values to fit the widgets height. - m_widget_height = height(); + auto widget_height = height(); for (int i = 0; i < 256; i++) { - m_data.red[i] = m_data.red[i] != 0 ? (static_cast(m_data.red[i]) / max_color_frequency) * m_widget_height : 0; - m_data.green[i] = m_data.green[i] != 0 ? (static_cast(m_data.green[i]) / max_color_frequency) * m_widget_height : 0; - m_data.blue[i] = m_data.blue[i] != 0 ? (static_cast(m_data.blue[i]) / max_color_frequency) * m_widget_height : 0; - m_data.brightness[i] = m_data.brightness[i] != 0 ? (static_cast(m_data.brightness[i]) / max_brightness_frequency) * m_widget_height : 0; + m_data.red[i] = m_data.red[i] != 0 ? (static_cast(m_data.red[i]) / max_color_frequency) * widget_height : 0; + m_data.green[i] = m_data.green[i] != 0 ? (static_cast(m_data.green[i]) / max_color_frequency) * widget_height : 0; + m_data.blue[i] = m_data.blue[i] != 0 ? (static_cast(m_data.blue[i]) / max_color_frequency) * widget_height : 0; + m_data.brightness[i] = m_data.brightness[i] != 0 ? (static_cast(m_data.brightness[i]) / max_brightness_frequency) * widget_height : 0; } - update(); return {}; } @@ -102,7 +82,7 @@ void HistogramWidget::paint_event(GUI::PaintEvent& event) if (!m_image) return; - int bottom_line = m_widget_height - 1; + int bottom_line = height() - 1; float step_width = static_cast(width()) / 256; Gfx::Path brightness_path; @@ -153,14 +133,6 @@ void HistogramWidget::paint_event(GUI::PaintEvent& event) void HistogramWidget::image_changed() { (void)rebuild_histogram_data(); -} - -void HistogramWidget::set_color_at_mouseposition(Color color) -{ - if (m_color_at_mouseposition == color) - return; - - m_color_at_mouseposition = color; update(); } diff --git a/Userland/Applications/PixelPaint/HistogramWidget.h b/Userland/Applications/PixelPaint/HistogramWidget.h index c50ff90d4f..6e581d1502 100644 --- a/Userland/Applications/PixelPaint/HistogramWidget.h +++ b/Userland/Applications/PixelPaint/HistogramWidget.h @@ -7,21 +7,17 @@ #pragma once #include "Image.h" -#include +#include "ScopeWidget.h" namespace PixelPaint { class HistogramWidget final - : public GUI::Frame - , ImageClient { + : public ScopeWidget { C_OBJECT(HistogramWidget); public: - virtual ~HistogramWidget() override; - - void set_image(Image*); - void image_changed(); - void set_color_at_mouseposition(Color); + virtual ~HistogramWidget() = default; + virtual void image_changed() override; private: HistogramWidget() = default; @@ -29,9 +25,6 @@ private: virtual void paint_event(GUI::PaintEvent&) override; ErrorOr rebuild_histogram_data(); - int m_widget_height = 0; - Color m_color_at_mouseposition = Color::Transparent; - RefPtr m_image; struct HistogramData { Vector red; diff --git a/Userland/Applications/PixelPaint/ScopeWidget.cpp b/Userland/Applications/PixelPaint/ScopeWidget.cpp new file mode 100644 index 0000000000..afa69a7965 --- /dev/null +++ b/Userland/Applications/PixelPaint/ScopeWidget.cpp @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2022, kleines Filmröllchen + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include "ScopeWidget.h" +#include "Layer.h" + +namespace PixelPaint { + +ScopeWidget::~ScopeWidget() +{ + if (m_image) + m_image->remove_client(*this); +} + +void ScopeWidget::set_image(Image* image) +{ + if (m_image == image) + return; + if (m_image) + m_image->remove_client(*this); + m_image = image; + if (m_image) + m_image->add_client(*this); + + image_changed(); + update(); +} + +void ScopeWidget::set_color_at_mouseposition(Color color) +{ + if (m_color_at_mouseposition == color) + return; + + m_color_at_mouseposition = color; + update(); +} + +} diff --git a/Userland/Applications/PixelPaint/ScopeWidget.h b/Userland/Applications/PixelPaint/ScopeWidget.h new file mode 100644 index 0000000000..527320d2ff --- /dev/null +++ b/Userland/Applications/PixelPaint/ScopeWidget.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2022, kleines Filmröllchen + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include "Image.h" +#include +#include + +namespace PixelPaint { + +class ScopeWidget + : public GUI::Frame + , public ImageClient { + C_OBJECT_ABSTRACT(ScopeWidget); + +public: + virtual ~ScopeWidget() override; + + void set_image(Image*); + virtual void image_changed() = 0; + void set_color_at_mouseposition(Color); + +protected: + virtual void paint_event(GUI::PaintEvent&) override = 0; + + Color m_color_at_mouseposition = Color::Transparent; + RefPtr m_image; +}; + +}