mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-06 00:30:08 +00:00
GtkButtonBox: add a non-homogeneous child property
This makes it easier to add things like lock buttons in dialogs. Part of #626457.
This commit is contained in:
parent
dd95a099be
commit
b8fe808e15
@ -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);
|
||||
}
|
||||
|
@ -79,6 +79,14 @@ void gtk_button_box_set_child_secondary (GtkButtonBox *widget,
|
||||
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
|
||||
|
||||
#endif /* __GTK_BUTTON_BOX_H__ */
|
||||
|
Loading…
Reference in New Issue
Block a user