diff options
author | Matthias Clasen <mclasen@redhat.com> | 2019-06-12 03:02:15 +0000 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2019-06-13 11:59:51 +0000 |
commit | 6f12c39a04a87aeb817327b31841b3d031468882 (patch) | |
tree | 192f8b2608290843f105a47c4ba4f9f78a1d3541 /gtk/gtkcolorswatch.c | |
parent | 6452aeef3cce6b74262a604a770af3a535f3bc09 (diff) | |
download | gtk+-6f12c39a04a87aeb817327b31841b3d031468882.tar.gz |
color chooser: Use a popover menu
Make the color chooser use a popover menu
and actions.
Diffstat (limited to 'gtk/gtkcolorswatch.c')
-rw-r--r-- | gtk/gtkcolorswatch.c | 113 |
1 files changed, 65 insertions, 48 deletions
diff --git a/gtk/gtkcolorswatch.c b/gtk/gtkcolorswatch.c index a5d3f52499..6932fa2413 100644 --- a/gtk/gtkcolorswatch.c +++ b/gtk/gtkcolorswatch.c @@ -33,7 +33,7 @@ #include "gtkintl.h" #include "gtkmain.h" #include "gtkmodelbutton.h" -#include "gtkpopover.h" +#include "gtkpopovermenu.h" #include "gtkprivate.h" #include "gtksnapshot.h" #include "gtkstylecontextprivate.h" @@ -76,16 +76,6 @@ enum PROP_HAS_MENU }; -enum -{ - ACTIVATE, - CUSTOMIZE, - LAST_SIGNAL -}; - -static guint signals[LAST_SIGNAL]; - - G_DEFINE_TYPE_WITH_PRIVATE (GtkColorSwatch, gtk_color_swatch, GTK_TYPE_WIDGET) #define INTENSITY(r, g, b) ((r) * 0.30 + (g) * 0.59 + (b) * 0.11) @@ -231,6 +221,32 @@ swatch_drag_data_received (GtkWidget *widget, gtk_color_swatch_set_rgba (GTK_COLOR_SWATCH (widget), &color); } +static void +activate_color (GtkColorSwatch *swatch) +{ + GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch); + gtk_widget_activate_action (GTK_WIDGET (swatch), + "color.select", + g_variant_new ("(dddd)", + priv->color.red, + priv->color.green, + priv->color.blue, + priv->color.alpha)); +} + +static void +customize_color (GtkColorSwatch *swatch) +{ + GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch); + gtk_widget_activate_action (GTK_WIDGET (swatch), + "color.customize", + g_variant_new ("(dddd)", + priv->color.red, + priv->color.green, + priv->color.blue, + priv->color.alpha)); +} + static gboolean key_controller_key_pressed (GtkEventControllerKey *controller, guint keyval, @@ -252,40 +268,51 @@ key_controller_key_pressed (GtkEventControllerKey *controller, (gtk_widget_get_state_flags (widget) & GTK_STATE_FLAG_SELECTED) == 0) gtk_widget_set_state_flags (widget, GTK_STATE_FLAG_SELECTED, FALSE); else - g_signal_emit (swatch, signals[ACTIVATE], 0); + customize_color (swatch); + return TRUE; } return FALSE; } -static void -emit_customize (GtkColorSwatch *swatch) +static GMenuModel * +gtk_color_swatch_get_menu_model (GtkColorSwatch *swatch) { - g_signal_emit (swatch, signals[CUSTOMIZE], 0); + GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch); + GMenu *menu, *section; + GMenuItem *item; + + menu = g_menu_new (); + + section = g_menu_new (); + item = g_menu_item_new (_("Customize"), NULL); + g_menu_item_set_action_and_target_value (item, "color.customize", + g_variant_new ("(dddd)", + priv->color.red, + priv->color.green, + priv->color.blue, + priv->color.alpha)); + + g_menu_append_item (section, item); + g_menu_append_section (menu, NULL, G_MENU_MODEL (section)); + g_object_unref (item); + g_object_unref (section); + + return G_MENU_MODEL (menu); } static void do_popup (GtkColorSwatch *swatch) { GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch); + GMenuModel *model; - if (priv->popover == NULL) - { - GtkWidget *box; - GtkWidget *item; - - priv->popover = gtk_popover_new (GTK_WIDGET (swatch)); - box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); - gtk_container_add (GTK_CONTAINER (priv->popover), box); - g_object_set (box, "margin", 10, NULL); - item = g_object_new (GTK_TYPE_MODEL_BUTTON, - "text", _("C_ustomize"), - NULL); - g_signal_connect_swapped (item, "clicked", - G_CALLBACK (emit_customize), swatch); - gtk_container_add (GTK_CONTAINER (box), item); - } + g_clear_pointer (&priv->popover, gtk_widget_unparent); + + model = gtk_color_swatch_get_menu_model (swatch); + priv->popover = gtk_popover_menu_new_from_model (GTK_WIDGET (swatch), model); + g_object_unref (model); gtk_popover_popup (GTK_POPOVER (priv->popover)); } @@ -300,7 +327,7 @@ swatch_primary_action (GtkColorSwatch *swatch) flags = gtk_widget_get_state_flags (widget); if (!priv->has_color) { - g_signal_emit (swatch, signals[ACTIVATE], 0); + customize_color (swatch); return TRUE; } else if (priv->selectable && @@ -340,7 +367,7 @@ tap_action (GtkGestureClick *gesture, if (n_press == 1) swatch_primary_action (swatch); else if (n_press > 1) - g_signal_emit (swatch, signals[ACTIVATE], 0); + activate_color (swatch); } else if (button == GDK_BUTTON_SECONDARY) { @@ -505,7 +532,7 @@ swatch_dispose (GObject *object) GtkColorSwatch *swatch = GTK_COLOR_SWATCH (object); GtkColorSwatchPrivate *priv = gtk_color_swatch_get_instance_private (swatch); - g_clear_pointer (&priv->popover, gtk_widget_destroy); + g_clear_pointer (&priv->popover, gtk_widget_unparent); G_OBJECT_CLASS (gtk_color_swatch_parent_class)->dispose (object); } @@ -530,20 +557,6 @@ gtk_color_swatch_class_init (GtkColorSwatchClass *class) widget_class->size_allocate = swatch_size_allocate; widget_class->state_flags_changed = swatch_state_flags_changed; - signals[ACTIVATE] = - g_signal_new (I_("activate"), - GTK_TYPE_COLOR_SWATCH, - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (GtkColorSwatchClass, activate), - NULL, NULL, NULL, G_TYPE_NONE, 0); - - signals[CUSTOMIZE] = - g_signal_new (I_("customize"), - GTK_TYPE_COLOR_SWATCH, - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET (GtkColorSwatchClass, customize), - NULL, NULL, NULL, G_TYPE_NONE, 0); - g_object_class_install_property (object_class, PROP_RGBA, g_param_spec_boxed ("rgba", P_("RGBA Color"), P_("Color as RGBA"), GDK_TYPE_RGBA, GTK_PARAM_READWRITE)); @@ -569,6 +582,10 @@ gtk_color_swatch_init (GtkColorSwatch *swatch) priv->use_alpha = TRUE; priv->selectable = TRUE; priv->has_menu = TRUE; + priv->color.red = 0.75; + priv->color.green = 0.25; + priv->color.blue = 0.25; + priv->color.alpha = 1.0; gtk_widget_set_can_focus (GTK_WIDGET (swatch), TRUE); gtk_widget_set_overflow (GTK_WIDGET (swatch), GTK_OVERFLOW_HIDDEN); |