#include "PaletteWidget.h" #include "PaintableWidget.h" #include class ColorWidget : public GFrame { public: explicit ColorWidget(Color color, PaletteWidget& palette_widget, GWidget* parent) : GFrame(parent) , m_palette_widget(palette_widget) , m_color(color) { set_frame_thickness(2); set_frame_shadow(FrameShadow::Sunken); set_frame_shape(FrameShape::Container); } virtual ~ColorWidget() override { } virtual void mousedown_event(GMouseEvent& event) override { if (event.button() == GMouseButton::Left) m_palette_widget.set_primary_color(m_color); else if (event.button() == GMouseButton::Right) m_palette_widget.set_secondary_color(m_color); } private: PaletteWidget& m_palette_widget; Color m_color; }; PaletteWidget::PaletteWidget(PaintableWidget& paintable_widget, GWidget* parent) : GFrame(parent) , m_paintable_widget(paintable_widget) { set_frame_shape(FrameShape::Panel); set_frame_shadow(FrameShadow::Raised); set_frame_thickness(0); set_fill_with_background_color(true); set_background_color(Color::LightGray); set_size_policy(SizePolicy::Fill, SizePolicy::Fixed); set_preferred_size({ 0, 34 }); m_secondary_color_widget = new GFrame(this); m_secondary_color_widget->set_frame_thickness(2); m_secondary_color_widget->set_frame_shape(FrameShape::Container); m_secondary_color_widget->set_frame_shadow(FrameShadow::Sunken); m_secondary_color_widget->set_relative_rect({ 2, 2, 60, 31 }); m_secondary_color_widget->set_fill_with_background_color(true); set_secondary_color(paintable_widget.secondary_color()); m_primary_color_widget = new GFrame(this); m_primary_color_widget->set_frame_thickness(2); m_primary_color_widget->set_frame_shape(FrameShape::Container); m_primary_color_widget->set_frame_shadow(FrameShadow::Sunken); Rect rect { 0, 0, 38, 15 }; rect.center_within(m_secondary_color_widget->relative_rect()); m_primary_color_widget->set_relative_rect(rect); m_primary_color_widget->set_fill_with_background_color(true); set_primary_color(paintable_widget.primary_color()); auto* color_container = new GWidget(this); color_container->set_relative_rect(m_secondary_color_widget->relative_rect().right() + 2, 2, 500, 32); color_container->set_layout(make(Orientation::Vertical)); color_container->layout()->set_spacing(1); auto* top_color_container = new GWidget(color_container); top_color_container->set_layout(make(Orientation::Horizontal)); top_color_container->layout()->set_spacing(1); auto* bottom_color_container = new GWidget(color_container); bottom_color_container->set_layout(make(Orientation::Horizontal)); bottom_color_container->layout()->set_spacing(1); 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); }; add_color_widget(top_color_container, Color::from_rgb(0x000000)); add_color_widget(top_color_container, Color::from_rgb(0x808080)); add_color_widget(top_color_container, Color::from_rgb(0x800000)); add_color_widget(top_color_container, Color::from_rgb(0x808000)); add_color_widget(top_color_container, Color::from_rgb(0x008000)); add_color_widget(top_color_container, Color::from_rgb(0x008080)); add_color_widget(top_color_container, Color::from_rgb(0x000080)); add_color_widget(top_color_container, Color::from_rgb(0x800080)); add_color_widget(top_color_container, Color::from_rgb(0x808040)); add_color_widget(top_color_container, Color::from_rgb(0x004040)); add_color_widget(top_color_container, Color::from_rgb(0x0080ff)); add_color_widget(top_color_container, Color::from_rgb(0x004080)); add_color_widget(top_color_container, Color::from_rgb(0x8000ff)); add_color_widget(top_color_container, Color::from_rgb(0x804000)); add_color_widget(bottom_color_container, Color::from_rgb(0xffffff)); add_color_widget(bottom_color_container, Color::from_rgb(0xc0c0c0)); add_color_widget(bottom_color_container, Color::from_rgb(0xff0000)); add_color_widget(bottom_color_container, Color::from_rgb(0xffff00)); add_color_widget(bottom_color_container, Color::from_rgb(0x00ff00)); add_color_widget(bottom_color_container, Color::from_rgb(0x00ffff)); add_color_widget(bottom_color_container, Color::from_rgb(0x0000ff)); add_color_widget(bottom_color_container, Color::from_rgb(0xff00ff)); add_color_widget(bottom_color_container, Color::from_rgb(0xffff80)); add_color_widget(bottom_color_container, Color::from_rgb(0x00ff80)); add_color_widget(bottom_color_container, Color::from_rgb(0x80ffff)); add_color_widget(bottom_color_container, Color::from_rgb(0x8080ff)); add_color_widget(bottom_color_container, Color::from_rgb(0xff0080)); add_color_widget(bottom_color_container, Color::from_rgb(0xff8040)); } PaletteWidget::~PaletteWidget() { } void PaletteWidget::set_primary_color(Color color) { m_paintable_widget.set_primary_color(color); m_primary_color_widget->set_background_color(color); m_primary_color_widget->update(); } void PaletteWidget::set_secondary_color(Color color) { m_paintable_widget.set_secondary_color(color); m_secondary_color_widget->set_background_color(color); m_secondary_color_widget->update(); }