Пример #1
0
        // Sync text values to class properties. Used for animation.
        protected virtual void Sync()
        {
            SetDefault(false);
            foreach (var kv in layoutAttribute)
            {
                if (!Flex.ParseStyleAttr(this, kv.Key, kv.Value))
                {
                    throw new Exception("Failed to parse attribute [" + kv.Key + ":" + kv.Value + "]");
                }
            }

            foreach (var kv in layoutAttributeAnimated)
            {
                if (!Flex.ParseStyleAttr(this, kv.Key, kv.Value))
                {
                    throw new Exception("Failed to parse attribute [" + kv.Key + ":" + kv.Value + "]");
                }
            }
        }
Пример #2
0
 // LayoutGetMargin gets margin
 internal float LayoutGetMargin(Edge edge)
 {
     Flex.assertWithNode(this, edge < Edge.End, "Cannot get layout properties of multi-edge shorthands");
     if (edge == Edge.Left)
     {
         if (this.nodeLayout.Direction == Direction.RTL)
         {
             return(this.nodeLayout.Margin[(int)Edge.End]);
         }
         return(this.nodeLayout.Margin[(int)Edge.Start]);
     }
     if (edge == Edge.Right)
     {
         if (this.nodeLayout.Direction == Direction.RTL)
         {
             return(this.nodeLayout.Margin[(int)Edge.Start]);
         }
         return(this.nodeLayout.Margin[(int)Edge.End]);
     }
     return(this.nodeLayout.Margin[(int)edge]);
 }
