LibGUI: Add alpha preview to ColorPicker

This commit is contained in:
Tibor Nagy 2020-09-25 17:01:58 +02:00 committed by Andreas Kling
parent 59a0e5ba1e
commit 5b7decc3af
Notes: sideshowbarker 2024-07-19 02:13:34 +09:00
2 changed files with 46 additions and 17 deletions

View file

@ -118,6 +118,19 @@ private:
virtual void resize_event(ResizeEvent&) override;
};
class ColorPreview final : public GUI::Widget {
C_OBJECT(ColorPreview);
public:
void set_color(Color);
private:
ColorPreview(Color);
Color m_color;
virtual void paint_event(GUI::PaintEvent&) override;
};
class CustomColorWidget final : public GUI::Widget {
C_OBJECT(CustomColorWidget);
@ -257,20 +270,10 @@ void ColorPicker::build_ui_custom(Widget& root_container)
preview_container.set_preferred_size(0, 128);
// Current color
auto& current_color_widget = preview_container.add<Widget>();
current_color_widget.set_fill_with_background_color(true);
auto pal1 = current_color_widget.palette();
pal1.set_color(ColorRole::Background, m_color);
current_color_widget.set_palette(pal1);
preview_container.add<ColorPreview>(m_color);
// Preview selected color
m_preview_widget = preview_container.add<Widget>();
m_preview_widget->set_fill_with_background_color(true);
auto pal2 = m_preview_widget->palette();
pal2.set_color(ColorRole::Background, m_color);
m_preview_widget->set_palette(pal2);
m_preview_widget = preview_container.add<ColorPreview>(m_color);
vertical_container.layout()->add_spacer();
@ -367,10 +370,7 @@ void ColorPicker::build_ui_custom(Widget& root_container)
void ColorPicker::update_color_widgets()
{
auto pal = m_preview_widget->palette();
pal.set_color(ColorRole::Background, m_color);
m_preview_widget->set_palette(pal);
m_preview_widget->update();
m_preview_widget->set_color(m_color);
m_html_text->set_text(m_color_has_alpha_channel ? m_color.to_string() : m_color.to_string_without_alpha());
@ -702,4 +702,32 @@ void ColorSlider::resize_event(ResizeEvent&)
recalculate_position();
}
ColorPreview::ColorPreview(Color color)
: m_color(color)
{
}
void ColorPreview::set_color(Color color)
{
if (m_color == color)
return;
m_color = color;
update();
}
void ColorPreview::paint_event(PaintEvent& event)
{
Painter painter(*this);
painter.add_clip_rect(event.rect());
if (m_color.alpha() < 255) {
Gfx::StylePainter::paint_transparency_grid(painter, rect(), palette());
painter.fill_rect(rect(), m_color);
painter.fill_rect({ 0, 0, rect().width() / 4, rect().height() }, m_color.with_alpha(255));
} else {
painter.fill_rect(rect(), m_color);
}
}
}

View file

@ -32,6 +32,7 @@
namespace GUI {
class ColorButton;
class ColorPreview;
class CustomColorWidget;
class ColorPicker final : public Dialog {
@ -58,7 +59,7 @@ private:
Vector<ColorButton*> m_color_widgets;
RefPtr<CustomColorWidget> m_custom_color;
RefPtr<Widget> m_preview_widget;
RefPtr<ColorPreview> m_preview_widget;
RefPtr<TextBox> m_html_text;
RefPtr<SpinBox> m_red_spinbox;
RefPtr<SpinBox> m_green_spinbox;