/// <summary>
        /// Interpolates between two colors based on a weight.
        /// </summary>
        public override object Interpolate(object from, object to, float weight)
        {
            ElementMargin a = from as ElementMargin;
            ElementMargin b = to as ElementMargin;
            if (a == null || b == null)
                return base.Interpolate(from, to, weight);

            return new ElementMargin(
                _elementSizeValueInterpolator.Interpolate(a.Left, b.Left, weight) as ElementSize,
                _elementSizeValueInterpolator.Interpolate(a.Top, b.Top, weight) as ElementSize,
                _elementSizeValueInterpolator.Interpolate(a.Right, b.Right, weight) as ElementSize,
                _elementSizeValueInterpolator.Interpolate(a.Bottom, b.Bottom, weight) as ElementSize);
        }
示例#2
0
        /// <summary>
        /// Updates the layout of the view.
        /// </summary>
        public override void LayoutChanged()
        {
            // set content margins based on tab list size and its orientation
            var contentMargin = new ElementMargin();
            var tabAlignment  = ElementAlignment.Center;

            if (TabHeaderList.Orientation == ElementOrientation.Horizontal)
            {
                if (TabHeaderList.Alignment.Value.HasFlag(ElementAlignment.Bottom))
                {
                    contentMargin.Bottom = ElementSize.FromPixels(TabHeaderList.Height.Value.Pixels);
                    tabAlignment         = ElementAlignment.Top;
                }
                else
                {
                    contentMargin.Top = ElementSize.FromPixels(TabHeaderList.Height.Value.Pixels);
                    tabAlignment      = ElementAlignment.Bottom;
                }
            }
            else
            {
                if (TabHeaderList.Alignment.Value.HasFlag(ElementAlignment.Right))
                {
                    contentMargin.Right = ElementSize.FromPixels(TabHeaderList.Width.Value.Pixels);
                    tabAlignment        = ElementAlignment.Left;
                }
                else
                {
                    contentMargin.Left = ElementSize.FromPixels(TabHeaderList.Width.Value.Pixels);
                    tabAlignment       = ElementAlignment.Right;
                }
            }

            if (AutoAdjustContentMargin)
            {
                TabContent.Margin.Value = contentMargin;
            }

            if (AutoAdjustTabListContentAlignment)
            {
                TabHeaderList.ContentAlignment.Value = tabAlignment;
            }

            base.LayoutChanged();
        }
示例#3
0
        /// <summary>
        /// Sets slider position based on value.
        /// </summary>
        private void UpdateSliderPosition(float value)
        {
            float p             = (value - Min) / (Max - Min);
            var   fillTransform = SliderFillRegion.RectTransform;

            // set handle offset
            float fillWidth      = fillTransform.rect.width;
            float slideAreaWidth = fillWidth - SliderHandleImageView.Width.Value.Pixels;
            float handleOffset   = p * slideAreaWidth + SliderFillRegion.Margin.Value.Left.Pixels;

            SliderHandleImageView.OffsetFromParent.DirectValue = ElementMargin.FromLeft(new ElementSize(handleOffset, ElementSizeUnit.Pixels));
            SliderHandleImageView.LayoutChanged();

            // set fill percentage as to match the offset of the handle
            float fillP = (handleOffset + SliderHandleImageView.Width.Value.Pixels / 2f) / fillWidth;

            SliderFillImageView.Width.DirectValue = new ElementSize(fillP, ElementSizeUnit.Percents);
            SliderFillImageView.LayoutChanged();
        }
