Esempio n. 1
0
        //-----------------------------------------------------------------------
        public override void DoLayout(Rectangle _rect)
        {
            base.DoLayout(_rect);

            bool bHidePane = mbCollapsed || mCollapseAnim.CurrentValue != 0f;

            mbDisplayFirstPane  = (!bHidePane || (mDirection != Direction.Left && mDirection != Direction.Up));
            mbDisplaySecondPane = (!bHidePane || (mDirection != Direction.Right && mDirection != Direction.Down));

            if (bHidePane)
            {
                int iCollapseOffset = (int)((1f - mCollapseAnim.CurrentValue) * SplitterOffset);

                switch (mDirection)
                {
                case Direction.Left: {
                    mSecondPane.DoLayout(new Rectangle(LayoutRect.Left + iCollapseOffset, LayoutRect.Top, LayoutRect.Width - iCollapseOffset, LayoutRect.Height));

                    HitBox = new Rectangle(
                        LayoutRect.Left + iCollapseOffset - SplitterSize / 2,
                        LayoutRect.Top,
                        SplitterSize,
                        LayoutRect.Height);
                    break;
                }

                case Direction.Up: {
                    mSecondPane.DoLayout(LayoutRect);

                    HitBox = new Rectangle(
                        LayoutRect.Top,
                        LayoutRect.Top + iCollapseOffset - SplitterSize / 2,
                        LayoutRect.Width,
                        SplitterSize
                        );
                    break;
                }

                case Direction.Right: {
                    mFirstPane.DoLayout(LayoutRect);

                    HitBox = new Rectangle(
                        LayoutRect.Right + iCollapseOffset - SplitterSize / 2,
                        LayoutRect.Top,
                        SplitterSize,
                        LayoutRect.Height);
                    break;
                }

                case Direction.Down: {
                    mFirstPane.DoLayout(LayoutRect);

                    HitBox = new Rectangle(
                        LayoutRect.Left,
                        LayoutRect.Bottom + iCollapseOffset - SplitterSize / 2,
                        SplitterSize,
                        LayoutRect.Height);
                    break;
                }
                }
            }
            else
            {
                switch (mDirection)
                {
                case Direction.Left: {
                    if (LayoutRect.Width >= FirstPaneMinSize + SecondPaneMinSize)
                    {
                        SplitterOffset = (int)MathHelper.Clamp(SplitterOffset, FirstPaneMinSize, LayoutRect.Width - SecondPaneMinSize);
                    }

                    HitBox = new Rectangle(
                        LayoutRect.Left + SplitterOffset - SplitterSize / 2,
                        LayoutRect.Top,
                        SplitterSize,
                        LayoutRect.Height);

                    if (mFirstPane != null)
                    {
                        mFirstPane.DoLayout(new Rectangle(LayoutRect.Left, LayoutRect.Top, SplitterOffset, LayoutRect.Height));
                    }

                    if (mSecondPane != null)
                    {
                        mSecondPane.DoLayout(new Rectangle(LayoutRect.Left + SplitterOffset, LayoutRect.Top, LayoutRect.Width - SplitterOffset, LayoutRect.Height));
                    }
                    break;
                }

                case Direction.Right: {
                    if (LayoutRect.Width >= FirstPaneMinSize + SecondPaneMinSize)
                    {
                        SplitterOffset = (int)MathHelper.Clamp(SplitterOffset, SecondPaneMinSize, LayoutRect.Width - FirstPaneMinSize);
                    }

                    HitBox = new Rectangle(
                        LayoutRect.Right - SplitterOffset - SplitterSize / 2,
                        LayoutRect.Top,
                        SplitterSize,
                        LayoutRect.Height);

                    if (mFirstPane != null)
                    {
                        mFirstPane.DoLayout(new Rectangle(LayoutRect.Left, LayoutRect.Top, LayoutRect.Width - SplitterOffset, LayoutRect.Height));
                    }

                    if (mSecondPane != null)
                    {
                        mSecondPane.DoLayout(new Rectangle(LayoutRect.Right - SplitterOffset, LayoutRect.Top, SplitterOffset, LayoutRect.Height));
                    }
                    break;
                }

                case Direction.Up: {
                    if (LayoutRect.Height >= FirstPaneMinSize + SecondPaneMinSize)
                    {
                        SplitterOffset = (int)MathHelper.Clamp(SplitterOffset, FirstPaneMinSize, LayoutRect.Height - SecondPaneMinSize);
                    }

                    HitBox = new Rectangle(
                        LayoutRect.Left,
                        LayoutRect.Top + SplitterOffset - SplitterSize / 2,
                        LayoutRect.Width,
                        SplitterSize);

                    if (mFirstPane != null)
                    {
                        mFirstPane.DoLayout(new Rectangle(LayoutRect.Left, LayoutRect.Top, LayoutRect.Width, SplitterOffset));
                    }

                    if (mSecondPane != null)
                    {
                        mSecondPane.DoLayout(new Rectangle(LayoutRect.Left, LayoutRect.Top + SplitterOffset, LayoutRect.Width, LayoutRect.Height - SplitterOffset));
                    }
                    break;
                }

                case Direction.Down: {
                    if (LayoutRect.Height >= FirstPaneMinSize + SecondPaneMinSize)
                    {
                        SplitterOffset = (int)MathHelper.Clamp(SplitterOffset, SecondPaneMinSize, LayoutRect.Height - FirstPaneMinSize);
                    }

                    HitBox = new Rectangle(
                        LayoutRect.Left,
                        LayoutRect.Bottom - SplitterOffset - SplitterSize / 2,
                        LayoutRect.Width,
                        SplitterSize);

                    if (mFirstPane != null)
                    {
                        mFirstPane.DoLayout(new Rectangle(LayoutRect.Left, LayoutRect.Top, LayoutRect.Width, LayoutRect.Height - SplitterOffset));
                    }

                    if (mSecondPane != null)
                    {
                        mSecondPane.DoLayout(new Rectangle(LayoutRect.Left, LayoutRect.Bottom - SplitterOffset, LayoutRect.Width, SplitterOffset));
                    }
                    break;
                }
                }
            }
        }
