//----------------------------------------------------------------------- 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; } } } }
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; } } }