Пример #3
0
        public static bool ParseStyleAttr(Style style, string attrKey, string attrValue)
        {
            bool parsed = true;

            switch (attrKey)
            {
            case "direction":
                parsed = Flex.StringToDirection(attrValue, out style.Direction);
                break;

            case "flex-direction":
                parsed = Flex.StringToFlexDirection(attrValue, out style.FlexDirection);
                break;

            case "justify-content":
                parsed = Flex.StringToJustify(attrValue, out style.JustifyContent);
                break;

            case "align-content":
                parsed = Flex.StringToAlign(attrValue, out style.AlignContent);
                break;

            case "align-items":
                parsed = Flex.StringToAlign(attrValue, out style.AlignItems);
                break;

            case "align-self":
                parsed = Flex.StringToAlign(attrValue, out style.AlignSelf);
                break;

            case "flex-wrap":
                parsed = Flex.StringToWrap(attrValue, out style.FlexWrap);
                break;

            case "overflow":
                parsed = Flex.StringToOverflow(attrValue, out style.Overflow);
                break;

            case "display":
                parsed = Flex.StringToDisplay(attrValue, out style.Display);
                break;

            case "flex-grow":
                parsed = float.TryParse(attrValue, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out style.FlexGrow);
                break;

            case "flex-shrink":
                parsed = float.TryParse(attrValue, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out style.FlexShrink);
                break;

            case "flex-basis":
                parsed = ParseValueFromString(attrValue, out style.FlexBasis);
                break;

            case "position":
                parsed = Flex.StringToPositionType(attrValue, out style.PositionType);
                break;

            case "left":
                parsed = ParseValueFromString(attrValue, out style.Position[(int)Edge.Left]);
                break;

            case "top":
                parsed = ParseValueFromString(attrValue, out style.Position[(int)Edge.Top]);
                break;

            case "right":
                parsed = ParseValueFromString(attrValue, out style.Position[(int)Edge.Right]);
                break;

            case "bottom":
                parsed = ParseValueFromString(attrValue, out style.Position[(int)Edge.Bottom]);
                break;

            case "width":
                parsed = ParseValueFromString(attrValue, out style.Dimensions[(int)Dimension.Width]);
                break;

            case "height":
                parsed = ParseValueFromString(attrValue, out style.Dimensions[(int)Dimension.Height]);
                break;

            case "min-width":
                parsed = ParseValueFromString(attrValue, out style.MinDimensions[(int)Dimension.Width]);
                break;

            case "min-height":
                parsed = ParseValueFromString(attrValue, out style.MinDimensions[(int)Dimension.Height]);
                break;

            case "max-width":
                parsed = ParseValueFromString(attrValue, out style.MaxDimensions[(int)Dimension.Width]);
                break;

            case "max-height":
                parsed = ParseValueFromString(attrValue, out style.MaxDimensions[(int)Dimension.Height]);
                break;

            case "margin":
            case "margin-left":
            case "margin-right":
            case "margin-top":
            case "margin-bottom":
            case "padding":
            case "padding-left":
            case "padding-right":
            case "padding-top":
            case "padding-bottom":
            case "border-width":
            case "border-left-width":
            case "border-right-width":
            case "border-top-width":
            case "border-bottom-width":
                // parse [margin|padding|border]-[Edgexxxx]
                if (ParseBreakWork(attrKey, out string head, out string tail))
                {
                    if (tail == "")
                    {
                        switch (head)
                        {
                        case "margin": parsed = ParseFourValueFromString(attrValue, out style.Margin); break;

                        case "padding": parsed = ParseFourValueFromString(attrValue, out style.Padding); break;

                        case "border": parsed = ParseFourValueFromString(attrValue, out style.Border); break;

                        default: parsed = false; break;
                        }
                    }
                    else if (Flex.StringToEdge(tail, out Edge edge))
                    {
                        switch (head)
                        {
                        case "margin": parsed = ParseValueFromString(attrValue, out style.Margin[(int)edge]); break;

                        case "padding": parsed = ParseValueFromString(attrValue, out style.Padding[(int)edge]); break;

                        case "border": parsed = ParseValueFromString(attrValue, out style.Border[(int)edge]); break;

                        default: parsed = false; break;
                        }
                    }
                    else
                    {
                        parsed = false;
                    }
                }
                else
                {
                    parsed = false;
                }
                break;
Пример #4
0
        // get/set attribute by text name used string value
        public virtual string this[string attr]
        {
            get
            {
                if (layoutAttributeAnimated.ContainsKey(attr))
                {
                    return(layoutAttributeAnimated[attr]);
                }
                if (!layoutAttributeDefault.ContainsKey(attr))
                {
                    throw new Exception("Try to get unknown layout style attribute [" + attr + "]");
                }
                string value = layoutAttribute.ContainsKey(attr) ? layoutAttribute[attr] : layoutAttributeDefault[attr];
                if (layoutAttributeInherit.ContainsKey(attr) && value == "inherit")
                {
                    //! Dirty-dirty hack (for good solution need to knew style of parent node, placed in TODO)
                    value = layoutAttributeInherit[attr];
                }
                return(value);
            }
            set
            {
                value = value.Trim();

                // if attr is margin, padding, border-width - ignore it in change tracking and expands it to edges(top, right, bottom, and left)
                if (attr == "margin" || attr == "padding" || attr == "border-width")
                {
                    var tail = attr == "border-width" ? "-width" : "";
                    var name = attr == "border-width" ? "border" : attr;
                    if (Flex.ParseFourValueFromString(value, out var vals))
                    {
                        foreach (var kv in edgeNameToId)
                        {
                            this[name + "-" + kv.Key + tail] = vals[kv.Value].value.ToString("F", System.Globalization.CultureInfo.InvariantCulture)
                                                               + (vals[kv.Value].unit == Unit.Percent ? "%" : "");
                        }
                    }
                    else
                    {
                        throw new Exception("Failed to parse attribute [" + attr + ":" + value + "]");
                    }

                    return;
                }

                if (!layoutAttributeDefault.ContainsKey(attr))
                {
                    throw new Exception("Try to set unknown layout style attribute [" + attr + "]");
                }
                if (setMode)
                {
                    var old_value = layoutAttributeWas.ContainsKey(attr) ? layoutAttributeWas[attr] : layoutAttributeDefault[attr];
                    if (value != old_value)
                    {
                        layoutAttributeChanged[attr] = old_value;
                    }
                    else if (layoutAttributeChanged.ContainsKey(attr))
                    {
                        layoutAttributeChanged.Remove(attr);
                    }
                }
                else
                {
                    layoutAttributeChanged[attr] = this[attr];
                }
                layoutAttribute[attr] = value;
                if (!Flex.ParseStyleAttr(this, attr, value))
                {
                    throw new Exception("Failed to parse attribute [" + attr + ":" + value + "]");
                }
            }
        }
Пример #5
0
 public void MarkAsDirty()
 {
     Flex.nodeMarkDirtyInternal(this);
 }
Пример #6
0
 public void CalculateLayout(float parentWidth, float parentHeight, Direction parentDirection)
 {
     _layout = null;
     Flex.CalculateLayout(this, parentWidth, parentHeight, parentDirection);
 }
Пример #7
0
 public void RemoveChild(Node child)
 {
     Flex.RemoveChild(this, child);
 }
Пример #8
0
 public void InsertChild(Node child, int idx)
 {
     Flex.InsertChild(this, child, idx);
 }
Пример #9
0
 public void AddChild(Node child)
 {
     Flex.InsertChild(this, child, ChildrenCount);
 }
Пример #10
0
 public Node GetChild(int idx)
 {
     return(Flex.GetChild(this, idx));
 }
Пример #11
0
 public void SetMeasureFunc(MeasureFunc measureFunc)
 {
     Flex.SetMeasureFunc(this, measureFunc);
 }