diff options
author | Matthias Clasen <mclasen@redhat.com> | 2022-10-23 22:09:17 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2022-10-23 22:10:58 -0400 |
commit | 2c42750efd2c633d66c79f9c3b8cac79c2e13cd3 (patch) | |
tree | 15dc09e3d522d129b6c543b6a9178e0a07a0f4b1 | |
parent | ab833951db6a6e25b74ac2a7e73b904c106a02eb (diff) | |
download | gtk+-async-color-api.tar.gz |
colorchoicebutton: Revise APIasync-color-api
-rw-r--r-- | gtk/gtkcolorchoicebutton.c | 209 | ||||
-rw-r--r-- | gtk/gtkcolorchoicebutton.h | 26 |
2 files changed, 139 insertions, 96 deletions
diff --git a/gtk/gtkcolorchoicebutton.c b/gtk/gtkcolorchoicebutton.c index b048e157ff..aa6ba9d316 100644 --- a/gtk/gtkcolorchoicebutton.c +++ b/gtk/gtkcolorchoicebutton.c @@ -20,6 +20,7 @@ #include "config.h" #include "gtkcolorchoicebutton.h" +#include "gtkcolorchoice.h" #include "gtkbinlayout.h" #include "gtkbutton.h" @@ -27,15 +28,12 @@ #include "gtkdragsource.h" #include "gtkdroptarget.h" #include <glib/gi18n-lib.h> -#include "gtkmain.h" -#include "gtkmarshalers.h" +//#include "gtkmain.h" #include "gtkprivate.h" -#include "gtksnapshot.h" +//#include "gtksnapshot.h" #include "gtkwidgetprivate.h" -static void set_color (GtkColorChoiceButton *self, - GdkRGBA *color); static gboolean drop (GtkDropTarget *dest, const GValue *value, double x, @@ -54,6 +52,10 @@ struct _GtkColorChoiceButton { GtkWidget parent_instance; + GdkRGBA color; + gboolean use_alpha; + char *title; + GtkWidget *button; GtkWidget *swatch; GtkColorChoice *choice; @@ -62,8 +64,9 @@ struct _GtkColorChoiceButton /* Properties */ enum { - PROP_CHOICE = 1, - PROP_COLOR, + PROP_COLOR = 1, + PROP_USE_ALPHA, + PROP_TITLE, NUM_PROPERTIES }; @@ -79,6 +82,9 @@ gtk_color_choice_button_init (GtkColorChoiceButton *self) GtkDragSource *source; GtkDropTarget *dest; + self->use_alpha = TRUE; + self->title = g_strdup (""); + self->button = gtk_button_new (); g_signal_connect_swapped (self->button, "clicked", G_CALLBACK (button_clicked), self); gtk_widget_set_parent (self->button, GTK_WIDGET (self)); @@ -122,8 +128,16 @@ gtk_color_choice_button_set_property (GObject *object, switch (param_id) { - case PROP_CHOICE: - gtk_color_choice_button_set_choice (self, g_value_get_object (value)); + case PROP_COLOR: + gtk_color_choice_button_set_color (self, g_value_get_boxed (value)); + break; + + case PROP_USE_ALPHA: + gtk_color_choice_button_set_use_alpha (self, g_value_get_boolean (value)); + break; + + case PROP_TITLE: + gtk_color_choice_button_set_title (self, g_value_get_string (value)); break; default: @@ -142,16 +156,16 @@ gtk_color_choice_button_get_property (GObject *object, switch (param_id) { - case PROP_CHOICE: - g_value_set_object (value, self->choice); + case PROP_COLOR: + g_value_set_boxed (value, &self->color); break; - case PROP_COLOR: - { - GdkRGBA color; - gtk_color_swatch_get_rgba (GTK_COLOR_SWATCH (self->swatch), &color); - g_value_set_boxed (value, &color); - } + case PROP_USE_ALPHA: + g_value_set_boolean (value, self->use_alpha); + break; + + case PROP_TITLE: + g_value_set_string (value, self->title); break; default: @@ -161,11 +175,21 @@ gtk_color_choice_button_get_property (GObject *object, } static void +gtk_color_choice_button_dispose (GObject *object) +{ + GtkColorChoiceButton *self = GTK_COLOR_CHOICE_BUTTON (object); + + g_clear_pointer (&self->button, gtk_widget_unparent); + + G_OBJECT_CLASS (gtk_color_choice_button_parent_class)->dispose (object); +} + +static void gtk_color_choice_button_finalize (GObject *object) { GtkColorChoiceButton *self = GTK_COLOR_CHOICE_BUTTON (object); - g_clear_object (&self->choice); + g_free (self->title); G_OBJECT_CLASS (gtk_color_choice_button_parent_class)->finalize (object); } @@ -178,20 +202,26 @@ gtk_color_choice_button_class_init (GtkColorChoiceButtonClass *class) object_class->get_property = gtk_color_choice_button_get_property; object_class->set_property = gtk_color_choice_button_set_property; + object_class->dispose = gtk_color_choice_button_dispose; object_class->finalize = gtk_color_choice_button_finalize; widget_class->grab_focus = gtk_widget_grab_focus_child; widget_class->focus = gtk_widget_focus_child; - properties[PROP_CHOICE] = - g_param_spec_object ("choice", NULL, NULL, - GTK_TYPE_COLOR_CHOICE, - G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS|G_PARAM_EXPLICIT_NOTIFY); - properties[PROP_COLOR] = g_param_spec_boxed ("color", NULL, NULL, GDK_TYPE_RGBA, - G_PARAM_READABLE|G_PARAM_STATIC_STRINGS); + G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS); + + properties[PROP_USE_ALPHA] = + g_param_spec_boolean ("use-alpha", NULL, NULL, + TRUE, + G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS); + + properties[PROP_TITLE] = + g_param_spec_string ("title", NULL, NULL, + "", + G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS); g_object_class_install_properties (object_class, NUM_PROPERTIES, properties); @@ -227,24 +257,6 @@ accessible_color_name (const GdkRGBA *color) scale_round (color->blue, 100)); } -static void -set_color (GtkColorChoiceButton *self, - GdkRGBA *color) -{ - char *text; - - gtk_color_swatch_set_rgba (GTK_COLOR_SWATCH (self->swatch), color); - gtk_color_choice_set_color (self->choice, color); - - text = accessible_color_name (color); - gtk_accessible_update_property (GTK_ACCESSIBLE (self->swatch), - GTK_ACCESSIBLE_PROPERTY_LABEL, text, - -1); - g_free (text); - - g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_COLOR]); -} - static gboolean drop (GtkDropTarget *dest, const GValue *value, @@ -254,7 +266,7 @@ drop (GtkDropTarget *dest, { GdkRGBA *color = g_value_get_boxed (value); - set_color (self, color); + gtk_color_choice_button_set_color (self, color); return TRUE; } @@ -265,11 +277,7 @@ drag_prepare (GtkDragSource *source, double y, GtkColorChoiceButton *self) { - GdkRGBA color; - - gtk_color_swatch_get_rgba (GTK_COLOR_SWATCH (self->swatch), &color); - - return gdk_content_provider_new_typed (GDK_TYPE_RGBA, &color); + return gdk_content_provider_new_typed (GDK_TYPE_RGBA, &self->color); } static void @@ -277,14 +285,15 @@ color_chosen (GObject *source, GAsyncResult *result, gpointer data) { + GtkColorChoice *choice = GTK_COLOR_CHOICE (source); GtkColorChoiceButton *self = data; GdkRGBA *color; GError *error = NULL; - color = gtk_color_choice_present_finish (self->choice, result, &error); + color = gtk_color_choice_choose_finish (choice, result, &error); if (color) { - set_color (self, color); + gtk_color_choice_button_set_color (self, color); gdk_rgba_free (color); } else @@ -297,77 +306,101 @@ color_chosen (GObject *source, static void button_clicked (GtkColorChoiceButton *self) { - if (gtk_color_choice_get_parent (self->choice) == NULL) - { - GtkRoot *root = gtk_widget_get_root (GTK_WIDGET (self)); + GtkRoot *root; + GtkWindow *parent = NULL; + GtkColorChoice *choice; - if (GTK_IS_WINDOW (root)) - gtk_color_choice_set_parent (self->choice, GTK_WINDOW (root)); - } + root = gtk_widget_get_root (GTK_WIDGET (self)); + if (GTK_IS_WINDOW (root)) + parent = GTK_WINDOW (root); - gtk_color_choice_present (self->choice, NULL, color_chosen, self); + choice = gtk_color_choice_new (parent, self->title, self->use_alpha); + gtk_color_choice_choose (choice, &self->color, NULL, color_chosen, self); + g_object_unref (choice); } /* }}} */ /* {{{ Public API */ /* {{{ Constructor */ -GtkWidget * -gtk_color_choice_button_new (GtkColorChoice *choice) +GtkColorChoiceButton * +gtk_color_choice_button_new (void) { - GtkWidget *self; - - g_return_val_if_fail (GTK_IS_COLOR_CHOICE (choice), NULL); - - if (choice == NULL) - choice = gtk_color_choice_new (); - - self = g_object_new (GTK_TYPE_COLOR_CHOICE_BUTTON, - "choice", choice, - NULL); - - g_clear_object (&choice); - - return self; + return g_object_new (GTK_TYPE_COLOR_CHOICE_BUTTON, NULL); } /* }}} */ /* {{{ Setters and Getters */ void -gtk_color_choice_button_set_choice (GtkColorChoiceButton *self, - GtkColorChoice *choice) +gtk_color_choice_button_set_color (GtkColorChoiceButton *self, + const GdkRGBA *color) { - GdkRGBA color; + char *text; g_return_if_fail (GTK_IS_COLOR_CHOICE_BUTTON (self)); - g_return_if_fail (GTK_IS_COLOR_CHOICE (choice)); + g_return_if_fail (color != NULL); - if (!g_set_object (&self->choice, choice)) + if (gdk_rgba_equal (&self->color, color)) return; - gtk_color_choice_get_color (choice, &color); - set_color (self, &color); + self->color = *color; + gtk_color_swatch_set_rgba (GTK_COLOR_SWATCH (self->swatch), color); - g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_CHOICE]); + text = accessible_color_name (color); + gtk_accessible_update_property (GTK_ACCESSIBLE (self->swatch), + GTK_ACCESSIBLE_PROPERTY_LABEL, text, + -1); + g_free (text); + + g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_COLOR]); } -GtkColorChoice * -gtk_color_choice_button_get_choice (GtkColorChoiceButton *self) +const GdkRGBA * +gtk_color_choice_button_get_color (GtkColorChoiceButton *self) { g_return_val_if_fail (GTK_IS_COLOR_CHOICE_BUTTON (self), NULL); - return self->choice; + return &self->color; } void -gtk_color_choice_button_get_color (GtkColorChoiceButton *self, - GdkRGBA *color) +gtk_color_choice_button_set_use_alpha (GtkColorChoiceButton *self, + gboolean use_alpha) { g_return_if_fail (GTK_IS_COLOR_CHOICE_BUTTON (self)); - g_return_if_fail (color != NULL); - gtk_color_swatch_get_rgba (GTK_COLOR_SWATCH (self->swatch), color); + if (self->use_alpha == use_alpha) + return; + + self->use_alpha = use_alpha; + g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_USE_ALPHA]); +} + +gboolean +gtk_color_choice_button_get_use_alpha (GtkColorChoiceButton *self) +{ + g_return_val_if_fail (GTK_IS_COLOR_CHOICE_BUTTON (self), TRUE); + + return self->use_alpha; +} + +void +gtk_color_choice_button_set_title (GtkColorChoiceButton *self, + const char *title) +{ + char *new_title; + + g_return_if_fail (GTK_IS_COLOR_CHOICE_BUTTON (self)); + g_return_if_fail (title != NULL); + + if (g_str_equal (self->title, title)) + return; + + new_title = g_strdup (title); + g_free (self->title); + self->title = new_title; + g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_TITLE]); } /* }}} */ diff --git a/gtk/gtkcolorchoicebutton.h b/gtk/gtkcolorchoicebutton.h index ef7b80857e..f8c5e2513e 100644 --- a/gtk/gtkcolorchoicebutton.h +++ b/gtk/gtkcolorchoicebutton.h @@ -23,8 +23,7 @@ #error "Only <gtk/gtk.h> can be included directly." #endif -#include <gtk/gtkbutton.h> -#include <gtk/gtkcolorchoice.h> +#include <gtk/gtkwidget.h> G_BEGIN_DECLS @@ -34,17 +33,28 @@ GDK_AVAILABLE_IN_4_10 G_DECLARE_FINAL_TYPE (GtkColorChoiceButton, gtk_color_choice_button, GTK, COLOR_CHOICE_BUTTON, GtkWidget) GDK_AVAILABLE_IN_4_10 -GtkWidget * gtk_color_choice_button_new (GtkColorChoice *choice); +GtkColorChoiceButton * + gtk_color_choice_button_new (void); GDK_AVAILABLE_IN_4_10 -void gtk_color_choice_button_set_choice (GtkColorChoiceButton *self, - GtkColorChoice *choice); +void gtk_color_choice_button_set_color (GtkColorChoiceButton *self, + const GdkRGBA *color); GDK_AVAILABLE_IN_4_10 -GtkColorChoice * gtk_color_choice_button_get_choice (GtkColorChoiceButton *self); +const GdkRGBA * gtk_color_choice_button_get_color (GtkColorChoiceButton *self); GDK_AVAILABLE_IN_4_10 -void gtk_color_choice_button_get_color (GtkColorChoiceButton *self, - GdkRGBA *color); +void gtk_color_choice_button_set_use_alpha (GtkColorChoiceButton *self, + gboolean use_alpha); + +GDK_AVAILABLE_IN_4_10 +gboolean gtk_color_choice_button_get_use_alpha (GtkColorChoiceButton *self); + +GDK_AVAILABLE_IN_4_10 +void gtk_color_choice_button_set_title (GtkColorChoiceButton *self, + const char *title); + +GDK_AVAILABLE_IN_4_10 +const char * gtk_color_choice_button_get_title (GtkColorChoiceButton *self); G_END_DECLS |