ladybird/Userland/Libraries/LibGUI/ColorPicker.h
Mustafa Quraish 253eb5c6d7 ColorPicker: Add ability to select a color on the screen
This commit adds a `ColorSelectOverlay` class, and uses it to
allow the user to pick a color from the screen. The API for
`ColorSelectOverlay` is inspired from the `SelectableOverlay`
in `Utilities/shot.cpp`. In particular, it opens up it's own
window, so that we can have control over the cursor over the
whole screen.

There's one thing notably different: In addition to returning the
final selected color from the `exec()` function, it also provides
an `on_color_changed()` hook, which can be used to (optionally)
get live updated as the mouse is moving around.

This is a bit odd, but allows us to use the preview widget of the
color picker to see the current color under the mouse (which will
be selected upon clicking). When trying to select the color from
text / other small elements, this is very useful.
2021-09-11 19:05:46 +02:00

53 lines
1.3 KiB
C++

/*
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <LibGUI/AbstractButton.h>
#include <LibGUI/Dialog.h>
namespace GUI {
class ColorButton;
class ColorPreview;
class CustomColorWidget;
class ColorSelectOverlay;
class ColorPicker final : public Dialog {
C_OBJECT(ColorPicker)
public:
virtual ~ColorPicker() override;
bool color_has_alpha_channel() const { return m_color_has_alpha_channel; }
void set_color_has_alpha_channel(bool);
Color color() const { return m_color; }
private:
explicit ColorPicker(Color, Window* parent_window = nullptr, String title = "Edit Color");
void build_ui();
void build_ui_custom(Widget& root_container);
void build_ui_palette(Widget& root_container);
void update_color_widgets();
void create_color_button(Widget& container, unsigned rgb);
Color m_color;
bool m_color_has_alpha_channel { true };
Vector<ColorButton&> m_color_widgets;
RefPtr<CustomColorWidget> m_custom_color;
RefPtr<ColorPreview> m_preview_widget;
RefPtr<Button> m_selector_button;
RefPtr<TextBox> m_html_text;
RefPtr<SpinBox> m_red_spinbox;
RefPtr<SpinBox> m_green_spinbox;
RefPtr<SpinBox> m_blue_spinbox;
RefPtr<SpinBox> m_alpha_spinbox;
};
}