public virtual void AdjustTrays()
{
for ( int i = 0; i < 9; i++ ) // resizes and hides trays if necessary
{
Real trayWidth = 0;
Real trayHeight = mWidgetPadding;
List<OverlayElement> labelsAndSeps = new List<OverlayElement>();
if ( mWidgets[ i ] == null || mWidgets[ i ].Count == 0 ) // hide tray if empty
{
mTrays[ i ].Hide();
continue;
}
else
mTrays[ i ].Show();
// arrange widgets and calculate final tray size and position
for ( int j = 0; j < mWidgets[ i ].Count; j++ )
{
OverlayElement e = mWidgets[ i ][ j ].OverlayElement;
if ( j != 0 )
trayHeight += mWidgetSpacing; // don't space first widget
e.VerticalAlignment = VerticalAlignment.Top;
e.Top = trayHeight;
switch ( e.HorizontalAlignment )
{
case HorizontalAlignment.Left:
e.Left = mWidgetPadding;
break;
case HorizontalAlignment.Right:
e.Left = -( e.Width + mWidgetPadding );
break;
default:
e.Left = ( -( e.Width / 2 ) );
break;
}
// prevents some weird texture filtering problems (just some)
e.SetPosition( (int)e.Left, (int)e.Top );
e.SetDimensions( (int)e.Width, (int)e.Height );
trayHeight += e.Height;
Label l = mWidgets[ i ][ j ] as Label;
if ( l != null && l.IsFitToTray )
{
labelsAndSeps.Add( e );
continue;
}
Separator s = mWidgets[ i ][ j ] as Separator;
if ( s != null && s.IsFitToTray )
{
labelsAndSeps.Add( e );
continue;
}
if ( e.Width > trayWidth )
trayWidth = e.Width;
}
// add paddings and resize trays
mTrays[ i ].Width = trayWidth + 2 * mWidgetPadding;
mTrays[ i ].Height = trayHeight + mWidgetPadding;
for ( int k = 0; k < labelsAndSeps.Count; k++ )
{
labelsAndSeps[ k ].Width = (int)trayWidth;
labelsAndSeps[ k ].Left = -(int)( trayWidth / 2 );
}
}
for ( int i = 0; i < 9; i++ ) // snap trays to anchors
{
if ( i == (int)TrayLocation.TopLeft || i == (int)TrayLocation.Left || i == (int)TrayLocation.BottomLeft )
mTrays[ i ].Left = mTrayPadding;
if ( i == (int)TrayLocation.Top || i == (int)TrayLocation.Center || i == (int)TrayLocation.Bottom )
mTrays[ i ].Left = -mTrays[ i ].Width / 2;
if ( i == (int)TrayLocation.TopRight || i == (int)TrayLocation.Right || i == (int)TrayLocation.BottomRight )
mTrays[ i ].Left = -( mTrays[ i ].Width + mTrayPadding );
if ( i == (int)TrayLocation.TopLeft || i == (int)TrayLocation.Top || i == (int)TrayLocation.TopRight )
mTrays[ i ].Top = mTrayPadding;
if ( i == (int)TrayLocation.Left || i == (int)TrayLocation.Center || i == (int)TrayLocation.Right )
mTrays[ i ].Top = -mTrays[ i ].Height / 2;
if ( i == (int)TrayLocation.BottomLeft || i == (int)TrayLocation.Bottom || i == (int)TrayLocation.BottomRight )
mTrays[ i ].Top = -mTrays[ i ].Height - mTrayPadding;
// prevents some weird texture filtering problems (just some)
mTrays[ i ].SetPosition( (int)mTrays[ i ].Left, (int)mTrays[ i ].Top );
mTrays[ i ].SetDimensions( (int)mTrays[ i ].Width, (int)mTrays[ i ].Height );
}
}