diff --git a/Applications/PaintBrush/ColorDialog.cpp b/Applications/PaintBrush/ColorDialog.cpp new file mode 100644 index 0000000000..45cb4fe10f --- /dev/null +++ b/Applications/PaintBrush/ColorDialog.cpp @@ -0,0 +1,83 @@ +#include "ColorDialog.h" +#include +#include +#include +#include +#include + +ColorDialog::ColorDialog(Color color, CObject* parent) + : GDialog(parent) + , m_color(color) +{ + set_title("Edit Color"); + build(); +} + +ColorDialog::~ColorDialog() +{ +} + +void ColorDialog::build() +{ + auto* horizontal_container = new GWidget; + horizontal_container->set_fill_with_background_color(true); + horizontal_container->set_layout(make(Orientation::Horizontal)); + horizontal_container->layout()->set_margins({ 4, 4, 4, 4 }); + set_main_widget(horizontal_container); + + auto* left_vertical_container = new GWidget(horizontal_container); + left_vertical_container->set_layout(make(Orientation::Vertical)); + + auto* right_vertical_container = new GWidget(horizontal_container); + right_vertical_container->set_layout(make(Orientation::Vertical)); + + enum RGBComponent { + Red, Green, Blue + }; + + auto* preview_widget = new GFrame(right_vertical_container); + preview_widget->set_background_color(m_color); + preview_widget->set_fill_with_background_color(true); + right_vertical_container->layout()->add_spacer(); + auto* cancel_button = new GButton("Cancel", right_vertical_container); + cancel_button->set_size_policy(SizePolicy::Fill, SizePolicy::Fixed); + cancel_button->set_preferred_size({ 0, 20 }); + cancel_button->on_click = [&](auto&) { + done(GDialog::ExecCancel); + }; + auto* ok_button = new GButton("Okay", right_vertical_container); + ok_button->set_size_policy(SizePolicy::Fill, SizePolicy::Fixed); + ok_button->set_preferred_size({ 0, 20 }); + ok_button->on_click = [&](auto&) { + done(GDialog::ExecOK); + }; + + auto make_spinbox = [&](RGBComponent component, int initial_value) { + auto* spinbox = new GSpinBox(left_vertical_container); + spinbox->set_size_policy(SizePolicy::Fill, SizePolicy::Fixed); + spinbox->set_preferred_size({ 0, 20 }); + spinbox->set_min(0); + spinbox->set_max(255); + spinbox->set_value(initial_value); + + spinbox->on_change = [=](auto value) { + dbgprintf("on_change, component=%d, value=%d\n", component, value); + if (component == Red) + m_color.set_red(value); + if (component == Green) + m_color.set_green(value); + if (component == Blue) + m_color.set_blue(value); + + dbgprintf("m_color is now: %s\n", m_color.to_string().characters()); + + preview_widget->set_background_color(m_color); + preview_widget->update(); + }; + return spinbox; + }; + + auto* red_spin = make_spinbox(Red, m_color.red()); + auto* green_spin = make_spinbox(Green, m_color.green()); + auto* blue_spin = make_spinbox(Blue, m_color.blue()); +} diff --git a/Applications/PaintBrush/ColorDialog.h b/Applications/PaintBrush/ColorDialog.h new file mode 100644 index 0000000000..bd37ff626f --- /dev/null +++ b/Applications/PaintBrush/ColorDialog.h @@ -0,0 +1,17 @@ +#pragma once + +#include + +class ColorDialog final : public GDialog { +public: + explicit ColorDialog(Color, CObject* parent = nullptr); + virtual ~ColorDialog() override; + virtual const char* class_name() const override { return "ColorDialog"; } + + Color color() const { return m_color; } + +private: + void build(); + + Color m_color; +}; diff --git a/Applications/PaintBrush/Makefile b/Applications/PaintBrush/Makefile index 2146f55ab7..b0137f7b9c 100644 --- a/Applications/PaintBrush/Makefile +++ b/Applications/PaintBrush/Makefile @@ -7,6 +7,7 @@ OBJS = \ Tool.o \ PenTool.o \ BucketTool.o \ + ColorDialog.o \ main.o APP = PaintBrush diff --git a/Applications/PaintBrush/PaletteWidget.cpp b/Applications/PaintBrush/PaletteWidget.cpp index ec3ff48e05..5c3d61f4b0 100644 --- a/Applications/PaintBrush/PaletteWidget.cpp +++ b/Applications/PaintBrush/PaletteWidget.cpp @@ -1,4 +1,5 @@ #include "PaletteWidget.h" +#include "ColorDialog.h" #include "PaintableWidget.h" #include @@ -20,6 +21,16 @@ public: virtual void mousedown_event(GMouseEvent& event) override { + if (event.modifiers() & KeyModifier::Mod_Ctrl && event.button() == GMouseButton::Left) { + ColorDialog dialog(m_color, window()); + if (dialog.exec() == GDialog::ExecOK) { + m_color = dialog.color(); + set_background_color(m_color); + update(); + } + return; + } + if (event.button() == GMouseButton::Left) m_palette_widget.set_primary_color(m_color); else if (event.button() == GMouseButton::Right) @@ -75,7 +86,7 @@ PaletteWidget::PaletteWidget(PaintableWidget& paintable_widget, GWidget* parent) bottom_color_container->set_layout(make(Orientation::Horizontal)); bottom_color_container->layout()->set_spacing(1); - auto add_color_widget = [&] (GWidget* container, Color color) { + auto add_color_widget = [&](GWidget* container, Color color) { auto* color_widget = new ColorWidget(color, *this, container); color_widget->set_fill_with_background_color(true); color_widget->set_background_color(color);