Browse Source

Merge branch 'master' into new-animations-algo

pull/1793/head
Jumar Macato 8 years ago
committed by GitHub
parent
commit
07c3311ae1
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 26
      src/Avalonia.Controls/Canvas.cs
  2. 4
      src/Avalonia.Controls/DockPanel.cs
  3. 5
      src/Avalonia.Controls/Grid.cs
  4. 42
      src/Avalonia.Controls/Panel.cs
  5. 2
      src/Avalonia.Controls/Presenters/ItemVirtualizer.cs
  6. 24
      tests/Avalonia.Controls.UnitTests/DockPanelTests.cs
  7. 26
      tests/Avalonia.Controls.UnitTests/GridTests.cs

26
src/Avalonia.Controls/Canvas.cs

@ -48,7 +48,7 @@ namespace Avalonia.Controls
static Canvas()
{
ClipToBoundsProperty.OverrideDefaultValue<Canvas>(false);
AffectsCanvasArrange(LeftProperty, TopProperty, RightProperty, BottomProperty);
AffectsParentArrange<Canvas>(LeftProperty, TopProperty, RightProperty, BottomProperty);
}
/// <summary>
@ -207,29 +207,5 @@ namespace Avalonia.Controls
return finalSize;
}
/// <summary>
/// Marks a property on a child as affecting the canvas' arrangement.
/// </summary>
/// <param name="properties">The properties.</param>
private static void AffectsCanvasArrange(params AvaloniaProperty[] properties)
{
foreach (var property in properties)
{
property.Changed.Subscribe(AffectsCanvasArrangeInvalidate);
}
}
/// <summary>
/// Calls <see cref="Layoutable.InvalidateArrange"/> on the parent of the control whose
/// property changed, if that parent is a canvas.
/// </summary>
/// <param name="e">The event args.</param>
private static void AffectsCanvasArrangeInvalidate(AvaloniaPropertyChangedEventArgs e)
{
var control = e.Sender as IControl;
var canvas = control?.VisualParent as Canvas;
canvas?.InvalidateArrange();
}
}
}

4
src/Avalonia.Controls/DockPanel.cs

@ -37,7 +37,7 @@ namespace Avalonia.Controls
/// </summary>
static DockPanel()
{
AffectsArrange(DockProperty);
AffectsParentMeasure<DockPanel>(DockProperty);
}
/// <summary>
@ -173,4 +173,4 @@ namespace Avalonia.Controls
return arrangeSize;
}
}
}
}

5
src/Avalonia.Controls/Grid.cs

@ -48,6 +48,11 @@ namespace Avalonia.Controls
private RowDefinitions _rowDefinitions;
static Grid()
{
AffectsParentMeasure<Grid>(ColumnProperty, ColumnSpanProperty, RowProperty, RowSpanProperty);
}
/// <summary>
/// Gets or sets the columns definitions for the grid.
/// </summary>

42
src/Avalonia.Controls/Panel.cs

@ -72,6 +72,32 @@ namespace Avalonia.Controls
base.Render(context);
}
/// <summary>
/// Marks a property on a child as affecting the parent panel's arrangement.
/// </summary>
/// <param name="properties">The properties.</param>
protected static void AffectsParentArrange<TPanel>(params AvaloniaProperty[] properties)
where TPanel : class, IPanel
{
foreach (var property in properties)
{
property.Changed.Subscribe(AffectsParentArrangeInvalidate<TPanel>);
}
}
/// <summary>
/// Marks a property on a child as affecting the parent panel's measurement.
/// </summary>
/// <param name="properties">The properties.</param>
protected static void AffectsParentMeasure<TPanel>(params AvaloniaProperty[] properties)
where TPanel : class, IPanel
{
foreach (var property in properties)
{
property.Changed.Subscribe(AffectsParentMeasureInvalidate<TPanel>);
}
}
/// <summary>
/// Called when the <see cref="Children"/> collection changes.
/// </summary>
@ -116,5 +142,21 @@ namespace Avalonia.Controls
InvalidateMeasure();
}
private static void AffectsParentArrangeInvalidate<TPanel>(AvaloniaPropertyChangedEventArgs e)
where TPanel : class, IPanel
{
var control = e.Sender as IControl;
var panel = control?.VisualParent as TPanel;
panel?.InvalidateArrange();
}
private static void AffectsParentMeasureInvalidate<TPanel>(AvaloniaPropertyChangedEventArgs e)
where TPanel : class, IPanel
{
var control = e.Sender as IControl;
var panel = control?.VisualParent as TPanel;
panel?.InvalidateMeasure();
}
}
}

2
src/Avalonia.Controls/Presenters/ItemVirtualizer.cs

@ -279,6 +279,6 @@ namespace Avalonia.Controls.Presenters
/// <summary>
/// Invalidates the current scroll.
/// </summary>
protected void InvalidateScroll() => ((ILogicalScrollable)Owner).InvalidateScroll();
protected void InvalidateScroll() => ((ILogicalScrollable)Owner).InvalidateScroll?.Invoke();
}
}

24
tests/Avalonia.Controls.UnitTests/DockPanelTests.cs

@ -58,5 +58,29 @@ namespace Avalonia.Controls.UnitTests
Assert.Equal(new Rect(50, 350, 500, 50), target.Children[3].Bounds);
Assert.Equal(new Rect(50, 50, 500, 300), target.Children[4].Bounds);
}
[Fact]
public void Changing_Child_Dock_Invalidates_Measure()
{
Border child;
var target = new DockPanel
{
Children =
{
(child = new Border
{
[DockPanel.DockProperty] = Dock.Left,
}),
}
};
target.Measure(Size.Infinity);
target.Arrange(new Rect(target.DesiredSize));
Assert.True(target.IsMeasureValid);
DockPanel.SetDock(child, Dock.Right);
Assert.False(target.IsMeasureValid);
}
}
}

26
tests/Avalonia.Controls.UnitTests/GridTests.cs

@ -154,5 +154,31 @@ namespace Avalonia.Controls.UnitTests
GridAssert.ChildrenHeight(rowGrid, 200, 300, 300);
GridAssert.ChildrenWidth(columnGrid, 200, 300, 300);
}
[Fact]
public void Changing_Child_Column_Invalidates_Measure()
{
Border child;
var target = new Grid
{
ColumnDefinitions = new ColumnDefinitions("*,*"),
Children =
{
(child = new Border
{
[Grid.ColumnProperty] = 0,
}),
}
};
target.Measure(Size.Infinity);
target.Arrange(new Rect(target.DesiredSize));
Assert.True(target.IsMeasureValid);
Grid.SetColumn(child, 1);
Assert.False(target.IsMeasureValid);
}
}
}

Loading…
Cancel
Save