function _getSpacing(constraint) { let index = 4; if (!constraint.view1 && (constraint.attr1 === 'left')) { index = 3; } else if (!constraint.view1 && (constraint.attr1 === 'top')) { index = 0; } else if (!constraint.view2 && (constraint.attr2 === 'right')) { index = 1; } else if (!constraint.view2 && (constraint.attr2 === 'bottom')) { index = 2; } else { switch (constraint.attr1) { case 'left': case 'right': case 'centerX': case 'leading': case 'trailing': index = 4; break; case 'zIndex': index = 6; break; default: index = 5; } } this._spacingVars = this._spacingVars || new Array(7); this._spacingExpr = this._spacingExpr || new Array(7); if (!this._spacingVars[index]) { if (process.env.CASSOWARYJS) { this._spacingVars[index] = new solver.Variable(); this._solver.addEditVar(this._spacingVars[index]); this._spacingExpr[index] = solver.minus(0, this._spacingVars[index]); } else { this._spacingVars[index] = new solver.Variable(); this._solver.addEditVariable(this._spacingVars[index], solver.Strength.create(999, 1000, 1000)); this._spacingExpr[index] = this._spacingVars[index].multiply(-1); } this._solver.suggestValue(this._spacingVars[index], this._spacing[index]); } return this._spacingExpr[index]; }
function _constraintToRelation(constraint) { let relation; const multiplier = (constraint.multiplier !== undefined) ? constraint.multiplier : 1; let constant = (constraint.constant !== undefined) ? constraint.constant : 0; if (constant === 'default') { constant = _getSpacing.call(this, constraint); } const attr1 = _getSubView.call(this, constraint.view1)._getAttr(constraint.attr1); let attr2; if (process.env.CASSOWARYJS) { if (constraint.attr2 === Attribute.CONST) { attr2 = _getConst.call(this, undefined, constraint.constant); } else { attr2 = _getSubView.call(this, constraint.view2)._getAttr(constraint.attr2); if ((multiplier !== 1) && constant) { attr2 = solver.plus(solver.times(attr2, multiplier), constant); } else if (constant) { attr2 = solver.plus(attr2, constant); } else if (multiplier !== 1) { attr2 = solver.times(attr2, multiplier); } } const strength = ((constraint.priority !== undefined) && (constraint.priority < 1000)) ? new solver.Strength('priority', 0, constraint.priority, 1000) : defaultPriorityStrength; switch (constraint.relation) { case Relation.EQU: relation = new solver.Equation(attr1, attr2, strength); break; case Relation.GEQ: relation = new solver.Inequality(attr1, solver.GEQ, attr2, strength); break; case Relation.LEQ: relation = new solver.Inequality(attr1, solver.LEQ, attr2, strength); break; default: throw 'Invalid relation specified: ' + constraint.relation; } } else { if (constraint.attr2 === Attribute.CONST) { attr2 = _getConst.call(this, undefined, constraint.constant); } else { attr2 = _getSubView.call(this, constraint.view2)._getAttr(constraint.attr2); if ((multiplier !== 1) && constant) { attr2 = attr2.multiply(multiplier).plus(constant); } else if (constant) { attr2 = attr2.plus(constant); } else if (multiplier !== 1) { attr2 = attr2.multiply(multiplier); } } const strength = ((constraint.priority !== undefined) && (constraint.priority < 1000)) ? solver.Strength.create(0, constraint.priority, 1000) : defaultPriorityStrength; switch (constraint.relation) { case Relation.EQU: relation = new solver.Constraint(attr1, solver.Operator.Eq, attr2, strength); break; case Relation.GEQ: relation = new solver.Constraint(attr1, solver.Operator.Ge, attr2, strength); break; case Relation.LEQ: relation = new solver.Constraint(attr1, solver.Operator.Le, attr2, strength); break; default: throw 'Invalid relation specified: ' + constraint.relation; } } return relation; }
import find from 'lodash.find'; import solver from 'constraint-solver'; import Attribute from './Attribute'; import Relation from './Relation'; import SubView from './SubView'; const defaultPriorityStrength = process.env.CASSOWARYJS ? new solver.Strength('defaultPriority', 0, 1000, 1000) : solver.Strength.create(0, 1000, 1000); function _getConst(name, value) { if (process.env.CASSOWARYJS) { const vr = new solver.Variable({value: value}); this._solver.addConstraint(new solver.StayConstraint(vr, solver.Strength.required, 0)); return vr; } else { const vr = new solver.Variable(); this._solver.addConstraint(new solver.Constraint(vr, solver.Operator.Eq, value)); return vr; } } function _getSubView(viewName) { if (!viewName) { return this._parentSubView; } else if (viewName.name) { this._subViews[viewName.name] = this._subViews[viewName.name] || new SubView({ name: viewName.name, solver: this._solver });