@@ -28,10 +28,8 @@ public static bool IsChanged(TextDiffSelectedChunk oldValue, TextDiffSelectedChu
2828
2929 public class TextDiffContext : ObservableObject
3030 {
31+ public Models . DiffOption Option => _option ;
3132 public Models . TextDiff Data => _data ;
32- public string File => _data . File ;
33- public bool IsUnstaged => _data . Option . IsUnstaged ;
34- public bool EnableChunkOption => _data . Option . WorkingCopyChange != null ;
3533
3634 public Vector ScrollOffset
3735 {
@@ -132,6 +130,30 @@ public virtual TextDiffContext SwitchMode()
132130 return null ;
133131 }
134132
133+ protected bool TryKeepPrevScrollOffset ( TextDiffContext prev )
134+ {
135+ var fastTest = prev != null &&
136+ prev . _showEntireFile == _showEntireFile &&
137+ prev . _option . IsUnstaged == _option . IsUnstaged &&
138+ prev . _option . Path . Equals ( _option . Path , StringComparison . Ordinal ) &&
139+ prev . _option . OrgPath . Equals ( _option . OrgPath , StringComparison . Ordinal ) &&
140+ prev . _option . Revisions . Count == _option . Revisions . Count ;
141+
142+ if ( ! fastTest )
143+ return false ;
144+
145+ for ( int i = 0 ; i < _option . Revisions . Count ; i ++ )
146+ {
147+ if ( ! prev . _option . Revisions [ i ] . Equals ( _option . Revisions [ i ] , StringComparison . Ordinal ) )
148+ return false ;
149+ }
150+
151+ _scrollOffset = prev . _scrollOffset ;
152+ return true ;
153+ }
154+
155+ protected Models . DiffOption _option = null ;
156+ protected bool _showEntireFile = false ;
135157 protected Models . TextDiff _data = null ;
136158 protected Vector _scrollOffset = Vector . Zero ;
137159 protected BlockNavigation _blockNavigation = null ;
@@ -142,24 +164,19 @@ public virtual TextDiffContext SwitchMode()
142164
143165 public class CombinedTextDiff : TextDiffContext
144166 {
145- public CombinedTextDiff ( Models . TextDiff diff , CombinedTextDiff previous = null )
167+ public CombinedTextDiff ( Models . DiffOption option , bool showEntireFile , Models . TextDiff diff , CombinedTextDiff previous = null )
146168 {
169+ _option = option ;
170+ _showEntireFile = showEntireFile ;
147171 _data = diff ;
148172
149- if ( previous != null && previous . File . Equals ( File , StringComparison . Ordinal ) )
150- {
151- _blockNavigation = new BlockNavigation ( _data . Lines , false ) ;
152- _scrollOffset = previous . _scrollOffset ;
153- }
154- else
155- {
156- _blockNavigation = new BlockNavigation ( _data . Lines , true ) ;
157- }
173+ var keep = TryKeepPrevScrollOffset ( previous ) ;
174+ _blockNavigation = new BlockNavigation ( _data . Lines , ! keep ) ;
158175 }
159176
160177 public override TextDiffContext SwitchMode ( )
161178 {
162- return new TwoSideTextDiff ( _data ) ;
179+ return new TwoSideTextDiff ( _option , _showEntireFile , _data ) ;
163180 }
164181 }
165182
@@ -168,8 +185,10 @@ public class TwoSideTextDiff : TextDiffContext
168185 public List < Models . TextDiffLine > Old { get ; } = [ ] ;
169186 public List < Models . TextDiffLine > New { get ; } = [ ] ;
170187
171- public TwoSideTextDiff ( Models . TextDiff diff , TwoSideTextDiff previous = null )
188+ public TwoSideTextDiff ( Models . DiffOption option , bool showEntireFile , Models . TextDiff diff , TwoSideTextDiff previous = null )
172189 {
190+ _option = option ;
191+ _showEntireFile = showEntireFile ;
173192 _data = diff ;
174193
175194 foreach ( var line in diff . Lines )
@@ -192,15 +211,8 @@ public TwoSideTextDiff(Models.TextDiff diff, TwoSideTextDiff previous = null)
192211
193212 FillEmptyLines ( ) ;
194213
195- if ( previous != null && previous . File . Equals ( File , StringComparison . Ordinal ) )
196- {
197- _blockNavigation = new BlockNavigation ( Old , false ) ;
198- _scrollOffset = previous . _scrollOffset ;
199- }
200- else
201- {
202- _blockNavigation = new BlockNavigation ( Old , true ) ;
203- }
214+ var keep = TryKeepPrevScrollOffset ( previous ) ;
215+ _blockNavigation = new BlockNavigation ( Old , ! keep ) ;
204216 }
205217
206218 public override bool IsSideBySide ( )
@@ -210,7 +222,7 @@ public override bool IsSideBySide()
210222
211223 public override TextDiffContext SwitchMode ( )
212224 {
213- return new CombinedTextDiff ( _data ) ;
225+ return new CombinedTextDiff ( _option , _showEntireFile , _data ) ;
214226 }
215227
216228 public void ConvertsToCombinedRange ( ref int startLine , ref int endLine , bool isOldSide )
0 commit comments