示例#4
0
        /// <summary>
        /// Updates the layout of the view.
        /// </summary>
        public override void LayoutChanged()
        {
            float maxWidth         = 0f;
            float maxHeight        = 0f;
            float totalWidth       = 0f;
            float totalHeight      = 0f;
            bool  percentageWidth  = false;
            bool  percentageHeight = false;

            bool isHorizontal = Orientation == ElementOrientation.Horizontal;

            var children           = new List <UIView>();
            var childrenToBeSorted = new List <UIView>();

            _groupContentContainer.ForEachChild <UIView>(x =>
            {
                // should this be sorted?
                if (x.SortIndex != 0)
                {
                    // yes.
                    childrenToBeSorted.Add(x);
                    return;
                }

                children.Add(x);
            }, false);

            if (SortDirection == ElementSortDirection.Ascending)
            {
                children.AddRange(childrenToBeSorted.OrderBy(x => x.SortIndex.Value));
            }
            else
            {
                children.AddRange(childrenToBeSorted.OrderByDescending(x => x.SortIndex.Value));
            }

            // get size of content and set content offsets and alignment
            int childCount = children.Count;
            int childIndex = 0;

            for (int i = 0; i < childCount; ++i)
            {
                var view = children[i];

                // don't group disabled views
                if (!view.IsLive)
                {
                    if (SetChildVisibility)
                    {
                        view.IsVisible.Value = false;
                    }
                    continue;
                }

                if (view.Width.Value.Unit == ElementSizeUnit.Percents)
                {
                    if (isHorizontal)
                    {
                        Debug.LogWarning(String.Format("[MarkLight] Unable to group view \"{0}\" horizontally as it doesn't specify its width in pixels or elements.", view.GameObjectName));
                        continue;
                    }
                    else
                    {
                        percentageWidth = true;
                    }
                }

                if (view.Height.Value.Unit == ElementSizeUnit.Percents)
                {
                    if (!isHorizontal)
                    {
                        Debug.LogWarning(String.Format("[MarkLight] Unable to group view \"{0}\" vertically as it doesn't specify its height in pixels or elements.", view.GameObjectName));
                        continue;
                    }
                    else
                    {
                        percentageHeight = true;
                    }
                }

                // set offsets and alignment
                var offset = new ElementMargin(
                    new ElementSize(isHorizontal ? totalWidth + Spacing.Value.Pixels * childIndex : 0f, ElementSizeUnit.Pixels),
                    new ElementSize(!isHorizontal ? totalHeight + Spacing.Value.Pixels * childIndex : 0f, ElementSizeUnit.Pixels));
                view.OffsetFromParent.DirectValue = offset;

                // set desired alignment if it is valid for the orientation otherwise use defaults
                var alignment        = isHorizontal ? ElementAlignment.Left : ElementAlignment.Top;
                var desiredAlignment = ContentAlignment.IsSet ? ContentAlignment : view.Alignment;
                if (isHorizontal && (desiredAlignment == ElementAlignment.Top || desiredAlignment == ElementAlignment.Bottom ||
                                     desiredAlignment == ElementAlignment.TopLeft || desiredAlignment == ElementAlignment.BottomLeft))
                {
                    view.Alignment.DirectValue = alignment | desiredAlignment;
                }
                else if (!isHorizontal && (desiredAlignment == ElementAlignment.Left || desiredAlignment == ElementAlignment.Right ||
                                           desiredAlignment == ElementAlignment.TopLeft || desiredAlignment == ElementAlignment.TopRight))
                {
                    view.Alignment.DirectValue = alignment | desiredAlignment;
                }
                else
                {
                    view.Alignment.DirectValue = alignment;
                }

                // get size of content
                if (!percentageWidth)
                {
                    totalWidth += view.Width.Value.Pixels;
                    maxWidth    = view.Width.Value.Pixels > maxWidth ? view.Width.Value.Pixels : maxWidth;
                }

                if (!percentageHeight)
                {
                    totalHeight += view.Height.Value.Pixels;
                    maxHeight    = view.Height.Value.Pixels > maxHeight ? view.Height.Value.Pixels : maxHeight;
                }

                // update child layout
                view.RectTransformChanged();
                ++childIndex;

                // update child visibility
                if (SetChildVisibility)
                {
                    view.IsVisible.Value = true;
                }
            }

            // set width and height
            float totalSpacing     = childCount > 1 ? (childIndex - 1) * Spacing.Value.Pixels : 0f;
            bool  adjustsToContent = false;

            if (!Width.IsSet)
            {
                // if width is not explicitly set then adjust to content
                if (!percentageWidth)
                {
                    // add margins
                    totalWidth += isHorizontal ? totalSpacing : 0f;
                    totalWidth += Margin.Value.Left.Pixels + Margin.Value.Right.Pixels;
                    maxWidth   += Margin.Value.Left.Pixels + Margin.Value.Right.Pixels;

                    // adjust width to content
                    Width.DirectValue = new ElementSize(isHorizontal ? totalWidth : maxWidth, ElementSizeUnit.Pixels);
                    adjustsToContent  = true;
                }
                else
                {
                    Width.DirectValue = new ElementSize(1, ElementSizeUnit.Percents);
                }
            }

            if (!Height.IsSet)
            {
                // if height is not explicitly set then adjust to content
                if (!percentageHeight)
                {
                    // add margins
                    totalHeight += !isHorizontal ? totalSpacing : 0f;
                    totalHeight += Margin.Value.Top.Pixels + Margin.Value.Bottom.Pixels;
                    maxHeight   += Margin.Value.Top.Pixels + Margin.Value.Bottom.Pixels;

                    // adjust height to content
                    Height.DirectValue = new ElementSize(!isHorizontal ? totalHeight : maxHeight, ElementSizeUnit.Pixels);
                    adjustsToContent   = true;
                }
                else
                {
                    Height.DirectValue = new ElementSize(1, ElementSizeUnit.Percents);
                }
            }

            if (!PropagateChildLayoutChanges.IsSet)
            {
                // don't propagate changes if width and height isn't adjusted to content
                PropagateChildLayoutChanges.DirectValue = adjustsToContent;
            }

            base.LayoutChanged();
        }
        /// <summary>
        /// Value converter for Margin type.
        /// </summary>
        public override ConversionResult Convert(object value, ValueConverterContext context)
        {
            if (value == null)
            {
                return(base.Convert(value, context));
            }

            Type valueType = value.GetType();

            if (valueType == _type)
            {
                return(base.Convert(value, context));
            }
            else if (valueType == _stringType)
            {
                var stringValue = (string)value;
                try
                {
                    string[] valueList;
                    valueList = stringValue.Split(',').ToArray();
                    ElementMargin convertedValue = null;
                    if (valueList.Length == 1)
                    {
                        convertedValue = new ElementMargin(ElementSize.Parse(valueList[0], context.UnitSize));
                    }
                    else if (valueList.Length == 2)
                    {
                        convertedValue = new ElementMargin(
                            ElementSize.Parse(valueList[0], context.UnitSize),
                            ElementSize.Parse(valueList[1], context.UnitSize));
                    }
                    else if (valueList.Length == 3)
                    {
                        convertedValue = new ElementMargin(
                            ElementSize.Parse(valueList[0], context.UnitSize),
                            ElementSize.Parse(valueList[1], context.UnitSize),
                            ElementSize.Parse(valueList[2], context.UnitSize));
                    }
                    else if (valueList.Length == 4)
                    {
                        convertedValue = new ElementMargin(
                            ElementSize.Parse(valueList[0], context.UnitSize),
                            ElementSize.Parse(valueList[1], context.UnitSize),
                            ElementSize.Parse(valueList[2], context.UnitSize),
                            ElementSize.Parse(valueList[3], context.UnitSize));
                    }
                    else
                    {
                        return(StringConversionFailed(value));
                    }

                    return(new ConversionResult(convertedValue));
                }
                catch (Exception e)
                {
                    return(ConversionFailed(value, e));
                }
            }
            else
            {
                // attempt to convert using system type converter
                try
                {
                    var convertedValue = System.Convert.ToInt32(value, CultureInfo.InvariantCulture);
                    return(new ConversionResult(convertedValue));
                }
                catch (Exception e)
                {
                    return(ConversionFailed(value, e));
                }
            }
        }
        /// <summary>
        /// Converts value to string.
        /// </summary>
        public override string ConvertToString(object value)
        {
            ElementMargin margin = value as ElementMargin;

            return(margin.ToString());
        }