[gtk+] GtkButtonBox: add a non-homogeneous child property
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] GtkButtonBox: add a non-homogeneous child property
- Date: Thu, 5 May 2011 11:47:02 +0000 (UTC)
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]