Browse Source

Some more changes + GridSplitter Fix

wojciech krysiak 7 years ago
parent
commit
49fda72568

+ 50 - 17
src/Avalonia.Controls/GridSplitter.cs

@@ -49,21 +49,41 @@ namespace Avalonia.Controls
             double min;
             GetDeltaConstraints(out min, out max);
             delta = Math.Min(Math.Max(delta, min), max);
-            foreach (var definition in _definitions)
+
+            var prevIsStar = IsStar(_prevDefinition);
+            var nextIsStar = IsStar(_nextDefinition);
+
+            if (prevIsStar && nextIsStar)
             {
-                if (definition == _prevDefinition)
-                {
-                    SetLengthInStars(_prevDefinition, GetActualLength(_prevDefinition) + delta);
-                }
-                else if (definition == _nextDefinition)
-                {
-                    SetLengthInStars(_nextDefinition, GetActualLength(_nextDefinition) - delta);
-                }
-                else if (IsStar(definition))
+                foreach (var definition in _definitions)
                 {
-                    SetLengthInStars(definition, GetActualLength(definition)); // same size but in stars.
+                    if (definition == _prevDefinition)
+                    {
+                        SetLengthInStars(_prevDefinition, GetActualLength(_prevDefinition) + delta);
+                    }
+                    else if (definition == _nextDefinition)
+                    {
+                        SetLengthInStars(_nextDefinition, GetActualLength(_nextDefinition) - delta);
+                    }
+                    else if (IsStar(definition))
+                    {
+                        SetLengthInStars(definition, GetActualLength(definition)); // same size but in stars.
+                    }
                 }
             }
+            else if (prevIsStar)
+            {
+                SetLength(_nextDefinition, GetActualLength(_nextDefinition) - delta);
+            }
+            else if (nextIsStar)
+            {
+                SetLength(_prevDefinition, GetActualLength(_prevDefinition) + delta);
+            }
+            else
+            {
+                SetLength(_prevDefinition, GetActualLength(_prevDefinition) + delta);
+                SetLength(_nextDefinition, GetActualLength(_nextDefinition) - delta);
+            }
         }
 
         private double GetActualLength(DefinitionBase definition)
@@ -71,7 +91,7 @@ namespace Avalonia.Controls
             if (definition == null)
                 return 0;
             var columnDefinition = definition as ColumnDefinition;
-            return columnDefinition?.ActualWidth ?? ((RowDefinition) definition).ActualHeight;
+            return columnDefinition?.ActualWidth ?? ((RowDefinition)definition).ActualHeight;
         }
 
         private double GetMinLength(DefinitionBase definition)
@@ -79,7 +99,7 @@ namespace Avalonia.Controls
             if (definition == null)
                 return 0;
             var columnDefinition = definition as ColumnDefinition;
-            return columnDefinition?.MinWidth ?? ((RowDefinition) definition).MinHeight;
+            return columnDefinition?.MinWidth ?? ((RowDefinition)definition).MinHeight;
         }
 
         private double GetMaxLength(DefinitionBase definition)
@@ -87,13 +107,13 @@ namespace Avalonia.Controls
             if (definition == null)
                 return 0;
             var columnDefinition = definition as ColumnDefinition;
-            return columnDefinition?.MaxWidth ?? ((RowDefinition) definition).MaxHeight;
+            return columnDefinition?.MaxWidth ?? ((RowDefinition)definition).MaxHeight;
         }
 
         private bool IsStar(DefinitionBase definition)
         {
             var columnDefinition = definition as ColumnDefinition;
-            return columnDefinition?.Width.IsStar ?? ((RowDefinition) definition).Height.IsStar;
+            return columnDefinition?.Width.IsStar ?? ((RowDefinition)definition).Height.IsStar;
         }
 
         private void SetLengthInStars(DefinitionBase definition, double value)
@@ -105,7 +125,20 @@ namespace Avalonia.Controls
             }
             else
             {
-                ((RowDefinition) definition).Height = new GridLength(value, GridUnitType.Star);
+                ((RowDefinition)definition).Height = new GridLength(value, GridUnitType.Star);
+            }
+        }
+
+        private void SetLength(DefinitionBase definition, double value)
+        {
+            var columnDefinition = definition as ColumnDefinition;
+            if (columnDefinition != null)
+            {
+                columnDefinition.Width = new GridLength(value);
+            }
+            else
+            {
+                ((RowDefinition)definition).Height = new GridLength(value);
             }
         }
 
@@ -160,7 +193,7 @@ namespace Avalonia.Controls
             }
             if (_grid.Children.OfType<Control>() // Decision based on other controls in the same column
                 .Where(c => Grid.GetColumn(c) == col)
-                .Any(c => c.GetType() != typeof (GridSplitter)))
+                .Any(c => c.GetType() != typeof(GridSplitter)))
             {
                 return Orientation.Horizontal;
             }

+ 7 - 3
src/Avalonia.Controls/Utils/SharedSizeScopeHost.cs

@@ -139,7 +139,7 @@ namespace Avalonia.Controls
 
                 for (int i = 0; i < Grid.ColumnDefinitions.Count; i++)
                 {
-                    Results[i + rowResult.LengthList.Count].MeasuredResult = columnResult.LengthList[i];
+                    Results[i + Grid.RowDefinitions.Count].MeasuredResult = columnResult.LengthList[i];
                 }
             }
 
@@ -206,7 +206,7 @@ namespace Avalonia.Controls
 
             public void Add(MeasurementResult result)
             {
-                if (!_results.Contains(result))
+                if (_results.Contains(result))
                     throw new AvaloniaInternalException(
                         $"Invalid call to Group.Add - The SharedSizeGroup {Name} already contains the passed result");
 
@@ -232,6 +232,9 @@ namespace Avalonia.Controls
 
                 foreach (var measurement in Results)
                 {
+                    if (Double.IsInfinity(measurement.MeasuredResult))
+                        continue;
+
                     if (measurement.Definition is ColumnDefinition column)
                     {
                         if (!onlyFixed && column.Width.IsAbsolute)
@@ -276,7 +279,6 @@ namespace Avalonia.Controls
                 cache.Grid.InvalidateMeasure();
                 AddGridToScopes(cache);
 
-                cache.GroupChanged.Subscribe(SharedGroupChanged);
             }
         }
 
@@ -397,6 +399,8 @@ namespace Avalonia.Controls
 
         private void AddGridToScopes(MeasurementCache cache)
         {
+            cache.GroupChanged.Subscribe(SharedGroupChanged);
+
             foreach (var result in cache.Results)
             {
                 var scopeName = result.Definition.SharedSizeGroup;