diff --git a/gtk/gtkcoloreditor.c b/gtk/gtkcoloreditor.c index 8f02600429..cc42cba575 100644 --- a/gtk/gtkcoloreditor.c +++ b/gtk/gtkcoloreditor.c @@ -24,7 +24,9 @@ #include "gtkcolorscaleprivate.h" #include "gtkcolorswatchprivate.h" #include "gtkcolorutils.h" +#include "gtkcolorpickerprivate.h" #include "gtkgrid.h" +#include "gtkbutton.h" #include "gtkintl.h" #include "gtkorientable.h" #include "gtkentry.h" @@ -61,6 +63,9 @@ struct _GtkColorEditorPrivate GtkAdjustment *v_adj; GtkAdjustment *a_adj; + GtkWidget *picker_button; + GtkColorPicker *picker; + gint popup_position; guint text_changed : 1; @@ -337,6 +342,36 @@ scaled_adjustment (GtkAdjustment *a, return as; } +static void +color_picked (GObject *source, + GAsyncResult *res, + gpointer data) +{ + GtkColorPicker *picker = GTK_COLOR_PICKER (source); + GtkColorEditor *editor = data; + GError *error = NULL; + GdkRGBA *color; + + color = gtk_color_picker_pick_finish (picker, res, &error); + if (color == NULL) + { + g_warning ("Picking color failed: %s", error->message); + g_error_free (error); + } + else + { + gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (editor), color); + gdk_rgba_free (color); + } +} + +static void +pick_color (GtkButton *button, + GtkColorEditor *editor) +{ + gtk_color_picker_pick (editor->priv->picker, color_picked, editor); +} + static void gtk_color_editor_init (GtkColorEditor *editor) { @@ -385,6 +420,10 @@ gtk_color_editor_init (GtkColorEditor *editor) gtk_widget_add_controller (editor->priv->a_entry, controller); gtk_style_context_remove_class (gtk_widget_get_style_context (editor->priv->swatch), "activatable"); + + editor->priv->picker = gtk_color_picker_new (); + if (editor->priv->picker == NULL) + gtk_widget_hide (editor->priv->picker_button); } static void @@ -393,6 +432,7 @@ gtk_color_editor_dispose (GObject *object) GtkColorEditor *editor = GTK_COLOR_EDITOR (object); dismiss_current_popup (editor); + g_clear_object (&editor->priv->picker); G_OBJECT_CLASS (gtk_color_editor_parent_class)->dispose (object); } @@ -495,6 +535,7 @@ gtk_color_editor_class_init (GtkColorEditorClass *class) gtk_widget_class_bind_template_child_private (widget_class, GtkColorEditor, s_adj); gtk_widget_class_bind_template_child_private (widget_class, GtkColorEditor, v_adj); gtk_widget_class_bind_template_child_private (widget_class, GtkColorEditor, a_adj); + gtk_widget_class_bind_template_child_private (widget_class, GtkColorEditor, picker_button); gtk_widget_class_bind_template_callback (widget_class, hsv_changed); gtk_widget_class_bind_template_callback (widget_class, dismiss_current_popup); @@ -503,6 +544,7 @@ gtk_color_editor_class_init (GtkColorEditorClass *class) gtk_widget_class_bind_template_callback (widget_class, entry_apply); gtk_widget_class_bind_template_callback (widget_class, entry_focus_changed); gtk_widget_class_bind_template_callback (widget_class, popup_edit); + gtk_widget_class_bind_template_callback (widget_class, pick_color); } static void diff --git a/gtk/ui/gtkcoloreditor.ui b/gtk/ui/gtkcoloreditor.ui index ed148e9433..6840a276db 100644 --- a/gtk/ui/gtkcoloreditor.ui +++ b/gtk/ui/gtkcoloreditor.ui @@ -38,6 +38,20 @@ 30 12 12 + + + color-select-symbolic + Pick a color from the screen + + + + + 0 + 0 + + editor-color-sample