From 1fd25ebac3d69a990f03a811b9f57d45c7680338 Mon Sep 17 00:00:00 2001 From: FoggyFinder Date: Sat, 31 Aug 2019 22:05:46 +0300 Subject: [PATCH 1/2] add check for multi-character atom --- .../DisplayEditingExtensions.TextLine.cs | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/CSharpMath.Editor/Extensions/DisplayEditingExtensions.TextLine.cs b/CSharpMath.Editor/Extensions/DisplayEditingExtensions.TextLine.cs index 1884f7232..fb270b90f 100644 --- a/CSharpMath.Editor/Extensions/DisplayEditingExtensions.TextLine.cs +++ b/CSharpMath.Editor/Extensions/DisplayEditingExtensions.TextLine.cs @@ -70,16 +70,24 @@ public static int MathListIndexToStringIndex(this TextLineDisplay public static MathListIndex IndexForPoint(this TextLineDisplay self, TypesettingContext context, PointF point) where TFont : IFont { // Convert the point to the reference of the CTLine var relativePoint = new PointF(point.X - self.Position.X, point.Y - self.Position.Y); - var indices = self.Runs.Select(run => run.Run.GlyphIndexForXOffset(context, relativePoint.Plus(run.Position).X)).Where(x => x.HasValue).ToArray(); + var indices = + self.Runs + .Select(run => ValueTuple.Create(run, run.Run.GlyphIndexForXOffset(context, relativePoint.Plus(run.Position).X))) + .Where(x => x.Item2.HasValue) + .ToArray(); if (indices.Length == 0) return null; - var index = indices.Single().GetValueOrDefault(); - - // index will be between 0 and _range.length inclusive - if (index < 0 || index > self.Range.Length) + var (r, nindex) = indices.Single(); + var index = nindex.GetValueOrDefault(); + var diffLng = r.Run.Length != r.Range.Length; + if (index < 0 || (!diffLng && index > self.Range.Length) || (diffLng && index > r.Run.Length)) throw new InvalidCodePathException($"Returned index out of range: {index}, range ({self.Range.Location}, {self.Range.Length})"); - // translate to the current index - return MathListIndex.Level0Index(self.Range.Location + index); + if (!diffLng) + return MathListIndex.Level0Index(self.Range.Location + index); + if (index > r.Run.Length / 2) + return MathListIndex.Level0Index(self.Range.End); + + return MathListIndex.Level0Index(self.Range.Location); } public static (TextRunDisplay run, int charIndex) GetRunAndCharIndexFromStringIndex(this TextLineDisplay self, int lineCharIndex) where TFont : IFont { From a1989764b4afe67b0e12bde4fc4bca39c9e04d8e Mon Sep 17 00:00:00 2001 From: FoggyFinder Date: Sun, 1 Sep 2019 11:40:03 +0300 Subject: [PATCH 2/2] renaming --- .../Extensions/DisplayEditingExtensions.TextLine.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CSharpMath.Editor/Extensions/DisplayEditingExtensions.TextLine.cs b/CSharpMath.Editor/Extensions/DisplayEditingExtensions.TextLine.cs index fb270b90f..099e5036e 100644 --- a/CSharpMath.Editor/Extensions/DisplayEditingExtensions.TextLine.cs +++ b/CSharpMath.Editor/Extensions/DisplayEditingExtensions.TextLine.cs @@ -70,14 +70,14 @@ public static int MathListIndexToStringIndex(this TextLineDisplay public static MathListIndex IndexForPoint(this TextLineDisplay self, TypesettingContext context, PointF point) where TFont : IFont { // Convert the point to the reference of the CTLine var relativePoint = new PointF(point.X - self.Position.X, point.Y - self.Position.Y); - var indices = + var runsAndIndicies = self.Runs .Select(run => ValueTuple.Create(run, run.Run.GlyphIndexForXOffset(context, relativePoint.Plus(run.Position).X))) .Where(x => x.Item2.HasValue) .ToArray(); - if (indices.Length == 0) + if (runsAndIndicies.Length == 0) return null; - var (r, nindex) = indices.Single(); + var (r, nindex) = runsAndIndicies.Single(); var index = nindex.GetValueOrDefault(); var diffLng = r.Run.Length != r.Range.Length; if (index < 0 || (!diffLng && index > self.Range.Length) || (diffLng && index > r.Run.Length))