Commit b8fe808e authored by Matthias Clasen's avatar Matthias Clasen

GtkButtonBox: add a non-homogeneous child property

This makes it easier to add things like lock buttons in
dialogs. Part of #626457.
parent dd95a099
......@@ -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
......
......@@ -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
......
......@@ -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);
}
......@@ -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
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment