]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkcolorseldialog.c
Draw no trough for color scales
[~andy/gtk] / gtk / gtkcolorseldialog.c
index 3d16c0a029de6e47e4f4f83955990b995b590916..a8a77e7177adbb8be27f188802d4c3b9f5632c97 100644 (file)
  * files for a list of changes.  These files are distributed with
  * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
  */
+#include "config.h"
+#include <string.h>
 #include <glib.h>
 #include "gtkcolorseldialog.h"
 #include "gtkframe.h"
-#include "gtkhbbox.h"
 #include "gtkbutton.h"
 #include "gtkstock.h"
 #include "gtkintl.h"
+#include "gtkbuildable.h"
 
 
-static void gtk_color_selection_dialog_class_init (GtkColorSelectionDialogClass *klass);
-static void gtk_color_selection_dialog_init (GtkColorSelectionDialog *colorseldiag);
+/**
+ * SECTION:gtkcolorseldlg
+ * @Short_description: A standard dialog box for selecting a color
+ * @Title: GtkColorSelectionDialog
+ *
+ * The #GtkColorSelectionDialog provides a standard dialog which
+ * allows the user to select a color much like the #GtkFileSelection
+ * provides a standard dialog for file selection.
+ *
+ * Use gtk_color_selection_dialog_get_color_selection() to get the
+ * #GtkColorSelection widget contained within the dialog. Use this widget
+ * and its gtk_color_selection_get_current_color()
+ * function to gain access to the selected color.  Connect a handler
+ * for this widget's #GtkColorSelection::color-changed signal to be notified
+ * when the color changes.
+ *
+ * <refsect2 id="GtkColorSelectionDialog-BUILDER-UI">
+ * <title>GtkColorSelectionDialog as GtkBuildable</title>
+ * The GtkColorSelectionDialog implementation of the GtkBuildable interface
+ * exposes the embedded #GtkColorSelection as internal child with the
+ * name "color_selection". It also exposes the buttons with the names
+ * "ok_button", "cancel_button" and "help_button".
+ * </refsect2>
+ */
+
+
+struct _GtkColorSelectionDialogPrivate
+{
+  GtkWidget *colorsel;
+  GtkWidget *ok_button;
+  GtkWidget *cancel_button;
+  GtkWidget *help_button;
+};
 
-static GtkWindowClass *color_selection_dialog_parent_class = NULL;
+enum {
+  PROP_0,
+  PROP_COLOR_SELECTION,
+  PROP_OK_BUTTON,
+  PROP_CANCEL_BUTTON,
+  PROP_HELP_BUTTON
+};
 
 
 /***************************/
 /* GtkColorSelectionDialog */
 /***************************/
 
