From 54104b66764a7e51240f6ca0a7cd6d6f44f323a1 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Thu, 27 Jun 2019 17:34:29 +0100 Subject: [PATCH] Fix the opposite size measurement in GtkConstraintLayout We cannot use the given "for size" when querying our children, because the constraint layout has no idea about the opposite size of its children until the layout is complete. Additionally, we should only suggest an opposite size for the layout if we have one, instead of suggesting a weak zero size. --- gtk/gtkconstraintlayout.c | 104 +++++++++++++++++--------------------- 1 file changed, 47 insertions(+), 57 deletions(-) diff --git a/gtk/gtkconstraintlayout.c b/gtk/gtkconstraintlayout.c index a111dbe591..86cdd2840f 100644 --- a/gtk/gtkconstraintlayout.c +++ b/gtk/gtkconstraintlayout.c @@ -693,57 +693,47 @@ gtk_constraint_layout_measure (GtkLayoutManager *manager, child_info = GTK_CONSTRAINT_LAYOUT_CHILD (gtk_layout_manager_get_layout_child (manager, child)); - gtk_widget_measure (child, orientation, for_size, + gtk_widget_measure (child, orientation, -1, &min_size, &nat_size, NULL, NULL); - switch (orientation) - { - case GTK_ORIENTATION_HORIZONTAL: - width_var = get_child_attribute (child_info, solver, child, - GTK_CONSTRAINT_ATTRIBUTE_WIDTH); + width_var = get_child_attribute (child_info, solver, child, + GTK_CONSTRAINT_ATTRIBUTE_WIDTH); - constraint = - gtk_constraint_solver_add_constraint (solver, - width_var, - GTK_CONSTRAINT_RELATION_GE, - gtk_constraint_expression_new (min_size), - GTK_CONSTRAINT_WEIGHT_REQUIRED); - g_ptr_array_add (size_constraints, constraint); + constraint = + gtk_constraint_solver_add_constraint (solver, + width_var, + GTK_CONSTRAINT_RELATION_GE, + gtk_constraint_expression_new (min_size), + 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; + 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); - case GTK_ORIENTATION_VERTICAL: - height_var = get_child_attribute (child_info, solver, child, - GTK_CONSTRAINT_ATTRIBUTE_HEIGHT); + height_var = get_child_attribute (child_info, solver, child, + GTK_CONSTRAINT_ATTRIBUTE_HEIGHT); - constraint = - gtk_constraint_solver_add_constraint (solver, - height_var, - GTK_CONSTRAINT_RELATION_GE, - gtk_constraint_expression_new (min_size), - GTK_CONSTRAINT_WEIGHT_REQUIRED); - g_ptr_array_add (size_constraints, constraint); + constraint = + gtk_constraint_solver_add_constraint (solver, + height_var, + GTK_CONSTRAINT_RELATION_GE, + gtk_constraint_expression_new (min_size), + GTK_CONSTRAINT_WEIGHT_REQUIRED); + 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: - break; - } + 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); } switch (orientation) @@ -769,15 +759,22 @@ gtk_constraint_layout_measure (GtkLayoutManager *manager, * natural state of the system. Once we get the value out, we can * remove these constraints */ - gtk_constraint_solver_add_edit_variable (solver, size, GTK_CONSTRAINT_WEIGHT_WEAK + 1); - gtk_constraint_solver_add_edit_variable (solver, opposite_size, GTK_CONSTRAINT_WEIGHT_WEAK + 2); + if (for_size > 0) + { + gtk_constraint_solver_add_edit_variable (solver, opposite_size, GTK_CONSTRAINT_WEIGHT_MEDIUM * 2.0); + gtk_constraint_solver_begin_edit (solver); + gtk_constraint_solver_suggest_value (solver, opposite_size, for_size); + gtk_constraint_solver_resolve (solver); - gtk_constraint_solver_begin_edit (solver); + value = gtk_constraint_variable_get_value (size); - gtk_constraint_solver_suggest_value (solver, size, 0.0); - gtk_constraint_solver_suggest_value (solver, opposite_size, for_size >= 0 ? for_size : 0.0); - - gtk_constraint_solver_resolve (solver); + gtk_constraint_solver_remove_edit_variable (solver, opposite_size); + gtk_constraint_solver_end_edit (solver); + } + else + { + value = gtk_constraint_variable_get_value (size); + } GTK_NOTE (LAYOUT, g_print ("layout %p preferred %s size: %.3f (for opposite size: %d)\n", @@ -786,13 +783,6 @@ gtk_constraint_layout_measure (GtkLayoutManager *manager, gtk_constraint_variable_get_value (size), for_size)); - value = gtk_constraint_variable_get_value (size); - - gtk_constraint_solver_remove_edit_variable (solver, size); - gtk_constraint_solver_remove_edit_variable (solver, opposite_size); - - gtk_constraint_solver_end_edit (solver); - for (guint i = 0; i < size_constraints->len; i++) { GtkConstraintRef *ref = g_ptr_array_index (size_constraints, i);