瀏覽代碼

Revert "Reapply "Reapply "Reapply "Rewrote FindDeepestView to be clearer and more performant""""

This reverts commit 907dc4d9bfe12c3aef27f45138abcb2dd8e1baba.
Tig 1 年之前
父節點
當前提交
30e62a694f
共有 1 個文件被更改,包括 34 次插入44 次删除
  1. 34 44
      Terminal.Gui/View/Layout/ViewLayout.cs

+ 34 - 44
Terminal.Gui/View/Layout/ViewLayout.cs

@@ -605,63 +605,53 @@ public partial class View
     // CONCURRENCY: This method is not thread-safe. Undefined behavior and likely program crashes are exposed by unsynchronized access to InternalSubviews.
     internal static View? FindDeepestView (View? start, int x, int y)
     {
-        while (start is { Visible: true } && start.Contains (x, y))
+        if (start is null || !start.Visible || !start.Contains (x, y))
         {
-            Adornment? found = null;
+            return null;
+        }
 
-            if (start.Margin.Contains (x, y))
-            {
-                found = start.Margin;
-            }
-            else if (start.Border.Contains (x, y))
-            {
-                found = start.Border;
-            }
-            else if (start.Padding.Contains (x, y))
-            {
-                found = start.Padding;
-            }
+        Adornment? found = null;
 
-            Point viewportOffset = start.GetViewportOffsetFromFrame ();
+        if (start.Margin.Contains (x, y))
+        {
+            found = start.Margin;
+        }
+        else if (start.Border.Contains (x, y))
+        {
+            found = start.Border;
+        }
+        else if (start.Padding.Contains (x, y))
+        {
+            found = start.Padding;
+        }
 
-            if (found is { })
-            {
-                start = found;
-                viewportOffset = found.Parent.Frame.Location;
-            }
+        Point viewportOffset = start.GetViewportOffsetFromFrame ();
 
-            if (start.InternalSubviews is { Count: > 0 })
-            {
-                int startOffsetX = x - (start.Frame.X + viewportOffset.X);
-                int startOffsetY = y - (start.Frame.Y + viewportOffset.Y);
+        if (found is { })
+        {
+            start = found;
+            viewportOffset = found.Parent.Frame.Location;
+        }
 
-                for (int i = start.InternalSubviews.Count - 1; i >= 0; i--)
-                {
-                    View nextStart = start.InternalSubviews [i];
+        if (start.InternalSubviews is { Count: > 0 })
+        {
+            int startOffsetX = x - (start.Frame.X + viewportOffset.X);
+            int startOffsetY = y - (start.Frame.Y + viewportOffset.Y);
 
-                    if (nextStart.Visible && nextStart.Contains (startOffsetX + start.Viewport.X, startOffsetY + start.Viewport.Y))
-                    {
-                        start = nextStart;
-                        x = startOffsetX + start.Viewport.X;
-                        y = startOffsetY + start.Viewport.Y;
-                        break;
-                    }
+            for (int i = start.InternalSubviews.Count - 1; i >= 0; i--)
+            {
+                View nextStart = start.InternalSubviews [i];
 
-                    if (i == 0)
-                    {
-                        return start; // If no visible subview is found, return the current start view
-                    }
+                if (nextStart.Visible && nextStart.Contains (startOffsetX + start.Viewport.X, startOffsetY + start.Viewport.Y))
+                {
+                    // TODO: Remove recursion
+                    return FindDeepestView (nextStart, startOffsetX + start.Viewport.X, startOffsetY + start.Viewport.Y) ?? nextStart;
                 }
             }
-            else
-            {
-                return start;
-            }
         }
 
-        return null;
+        return start;
     }
-
 #nullable restore
 
     /// <summary>