20 public enum TrackSizeType
28 public class GridTrack
30 public TrackSizeType Type;
31 public float? Absolute;
32 public float? Relative;
33 public float? Fractional;
38 public float RealSize(
float hostSize)
42 if (Absolute.HasValue) size = Absolute.Value;
43 if (Relative.HasValue) size = Relative.Value * hostSize;
48 public GridTrack(
string value)
53 if (value.EndsWith(
"fr"))
55 if (
float.TryParse(value.Substring(0, value.Length - 2), out f))
58 Type = TrackSizeType.Fractional;
62 if (value.EndsWith(
"%"))
64 if (
float.TryParse(value.Substring(0, value.Length - 1), out f))
67 Type = TrackSizeType.Relative;
71 if (
float.TryParse(value, out f))
74 Type = TrackSizeType.Absolute;
78 public override string ToString() => $
"[{Absolute},{Relative},{Fractional}]";
84 List<GridTrack> Rows =
new();
85 List<GridTrack> Columns =
new();
87 public void CalculateTracks()
96 Rows.Add(
new GridTrack(s));
104 Columns.Add(
new GridTrack(s));
108 if (Rows.Count == 0) Rows.Add(
new GridTrack(
"100%"));
109 if (Columns.Count == 0) Columns.Add(
new GridTrack(
"100%"));
112 foreach (GridTrack track
in Columns)
115 track.Size = track.RealSize(Host.
Real.Width);
121 foreach (GridTrack track
in Rows)
124 track.Size = track.RealSize(Host.
Real.Height);
132 internal override void Update()
134 if (Changed && Host.Children.Count > 0)
136 Host.InvokeOnLayoutUpdated();
151 startCellX = Math.Clamp(c.
GridStartCell.Value.X, 0, Rows.Count);
152 startCellY = Math.Clamp(c.
GridStartCell.Value.Y, 0, Columns.Count);
159 endCellX = Math.Clamp(c.
GridEndCell.Value.X, 0, Rows.Count);
160 endCellY = Math.Clamp(c.
GridEndCell.Value.Y, 0, Columns.Count);
164 Columns[startCellX].Start,
165 Rows[startCellY].Start,
166 Columns[endCellX].End - Columns[startCellX].Start,
167 Rows[endCellY].End - Rows[startCellY].Start
170 real = real.Shift(Host.
Real.Position);
172 c.AmIOkWithThisSize(real.Size);
174 c.SetReal(real,
"Grid Layout update");