Browse Source

Moved alignment into child Control.

pull/4/head
Steven Kirk 12 years ago
parent
commit
d47163353b
  1. 2
      Perspex.UnitTests/StyleTests.cs
  2. 18
      Perspex/Controls/Border.cs
  3. 4
      Perspex/Controls/ContentControl.cs
  4. 4
      Perspex/Controls/ContentPresenter.cs
  5. 63
      Perspex/Controls/Control.cs
  6. 13
      Perspex/Controls/Decorator.cs
  7. 4
      Perspex/Controls/Grid.cs
  8. 4
      Perspex/Controls/StackPanel.cs
  9. 2
      Perspex/Controls/TextBlock.cs
  10. 86
      Perspex/Layout/LayoutHelper.cs
  11. 6
      Perspex/Shapes/Rectangle.cs
  12. 2
      Perspex/Shapes/Shape.cs
  13. BIN
      TestFiles/Direct2D1/Controls/Border/Border_Centers_Content_Horizontally.expected.png
  14. BIN
      TestFiles/Direct2D1/Controls/Border/Border_Centers_Content_Vertically.expected.png

2
Perspex.UnitTests/StyleTests.cs

@ -119,7 +119,7 @@ namespace Perspex.UnitTests
set { this.SetValue(FooProperty, value); } set { this.SetValue(FooProperty, value); }
} }
protected override Size MeasureContent(Size availableSize) protected override Size MeasureOverride(Size availableSize)
{ {
throw new NotImplementedException(); throw new NotImplementedException();
} }

18
Perspex/Controls/Border.cs

@ -42,16 +42,20 @@ namespace Perspex.Controls
} }
} }
protected override Size ArrangeContent(Size finalSize) protected override Size ArrangeOverride(Size finalSize)
{ {
return LayoutHelper.ArrangeDecorator( Control content = this.Content;
this,
this.Content, if (content != null)
finalSize, {
this.Padding + new Thickness(this.BorderThickness)); Thickness padding = this.Padding + new Thickness(this.BorderThickness);
content.Arrange(new Rect(finalSize).Deflate(padding));
}
return finalSize;
} }
protected override Size MeasureContent(Size availableSize) protected override Size MeasureOverride(Size availableSize)
{ {
return LayoutHelper.MeasureDecorator( return LayoutHelper.MeasureDecorator(
this, this,

4
Perspex/Controls/ContentControl.cs

@ -48,7 +48,7 @@ namespace Perspex.Controls
} }
} }
protected override Size ArrangeContent(Size finalSize) protected override Size ArrangeOverride(Size finalSize)
{ {
Control child = ((IVisual)this).VisualChildren.SingleOrDefault() as Control; Control child = ((IVisual)this).VisualChildren.SingleOrDefault() as Control;
@ -63,7 +63,7 @@ namespace Perspex.Controls
} }
} }
protected override Size MeasureContent(Size availableSize) protected override Size MeasureOverride(Size availableSize)
{ {
if (this.Visibility != Visibility.Collapsed) if (this.Visibility != Visibility.Collapsed)
{ {

4
Perspex/Controls/ContentPresenter.cs

@ -86,7 +86,7 @@ namespace Perspex.Controls
} }
} }
protected override Size ArrangeContent(Size finalSize) protected override Size ArrangeOverride(Size finalSize)
{ {
Control child = ((IVisual)this).VisualChildren.SingleOrDefault() as Control; Control child = ((IVisual)this).VisualChildren.SingleOrDefault() as Control;
@ -143,7 +143,7 @@ namespace Perspex.Controls
return finalSize; return finalSize;
} }
protected override Size MeasureContent(Size availableSize) protected override Size MeasureOverride(Size availableSize)
{ {
if (this.Visibility != Visibility.Collapsed) if (this.Visibility != Visibility.Collapsed)
{ {

63
Perspex/Controls/Control.cs

@ -332,17 +332,13 @@ namespace Perspex.Controls
public void Arrange(Rect rect) public void Arrange(Rect rect)
{ {
Thickness margin = this.Margin; this.ArrangeCore(rect);
((IVisual)this).Bounds = new Rect(
new Point(rect.Position.X + margin.Left, rect.Position.Y + margin.Top),
this.ArrangeContent(rect.Size.Deflate(margin).Constrain(rect.Size)));
} }
public void Measure(Size availableSize) public void Measure(Size availableSize)
{ {
availableSize = availableSize.Deflate(this.Margin); availableSize = availableSize.Deflate(this.Margin);
this.DesiredSize = this.MeasureContent(availableSize).Constrain(availableSize); this.DesiredSize = this.MeasureCore(availableSize).Constrain(availableSize);
} }
public void InvalidateArrange() public void InvalidateArrange()
@ -365,12 +361,63 @@ namespace Perspex.Controls
} }
} }
protected virtual Size ArrangeContent(Size finalSize) protected virtual void ArrangeCore(Rect finalRect)
{
double originX = finalRect.X + this.Margin.Left;
double originY = finalRect.Y + this.Margin.Top;
double sizeX = Math.Max(0, finalRect.Width - this.Margin.Left - this.Margin.Right);
double sizeY = Math.Max(0, finalRect.Height - this.Margin.Top - this.Margin.Bottom);
if (this.HorizontalAlignment != HorizontalAlignment.Stretch)
{
sizeX = Math.Min(sizeX, this.DesiredSize.Value.Width);
}
if (this.VerticalAlignment != VerticalAlignment.Stretch)
{
sizeY = Math.Min(sizeY, this.DesiredSize.Value.Height);
}
Size taken = this.ArrangeOverride(new Size(sizeX, sizeY));
sizeX = Math.Min(taken.Width, sizeX);
sizeY = Math.Min(taken.Height, sizeY);
switch (this.HorizontalAlignment)
{
case HorizontalAlignment.Center:
originX += (finalRect.Width - sizeX) / 2;
break;
case HorizontalAlignment.Right:
originX += finalRect.Width - sizeX;
break;
}
switch (this.VerticalAlignment)
{
case VerticalAlignment.Center:
originY += (finalRect.Height - sizeY) / 2;
break;
case VerticalAlignment.Bottom:
originY += finalRect.Height - sizeY;
break;
}
((IVisual)this).Bounds = new Rect(originX, originY, sizeX, sizeY);
}
protected virtual Size ArrangeOverride(Size finalSize)
{ {
return finalSize; return finalSize;
} }
protected virtual Size MeasureContent(Size availableSize) protected virtual Size MeasureCore(Size availableSize)
{
availableSize = availableSize.Deflate(this.Margin);
return this.MeasureOverride(availableSize);
}
protected virtual Size MeasureOverride(Size availableSize)
{ {
return new Size(); return new Size();
} }