-GType
-gtk_color_selection_dialog_get_type (void)
+static void gtk_color_selection_dialog_buildable_interface_init     (GtkBuildableIface *iface);
+static GObject * gtk_color_selection_dialog_buildable_get_internal_child (GtkBuildable *buildable,
+                                                                         GtkBuilder   *builder,
+                                                                         const gchar  *childname);
+
+G_DEFINE_TYPE_WITH_CODE (GtkColorSelectionDialog, gtk_color_selection_dialog,
+           GTK_TYPE_DIALOG,
+           G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE,
+                      gtk_color_selection_dialog_buildable_interface_init))
+
+static GtkBuildableIface *parent_buildable_iface;
+
+static void
+gtk_color_selection_dialog_get_property (GObject         *object,
+                                        guint            prop_id,
+                                        GValue          *value,
+                                        GParamSpec      *pspec)
 {
-  static GType color_selection_dialog_type = 0;
-  
-  if (!color_selection_dialog_type)
+  GtkColorSelectionDialog *colorsel = GTK_COLOR_SELECTION_DIALOG (object);
+  GtkColorSelectionDialogPrivate *priv = colorsel->priv;
+
+  switch (prop_id)
     {
-      static const GTypeInfo colorsel_diag_info =
-      {
-       sizeof (GtkColorSelectionDialogClass),
-       NULL,           /* base_init */
-       NULL,           /* base_finalize */
-       (GClassInitFunc) gtk_color_selection_dialog_class_init,
-       NULL,           /* class_finalize */
-       NULL,           /* class_data */
-       sizeof (GtkColorSelectionDialog),
-       0,              /* n_preallocs */
-       (GInstanceInitFunc) gtk_color_selection_dialog_init,
-      };
-      
-      color_selection_dialog_type =
-       g_type_register_static (GTK_TYPE_DIALOG, "GtkColorSelectionDialog",
-                               &colorsel_diag_info, 0);
+    case PROP_COLOR_SELECTION:
+      g_value_set_object (value, priv->colorsel);
+      break;
+    case PROP_OK_BUTTON:
+      g_value_set_object (value, priv->ok_button);
+      break;
+    case PROP_CANCEL_BUTTON:
+      g_value_set_object (value, priv->cancel_button);
+      break;
+    case PROP_HELP_BUTTON:
+      g_value_set_object (value, priv->help_button);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
     }
-  
-  return color_selection_dialog_type;
 }
 
 static void
 gtk_color_selection_dialog_class_init (GtkColorSelectionDialogClass *klass)
 {
-  color_selection_dialog_parent_class = g_type_class_peek_parent (klass);
+  GObjectClass   *gobject_class = G_OBJECT_CLASS (klass);
+  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+  gobject_class->get_property = gtk_color_selection_dialog_get_property;
+
+  g_object_class_install_property (gobject_class,
+                                  PROP_COLOR_SELECTION,
+                                  g_param_spec_object ("color-selection",
+                                                    P_("Color Selection"),
+                                                    P_("The color selection embedded in the dialog."),
+                                                    GTK_TYPE_WIDGET,
+                                                    G_PARAM_READABLE));
+  g_object_class_install_property (gobject_class,
+                                  PROP_OK_BUTTON,
+                                  g_param_spec_object ("ok-button",
+                                                    P_("OK Button"),
+                                                    P_("The OK button of the dialog."),
+                                                    GTK_TYPE_WIDGET,
+                                                    G_PARAM_READABLE));
+  g_object_class_install_property (gobject_class,
+                                  PROP_CANCEL_BUTTON,
+                                  g_param_spec_object ("cancel-button",
+                                                    P_("Cancel Button"),
+                                                    P_("The cancel button of the dialog."),
+                                                    GTK_TYPE_WIDGET,
+                                                    G_PARAM_READABLE));
+  g_object_class_install_property (gobject_class,
+                                  PROP_HELP_BUTTON,
+                                  g_param_spec_object ("help-button",
+                                                    P_("Help Button"),
+                                                    P_("The help button of the dialog."),
+                                                    GTK_TYPE_WIDGET,
+                                                    G_PARAM_READABLE));
+
+  gtk_widget_class_set_accessible_role (widget_class, ATK_ROLE_COLOR_CHOOSER);
+
+  g_type_class_add_private (klass, sizeof (GtkColorSelectionDialogPrivate));
 }
 
 static void
 gtk_color_selection_dialog_init (GtkColorSelectionDialog *colorseldiag)
 {
-  GtkWidget *action_area_button_box, *frame;  
-  
-  frame = gtk_frame_new (NULL);
-  gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE);
-  gtk_container_add (GTK_CONTAINER (GTK_DIALOG (colorseldiag)->vbox), frame);
-  gtk_container_set_border_width (GTK_CONTAINER (frame), 10); 
-  gtk_widget_show (frame); 
-  
-  colorseldiag->colorsel = gtk_color_selection_new ();
-  gtk_color_selection_set_has_palette (GTK_COLOR_SELECTION(colorseldiag->colorsel), FALSE); 
-  gtk_color_selection_set_has_opacity_control (GTK_COLOR_SELECTION(colorseldiag->colorsel), FALSE);
-  gtk_container_add (GTK_CONTAINER (frame), colorseldiag->colorsel);
-  gtk_widget_show (colorseldiag->colorsel);
-  
-  action_area_button_box = GTK_DIALOG (colorseldiag)->action_area;
+  GtkColorSelectionDialogPrivate *priv;
+  GtkDialog *dialog = GTK_DIALOG (colorseldiag);
+  GtkWidget *action_area, *content_area;
 
-  colorseldiag->cancel_button = gtk_dialog_add_button (GTK_DIALOG (colorseldiag),
-                                                       GTK_STOCK_CANCEL,
-                                                       GTK_RESPONSE_CANCEL);
+  colorseldiag->priv = G_TYPE_INSTANCE_GET_PRIVATE (colorseldiag,
+                                                    GTK_TYPE_COLOR_SELECTION_DIALOG,
+                                                    GtkColorSelectionDialogPrivate);
+  priv = colorseldiag->priv;
 
