protected ClVariable GetCompositeVariableFromViewAndAttribute(T view, LayoutAttribute attribute) { if (HasVariableForViewAndAttribute(view, attribute)) { return(GetVariableFromViewAndAttribute(view, attribute)); } switch (attribute) { case LayoutAttribute.Width: { var leftVar = GetVariableFromViewAndAttribute(view, LayoutAttribute.Left); var rightVar = GetVariableFromViewAndAttribute(view, LayoutAttribute.Right); var widthExpression = Cl.Minus( new ClLinearExpression(rightVar), new ClLinearExpression(leftVar) ); var widthVariable = new ClVariable(viewEngine.GetViewName(view) + ".Width"); solver.AddConstraint(new ClLinearEquation( widthVariable, widthExpression, ClStrength.Required )); AddVariableForViewAndAttribute(view, attribute, widthVariable); return(widthVariable); } case LayoutAttribute.Height: { var topVar = GetVariableFromViewAndAttribute(view, LayoutAttribute.Top); var bottomVar = GetVariableFromViewAndAttribute(view, LayoutAttribute.Bottom); var heightExpression = Cl.Minus( new ClLinearExpression(bottomVar), new ClLinearExpression(topVar) ); var heightVariable = new ClVariable(viewEngine.GetViewName(view) + ".Height"); solver.AddConstraint(new ClLinearEquation( heightVariable, heightExpression, ClStrength.Required )); solver.AddConstraint(new ClLinearInequality( heightVariable, Cl.Operator.GreaterThanOrEqualTo, new ClLinearExpression(0) )); AddVariableForViewAndAttribute(view, attribute, heightVariable); return(heightVariable); } case LayoutAttribute.CenterX: { var leftVar = GetVariableFromViewAndAttribute(view, LayoutAttribute.Left); var rightVar = GetVariableFromViewAndAttribute(view, LayoutAttribute.Right); var centerXExpression = Cl.Plus( Cl.Divide(new ClLinearExpression(leftVar), new ClLinearExpression(2)), Cl.Divide(new ClLinearExpression(rightVar), new ClLinearExpression(2)) ); var centerXVariable = new ClVariable(viewEngine.GetViewName(view) + ".CenterX"); solver.AddConstraint(new ClLinearEquation( centerXVariable, centerXExpression, ClStrength.Required )); AddVariableForViewAndAttribute(view, attribute, centerXVariable); return(centerXVariable); } case LayoutAttribute.CenterY: { var topVar = GetVariableFromViewAndAttribute(view, LayoutAttribute.Top); var bottomVar = GetVariableFromViewAndAttribute(view, LayoutAttribute.Bottom); var centerYExpression = Cl.Plus( Cl.Divide(new ClLinearExpression(topVar), new ClLinearExpression(2)), Cl.Divide(new ClLinearExpression(bottomVar), new ClLinearExpression(2)) ); var centerYVariable = new ClVariable(viewEngine.GetViewName(view) + ".CenterY"); solver.AddConstraint(new ClLinearEquation( centerYVariable, centerYExpression, ClStrength.Required )); AddVariableForViewAndAttribute(view, attribute, centerYVariable); return(centerYVariable); } } return(null); }
protected Variable GetCompositeVariableFromViewAndAttribute(T view, LayoutAttribute attribute, Variable leftVar, Variable rightVar, Variable topVar, Variable bottomVar) { switch (attribute) { case LayoutAttribute.Width: { var widthExpression = kiwi.kiwi.__minus__( rightVar, leftVar ); var widthVariable = new Variable(viewEngine.GetViewName(view) + ".Width"); solver.addConstraint(new Constraint( kiwi.kiwi.__minus__(widthVariable, widthExpression), RelationalOperator.OP_EQ, kiwi.kiwi.required)); AddVariableForViewAndAttribute(view, attribute, widthVariable); return(widthVariable); } case LayoutAttribute.Height: { var heightExpression = kiwi.kiwi.__minus__( bottomVar, topVar ); var heightVariable = new Variable(viewEngine.GetViewName(view) + ".Height"); solver.addConstraint(new Constraint( kiwi.kiwi.__minus__(heightVariable, heightExpression), RelationalOperator.OP_EQ, kiwi.kiwi.required)); AddVariableForViewAndAttribute(view, attribute, heightVariable); return(heightVariable); } case LayoutAttribute.CenterX: { var centerXExpression = kiwi.kiwi.__plus__( kiwi.kiwi.__div__(leftVar, 2), kiwi.kiwi.__div__(rightVar, 2) ); var centerXVariable = new Variable(viewEngine.GetViewName(view) + ".CenterX"); solver.addConstraint(new Constraint( kiwi.kiwi.__minus__(centerXVariable, centerXExpression), RelationalOperator.OP_EQ, kiwi.kiwi.required )); AddVariableForViewAndAttribute(view, attribute, centerXVariable); return(centerXVariable); } case LayoutAttribute.CenterY: { var centerYExpression = kiwi.kiwi.__plus__( kiwi.kiwi.__div__(topVar, 2), kiwi.kiwi.__div__(bottomVar, 2) ); var centerYVariable = new Variable(viewEngine.GetViewName(view) + ".CenterY"); solver.addConstraint(new Constraint( kiwi.kiwi.__minus__(centerYVariable, centerYExpression), RelationalOperator.OP_EQ, kiwi.kiwi.required )); AddVariableForViewAndAttribute(view, attribute, centerYVariable); return(centerYVariable); } } return(null); }