13
Perspex/Controls/Decorator.cs

@ -64,12 +64,19 @@ namespace Perspex.Controls
} }
} }
protected override Size ArrangeContent(Size finalSize) protected override Size ArrangeOverride(Size finalSize)
{ {
return LayoutHelper.ArrangeDecorator(this, this.Content, finalSize, this.Padding); Control content = this.Content;
if (content != null)
{
content.Arrange(new Rect(finalSize).Deflate(this.Padding));
}
return finalSize;
} }
protected override Size MeasureContent(Size availableSize) protected override Size MeasureOverride(Size availableSize)
{ {
return LayoutHelper.MeasureDecorator(this, this.Content, availableSize, this.Padding); return LayoutHelper.MeasureDecorator(this, this.Content, availableSize, this.Padding);
} }

4
Perspex/Controls/Grid.cs

@ -88,7 +88,7 @@ namespace Perspex.Controls
element.SetValue(RowSpanProperty, value); element.SetValue(RowSpanProperty, value);
} }
protected override Size MeasureContent(Size constraint) protected override Size MeasureOverride(Size constraint)
{ {
Size totalSize = constraint; Size totalSize = constraint;
int colCount = this.ColumnDefinitions.Count; int colCount = this.ColumnDefinitions.Count;
@ -379,7 +379,7 @@ namespace Perspex.Controls
return new Size(gridSizeX, gridSizeY); return new Size(gridSizeX, gridSizeY);
} }
protected override Size ArrangeContent(Size finalSize) protected override Size ArrangeOverride(Size finalSize)
{ {
int colCount = this.ColumnDefinitions.Count; int colCount = this.ColumnDefinitions.Count;
int rowCount = this.RowDefinitions.Count; int rowCount = this.RowDefinitions.Count;

4
Perspex/Controls/StackPanel.cs

@ -38,7 +38,7 @@ namespace Perspex.Controls
set { this.SetValue(OrientationProperty, value); } set { this.SetValue(OrientationProperty, value); }
} }
protected override Size MeasureContent(Size availableSize) protected override Size MeasureOverride(Size availableSize)
{ {
if (this.Visibility != Visibility.Collapsed) if (this.Visibility != Visibility.Collapsed)
{ {
@ -97,7 +97,7 @@ namespace Perspex.Controls
return new Size(); return new Size();
} }
protected override Size ArrangeContent(Size finalSize) protected override Size ArrangeOverride(Size finalSize)
{ {
double arrangedWidth = finalSize.Width; double arrangedWidth = finalSize.Width;
double arrangedHeight = finalSize.Height; double arrangedHeight = finalSize.Height;

2
Perspex/Controls/TextBlock.cs

@ -67,7 +67,7 @@ namespace Perspex.Controls
} }
} }
protected override Size MeasureContent(Size availableSize) protected override Size MeasureOverride(Size availableSize)
{ {
if (this.Visibility != Visibility.Collapsed) if (this.Visibility != Visibility.Collapsed)
{ {

86
Perspex/Layout/LayoutHelper.cs

@ -47,91 +47,5 @@ namespace Perspex.Layout
return new Size(width, height); return new Size(width, height);
} }
public static Size ArrangeDecorator(
Control decorator,
Control content,
Size finalSize,
Thickness padding)
{
if (content != null)
{
Rect childRect = AlignChild(
new Rect(finalSize).Deflate(padding),
content.DesiredSize.Value,
content.HorizontalAlignment,
content.VerticalAlignment);
content.Arrange(childRect);
}
return finalSize;
}
public static Rect AlignChild(
Rect parentRect,
Size desiredSize,
HorizontalAlignment horizontalAlignment,
VerticalAlignment verticalAlignment)
{
double x;
double y;
double width;
double height;
switch (horizontalAlignment)
{
case HorizontalAlignment.Stretch:
width = parentRect.Width;
x = parentRect.X;
break;
case HorizontalAlignment.Left:
width = desiredSize.Width;
x = parentRect.X;
break;
case HorizontalAlignment.Center:
width = desiredSize.Width;
x = (parentRect.Width - width) / 2;
break;
case HorizontalAlignment.Right:
width = desiredSize.Width;
x = parentRect.Right - width;
break;
default:
throw new InvalidOperationException("Invalid HorizontalAlignment.");
}
switch (verticalAlignment)
{
case VerticalAlignment.Stretch:
height = parentRect.Height;
y = parentRect.Y;
break;
case VerticalAlignment.Top:
height = desiredSize.Height;
y = parentRect.Y;
break;
case VerticalAlignment.Center:
height = desiredSize.Height;
y = (parentRect.Height - height) / 2;
break;
case VerticalAlignment.Bottom:
height = desiredSize.Height;
y = parentRect.Bottom - height;
break;
default:
throw new InvalidOperationException("Invalid VerticalAlignment.");
}
return new Rect(x, y, width, height);
}
} }
} }

