Properly handle unbounded results in SharedSolver::Validate{Min|Max}()

This commit is contained in:
Alex Wilson
2012-05-03 08:45:12 +12:00
parent 1cbe95140a
commit a9242e3d98
+17 -5
View File
@@ -19,11 +19,16 @@ struct SharedSolver::MinSizeValidator {
spec->FindMins(vars); spec->FindMins(vars);
} }
inline void Finalize(BALMLayout* layout, SharedSolver* solver) inline void Finalize(BALMLayout* layout, SharedSolver* solver,
ResultType solveResult)
{ {
if (solveResult == LinearProgramming::kUnbounded) {
solver->SetMinSize(layout, BSize(0, 0));
} else {
solver->SetMinSize(layout, BSize(layout->Right()->Value(), solver->SetMinSize(layout, BSize(layout->Right()->Value(),
layout->Bottom()->Value())); layout->Bottom()->Value()));
} }
}
}; };
@@ -33,11 +38,17 @@ struct SharedSolver::MaxSizeValidator {
spec->FindMaxs(vars); spec->FindMaxs(vars);
} }
inline void Finalize(BALMLayout* layout, SharedSolver* solver) inline void Finalize(BALMLayout* layout, SharedSolver* solver,
ResultType solveResult)
{ {
if (solveResult == LinearProgramming::kUnbounded) {
solver->SetMaxSize(layout,
BSize(B_SIZE_UNLIMITED, B_SIZE_UNLIMITED));
} else {
solver->SetMaxSize(layout, BSize(layout->Right()->Value(), solver->SetMaxSize(layout, BSize(layout->Right()->Value(),
layout->Bottom()->Value())); layout->Bottom()->Value()));
} }
}
}; };
@@ -47,7 +58,8 @@ struct SharedSolver::PreferredSizeValidator {
spec->Solve(); spec->Solve();
} }
inline void Finalize(BALMLayout* layout, SharedSolver* solver) inline void Finalize(BALMLayout* layout, SharedSolver* solver,
ResultType solveResult)
{ {
float width = layout->Right()->Value() - layout->Left()->Value(); float width = layout->Right()->Value() - layout->Left()->Value();
float height = layout->Top()->Value() - layout->Bottom()->Value(); float height = layout->Top()->Value() - layout->Bottom()->Value();
@@ -238,11 +250,11 @@ SharedSolver::_Validate(bool& isValid, ResultType& result)
} }
validator.CallSolverMethod(&fLinearSpec, &variables); validator.CallSolverMethod(&fLinearSpec, &variables);
result = fLinearSpec.Result();
for (int32 i = fLayouts.CountItems() - 1; i >= 0; i--) for (int32 i = fLayouts.CountItems() - 1; i >= 0; i--)
validator.Finalize(fLayouts.ItemAt(i), this); validator.Finalize(fLayouts.ItemAt(i), this, result);
result = fLinearSpec.Result();
isValid = true; isValid = true;
fLayoutValid = false; fLayoutValid = false;
} }