[gtk/constraint-guide-3: 9/9] constraint layout: Measure min/nat size separately
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/constraint-guide-3: 9/9] constraint layout: Measure min/nat size separately
- Date: Fri, 28 Jun 2019 23:06:36 +0000 (UTC)
commit 0f2f5db449c5afa031950dc930f7056a14895895
Author: Matthias Clasen <mclasen redhat com>
Date: Fri Jun 28 23:00:34 2019 +0000
constraint layout: Measure min/nat size separately
Only constraint the opposite direction if we
actually have a for_size, and measure natural
size after removing the edit constraints. With
these changes, the test that compares constraint
layout to grid layout passes.
gtk/gtkconstraintlayout.c | 38 ++++++++++++++++++++------------------
1 file changed, 20 insertions(+), 18 deletions(-)
---
diff --git a/gtk/gtkconstraintlayout.c b/gtk/gtkconstraintlayout.c
index 7a27b962ab..42feab7af4 100644
--- a/gtk/gtkconstraintlayout.c
+++ b/gtk/gtkconstraintlayout.c
@@ -701,7 +701,8 @@ gtk_constraint_layout_measure (GtkLayoutManager *manager,
GtkConstraintSolver *solver;
GPtrArray *size_constraints;
GtkWidget *child;
- int value;
+ int min_value;
+ int nat_value;
solver = gtk_constraint_layout_get_solver (self);
if (solver == NULL)
@@ -779,33 +780,34 @@ gtk_constraint_layout_measure (GtkLayoutManager *manager,
g_assert (size != NULL && opposite_size != NULL);
+ nat_value = gtk_constraint_variable_get_value (size);
+
/* We impose a temporary value on the size and opposite size of the
* layout, with a low weight to let the solver settle towards the
* 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_STRONG);
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_add_edit_variable (solver, opposite_size, GTK_CONSTRAINT_WEIGHT_STRONG);
+ gtk_constraint_solver_begin_edit (solver);
+ gtk_constraint_solver_suggest_value (solver, size, 0.0);
+ if (for_size > 0)
+ gtk_constraint_solver_suggest_value (solver, opposite_size, for_size);
+ gtk_constraint_solver_resolve (solver);
- value = gtk_constraint_variable_get_value (size);
+ min_value = gtk_constraint_variable_get_value (size);
- gtk_constraint_solver_remove_edit_variable (solver, opposite_size);
- gtk_constraint_solver_end_edit (solver);
- }
- else
- {
- value = gtk_constraint_variable_get_value (size);
- }
+ gtk_constraint_solver_remove_edit_variable (solver, size);
+ if (for_size > 0)
+ gtk_constraint_solver_remove_edit_variable (solver, opposite_size);
+ gtk_constraint_solver_end_edit (solver);
GTK_NOTE (LAYOUT,
- g_print ("layout %p preferred %s size: %.3f (for opposite size: %d)\n",
+ g_print ("layout %p %s size: min %d nat %d (for opposite size: %d)\n",
self,
orientation == GTK_ORIENTATION_HORIZONTAL ? "horizontal" : "vertical",
- gtk_constraint_variable_get_value (size),
+ min_value, nat_value,
for_size));
for (guint i = 0; i < size_constraints->len; i++)
@@ -818,10 +820,10 @@ gtk_constraint_layout_measure (GtkLayoutManager *manager,
g_ptr_array_unref (size_constraints);
if (minimum != NULL)
- *minimum = value;
+ *minimum = min_value;
if (natural != NULL)
- *natural = value;
+ *natural = nat_value;
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]