Example #1
0
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];
}
Example #2
0
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;
}
Example #3
0
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
        });