Skip to content

Commit b814cb6

Browse files
committed
fix: scroll to the first change using the real text layout in diff view
1 parent 9071940 commit b814cb6

1 file changed

Lines changed: 34 additions & 10 deletions

File tree

‎src/Views/TextDiffView.axaml.cs‎

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -640,7 +640,7 @@ protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs chang
640640
protected override void OnDataContextChanged(EventArgs e)
641641
{
642642
base.OnDataContextChanged(e);
643-
AutoScrollToFirstChange();
643+
_execSizeChanged = false;
644644
}
645645

646646
protected override void OnSizeChanged(SizeChangedEventArgs e)
@@ -857,20 +857,40 @@ private void AutoScrollToFirstChange()
857857
if (curBlock == null)
858858
return;
859859

860-
var lineHeight = TextArea.TextView.DefaultLineHeight;
861-
var vOffset = lineHeight * (curBlock.Start - 1) - Bounds.Height * 0.5;
860+
ApplyTemplate();
861+
var scroller = this.FindDescendantOfType<ScrollViewer>();
862+
if (scroller == null)
863+
{
864+
_execSizeChanged = false;
865+
return;
866+
}
867+
868+
var target = Math.Min(curBlock.Start, Document.LineCount);
869+
if (target < 1)
870+
return;
871+
872+
var textView = TextArea.TextView;
873+
for (var i = 1; i < target; i++)
874+
textView.GetOrConstructVisualLine(Document.GetLineByNumber(i));
875+
876+
var visualLine = textView.GetOrConstructVisualLine(Document.GetLineByNumber(target));
877+
var vOffset = visualLine.VisualTop - scroller.Viewport.Height * 0.5;
862878
if (vOffset >= 0)
863879
{
864-
var scroller = this.FindDescendantOfType<ScrollViewer>();
865-
if (scroller != null)
866-
{
867-
var scrollOffset = new Vector(0, vOffset);
868-
scroller.Offset = scrollOffset;
869-
ctx.ScrollOffset = scrollOffset;
870-
}
880+
var scrollOffset = new Vector(0, vOffset);
881+
scroller.Offset = scrollOffset;
882+
ctx.ScrollOffset = scrollOffset;
871883
}
872884
}
873885

886+
protected void ScheduleAutoScrollToFirstChange()
887+
{
888+
if (DataContext is not ViewModels.TextDiffContext)
889+
return;
890+
891+
Dispatcher.UIThread.Post(AutoScrollToFirstChange, DispatcherPriority.Background);
892+
}
893+
874894
private bool CanCopyText()
875895
{
876896
var selection = TextArea.Selection;
@@ -1061,6 +1081,8 @@ protected override void OnDataContextChanged(EventArgs e)
10611081
Text = string.Empty;
10621082
}
10631083

1084+
ScheduleAutoScrollToFirstChange();
1085+
10641086
GC.Collect();
10651087
}
10661088

@@ -1252,6 +1274,8 @@ protected override void OnDataContextChanged(EventArgs e)
12521274
{
12531275
Text = string.Empty;
12541276
}
1277+
1278+
ScheduleAutoScrollToFirstChange();
12551279
}
12561280

12571281
protected override void UpdateSelectedChunk(double y)

0 commit comments

Comments
 (0)