mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-09-20 09:49:15 +03:00
LibGUI: Make GUI::ColorPicker
interactive
There is now a `on_color_changed` callback that clients can optionally hook into to receive real-time updates while the user is picking a color. If the user hits Cancel, the callback gets called once more with the color passed in while constructing `ColorPicker`. If the user hits OK, the same happens with the currently selected color instead. Programs therefore can perform all their updates with this callback, and only care about `ExecResult` if they want to make a decision, like if we should write the result to `ConfigServer`, for example.
This commit is contained in:
parent
ca1a98ba9f
commit
825c9eaeb1
Notes:
sideshowbarker
2024-07-17 01:10:58 +09:00
Author: https://github.com/vkoskiv Commit: https://github.com/SerenityOS/serenity/commit/825c9eaeb1 Pull-request: https://github.com/SerenityOS/serenity/pull/20116 Reviewed-by: https://github.com/LucasChollet Reviewed-by: https://github.com/MacDue Reviewed-by: https://github.com/alimpfard Reviewed-by: https://github.com/trflynn89
@ -71,9 +71,11 @@ void ColorInput::mouseup_event(MouseEvent& event)
|
||||
m_may_be_color_rect_click = false;
|
||||
if (is_color_rect_click) {
|
||||
auto dialog = GUI::ColorPicker::construct(m_color, window(), m_color_picker_title);
|
||||
dialog->on_color_changed = [this](Gfx::Color color) {
|
||||
set_color(color);
|
||||
};
|
||||
dialog->set_color_has_alpha_channel(m_color_has_alpha_channel);
|
||||
if (dialog->exec() == GUI::Dialog::ExecResult::OK)
|
||||
set_color(dialog->color());
|
||||
dialog->exec();
|
||||
event.accept();
|
||||
return;
|
||||
}
|
||||
|
@ -185,6 +185,7 @@ private:
|
||||
|
||||
ColorPicker::ColorPicker(Color color, Window* parent_window, DeprecatedString title)
|
||||
: Dialog(parent_window)
|
||||
, m_original_color(color)
|
||||
, m_color(color)
|
||||
{
|
||||
set_icon(Gfx::Bitmap::load_from_file("/res/icons/16x16/color-chooser.png"sv).release_value_but_fixme_should_propagate_errors());
|
||||
@ -230,6 +231,8 @@ void ColorPicker::build_ui()
|
||||
auto& ok_button = button_container.add<DialogButton>();
|
||||
ok_button.set_text("OK"_short_string);
|
||||
ok_button.on_click = [this](auto) {
|
||||
if (on_color_changed)
|
||||
on_color_changed(m_color);
|
||||
done(ExecResult::OK);
|
||||
};
|
||||
ok_button.set_default(true);
|
||||
@ -237,6 +240,8 @@ void ColorPicker::build_ui()
|
||||
auto& cancel_button = button_container.add<DialogButton>();
|
||||
cancel_button.set_text("Cancel"_short_string);
|
||||
cancel_button.on_click = [this](auto) {
|
||||
if (on_color_changed)
|
||||
on_color_changed(m_original_color);
|
||||
done(ExecResult::Cancel);
|
||||
};
|
||||
}
|
||||
@ -439,6 +444,8 @@ void ColorPicker::update_color_widgets()
|
||||
m_alpha_spinbox->set_enabled(m_color_has_alpha_channel);
|
||||
m_alpha->set_value(m_color.alpha());
|
||||
m_alpha->set_visible(m_color_has_alpha_channel);
|
||||
if (on_color_changed)
|
||||
on_color_changed(m_color);
|
||||
}
|
||||
|
||||
void ColorPicker::create_color_button(Widget& container, unsigned rgb)
|
||||
|
@ -26,6 +26,7 @@ public:
|
||||
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; }
|
||||
Function<void(Color)> on_color_changed;
|
||||
|
||||
private:
|
||||
explicit ColorPicker(Color, Window* parent_window = nullptr, DeprecatedString title = "Color Picker");
|
||||
@ -36,6 +37,7 @@ private:
|
||||
void update_color_widgets();
|
||||
void create_color_button(Widget& container, unsigned rgb);
|
||||
|
||||
Color m_original_color;
|
||||
Color m_color;
|
||||
bool m_color_has_alpha_channel { true };
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user