6
Perspex/Shapes/Rectangle.cs

@ -19,15 +19,15 @@ namespace Perspex.Shapes
get { return new RectangleGeometry(new Rect(size)); } get { return new RectangleGeometry(new Rect(size)); }
} }
protected override Size MeasureContent(Size availableSize) protected override Size MeasureOverride(Size availableSize)
{ {
return new Size(this.Width, this.Height); return new Size(this.Width, this.Height);
} }
protected override Size ArrangeContent(Size finalSize) protected override Size ArrangeOverride(Size finalSize)
{ {
this.size = finalSize; this.size = finalSize;
return base.ArrangeContent(finalSize); return base.ArrangeOverride(finalSize);
} }
} }
} }

2
Perspex/Shapes/Shape.cs

@ -58,7 +58,7 @@ namespace Perspex.Shapes
set { this.SetValue(StrokeThicknessProperty, value); } set { this.SetValue(StrokeThicknessProperty, value); }
} }
protected override Size MeasureContent(Size availableSize) protected override Size MeasureOverride(Size availableSize)
{ {
Rect shapeBounds = this.RenderedGeometry.Bounds; Rect shapeBounds = this.RenderedGeometry.Bounds;
double width = this.Width; double width = this.Width;

BIN
TestFiles/Direct2D1/Controls/Border/Border_Centers_Content_Horizontally.expected.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 832 B

After

Width:  |  Height:  |  Size: 830 B

BIN
TestFiles/Direct2D1/Controls/Border/Border_Centers_Content_Vertically.expected.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 811 B

After

Width:  |  Height:  |  Size: 811 B

Loading…
Cancel
Save