[gtk+] GtkButtonBox: add a non-homogeneous child property



commit b8fe808e157dbe1fd12601114c391c67c03ed7a2
Author: Matthias Clasen <mclasen redhat com>
Date:   Thu May 5 07:46:03 2011 -0400

    GtkButtonBox: add a non-homogeneous child property
    
    This makes it easier to add things like lock buttons in
    dialogs. Part of #626457.

 docs/reference/gtk/gtk3-sections.txt |    2 +
 gtk/gtk.symbols                      |    2 +
 gtk/gtkbbox.c                        |   92 +++++++++++++++++++++++++++++++---
 gtk/gtkbbox.h                        |   16 ++++--
 4 files changed, 101 insertions(+), 11 deletions(-)
---
diff --git a/docs/reference/gtk/gtk3-sections.txt b/docs/reference/gtk/gtk3-sections.txt
index 96d5e55..6f3cf4c 100644
--- a/docs/reference/gtk/gtk3-sections.txt
+++ b/docs/reference/gtk/gtk3-sections.txt
@@ -430,8 +430,10 @@ GtkButtonBox
 gtk_button_box_new
 gtk_button_box_get_layout
 gtk_button_box_get_child_secondary
+gtk_button_box_get_child_non_homogeneous
 gtk_button_box_set_layout
 gtk_button_box_set_child_secondary
+gtk_button_box_set_child_non_homogeneous
 <SUBSECTION Standard>
 GTK_BUTTON_BOX
 GTK_IS_BUTTON_BOX
diff --git a/gtk/gtk.symbols b/gtk/gtk.symbols
index a855b89..71c8080 100644
--- a/gtk/gtk.symbols
+++ b/gtk/gtk.symbols
@@ -311,10 +311,12 @@ gtk_builder_set_translation_domain
 gtk_builder_value_from_string
 gtk_builder_value_from_string_type
 gtk_button_box_get_child_secondary
+gtk_button_box_get_child_non_homogeneous
 gtk_button_box_get_layout
 gtk_button_box_get_type G_GNUC_CONST
 gtk_button_box_new
 gtk_button_box_set_child_secondary
+gtk_button_box_set_child_non_homogeneous
 gtk_button_box_set_layout
 gtk_button_box_style_get_type G_GNUC_CONST
 gtk_button_clicked
diff --git a/gtk/gtkbbox.c b/gtk/gtkbbox.c
index c5e57db..e5659a8 100644
--- a/gtk/gtkbbox.c
+++ b/gtk/gtkbbox.c
@@ -42,6 +42,10 @@
  * 'outliers' to keep their own larger size. To force all children to be
  * strictly the same size without exceptions, you can set the
  * #GtkButtonBox::homogeneous property to %TRUE.
+ *
+ * To excempt individual children from homogeneous sizing regardless of their
+ * 'outlier' status, you can set the #GtkButtonBox::non-homogeneous child
+ * property.
  */
 
 #include "config.h"
@@ -68,10 +72,12 @@ enum {
 
 enum {
   CHILD_PROP_0,
-  CHILD_PROP_SECONDARY
+  CHILD_PROP_SECONDARY,
+  CHILD_PROP_NONHOMOGENEOUS
 };
 
 #define GTK_BOX_SECONDARY_CHILD "gtk-box-secondary-child"
+#define GTK_BOX_NON_HOMOGENEOUS "gtk-box-non-homogeneous"
 
 static void gtk_button_box_set_property       (GObject           *object,
                                                guint              prop_id,
@@ -199,6 +205,14 @@ gtk_button_box_class_init (GtkButtonBoxClass *class)
                                                                     FALSE,
                                                                     GTK_PARAM_READWRITE));
 
+  gtk_container_class_install_child_property (container_class,
+                                              CHILD_PROP_NONHOMOGENEOUS,
+                                              g_param_spec_boolean ("non-homogeneous",
+                                                                    P_("Non-Homogeneous"),
+                                                                    P_("If TRUE, the child will not be subject to homogeneous sizing"),
+                                                                    FALSE,
+                                                                    GTK_PARAM_READWRITE));
+
   g_type_class_add_private (class, sizeof (GtkButtonBoxPrivate));
 }
 
@@ -266,6 +280,10 @@ gtk_button_box_set_child_property (GtkContainer *container,
       gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (container), child,
                                           g_value_get_boolean (value));
       break;
+    case CHILD_PROP_NONHOMOGENEOUS:
+      gtk_button_box_set_child_non_homogeneous (GTK_BUTTON_BOX (container), child,
+                                                g_value_get_boolean (value));
+      break;
     default:
       GTK_CONTAINER_WARN_INVALID_CHILD_PROPERTY_ID (container, property_id, pspec);
       break;
@@ -286,6 +304,11 @@ gtk_button_box_get_child_property (GtkContainer *container,
                            gtk_button_box_get_child_secondary (GTK_BUTTON_BOX (container),
                                                                child));
       break;
+    case CHILD_PROP_NONHOMOGENEOUS:
+      g_value_set_boolean (value,
+                           gtk_button_box_get_child_non_homogeneous (GTK_BUTTON_BOX (container),
+                                                                     child));
+      break;
     default:
       GTK_CONTAINER_WARN_INVALID_CHILD_PROPERTY_ID (container, property_id, pspec);
       break;
