diff --git a/packages/cassowary/lib/param.dart b/packages/cassowary/lib/param.dart index 0705d0e8df8..0b2b5c14f9a 100644 --- a/packages/cassowary/lib/param.dart +++ b/packages/cassowary/lib/param.dart @@ -7,8 +7,13 @@ part of cassowary; class Param extends _EquationMember { final Variable variable; - Param.withVariable(this.variable); - Param([double value = 0.0]) : this.variable = new Variable(value); + Param.withVariable(this.variable) { + variable._owner = this; + } + + Param([double value = 0.0]) : this.variable = new Variable(value) { + variable._owner = this; + } bool get isConstant => false; diff --git a/packages/cassowary/lib/solver.dart b/packages/cassowary/lib/solver.dart index c0ce826c3c0..59ee312bc1e 100644 --- a/packages/cassowary/lib/solver.dart +++ b/packages/cassowary/lib/solver.dart @@ -168,16 +168,20 @@ class Solver { return _dualOptimize(); } - void flushVariableUpdates() { + List flushParameterUpdates() { + List updates = new List(); + for (Variable variable in _vars.keys) { _Symbol symbol = _vars[variable]; _Row row = _rows[symbol]; - if (row == null) { - variable.value = 0.0; - } else { - variable.value = row.constant; + + double updatedValue = row == null ? 0.0 : row.constant; + + if (variable._applyUpdate(updatedValue) && variable._owner != null) { + updates.add(variable._owner); } } + return updates; } _Symbol _symbolForVariable(Variable variable) { diff --git a/packages/cassowary/lib/variable.dart b/packages/cassowary/lib/variable.dart index 31926019230..40219f77fdb 100644 --- a/packages/cassowary/lib/variable.dart +++ b/packages/cassowary/lib/variable.dart @@ -8,12 +8,18 @@ class Variable { double value = 0.0; String name; + Param _owner; + int _tick; static int _total = 0; Variable(this.value) : _tick = _total++; - // TODO(csg): Add external variable update callbacks here + bool _applyUpdate(double updated) { + bool res = updated != value; + value = updated; + return res; + } String get debugName => _elvis(name, "variable${_tick}"); diff --git a/packages/cassowary/test/cassowary_test.dart b/packages/cassowary/test/cassowary_test.dart index 854b23b2517..7c2e60d7aa8 100644 --- a/packages/cassowary/test/cassowary_test.dart +++ b/packages/cassowary/test/cassowary_test.dart @@ -427,7 +427,7 @@ void main() { var left = new Param(-20.0); Solver s = new Solver(); s.addConstraint(left >= CM(0.0)); - s.flushVariableUpdates(); + s.flushParameterUpdates(); expect(left.value, 0.0); }); @@ -443,7 +443,7 @@ void main() { expect(s.addConstraint(right - left >= CM(100.0)), Result.success); expect(s.addConstraint(left >= CM(0.0)), Result.success); - s.flushVariableUpdates(); + s.flushParameterUpdates(); expect(left.value, 0.0); expect(mid.value, 50.0); @@ -484,7 +484,7 @@ void main() { expect(s.addEditVariable(mid.variable, Priority.strong), Result.success); expect(s.suggestValueForVariable(mid.variable, 300.0), Result.success); - s.flushVariableUpdates(); + s.flushParameterUpdates(); expect(left.value, 0.0); expect(mid.value, 300.0); @@ -494,10 +494,14 @@ void main() { test('test_description', () { var left = new Param(0.0); var right = new Param(100.0); - var c = right >= left; + var c1 = right >= left; + var c2 = right <= left; + var c3 = (right == left) as Constraint; Solver s = new Solver(); - expect(s.addConstraint(c), Result.success); + expect(s.addConstraint(c1), Result.success); + expect(s.addConstraint(c2), Result.success); + expect(s.addConstraint(c3), Result.success); expect(s.toString() != null, true); }); @@ -519,7 +523,7 @@ void main() { solver.addConstraint((p2 == CM(2.0) * p1) as Constraint); solver.addConstraint((container == (p1 + p2 + p3)) as Constraint); - solver.flushVariableUpdates(); + solver.flushParameterUpdates(); expect(container.value, 100.0); @@ -527,4 +531,29 @@ void main() { expect(p2.value, 60.0); expect(p3.value, 10.0); }); + + test('test_updates_collection', () { + Param left = new Param(); + Param mid = new Param(); + Param right = new Param(); + + Solver s = new Solver(); + + expect(s.addEditVariable(mid.variable, Priority.strong), Result.success); + + expect(s.addConstraint((mid * CM(2.0) == left + right) as Constraint), + Result.success); + expect(s.addConstraint(left >= CM(0.0)), Result.success); + + expect(s.suggestValueForVariable(mid.variable, 50.0), Result.success); + + var updates = s.flushParameterUpdates(); + + expect(updates.length, 2); + expect(updates[0] is Param, true); + + expect(left.value, 0.0); + expect(mid.value, 50.0); + expect(right.value, 100.0); + }); }