Egg Move selection is done in pairs

This commit is contained in:
Benjamin Popp
2019-05-15 06:40:39 -05:00
parent 317582ff68
commit b22f693f8c
2 changed files with 26 additions and 3 deletions

View File

@@ -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);

View File

@@ -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)));
}
}
}