/* * Copyright (c) 2018-2020, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #include "PaletteWidget.h" #include "ImageEditor.h" #include #include #include REGISTER_WIDGET(PixelPaint, PaletteWidget); namespace PixelPaint { class ColorWidget : public GUI::Frame { C_OBJECT(ColorWidget); public: explicit ColorWidget(Color color, PaletteWidget& palette_widget) : m_palette_widget(palette_widget) , m_color(color) { set_fixed_width(16); } virtual ~ColorWidget() override { } virtual void mousedown_event(GUI::MouseEvent& event) override { if (event.modifiers() & KeyModifier::Mod_Ctrl && event.button() == GUI::MouseButton::Left) { auto dialog = GUI::ColorPicker::construct(m_color, window()); if (dialog->exec() == GUI::Dialog::ExecOK) { m_color = dialog->color(); auto pal = palette(); pal.set_color(ColorRole::Background, m_color); set_palette(pal); update(); } return; } if (event.button() == GUI::MouseButton::Left) m_palette_widget.set_primary_color(m_color); else if (event.button() == GUI::MouseButton::Right) m_palette_widget.set_secondary_color(m_color); } private: PaletteWidget& m_palette_widget; Color m_color; }; PaletteWidget::PaletteWidget() { set_frame_shape(Gfx::FrameShape::Panel); set_frame_shadow(Gfx::FrameShadow::Raised); set_frame_thickness(0); set_fill_with_background_color(true); set_fixed_height(33); m_secondary_color_widget = add(); m_secondary_color_widget->set_relative_rect({ 0, 2, 60, 31 }); m_secondary_color_widget->set_fill_with_background_color(true); m_primary_color_widget = add(); Gfx::IntRect 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); auto& color_container = add(); color_container.set_relative_rect(m_secondary_color_widget->relative_rect().right() + 2, 2, 500, 32); color_container.set_layout(); color_container.layout()->set_spacing(1); auto& top_color_container = color_container.add(); top_color_container.set_layout(); top_color_container.layout()->set_spacing(1); auto& bottom_color_container = color_container.add(); bottom_color_container.set_layout(); bottom_color_container.layout()->set_spacing(1); auto add_color_widget = [&](GUI::Widget& container, Color color) { auto& color_widget = container.add(color, *this); color_widget.set_fill_with_background_color(true); auto pal = color_widget.palette(); pal.set_color(ColorRole::Background, color); color_widget.set_palette(pal); }; 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)); } void PaletteWidget::set_image_editor(ImageEditor& editor) { m_editor = &editor; set_primary_color(editor.primary_color()); set_secondary_color(editor.secondary_color()); editor.on_primary_color_change = [this](Color color) { set_primary_color(color); }; editor.on_secondary_color_change = [this](Color color) { set_secondary_color(color); }; } PaletteWidget::~PaletteWidget() { } void PaletteWidget::set_primary_color(Color color) { m_editor->set_primary_color(color); auto pal = m_primary_color_widget->palette(); pal.set_color(ColorRole::Background, color); m_primary_color_widget->set_palette(pal); m_primary_color_widget->update(); } void PaletteWidget::set_secondary_color(Color color) { m_editor->set_secondary_color(color); auto pal = m_secondary_color_widget->palette(); pal.set_color(ColorRole::Background, color); m_secondary_color_widget->set_palette(pal); m_secondary_color_widget->update(); } }