diff --git a/Terminal.Gui/Core.cs b/Terminal.Gui/Core.cs index 36b18410e..e465598b4 100644 --- a/Terminal.Gui/Core.cs +++ b/Terminal.Gui/Core.cs @@ -1248,12 +1248,12 @@ namespace Terminal.Gui { } // https://en.wikipedia.org/wiki/Topological_sorting - List TopologicalSort (HashSet nodes, HashSet<(View, View)> edges) + List TopologicalSort (HashSet nodes, HashSet<(View From, View To)> edges) { var result = new List (); // Set of all nodes with no incoming edges - var S = new HashSet (nodes.Where (n => edges.All (e => e.Item2.Equals (n) == false))); + var S = new HashSet (nodes.Where (n => edges.All (e => e.To.Equals (n) == false))); while (S.Any ()) { // remove a node n from S @@ -1265,14 +1265,14 @@ namespace Terminal.Gui { result.Add (n); // for each node m with an edge e from n to m do - foreach (var e in edges.Where (e => e.Item1.Equals (n)).ToList ()) { - var m = e.Item2; + foreach (var e in edges.Where (e => e.From.Equals (n)).ToArray ()) { + var m = e.To; // remove edge e from the graph edges.Remove (e); // if m has no other incoming edges then - if (edges.All (me => me.Item2.Equals (m) == false) && m != this?.SuperView) { + if (edges.All (me => me.To.Equals (m) == false) && m != this?.SuperView) { // insert m into S S.Add (m); } @@ -1306,19 +1306,18 @@ namespace Terminal.Gui { foreach (var v in InternalSubviews) { nodes.Add (v); if (v.LayoutStyle == LayoutStyle.Computed) { - if (v.X is Pos.PosView) - edges.Add ((v, (v.X as Pos.PosView).Target)); - if (v.Y is Pos.PosView) - edges.Add ((v, (v.Y as Pos.PosView).Target)); - if (v.Width is Dim.DimView) - edges.Add ((v, (v.Width as Dim.DimView).Target)); - if (v.Height is Dim.DimView) - edges.Add ((v, (v.Height as Dim.DimView).Target)); + if (v.X is Pos.PosView vX) + edges.Add ((vX.Target, v)); + if (v.Y is Pos.PosView vY) + edges.Add ((vY.Target, v)); + if (v.Width is Dim.DimView vWidth) + edges.Add ((vWidth.Target, v)); + if (v.Height is Dim.DimView vHeight) + edges.Add ((vHeight.Target, v)); } } var ordered = TopologicalSort (nodes, edges); - ordered.Reverse (); if (ordered == null) throw new Exception ("There is a recursive cycle in the relative Pos/Dim in the views of " + this);