Esempio n. 2
0
        protected override void LayoutChildren()
        {
            int iWidth  = LayoutRect.Width - Padding.Horizontal;
            int iHeight = LayoutRect.Height - Padding.Vertical;

            int iUnexpandedSize        = 0;
            int iExpandedChildrenCount = 0;

            for (int iIndex = 0; iIndex < mlChildren.Count; iIndex++)
            {
                if (!mlExpandedChildren[iIndex])
                {
                    iUnexpandedSize += (mOrientation == Orientation.Horizontal) ?
                                       (mlChildren[iIndex].AnchoredRect.HasWidth ? mlChildren[iIndex].AnchoredRect.Width : mlChildren[iIndex].ContentWidth) :
                                       (mlChildren[iIndex].AnchoredRect.HasHeight ? mlChildren[iIndex].AnchoredRect.Height : mlChildren[iIndex].ContentHeight);
                }
                else
                {
                    iExpandedChildrenCount++;
                }
            }

            iUnexpandedSize += (mlChildren.Count - 1) * miSpacing;

            float fExpandedWidgetSize = 0f;

            if (iExpandedChildrenCount > 0)
            {
                fExpandedWidgetSize = (((mOrientation == Orientation.Horizontal) ? iWidth : iHeight) - iUnexpandedSize) / (float)iExpandedChildrenCount;
            }

            int iActualSize = iExpandedChildrenCount > 0 ? ((mOrientation == Orientation.Horizontal) ? iWidth : iHeight) : iUnexpandedSize;

            Point pWidgetPosition;

            switch (mOrientation)
            {
            case Orientation.Horizontal:
                switch (mContentAnchor)
                {
                case Anchor.Start:
                    pWidgetPosition = new Point(LayoutRect.Left + Padding.Left, LayoutRect.Top + Padding.Top);
                    break;

                case Anchor.Center:
                    pWidgetPosition = new Point(LayoutRect.Center.X - iActualSize / 2, LayoutRect.Top + Padding.Top);
                    break;

                case Anchor.End:
                    pWidgetPosition = new Point(LayoutRect.Right - Padding.Right - iActualSize, LayoutRect.Top + Padding.Top);
                    break;

                default:
                    throw new NotSupportedException();
                }
                break;

            case Orientation.Vertical:
                switch (mContentAnchor)
                {
                case Anchor.Start:
                    pWidgetPosition = new Point(LayoutRect.Left + Padding.Left, LayoutRect.Top + Padding.Top);
                    break;

                case Anchor.Center:
                    pWidgetPosition = new Point(LayoutRect.X + Padding.Left, LayoutRect.Center.Y - iActualSize / 2);
                    break;

                case Anchor.End:
                    pWidgetPosition = new Point(LayoutRect.X + Padding.Left, LayoutRect.Bottom - Padding.Bottom - iActualSize);
                    break;

                default:
                    throw new NotSupportedException();
                }
                break;

            default:
                throw new NotSupportedException();
            }

            float fOffset = 0;

            for (int iIndex = 0; iIndex < mlChildren.Count; iIndex++)
            {
                Widget widget = mlChildren[iIndex];

                int iWidgetSize = (mOrientation == Orientation.Horizontal) ?
                                  (mlChildren[iIndex].AnchoredRect.HasWidth ? mlChildren[iIndex].AnchoredRect.Width : mlChildren[iIndex].ContentWidth) :
                                  (mlChildren[iIndex].AnchoredRect.HasHeight ? mlChildren[iIndex].AnchoredRect.Height : mlChildren[iIndex].ContentHeight);

                if (mlExpandedChildren[iIndex])
                {
                    if (iIndex < mlChildren.Count - 1)
                    {
                        iWidgetSize = (int)Math.Floor(fExpandedWidgetSize + fOffset - Math.Floor(fOffset));
                    }
                    else
                    {
                        iWidgetSize = (int)(((mOrientation == Orientation.Horizontal) ? iWidth : iHeight) - Math.Floor(fOffset));
                    }
                    fOffset += fExpandedWidgetSize + miSpacing;
                }
                else
                {
                    fOffset += iWidgetSize + miSpacing;
                }

                widget.DoLayout(new Rectangle(pWidgetPosition.X, pWidgetPosition.Y, mOrientation == Orientation.Horizontal ? iWidgetSize : iWidth, mOrientation == Orientation.Horizontal ? iHeight : iWidgetSize));

                switch (mOrientation)
                {
                case Orientation.Horizontal:
                    pWidgetPosition.X += iWidgetSize + miSpacing;
                    break;

                case Orientation.Vertical:
                    pWidgetPosition.Y += iWidgetSize + miSpacing;
                    break;
                }
            }
        }