diff --git a/src/Views/TextDiffView.axaml.cs b/src/Views/TextDiffView.axaml.cs index cfc392f1..e6de0d97 100644 --- a/src/Views/TextDiffView.axaml.cs +++ b/src/Views/TextDiffView.axaml.cs @@ -391,7 +391,7 @@ namespace SourceGit.Views base.Render(context); var chunk = SelectedChunk; - if (chunk == null || (!chunk.Combined && chunk.IsOldSide != IsOld)) + if (chunk == null || (!chunk.Combined && chunk.IsOldSide != IsOld) || chunk.Height == 0) return; var view = TextArea.TextView; @@ -639,7 +639,11 @@ namespace SourceGit.Views base.OnApplyTemplate(e); var scroller = (ScrollViewer)e.NameScope.Find("PART_ScrollViewer"); - scroller?.Bind(ScrollViewer.OffsetProperty, new Binding("SyncScrollOffset", BindingMode.TwoWay)); + if (scroller != null) + { + scroller.Bind(ScrollViewer.OffsetProperty, new Binding("SyncScrollOffset", BindingMode.TwoWay)); + scroller.GotFocus += (_, _) => TrySetChunk(null); + } } public override void UpdateSelectedChunk(double y) @@ -675,6 +679,35 @@ namespace SourceGit.Views return; } + var firstLineIdx = view.VisualLines[0].FirstDocumentLine.LineNumber - 1; + var lastLineIdx = view.VisualLines[^1].FirstDocumentLine.LineNumber - 1; + if (endIdx < firstLineIdx) + { + TrySetChunk(new TextDiffViewChunk() + { + Y = 0, + Height = 0, + StartIdx = startIdx, + EndIdx = endIdx, + Combined = true, + IsOldSide = false, + }); + return; + } + else if (startIdx > lastLineIdx) + { + TrySetChunk(new TextDiffViewChunk() + { + Y = 0, + Height = 0, + StartIdx = startIdx, + EndIdx = endIdx, + Combined = true, + IsOldSide = false, + }); + return; + } + var startLine = view.GetVisualLine(startIdx + 1); var endLine = view.GetVisualLine(endIdx + 1); @@ -840,6 +873,39 @@ namespace SourceGit.Views return; } + var firstLineIdx = view.VisualLines[0].FirstDocumentLine.LineNumber - 1; + var lastLineIdx = view.VisualLines[^1].FirstDocumentLine.LineNumber - 1; + if (endIdx < firstLineIdx) + { + diff.ConvertsToCombinedRange(parent.DataContext as Models.TextDiff, ref startIdx, ref endIdx, IsOld); + + TrySetChunk(new TextDiffViewChunk() + { + Y = 0, + Height = 0, + StartIdx = startIdx, + EndIdx = endIdx, + Combined = false, + IsOldSide = IsOld, + }); + return; + } + else if (startIdx > lastLineIdx) + { + diff.ConvertsToCombinedRange(parent.DataContext as Models.TextDiff, ref startIdx, ref endIdx, IsOld); + + TrySetChunk(new TextDiffViewChunk() + { + Y = 0, + Height = 0, + StartIdx = startIdx, + EndIdx = endIdx, + Combined = false, + IsOldSide = IsOld, + }); + return; + } + var startLine = view.GetVisualLine(startIdx + 1); var endLine = view.GetVisualLine(endIdx + 1); @@ -925,6 +991,7 @@ namespace SourceGit.Views _scrollViewer = this.FindDescendantOfType(); if (_scrollViewer != null) { + _scrollViewer.GotFocus += OnTextViewScrollGotFocus; _scrollViewer.ScrollChanged += OnTextViewScrollChanged; _scrollViewer.Bind(ScrollViewer.OffsetProperty, new Binding("SyncScrollOffset", BindingMode.OneWay)); } @@ -939,6 +1006,7 @@ namespace SourceGit.Views if (_scrollViewer != null) { _scrollViewer.ScrollChanged -= OnTextViewScrollChanged; + _scrollViewer.GotFocus -= OnTextViewScrollGotFocus; _scrollViewer = null; } @@ -977,6 +1045,11 @@ namespace SourceGit.Views } } + private void OnTextViewScrollGotFocus(object sender, GotFocusEventArgs e) + { + TrySetChunk(null); + } + private void OnTextViewScrollChanged(object sender, ScrollChangedEventArgs e) { if (TextArea.IsFocused && DataContext is ViewModels.TwoSideTextDiff diff) @@ -1048,7 +1121,7 @@ namespace SourceGit.Views SelectedChunkProperty.Changed.AddClassHandler((v, _) => { var chunk = v.SelectedChunk; - if (chunk == null) + if (chunk == null || chunk.Height == 0) { v.Popup.IsVisible = false; return;