-  colorseldiag->ok_button = gtk_dialog_add_button (GTK_DIALOG (colorseldiag),
-                                                   GTK_STOCK_OK,
-                                                   GTK_RESPONSE_OK);
-                                                   
-  gtk_widget_grab_default (colorseldiag->ok_button);
-  
-  colorseldiag->help_button = gtk_dialog_add_button (GTK_DIALOG (colorseldiag),
-                                                     GTK_STOCK_HELP,
-                                                     GTK_RESPONSE_HELP);
+  content_area = gtk_dialog_get_content_area (dialog);
+  action_area = gtk_dialog_get_action_area (dialog);
+
+  gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
+  gtk_box_set_spacing (GTK_BOX (content_area), 2); /* 2 * 5 + 2 = 12 */
+  gtk_container_set_border_width (GTK_CONTAINER (action_area), 5);
+  gtk_box_set_spacing (GTK_BOX (action_area), 6);
+
+  priv->colorsel = gtk_color_selection_new ();
+  gtk_container_set_border_width (GTK_CONTAINER (priv->colorsel), 5);
+  gtk_color_selection_set_has_palette (GTK_COLOR_SELECTION (priv->colorsel), FALSE);
+  gtk_color_selection_set_has_opacity_control (GTK_COLOR_SELECTION (priv->colorsel), FALSE);
+  gtk_container_add (GTK_CONTAINER (content_area), priv->colorsel);
+  gtk_widget_show (priv->colorsel);
+
+  priv->cancel_button = gtk_dialog_add_button (dialog,
+                                               GTK_STOCK_CANCEL,
+                                               GTK_RESPONSE_CANCEL);
+
+  priv->ok_button = gtk_dialog_add_button (dialog,
+                                           _("_Select"),
+                                           GTK_RESPONSE_OK);
 
-  gtk_widget_hide (colorseldiag->help_button);
+  gtk_widget_grab_default (priv->ok_button);
+
+  priv->help_button = gtk_dialog_add_button (dialog,
+                                             GTK_STOCK_HELP,
+                                             GTK_RESPONSE_HELP);
+
+  gtk_widget_hide (priv->help_button);
+
+  gtk_dialog_set_alternative_button_order (dialog,
+                                          GTK_RESPONSE_OK,
+                                          GTK_RESPONSE_CANCEL,
+                                          GTK_RESPONSE_HELP,
+                                          -1);
+
+  gtk_window_set_title (GTK_WINDOW (colorseldiag),
+                        _("Color Selection"));
 }
 
+/**
+ * gtk_color_selection_dialog_new:
+ * @title: a string containing the title text for the dialog.
+ *
+ * Creates a new #GtkColorSelectionDialog.
+ *
+ * Returns: a #GtkColorSelectionDialog.
+ */
 GtkWidget*
 gtk_color_selection_dialog_new (const gchar *title)
 {
   GtkColorSelectionDialog *colorseldiag;
   
   colorseldiag = g_object_new (GTK_TYPE_COLOR_SELECTION_DIALOG, NULL);
-  gtk_window_set_title (GTK_WINDOW (colorseldiag), title);
+
+  if (title)
+    gtk_window_set_title (GTK_WINDOW (colorseldiag), title);
+
+  gtk_window_set_resizable (GTK_WINDOW (colorseldiag), FALSE);
   
   return GTK_WIDGET (colorseldiag);
 }
+
+/**
+ * gtk_color_selection_dialog_get_color_selection:
+ * @colorsel: a #GtkColorSelectionDialog
+ *
+ * Retrieves the #GtkColorSelection widget embedded in the dialog.
+ *
+ * Returns: (transfer none): the embedded #GtkColorSelection
+ *
+ * Since: 2.14
+ **/
+GtkWidget*
+gtk_color_selection_dialog_get_color_selection (GtkColorSelectionDialog *colorsel)
+{
+  g_return_val_if_fail (GTK_IS_COLOR_SELECTION_DIALOG (colorsel), NULL);
+
+  return colorsel->priv->colorsel;
+}
+
+static void
+gtk_color_selection_dialog_buildable_interface_init (GtkBuildableIface *iface)
+{
+  parent_buildable_iface = g_type_interface_peek_parent (iface);
+  iface->get_internal_child = gtk_color_selection_dialog_buildable_get_internal_child;
+}
+
+static GObject *
+gtk_color_selection_dialog_buildable_get_internal_child (GtkBuildable *buildable,
+                                                        GtkBuilder   *builder,
+                                                        const gchar  *childname)
+{
+  GtkColorSelectionDialog *selection_dialog = GTK_COLOR_SELECTION_DIALOG (buildable);
+  GtkColorSelectionDialogPrivate *priv = selection_dialog->priv;
+
+  if (g_strcmp0 (childname, "ok_button") == 0)
+    return G_OBJECT (priv->ok_button);
+  else if (g_strcmp0 (childname, "cancel_button") == 0)
+    return G_OBJECT (priv->cancel_button);
+  else if (g_strcmp0 (childname, "help_button") == 0)
+    return G_OBJECT (priv->help_button);
+  else if (g_strcmp0 (childname, "color_selection") == 0)
+    return G_OBJECT (priv->colorsel);
+
+  return parent_buildable_iface->get_internal_child (buildable, builder, childname);
+}