From dcf6ef1fe7bbd62d1197bc1ccebac6d9a8947954 Mon Sep 17 00:00:00 2001 From: FoggyFinder Date: Sun, 8 Sep 2019 11:38:14 +0300 Subject: [PATCH] additional check due to previous change in Contains method --- .../DisplayEditingExtensions.List.cs | 74 ++++++++++--------- 1 file changed, 41 insertions(+), 33 deletions(-) diff --git a/CSharpMath.Editor/Extensions/DisplayEditingExtensions.List.cs b/CSharpMath.Editor/Extensions/DisplayEditingExtensions.List.cs index 78538df10..d83af073c 100644 --- a/CSharpMath.Editor/Extensions/DisplayEditingExtensions.List.cs +++ b/CSharpMath.Editor/Extensions/DisplayEditingExtensions.List.cs @@ -86,48 +86,56 @@ public static MathListIndex IndexForPoint(this ListDisplay(this ListDisplay self, TypesettingContext context, MathListIndex index) where TFont : IFont { if (index is null) return null; - PointF? position; - if (index.AtomIndex == self.Range.End) - // Special case the edge of the range + PointF? position = null; + var nonScripted = + self.Displays + .Where(d => !(d is ListDisplay ld && + ld.LinePosition != Enumerations.LinePosition.Regular)) + .ToArray(); + if (index.SubIndexType == MathListSubIndexType.None && + nonScripted.Length > 0 && + nonScripted.All(d => d.Range.End <= index.AtomIndex)) { position = new PointF(self.Width, 0); - else if (self.Range.Contains(index.AtomIndex) && self.SubDisplayForIndex(index) is IDisplay display) - switch (index.SubIndexType) { - case MathListSubIndexType.BetweenBaseAndScripts: - var nucleusPosition = index.AtomIndex + index.SubIndex.AtomIndex; - position = display.PointForIndex(context, MathListIndex.Level0Index(nucleusPosition)); - break; - case MathListSubIndexType.None: - if (!display.HasScript) { - position = display.PointForIndex(context, index); - } else { - var mainPosition = display.PointForIndex(context, index); - position = self.Displays.SingleOrDefault(d => - d is ListDisplay ld && ld.IndexInParent == index.AtomIndex - 1) - is IDisplay scripted && mainPosition != null - ? new PointF(mainPosition.Value.X + scripted.Width, 0) - : mainPosition; - } - break; - default: - // Recurse - position = display.PointForIndex(context, index.SubIndex); - break; - } - else - // Outside the range - return null; - + } else { + if (index.AtomIndex == self.Range.End) { + // Special case the edge of the range + position = new PointF(self.Width, 0); + } else if (self.Range.Contains(index.AtomIndex) && self.SubDisplayForIndex(index) is IDisplay display) + switch (index.SubIndexType) { + case MathListSubIndexType.BetweenBaseAndScripts: + var nucleusPosition = index.AtomIndex + index.SubIndex.AtomIndex; + position = display.PointForIndex(context, MathListIndex.Level0Index(nucleusPosition)); + break; + case MathListSubIndexType.None: + if (!display.HasScript) { + position = display.PointForIndex(context, index); + } else { + var mainPosition = display.PointForIndex(context, index); + position = self.Displays.SingleOrDefault(d => + d is ListDisplay ld && ld.IndexInParent == index.AtomIndex - 1) + is IDisplay scripted && mainPosition != null + ? new PointF(mainPosition.Value.X + scripted.Width, 0) + : mainPosition; + } + break; + default: + // Recurse + position = display.PointForIndex(context, index.SubIndex); + break; + } else + // Outside the range + return null; + } if (position is PointF found) { // Convert bounds from our coordinate system before returning found.X += self.Position.X; found.Y += self.Position.Y; return found; - } - else + } else // We didn't find the position return null; }