From a9dfca04e4403b9e7b17e9550a7b837c1b232f2c Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 29 Jun 2019 14:18:23 +0000 Subject: constraint guide: Make strength tweakable The strength for the natural width can be used as a tie-breaker to make instable systems behave in a more predictable way. This can be seen in the simple constraints demo in gtk-demo. --- demos/gtk-demo/constraints.c | 1 + gtk/gtkconstraintguide.c | 46 +++++++++++++++++++++++++++++++++++++++++++- gtk/gtkconstraintguide.h | 8 ++++++++ 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/demos/gtk-demo/constraints.c b/demos/gtk-demo/constraints.c index 9e2bf3577d..1b6b00b2f5 100644 --- a/demos/gtk-demo/constraints.c +++ b/demos/gtk-demo/constraints.c @@ -88,6 +88,7 @@ build_constraints (SimpleGrid *self, gtk_constraint_guide_set_min_size (guide, 10, 10); gtk_constraint_guide_set_nat_size (guide, 100, 10); gtk_constraint_guide_set_max_size (guide, 200, 20); + gtk_constraint_guide_set_strength (guide, GTK_CONSTRAINT_STRENGTH_STRONG); gtk_constraint_layout_add_guide (manager, guide); gtk_constraint_layout_add_constraint (manager, diff --git a/gtk/gtkconstraintguide.c b/gtk/gtkconstraintguide.c index 60220c60f6..b6db1554b2 100644 --- a/gtk/gtkconstraintguide.c +++ b/gtk/gtkconstraintguide.c @@ -47,6 +47,8 @@ struct _GtkConstraintGuide char *name; + int strength; + int values[LAST_VALUE]; GtkConstraintLayout *layout; @@ -73,6 +75,7 @@ enum { PROP_NAT_HEIGHT, PROP_MAX_WIDTH, PROP_MAX_HEIGHT, + PROP_STRENGTH, PROP_NAME, LAST_PROP }; @@ -137,7 +140,7 @@ gtk_constraint_guide_update_constraint (GtkConstraintGuide *guide, guide->constraints[index] = gtk_constraint_solver_add_stay_variable (solver, var, - GTK_CONSTRAINT_WEIGHT_MEDIUM); + guide->strength); } else { @@ -232,6 +235,10 @@ gtk_constraint_guide_set_property (GObject *gobject, } break; + case PROP_STRENGTH: + gtk_constraint_guide_set_strength (self, g_value_get_enum (value)); + break; + case PROP_NAME: gtk_constraint_guide_set_name (self, g_value_get_string (value)); break; @@ -261,6 +268,10 @@ gtk_constraint_guide_get_property (GObject *gobject, g_value_set_int (value, self->values[prop_id - 1]); break; + case PROP_STRENGTH: + g_value_set_int (value, self->strength); + break; + case PROP_NAME: g_value_set_string (value, self->name); break; @@ -335,6 +346,15 @@ gtk_constraint_guide_class_init (GtkConstraintGuideClass *class) G_PARAM_READWRITE| G_PARAM_EXPLICIT_NOTIFY); + guide_props[PROP_STRENGTH] = + g_param_spec_enum ("strength", + "Strength", + "The strength to use for natural size", + GTK_TYPE_CONSTRAINT_STRENGTH, + GTK_CONSTRAINT_STRENGTH_MEDIUM, + G_PARAM_READWRITE| + G_PARAM_EXPLICIT_NOTIFY); + guide_props[PROP_NAME] = g_param_spec_string ("name", "Name", @@ -538,3 +558,27 @@ gtk_constraint_guide_set_name (GtkConstraintGuide *guide, guide->name = g_strdup (name); g_object_notify_by_pspec (G_OBJECT (guide), guide_props[PROP_NAME]); } + +GtkConstraintStrength +gtk_constraint_guide_get_strength (GtkConstraintGuide *guide) +{ + g_return_val_if_fail (GTK_IS_CONSTRAINT_GUIDE (guide), + GTK_CONSTRAINT_STRENGTH_MEDIUM); + + return guide->strength; +} + +void +gtk_constraint_guide_set_strength (GtkConstraintGuide *guide, + GtkConstraintStrength strength) +{ + g_return_if_fail (GTK_IS_CONSTRAINT_GUIDE (guide)); + + if (guide->strength == strength) + return; + + guide->strength = strength; + g_object_notify_by_pspec (G_OBJECT (guide), guide_props[PROP_STRENGTH]); + gtk_constraint_guide_update_constraint (guide, NAT_WIDTH); + gtk_constraint_guide_update_constraint (guide, NAT_HEIGHT); +} diff --git a/gtk/gtkconstraintguide.h b/gtk/gtkconstraintguide.h index 429085c1f9..1a489543f8 100644 --- a/gtk/gtkconstraintguide.h +++ b/gtk/gtkconstraintguide.h @@ -21,6 +21,7 @@ #include #include +#include G_BEGIN_DECLS @@ -67,6 +68,13 @@ GDK_AVAILABLE_IN_ALL void gtk_constraint_guide_get_max_size (GtkConstraintGuide *guide, int *width, int *height); + +GDK_AVAILABLE_IN_ALL +GtkConstraintStrength gtk_constraint_guide_get_strength (GtkConstraintGuide *guide); +GDK_AVAILABLE_IN_ALL +void gtk_constraint_guide_set_strength (GtkConstraintGuide *guide, + GtkConstraintStrength strength); + GDK_AVAILABLE_IN_ALL void gtk_constraint_guide_set_name (GtkConstraintGuide *guide, const char *name); -- cgit v1.2.1