@@ -296,12 +319,11 @@ static void
 gtk_button_box_remove (GtkContainer *container,
                        GtkWidget    *widget)
 {
-  /* clear is_secondary flag in case the widget
+  /* clear is_secondary and nonhomogeneous flag in case the widget
    * is added to another container
    */
-  gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (container),
-                                      widget,
-                                      FALSE);
+  gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (container), widget, FALSE);
+  gtk_button_box_set_child_non_homogeneous (GTK_BUTTON_BOX (container), widget, FALSE);
 
   GTK_CONTAINER_CLASS (gtk_button_box_parent_class)->remove (container, widget);
 }
@@ -485,6 +507,7 @@ gtk_button_box_child_requisition (GtkWidget  *widget,
     {
       GtkWidget *child;
       gboolean is_secondary;
+      gboolean non_homogeneous;
 
       child = children->data;
       children = children->next;
@@ -492,12 +515,15 @@ gtk_button_box_child_requisition (GtkWidget  *widget,
       if (gtk_widget_get_visible (child))
         {
           is_secondary = gtk_button_box_get_child_secondary (bbox, child);
+          non_homogeneous = gtk_button_box_get_child_non_homogeneous (bbox, child);
+
           if (is_secondary)
             nsecondaries++;
 
           gtk_widget_get_preferred_size (child, &child_requisition, NULL);
 
-          if (homogeneous || (child_requisition.width + ipad_w < avg_w * 1.5))
+          if (homogeneous ||
+              (!non_homogeneous && (child_requisition.width + ipad_w < avg_w * 1.5)))
             {
               (*widths)[i] = -1;
               if (child_requisition.width + ipad_w > needed_width)
@@ -508,7 +534,8 @@ gtk_button_box_child_requisition (GtkWidget  *widget,
               (*widths)[i] = child_requisition.width + ipad_w;
             }
 
-          if (homogeneous || (child_requisition.height + ipad_h < avg_h * 1.5))
+          if (homogeneous ||
+              (!non_homogeneous && (child_requisition.height + ipad_h < avg_h * 1.5)))
             {
               (*heights)[i] = -1;
               if (child_requisition.height + ipad_h > needed_height)
@@ -953,3 +980,54 @@ gtk_button_box_new (GtkOrientation orientation)
                        "orientation", orientation,
                        NULL);
 }
+
+/**
+ * gtk_button_box_get_child_non_homogeneous:
+ * @widget: a #GtkButtonBox
+ * @child: a child of @widget
+ *
+ * Returns whether the child is exempted from homogenous
+ * sizing.
+ *
+ * Returns: %TRUE if the child is not subject to homogenous sizing
+ *
+ * Since: 3.2
+ */
+gboolean
+gtk_button_box_get_child_non_homogeneous (GtkButtonBox *widget,
+                                          GtkWidget    *child)
+{
+  g_return_val_if_fail (GTK_IS_BUTTON_BOX (widget), FALSE);
+  g_return_val_if_fail (GTK_IS_WIDGET (child), FALSE);
+
+  return (g_object_get_data (G_OBJECT (child), GTK_BOX_NON_HOMOGENEOUS) != NULL);
+}
+
+/**
+ * gtk_button_box_set_child_non_homogeneous:
+ * @widget: a #GtkButtonBox
+ * @child: a child of @widget
+ * @non_homogeneous: the new value
+ *
+ * Sets whether the child is exempted from homogeous sizing.
+ *
+ * Since: 3.2
+ */
+void
+gtk_button_box_set_child_non_homogeneous (GtkButtonBox *widget,
+                                          GtkWidget    *child,
+                                          gboolean      non_homogeneous)
+{
+  g_return_if_fail (GTK_IS_BUTTON_BOX (widget));
+  g_return_if_fail (GTK_IS_WIDGET (child));
+  g_return_if_fail (gtk_widget_get_parent (child) == GTK_WIDGET (widget));
+
+  g_object_set_data (G_OBJECT (child),
+                     GTK_BOX_NON_HOMOGENEOUS,
+                     non_homogeneous ? GINT_TO_POINTER (1) : NULL);
+  gtk_widget_child_notify (child, "non-homogeneous");
+
+  if (gtk_widget_get_visible (GTK_WIDGET (widget)) &&
+      gtk_widget_get_visible (child))
+    gtk_widget_queue_resize (child);
+}
diff --git a/gtk/gtkbbox.h b/gtk/gtkbbox.h
index a46ba4d..878a997 100644
--- a/gtk/gtkbbox.h
+++ b/gtk/gtkbbox.h
@@ -72,12 +72,20 @@ GType             gtk_button_box_get_type            (void) G_GNUC_CONST;
 GtkWidget       * gtk_button_box_new                 (GtkOrientation     orientation);
 GtkButtonBoxStyle gtk_button_box_get_layout          (GtkButtonBox      *widget);
 void              gtk_button_box_set_layout          (GtkButtonBox      *widget,
-						      GtkButtonBoxStyle  layout_style);
+                                                      GtkButtonBoxStyle  layout_style);
 gboolean          gtk_button_box_get_child_secondary (GtkButtonBox      *widget,
-						      GtkWidget         *child);
+                                                      GtkWidget         *child);
 void              gtk_button_box_set_child_secondary (GtkButtonBox      *widget,
-						      GtkWidget         *child,
-						      gboolean           is_secondary);
+                                                      GtkWidget         *child,
+                                                      gboolean           is_secondary);
+
+gboolean          gtk_button_box_get_child_non_homogeneous (GtkButtonBox *widget,
+                                                            GtkWidget    *child);
+
+void              gtk_button_box_set_child_non_homogeneous (GtkButtonBox *widget,
+                                                            GtkWidget    *child,
+                                                            gboolean      non_homogeneous);
+
 
 G_END_DECLS
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]