diff --git a/src/HexManiac.Core/ViewModels/EditorViewModel.cs b/src/HexManiac.Core/ViewModels/EditorViewModel.cs index a0481876..018e0b94 100644 --- a/src/HexManiac.Core/ViewModels/EditorViewModel.cs +++ b/src/HexManiac.Core/ViewModels/EditorViewModel.cs @@ -348,6 +348,9 @@ namespace HavenSoft.HexManiac.Core.ViewModels { } } + private int maxDiffSegCount = 1000; + public int MaximumDiffSegments { get => maxDiffSegCount; set => Set(ref maxDiffSegCount, value.LimitToRange(1, 10000)); } + public IToolTrayViewModel Tools => (SelectedTab as IViewPort)?.Tools; public IReadOnlyList QuickEditsPokedex { get; } @@ -767,7 +770,7 @@ namespace HavenSoft.HexManiac.Core.ViewModels { } SelectedIndex = left; - leftViewPort.Diff.Execute(rightViewPort); + leftViewPort.Diff.Execute((Other: rightViewPort, MaxSegments: maxDiffSegCount)); } #endregion diff --git a/src/HexManiac.Core/ViewModels/ViewPort.cs b/src/HexManiac.Core/ViewModels/ViewPort.cs index 965f96f6..1cefab39 100644 --- a/src/HexManiac.Core/ViewModels/ViewPort.cs +++ b/src/HexManiac.Core/ViewModels/ViewPort.cs @@ -535,10 +535,12 @@ namespace HavenSoft.HexManiac.Core.ViewModels { public event EventHandler RequestDiff; private StubCommand diff, diffLeft, diffRight; - public ICommand Diff => StubCommand(ref diff, ExecuteDiff); + public ICommand Diff => StubCommand(ref diff, ExecuteDiff); public ICommand DiffLeft => StubCommand(ref diffLeft, ExecuteDiffLeft, CanExecuteDiffLeft); public ICommand DiffRight => StubCommand(ref diffRight, ExecuteDiffRight, CanExecuteDiffRight); - private void ExecuteDiff(ITabContent otherTab) { + private void ExecuteDiff(object data) { + var args = (ValueTuple)data; + var (otherTab, maxSegments) = args; if (otherTab == null) { var resultsTab = new SearchResultsViewPort("Changes"); int firstResultStart = 0; @@ -551,12 +553,15 @@ namespace HavenSoft.HexManiac.Core.ViewModels { else break; } resultsTab.Add(CreateChildView(i, i + length - 1), i, i + length - 1); + if (resultsTab.ResultCount >= maxSegments) break; if (firstResultLength == 0) (firstResultStart, firstResultLength) = (i, length); i += length; } var changeCount = resultsTab.ResultCount; - RaiseMessage($"{changeCount} changes found."); + var changeCountText = changeCount.ToString(); + if (changeCount >= maxSegments) changeCountText += "+"; + RaiseMessage($"{changeCountText} changes found."); if (changeCount == 1) { Goto.Execute(firstResultStart); SelectionEnd = ConvertAddressToViewPoint(firstResultStart + firstResultLength - 1); @@ -577,10 +582,13 @@ namespace HavenSoft.HexManiac.Core.ViewModels { resultsTabA.Add(CreateChildView(i, lastDiff)); resultsTabB.Add(otherViewPort.CreateChildView(i, lastDiff)); i = lastDiff + 1; + if (resultsTabA.Count >= maxSegments) break; } var diffTab = new DiffViewPort(resultsTabA, resultsTabB) { Height = Height }; var changeCount = resultsTabA.Count; - RaiseMessage($"{changeCount} changes found."); + var changeCountText = changeCount.ToString(); + if (changeCount >= maxSegments) changeCountText += "+"; + RaiseMessage($"{changeCountText} changes found."); if (changeCount > 0) { RequestTabChange?.Invoke(this, diffTab); } diff --git a/src/HexManiac.Tests/DiffTests.cs b/src/HexManiac.Tests/DiffTests.cs index 949d1777..934c2cb2 100644 --- a/src/HexManiac.Tests/DiffTests.cs +++ b/src/HexManiac.Tests/DiffTests.cs @@ -170,5 +170,17 @@ namespace HavenSoft.HexManiac.Tests { var selectedAddress = selectedTab.ConvertViewPointToAddress(selectedTab.SelectionStart); Assert.Equal(newSelectionStart, selectedAddress); } + + [Fact] + public void ManyChanges_Diff_LimitTo1000Changes() { + editor.MaximumDiffSegments = 2; + Model1[1] = 1; + Model1[30] = 1; + Model1[60] = 1; + + ViewModel0.DiffRight.Execute(); + + Assert.Contains("+", editor.InformationMessage); + } } }