Skip to content

Commit

Permalink
Merge pull request #367 from BAndysc/layout_cycle
Browse files Browse the repository at this point in the history
Fix layout cycle error in ProportionalStackPanel
  • Loading branch information
wieslawsoltes authored Oct 19, 2024
2 parents 5e08ea6 + 4dfdd7f commit 5d3e14e
Showing 1 changed file with 31 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using System.Linq;
using Avalonia.Data;
using Avalonia.Layout;
using Avalonia.VisualTree;

namespace Avalonia.Controls;

Expand All @@ -11,6 +12,8 @@ namespace Avalonia.Controls;
/// </summary>
public class ProportionalStackPanel : Panel
{
private bool isAssigningProportions;

/// <summary>
/// Defines the <see cref="Orientation"/> property.
/// </summary>
Expand Down Expand Up @@ -80,7 +83,20 @@ public static void SetIsCollapsed(AvaloniaObject control, bool value)
control.SetValue(IsCollapsedProperty, value);
}

private void AssignProportions(global::Avalonia.Controls.Controls children)
private void AssignProportions()
{
isAssigningProportions = true;
try
{
AssignProportionsInternal(Children);
}
finally
{
isAssigningProportions = false;
}
}

private static void AssignProportionsInternal(global::Avalonia.Controls.Controls children)
{
var assignedProportion = 0.0;
var unassignedProportions = 0;
Expand Down Expand Up @@ -221,7 +237,7 @@ protected override Size MeasureOverride(Size constraint)
var maximumHeight = 0.0;
var splitterThickness = GetTotalSplitterThickness(Children);

AssignProportions(Children);
AssignProportions();

var needsNextSplitter = false;
double sumOfFractions = 0;
Expand Down Expand Up @@ -344,7 +360,7 @@ protected override Size ArrangeOverride(Size arrangeSize)
var splitterThickness = GetTotalSplitterThickness(Children);
var index = 0;

AssignProportions(Children);
AssignProportions();

var needsNextSplitter = false;
double sumOfFractions = 0;
Expand Down Expand Up @@ -492,7 +508,17 @@ static ProportionalStackPanel()
{
AffectsParentMeasure<ProportionalStackPanel>(IsCollapsedProperty);
AffectsParentArrange<ProportionalStackPanel>(IsCollapsedProperty);
AffectsParentMeasure<ProportionalStackPanel>(ProportionProperty);
AffectsParentArrange<ProportionalStackPanel>(ProportionProperty);

ProportionProperty.Changed.AddClassHandler<Control>((sender, e) =>
{
if (sender.GetVisualParent() is not ProportionalStackPanel parent)
return;
if (parent.isAssigningProportions)
return;
parent.InvalidateMeasure();
parent.InvalidateArrange();
});
}
}

0 comments on commit 5d3e14e

Please sign in to comment.