diff --git a/src/HexManiac.Core/ViewModels/ViewPort.cs b/src/HexManiac.Core/ViewModels/ViewPort.cs index aa99d180..d9785f93 100644 --- a/src/HexManiac.Core/ViewModels/ViewPort.cs +++ b/src/HexManiac.Core/ViewModels/ViewPort.cs @@ -1035,12 +1035,20 @@ namespace HavenSoft.HexManiac.Core.ViewModels { var run = Model.GetNextRun(index); if (run.Start > index) return (p, p); - if (run is PointerRun) return (scroll.DataIndexToViewPoint(run.Start), scroll.DataIndexToViewPoint(run.Start + run.Length - 1)); + (Point, Point) pair(int start, int end) => (scroll.DataIndexToViewPoint(start), scroll.DataIndexToViewPoint(end)); + + if (run is PointerRun) return pair(run.Start, run.Start + run.Length - 1); + if (run is EggMoveRun) { + var even = (index - run.Start) % 2 == 0; + if (even) return pair(index, index + 1); + return pair(index - 1, index); + } if (!(run is ArrayRun array)) return (p, p); var offset = array.ConvertByteOffsetToArrayOffset(index); - if (array.ElementContent[offset.SegmentIndex].Type == ElementContentType.Pointer || array.ElementContent[offset.SegmentIndex].Type == ElementContentType.Integer) { - return (scroll.DataIndexToViewPoint(offset.SegmentStart), scroll.DataIndexToViewPoint(offset.SegmentStart + array.ElementContent[offset.SegmentIndex].Length - 1)); + var type = array.ElementContent[offset.SegmentIndex].Type; + if (type == ElementContentType.Pointer || type == ElementContentType.Integer) { + return pair(offset.SegmentStart, offset.SegmentStart + array.ElementContent[offset.SegmentIndex].Length - 1); } return (p, p); diff --git a/src/HexManiac.Tests/EggMoveTests.cs b/src/HexManiac.Tests/EggMoveTests.cs index 876e6a8f..1fca59d2 100644 --- a/src/HexManiac.Tests/EggMoveTests.cs +++ b/src/HexManiac.Tests/EggMoveTests.cs @@ -48,5 +48,20 @@ namespace HavenSoft.HexManiac.Tests { Assert.Equal("Wind", item.ItemName); Assert.Equal("[]", endSection.SectionName); } + + [Fact] + public void SelectionDoneInPairs() { + var token = new ModelDelta(); + model.WriteMultiByteValue(0, 2, token, EggMoveRun.MagicNumber + 2); // Carl + model.WriteMultiByteValue(2, 2, token, 3); // Wind + viewPort.Edit("^eggmoves`egg` "); + + viewPort.SelectionStart = new Point(2, 0); // should select "Wind" + Assert.True(viewPort.IsSelected(new Point(3, 0))); + + viewPort.MoveSelectionStart.Execute(Direction.Right); // should select "[]" + Assert.True(viewPort.IsSelected(new Point(4, 0))); + Assert.True(viewPort.IsSelected(new Point(5, 0))); + } } }