diff options
author | Emmanuele Bassi <ebassi@gnome.org> | 2019-06-27 17:08:48 +0100 |
---|---|---|
committer | Emmanuele Bassi <ebassi@gnome.org> | 2019-06-27 17:38:02 +0100 |
commit | 19e7d412e3462d5961040dcd5b1d675421896c5a (patch) | |
tree | 124edd77bbe982e3ed636de67a9b0bd408856ced | |
parent | 80c27061c68d88997d1ef28fceb3854d77f8282a (diff) | |
download | gtk+-19e7d412e3462d5961040dcd5b1d675421896c5a.tar.gz |
Remove size constraints from ConstraintLayoutChild
The size constraints are transient to measurement and allocation, so
they don't really need to be stored inside the GtkLayoutChild subclass
created by a GtkConstraintLayout.
-rw-r--r-- | gtk/gtkconstraintlayout.c | 100 |
1 files changed, 48 insertions, 52 deletions
diff --git a/gtk/gtkconstraintlayout.c b/gtk/gtkconstraintlayout.c index 390149fde2..a111dbe591 100644 --- a/gtk/gtkconstraintlayout.c +++ b/gtk/gtkconstraintlayout.c @@ -82,10 +82,6 @@ struct _GtkConstraintLayoutChild * to be freed. */ GHashTable *bound_attributes; - - /* Internal constraints on minimum and natural sizes */ - GtkConstraintRef *width_constraint[2]; - GtkConstraintRef *height_constraint[2]; }; struct _GtkConstraintLayout @@ -333,22 +329,6 @@ static void gtk_constraint_layout_child_finalize (GObject *gobject) { GtkConstraintLayoutChild *self = GTK_CONSTRAINT_LAYOUT_CHILD (gobject); - GtkLayoutManager *manager; - GtkConstraintSolver *solver; - - manager = gtk_layout_child_get_layout_manager (GTK_LAYOUT_CHILD (self)); - solver = gtk_constraint_layout_get_solver (GTK_CONSTRAINT_LAYOUT (manager)); - if (solver != NULL) - { - if (self->width_constraint[0] != NULL) - gtk_constraint_solver_remove_constraint (solver, self->width_constraint[0]); - if (self->width_constraint[1] != NULL) - gtk_constraint_solver_remove_constraint (solver, self->width_constraint[1]); - if (self->height_constraint[0] != NULL) - gtk_constraint_solver_remove_constraint (solver, self->height_constraint[0]); - if (self->height_constraint[1] != NULL) - gtk_constraint_solver_remove_constraint (solver, self->height_constraint[1]); - } g_clear_pointer (&self->bound_attributes, g_hash_table_unref); @@ -685,6 +665,7 @@ gtk_constraint_layout_measure (GtkLayoutManager *manager, GtkConstraintLayout *self = GTK_CONSTRAINT_LAYOUT (manager); GtkConstraintVariable *size, *opposite_size; GtkConstraintSolver *solver; + GPtrArray *size_constraints; GtkWidget *child; int value; @@ -692,6 +673,8 @@ gtk_constraint_layout_measure (GtkLayoutManager *manager, if (solver == NULL) return; + size_constraints = g_ptr_array_new (); + /* We measure each child in the layout and impose restrictions on the * minimum and natural size, so we can solve the size of the overall * layout later on @@ -702,6 +685,7 @@ gtk_constraint_layout_measure (GtkLayoutManager *manager, { GtkConstraintLayoutChild *child_info; GtkConstraintVariable *width_var, *height_var; + GtkConstraintRef *constraint; int min_size = 0, nat_size = 0; if (!gtk_widget_should_layout (child)) @@ -713,54 +697,48 @@ gtk_constraint_layout_measure (GtkLayoutManager *manager, &min_size, &nat_size, NULL, NULL); - if (child_info->width_constraint[0] != NULL) - { - gtk_constraint_solver_remove_constraint (solver, child_info->width_constraint[0]); - gtk_constraint_solver_remove_constraint (solver, child_info->width_constraint[1]); - } - - if (child_info->height_constraint[0] != NULL) - { - gtk_constraint_solver_remove_constraint (solver, child_info->height_constraint[0]); - gtk_constraint_solver_remove_constraint (solver, child_info->height_constraint[1]); - } - switch (orientation) { case GTK_ORIENTATION_HORIZONTAL: width_var = get_child_attribute (child_info, solver, child, GTK_CONSTRAINT_ATTRIBUTE_WIDTH); - child_info->width_constraint[0] = + constraint = gtk_constraint_solver_add_constraint (solver, width_var, GTK_CONSTRAINT_RELATION_GE, gtk_constraint_expression_new (min_size), - GTK_CONSTRAINT_WEIGHT_REQUIRED); - child_info->width_constraint[1] = + GTK_CONSTRAINT_WEIGHT_REQUIRED); + g_ptr_array_add (size_constraints, constraint); + + constraint = gtk_constraint_solver_add_constraint (solver, width_var, GTK_CONSTRAINT_RELATION_EQ, gtk_constraint_expression_new (nat_size), GTK_CONSTRAINT_WEIGHT_MEDIUM); + g_ptr_array_add (size_constraints, constraint); break; case GTK_ORIENTATION_VERTICAL: height_var = get_child_attribute (child_info, solver, child, GTK_CONSTRAINT_ATTRIBUTE_HEIGHT); - child_info->height_constraint[0] = + constraint = gtk_constraint_solver_add_constraint (solver, height_var, GTK_CONSTRAINT_RELATION_GE, gtk_constraint_expression_new (min_size), GTK_CONSTRAINT_WEIGHT_REQUIRED); - child_info->height_constraint[1] = + g_ptr_array_add (size_constraints, constraint); + + constraint = gtk_constraint_solver_add_constraint (solver, height_var, GTK_CONSTRAINT_RELATION_EQ, gtk_constraint_expression_new (nat_size), GTK_CONSTRAINT_WEIGHT_MEDIUM); + g_ptr_array_add (size_constraints, constraint); break; default: @@ -815,6 +793,15 @@ gtk_constraint_layout_measure (GtkLayoutManager *manager, gtk_constraint_solver_end_edit (solver); + for (guint i = 0; i < size_constraints->len; i++) + { + GtkConstraintRef *ref = g_ptr_array_index (size_constraints, i); + + gtk_constraint_solver_remove_constraint (solver, ref); + } + + g_ptr_array_unref (size_constraints); + if (minimum != NULL) *minimum = value; @@ -834,6 +821,7 @@ gtk_constraint_layout_allocate (GtkLayoutManager *manager, GtkConstraintSolver *solver; GtkConstraintVariable *layout_top, *layout_height; GtkConstraintVariable *layout_left, *layout_width; + GPtrArray *size_constraints; GtkWidget *child; solver = gtk_constraint_layout_get_solver (self); @@ -872,6 +860,8 @@ gtk_constraint_layout_allocate (GtkLayoutManager *manager, gtk_constraint_variable_get_value (layout_width), gtk_constraint_variable_get_value (layout_height))); + size_constraints = g_ptr_array_new (); + /* We reset the constraints on the size of each child, so we are sure the * layout is up to date */ @@ -882,6 +872,7 @@ gtk_constraint_layout_allocate (GtkLayoutManager *manager, GtkConstraintLayoutChild *child_info; GtkConstraintVariable *width_var, *height_var; GtkRequisition min_req, nat_req; + GtkConstraintRef *constraint; if (!gtk_widget_should_layout (child)) continue; @@ -890,49 +881,44 @@ gtk_constraint_layout_allocate (GtkLayoutManager *manager, gtk_widget_get_preferred_size (child, &min_req, &nat_req); - if (child_info->width_constraint[0] != NULL) - { - gtk_constraint_solver_remove_constraint (solver, child_info->width_constraint[0]); - gtk_constraint_solver_remove_constraint (solver, child_info->width_constraint[1]); - } - - if (child_info->height_constraint[0] != NULL) - { - gtk_constraint_solver_remove_constraint (solver, child_info->height_constraint[0]); - gtk_constraint_solver_remove_constraint (solver, child_info->height_constraint[1]); - } width_var = get_child_attribute (child_info, solver, child, GTK_CONSTRAINT_ATTRIBUTE_WIDTH); - child_info->width_constraint[0] = + constraint = gtk_constraint_solver_add_constraint (solver, width_var, GTK_CONSTRAINT_RELATION_GE, gtk_constraint_expression_new (min_req.width), GTK_CONSTRAINT_WEIGHT_REQUIRED); - child_info->width_constraint[1] = + g_ptr_array_add (size_constraints, constraint); + + constraint = gtk_constraint_solver_add_constraint (solver, width_var, GTK_CONSTRAINT_RELATION_EQ, gtk_constraint_expression_new (nat_req.width), GTK_CONSTRAINT_WEIGHT_MEDIUM); + g_ptr_array_add (size_constraints, constraint); height_var = get_child_attribute (child_info, solver, child, GTK_CONSTRAINT_ATTRIBUTE_HEIGHT); - child_info->height_constraint[0] = + constraint = gtk_constraint_solver_add_constraint (solver, height_var, GTK_CONSTRAINT_RELATION_GE, gtk_constraint_expression_new (min_req.height), GTK_CONSTRAINT_WEIGHT_REQUIRED); - child_info->height_constraint[1] = + g_ptr_array_add (size_constraints, constraint); + + constraint = gtk_constraint_solver_add_constraint (solver, height_var, GTK_CONSTRAINT_RELATION_EQ, gtk_constraint_expression_new (nat_req.height), GTK_CONSTRAINT_WEIGHT_MEDIUM); + g_ptr_array_add (size_constraints, constraint); } for (child = _gtk_widget_get_first_child (widget); @@ -979,6 +965,16 @@ gtk_constraint_layout_allocate (GtkLayoutManager *manager, child_baseline); } + /* The constraints on the children sizes can be removed now */ + for (guint i = 0; i < size_constraints->len; i++) + { + GtkConstraintRef *ref = g_ptr_array_index (size_constraints, i); + + gtk_constraint_solver_remove_constraint (solver, ref); + } + + g_ptr_array_unref (size_constraints); + /* The allocation stay constraints are not needed any more */ gtk_constraint_solver_remove_constraint (solver, stay_w); gtk_constraint_solver_remove_constraint (solver, stay_h); |