Skip to content

Commit 6fbff56

Browse files
committed
fix: scroll sync works with keyboard and scrollbar
1 parent 8778257 commit 6fbff56

File tree

1 file changed

+15
-13
lines changed

1 file changed

+15
-13
lines changed

src/Views/MergeConflictEditor.axaml.cs

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -848,15 +848,15 @@ private void SetupScrollSync()
848848
var theirsScroll = _theirsPresenter?.GetScrollViewer();
849849
var resultScroll = _resultPresenter?.GetScrollViewer();
850850

851-
// Wheel events
851+
// Wheel events for scroll sync
852852
if (_oursPresenter != null)
853853
_oursPresenter.AddHandler(PointerWheelChangedEvent, OnPresenterPointerWheelChanged, RoutingStrategies.Tunnel);
854854
if (_theirsPresenter != null)
855855
_theirsPresenter.AddHandler(PointerWheelChangedEvent, OnPresenterPointerWheelChanged, RoutingStrategies.Tunnel);
856856
if (_resultPresenter != null)
857857
_resultPresenter.AddHandler(PointerWheelChangedEvent, OnPresenterPointerWheelChanged, RoutingStrategies.Tunnel);
858858

859-
// ScrollChanged for scrollbar drag
859+
// ScrollChanged for scrollbar drag sync
860860
if (oursScroll != null)
861861
oursScroll.ScrollChanged += OnScrollChanged;
862862
if (theirsScroll != null)
@@ -865,6 +865,15 @@ private void SetupScrollSync()
865865
resultScroll.ScrollChanged += OnScrollChanged;
866866
}
867867

868+
private void OnScrollChanged(object sender, ScrollChangedEventArgs e)
869+
{
870+
if (_isSyncingScroll || sender is not ScrollViewer source)
871+
return;
872+
873+
// Sync on any scroll change (scrollbar drag, programmatic, etc.)
874+
SyncAllScrollViewers(source.Offset);
875+
}
876+
868877
private void OnPresenterPointerWheelChanged(object sender, PointerWheelEventArgs e)
869878
{
870879
var oursScroll = _oursPresenter?.GetScrollViewer();
@@ -879,34 +888,27 @@ private void OnPresenterPointerWheelChanged(object sender, PointerWheelEventArgs
879888
e.Handled = true;
880889
}
881890

882-
private void OnScrollChanged(object sender, ScrollChangedEventArgs e)
891+
private void SyncAllScrollViewers(Vector offset)
883892
{
884-
if (_isSyncingScroll || sender is not ScrollViewer source)
893+
if (_isSyncingScroll)
885894
return;
886895

887-
// Only sync if significant movement (scrollbar drag)
888-
if (e.OffsetDelta.SquaredLength > 0.5f)
889-
{
890-
SyncAllScrollViewers(source.Offset);
891-
}
892-
}
893-
894-
private void SyncAllScrollViewers(Vector offset)
895-
{
896896
_isSyncingScroll = true;
897897
try
898898
{
899899
var oursScroll = _oursPresenter?.GetScrollViewer();
900900
var theirsScroll = _theirsPresenter?.GetScrollViewer();
901901
var resultScroll = _resultPresenter?.GetScrollViewer();
902902

903+
// Direct offset assignment for immediate sync
903904
if (oursScroll != null)
904905
oursScroll.Offset = offset;
905906
if (theirsScroll != null)
906907
theirsScroll.Offset = offset;
907908
if (resultScroll != null)
908909
resultScroll.Offset = offset;
909910

911+
// Also update ViewModel for state tracking
910912
if (DataContext is ViewModels.MergeConflictEditor vm)
911913
vm.ScrollOffset = offset;
912914
}

0 commit comments

Comments
 (0)