X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkcolorchooserdialog.c;h=261035473922e055cf8a1b5f242ede64bde5e061;hb=3b2182e711ace4a2d6843848208224cd7525d530;hp=76355409e7557f8413eac8ed5ce1cb199d8b699b;hpb=3b6e316e746dc6a4ca21bc87e678eec4a1c549e4;p=~andy%2Fgtk diff --git a/gtk/gtkcolorchooserdialog.c b/gtk/gtkcolorchooserdialog.c index 76355409e..261035473 100644 --- a/gtk/gtkcolorchooserdialog.c +++ b/gtk/gtkcolorchooserdialog.c @@ -12,26 +12,37 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library. If not, see . */ #include "config.h" #include "gtkdialog.h" #include "gtkstock.h" +#include "gtkbutton.h" #include "gtkbox.h" +#include "gtkprivate.h" #include "gtkintl.h" #include "gtkcolorchooserprivate.h" #include "gtkcolorchooserdialog.h" #include "gtkcolorchooserwidget.h" +/** + * SECTION:gtkcolorchooserdialog + * @Short_description: A dialog for choosing colors + * @Title: GtkColorChooserDialog + * @See_also: #GtkColorChooser, #GtkDialog + * + * The #GtkColorChooserDialog widget is a dialog for choosing + * a color. It implements the #GtkColorChooser interface. + * + * Since: 3.4 + */ struct _GtkColorChooserDialogPrivate { - GtkWidget *color_chooser; + GtkWidget *chooser; GtkWidget *select_button; GtkWidget *cancel_button; @@ -40,7 +51,9 @@ struct _GtkColorChooserDialogPrivate enum { PROP_ZERO, - PROP_COLOR + PROP_RGBA, + PROP_USE_ALPHA, + PROP_SHOW_EDITOR }; static void gtk_color_chooser_dialog_iface_init (GtkColorChooserInterface *iface); @@ -54,7 +67,19 @@ propagate_notify (GObject *o, GParamSpec *pspec, GtkColorChooserDialog *cc) { - g_object_notify (G_OBJECT (cc), "color"); + g_object_notify (G_OBJECT (cc), pspec->name); +} + +static void +save_color (GtkColorChooserDialog *dialog) +{ + GdkRGBA color; + + /* This causes the color chooser widget to save the + * selected and custom colors to GSettings. + */ + gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (dialog), &color); + gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (dialog), &color); } static void @@ -62,6 +87,15 @@ color_activated_cb (GtkColorChooser *chooser, GdkRGBA *color, GtkDialog *dialog) { + save_color (GTK_COLOR_CHOOSER_DIALOG (dialog)); + gtk_dialog_response (dialog, GTK_RESPONSE_OK); +} + +static void +selected_cb (GtkButton *button, + GtkDialog *dialog) +{ + save_color (GTK_COLOR_CHOOSER_DIALOG (dialog)); gtk_dialog_response (dialog, GTK_RESPONSE_OK); } @@ -90,25 +124,36 @@ gtk_color_chooser_dialog_init (GtkColorChooserDialog *cc) gtk_window_set_resizable (GTK_WINDOW (cc), FALSE); /* Create the content area */ - priv->color_chooser = gtk_color_chooser_widget_new (); - gtk_container_set_border_width (GTK_CONTAINER (priv->color_chooser), 5); - gtk_widget_show (priv->color_chooser); + priv->chooser = gtk_color_chooser_widget_new (); + gtk_container_set_border_width (GTK_CONTAINER (priv->chooser), 5); + gtk_widget_show (priv->chooser); gtk_box_pack_start (GTK_BOX (content_area), - priv->color_chooser, TRUE, TRUE, 0); + priv->chooser, TRUE, TRUE, 0); - g_signal_connect (priv->color_chooser, "notify::color", + g_signal_connect (priv->chooser, "notify::rgba", G_CALLBACK (propagate_notify), cc); - g_signal_connect (priv->color_chooser, "color-activated", + g_signal_connect (priv->chooser, "notify::show-editor", + G_CALLBACK (propagate_notify), cc); + + g_signal_connect (priv->chooser, "color-activated", G_CALLBACK (color_activated_cb), cc); /* Create the action area */ priv->cancel_button = gtk_dialog_add_button (dialog, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL); - priv->select_button = gtk_dialog_add_button (dialog, - _("_Select"), - GTK_RESPONSE_OK); + + /* We emit the response for the Select button manually, + * since we want to save the color first + */ + priv->select_button = gtk_button_new_from_stock (_("_Select")); + g_signal_connect (priv->select_button, "clicked", + G_CALLBACK (selected_cb), dialog); + gtk_widget_set_can_default (priv->select_button, TRUE); + gtk_widget_show (priv->select_button); + gtk_box_pack_end (GTK_BOX (gtk_dialog_get_action_area (dialog)), + priv->select_button, FALSE, TRUE, 0); gtk_widget_grab_default (priv->select_button); gtk_dialog_set_alternative_button_order (dialog, @@ -121,24 +166,47 @@ gtk_color_chooser_dialog_init (GtkColorChooserDialog *cc) gtk_widget_pop_composite_child (); } +static void +gtk_color_chooser_dialog_map (GtkWidget *widget) +{ + /* We never want the dialog to come up with the editor, + * even if it was showing the editor the last time it was used. + */ + g_object_set (GTK_COLOR_CHOOSER_DIALOG (widget)->priv->chooser, + "show-editor", FALSE, NULL); + + GTK_WIDGET_CLASS (gtk_color_chooser_dialog_parent_class)->map (widget); +} + static void gtk_color_chooser_dialog_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) { + GtkColorChooserDialog *cd = GTK_COLOR_CHOOSER_DIALOG (object); GtkColorChooser *cc = GTK_COLOR_CHOOSER (object); switch (prop_id) { - case PROP_COLOR: + case PROP_RGBA: { GdkRGBA color; - gtk_color_chooser_get_color (cc, &color); + gtk_color_chooser_get_rgba (cc, &color); g_value_set_boxed (value, &color); } - break; + break; + case PROP_USE_ALPHA: + g_value_set_boolean (value, gtk_color_chooser_get_use_alpha (GTK_COLOR_CHOOSER (cd->priv->chooser))); + break; + case PROP_SHOW_EDITOR: + { + gboolean show_editor; + g_object_get (cd->priv->chooser, "show-editor", &show_editor, NULL); + g_value_set_boolean (value, show_editor); + } + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -151,13 +219,22 @@ gtk_color_chooser_dialog_set_property (GObject *object, const GValue *value, GParamSpec *pspec) { + GtkColorChooserDialog *cd = GTK_COLOR_CHOOSER_DIALOG (object); GtkColorChooser *cc = GTK_COLOR_CHOOSER (object); switch (prop_id) { - case PROP_COLOR: - gtk_color_chooser_set_color (cc, g_value_get_boxed (value)); - break; + case PROP_RGBA: + gtk_color_chooser_set_rgba (cc, g_value_get_boxed (value)); + break; + case PROP_USE_ALPHA: + gtk_color_chooser_set_use_alpha (GTK_COLOR_CHOOSER (cd->priv->chooser), g_value_get_boolean (value)); + break; + case PROP_SHOW_EDITOR: + g_object_set (cd->priv->chooser, + "show-editor", g_value_get_boolean (value), + NULL); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -168,40 +245,73 @@ static void gtk_color_chooser_dialog_class_init (GtkColorChooserDialogClass *class) { GObjectClass *object_class = G_OBJECT_CLASS (class); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class); object_class->get_property = gtk_color_chooser_dialog_get_property; object_class->set_property = gtk_color_chooser_dialog_set_property; - g_object_class_override_property (object_class, PROP_COLOR, "color"); + widget_class->map = gtk_color_chooser_dialog_map; + + g_object_class_override_property (object_class, PROP_RGBA, "rgba"); + g_object_class_override_property (object_class, PROP_USE_ALPHA, "use-alpha"); + g_object_class_install_property (object_class, PROP_SHOW_EDITOR, + g_param_spec_boolean ("show-editor", P_("Show editor"), P_("Show editor"), + FALSE, GTK_PARAM_READWRITE)); + g_type_class_add_private (class, sizeof (GtkColorChooserDialogPrivate)); } static void -gtk_color_chooser_dialog_get_color (GtkColorChooser *chooser, - GdkRGBA *color) +gtk_color_chooser_dialog_get_rgba (GtkColorChooser *chooser, + GdkRGBA *color) { GtkColorChooserDialog *cc = GTK_COLOR_CHOOSER_DIALOG (chooser); - gtk_color_chooser_get_color (GTK_COLOR_CHOOSER (cc->priv->color_chooser), color); + gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (cc->priv->chooser), color); } static void -gtk_color_chooser_dialog_set_color (GtkColorChooser *chooser, - const GdkRGBA *color) +gtk_color_chooser_dialog_set_rgba (GtkColorChooser *chooser, + const GdkRGBA *color) { GtkColorChooserDialog *cc = GTK_COLOR_CHOOSER_DIALOG (chooser); - gtk_color_chooser_set_color (GTK_COLOR_CHOOSER (cc->priv->color_chooser), color); + gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (cc->priv->chooser), color); +} + +static void +gtk_color_chooser_dialog_add_palette (GtkColorChooser *chooser, + GtkOrientation orientation, + gint colors_per_line, + gint n_colors, + GdkRGBA *colors) +{ + GtkColorChooserDialog *cc = GTK_COLOR_CHOOSER_DIALOG (chooser); + + gtk_color_chooser_add_palette (GTK_COLOR_CHOOSER (cc->priv->chooser), + orientation, colors_per_line, n_colors, colors); } static void gtk_color_chooser_dialog_iface_init (GtkColorChooserInterface *iface) { - iface->get_color = gtk_color_chooser_dialog_get_color; - iface->set_color = gtk_color_chooser_dialog_set_color; + iface->get_rgba = gtk_color_chooser_dialog_get_rgba; + iface->set_rgba = gtk_color_chooser_dialog_set_rgba; + iface->add_palette = gtk_color_chooser_dialog_add_palette; } +/** + * gtk_color_chooser_dialog_new: + * @title: (allow-none): Title of the dialog, or %NULL + * @parent: (allow-none): Transient parent of the dialog, or %NULL + * + * Creates a new #GtkColorChooserDialog. + * + * Return value: a new #GtkColorChooserDialog + * + * Since: 3.4 + */ GtkWidget * gtk_color_chooser_dialog_new (const gchar *title, GtkWindow *parent)