@@ -124,82 +124,25 @@ public Models.ConflictLineState GetLineState(int line)
124124 return Models . ConflictLineState . Normal ;
125125 }
126126
127- public void AcceptOurs ( )
127+ public void Resolve ( object param )
128128 {
129129 if ( _selectedChunk == null )
130130 return ;
131131
132132 var region = _conflictRegions [ _selectedChunk . ConflictIndex ] ;
133- if ( region . IsResolved )
133+ if ( param is not Models . ConflictResolution resolution )
134134 return ;
135135
136- region . ResolvedContent = new List < string > ( region . OursContent ) ;
137- region . IsResolved = true ;
138- region . ResolutionType = Models . ConflictResolution . UseOurs ;
139- RefreshDisplayData ( ) ;
140- }
141-
142- public void AcceptTheirs ( )
143- {
144- if ( _selectedChunk == null )
145- return ;
146-
147- var region = _conflictRegions [ _selectedChunk . ConflictIndex ] ;
148- if ( region . IsResolved )
149- return ;
150-
151- region . ResolvedContent = new List < string > ( region . TheirsContent ) ;
152- region . IsResolved = true ;
153- region . ResolutionType = Models . ConflictResolution . UseTheirs ;
154- RefreshDisplayData ( ) ;
155- }
156-
157- public void AcceptBothMineFirst ( )
158- {
159- if ( _selectedChunk == null )
160- return ;
161-
162- var region = _conflictRegions [ _selectedChunk . ConflictIndex ] ;
163- if ( region . IsResolved )
136+ // Try to resolve a resolved region.
137+ if ( resolution != Models . ConflictResolution . None && region . IsResolved )
164138 return ;
165139
166- var combined = new List < string > ( region . OursContent ) ;
167- combined . AddRange ( region . TheirsContent ) ;
168- region . ResolvedContent = combined ;
169- region . IsResolved = true ;
170- region . ResolutionType = Models . ConflictResolution . UseBothMineFirst ;
171- RefreshDisplayData ( ) ;
172- }
173-
174- public void AcceptBothTheirsFirst ( )
175- {
176- if ( _selectedChunk == null )
177- return ;
178-
179- var region = _conflictRegions [ _selectedChunk . ConflictIndex ] ;
180- if ( region . IsResolved )
140+ // Try to undo an unresolved region.
141+ if ( resolution == Models . ConflictResolution . None && ! region . IsResolved )
181142 return ;
182143
183- var combined = new List < string > ( region . TheirsContent ) ;
184- combined . AddRange ( region . OursContent ) ;
185- region . ResolvedContent = combined ;
186- region . IsResolved = true ;
187- region . ResolutionType = Models . ConflictResolution . UseBothTheirsFirst ;
188- RefreshDisplayData ( ) ;
189- }
190-
191- public void Undo ( )
192- {
193- if ( _selectedChunk == null )
194- return ;
195-
196- var region = _conflictRegions [ _selectedChunk . ConflictIndex ] ;
197- if ( ! region . IsResolved )
198- return ;
199-
200- region . ResolvedContent = null ;
201- region . IsResolved = false ;
202- region . ResolutionType = Models . ConflictResolution . None ;
144+ region . IsResolved = resolution != Models . ConflictResolution . None ;
145+ region . ResolutionType = resolution ;
203146 RefreshDisplayData ( ) ;
204147 }
205148
@@ -223,8 +166,32 @@ public async Task<bool> SaveAndStageAsync()
223166 for ( var i = lastLineIdx ; i < r . StartLineInOriginal ; i ++ )
224167 builder . Append ( lines [ i ] ) . Append ( '\n ' ) ;
225168
226- foreach ( var l in r . ResolvedContent )
227- builder . Append ( l ) . Append ( '\n ' ) ;
169+ if ( r . ResolutionType == Models . ConflictResolution . UseOurs )
170+ {
171+ foreach ( var l in r . OursContent )
172+ builder . Append ( l ) . Append ( '\n ' ) ;
173+ }
174+ else if ( r . ResolutionType == Models . ConflictResolution . UseTheirs )
175+ {
176+ foreach ( var l in r . TheirsContent )
177+ builder . Append ( l ) . Append ( '\n ' ) ;
178+ }
179+ else if ( r . ResolutionType == Models . ConflictResolution . UseBothMineFirst )
180+ {
181+ foreach ( var l in r . OursContent )
182+ builder . Append ( l ) . Append ( '\n ' ) ;
183+
184+ foreach ( var l in r . TheirsContent )
185+ builder . Append ( l ) . Append ( '\n ' ) ;
186+ }
187+ else if ( r . ResolutionType == Models . ConflictResolution . UseBothTheirsFirst )
188+ {
189+ foreach ( var l in r . TheirsContent )
190+ builder . Append ( l ) . Append ( '\n ' ) ;
191+
192+ foreach ( var l in r . OursContent )
193+ builder . Append ( l ) . Append ( '\n ' ) ;
194+ }
228195
229196 lastLineIdx = r . EndLineInOriginal + 1 ;
230197 }
@@ -278,7 +245,6 @@ private void ParseOriginalContent(string content)
278245 var region = new Models . ConflictRegion
279246 {
280247 StartLineInOriginal = i ,
281- PanelStartLine = oursLines . Count ,
282248 StartMarker = line ,
283249 } ;
284250
@@ -339,7 +305,6 @@ private void ParseOriginalContent(string content)
339305
340306 region . EndMarker = lines [ i ] ;
341307 region . EndLineInOriginal = i ;
342- region . PanelEndLine = oursLines . Count - 1 ;
343308 i ++ ;
344309 }
345310
@@ -383,71 +348,79 @@ private void RefreshDisplayData()
383348 if ( conflictIdx < _conflictRegions . Count )
384349 {
385350 var region = _conflictRegions [ conflictIdx ] ;
386- if ( region . PanelStartLine == currentLine )
351+ if ( region . StartLineInOriginal == currentLine )
387352 currentRegion = region ;
388353 }
389354
390355 if ( currentRegion != null )
391356 {
392- int regionLines = currentRegion . PanelEndLine - currentRegion . PanelStartLine + 1 ;
393-
394- if ( currentRegion . ResolvedContent != null )
357+ int regionLines = currentRegion . EndLineInOriginal - currentRegion . StartLineInOriginal + 1 ;
358+ if ( currentRegion . IsResolved )
395359 {
396360 var oldLineCount = resultLines . Count ;
361+ var resolveType = currentRegion . ResolutionType ;
397362
398363 // Resolved - show resolved content with color based on resolution type
399- if ( currentRegion . ResolutionType == Models . ConflictResolution . UseBothMineFirst )
364+ if ( resolveType == Models . ConflictResolution . UseBothMineFirst )
400365 {
401- // First portion is Mine (Deleted color), second is Theirs (Added color)
402366 int mineCount = currentRegion . OursContent . Count ;
403- for ( int i = 0 ; i < currentRegion . ResolvedContent . Count ; i ++ )
367+ for ( int i = 0 ; i < mineCount ; i ++ )
404368 {
405- var lineType = i < mineCount
406- ? Models . TextDiffLineType . Deleted
407- : Models . TextDiffLineType . Added ;
408- resultLines . Add ( new Models . TextDiffLine (
409- lineType , currentRegion . ResolvedContent [ i ] , resultLineNumber , resultLineNumber ) ) ;
369+ resultLines . Add ( new Models . TextDiffLine ( Models . TextDiffLineType . Deleted , currentRegion . OursContent [ i ] , resultLineNumber , resultLineNumber ) ) ;
370+ resultLineNumber ++ ;
371+ }
372+
373+ int theirsCount = currentRegion . TheirsContent . Count ;
374+ for ( int i = 0 ; i < theirsCount ; i ++ )
375+ {
376+ resultLines . Add ( new Models . TextDiffLine ( Models . TextDiffLineType . Added , currentRegion . TheirsContent [ i ] , resultLineNumber , resultLineNumber ) ) ;
410377 resultLineNumber ++ ;
411378 }
412379 }
413- else if ( currentRegion . ResolutionType == Models . ConflictResolution . UseBothTheirsFirst )
380+ else if ( resolveType == Models . ConflictResolution . UseBothTheirsFirst )
414381 {
415- // First portion is Theirs (Added color), second is Mine (Deleted color)
416382 int theirsCount = currentRegion . TheirsContent . Count ;
417- for ( int i = 0 ; i < currentRegion . ResolvedContent . Count ; i ++ )
383+ for ( int i = 0 ; i < theirsCount ; i ++ )
384+ {
385+ resultLines . Add ( new Models . TextDiffLine ( Models . TextDiffLineType . Added , currentRegion . TheirsContent [ i ] , resultLineNumber , resultLineNumber ) ) ;
386+ resultLineNumber ++ ;
387+ }
388+
389+ int mineCount = currentRegion . OursContent . Count ;
390+ for ( int i = 0 ; i < mineCount ; i ++ )
418391 {
419- var lineType = i < theirsCount
420- ? Models . TextDiffLineType . Added
421- : Models . TextDiffLineType . Deleted ;
422- resultLines . Add ( new Models . TextDiffLine (
423- lineType , currentRegion . ResolvedContent [ i ] , resultLineNumber , resultLineNumber ) ) ;
392+ resultLines . Add ( new Models . TextDiffLine ( Models . TextDiffLineType . Deleted , currentRegion . OursContent [ i ] , resultLineNumber , resultLineNumber ) ) ;
424393 resultLineNumber ++ ;
425394 }
426395 }
427- else
396+ else if ( resolveType == Models . ConflictResolution . UseOurs )
428397 {
429- var lineType = currentRegion . ResolutionType switch
398+ int mineCount = currentRegion . OursContent . Count ;
399+ for ( int i = 0 ; i < mineCount ; i ++ )
430400 {
431- Models . ConflictResolution . UseOurs => Models . TextDiffLineType . Deleted , // Mine color
432- Models . ConflictResolution . UseTheirs => Models . TextDiffLineType . Added , // Theirs color
433- _ => Models . TextDiffLineType . Normal
434- } ;
435-
436- foreach ( var line in currentRegion . ResolvedContent )
401+ resultLines . Add ( new Models . TextDiffLine ( Models . TextDiffLineType . Deleted , currentRegion . OursContent [ i ] , resultLineNumber , resultLineNumber ) ) ;
402+ resultLineNumber ++ ;
403+ }
404+ }
405+ else if ( resolveType == Models . ConflictResolution . UseTheirs )
406+ {
407+ int theirsCount = currentRegion . TheirsContent . Count ;
408+ for ( int i = 0 ; i < theirsCount ; i ++ )
437409 {
438- resultLines . Add ( new Models . TextDiffLine (
439- lineType , line , resultLineNumber , resultLineNumber ) ) ;
410+ resultLines . Add ( new Models . TextDiffLine ( Models . TextDiffLineType . Added , currentRegion . TheirsContent [ i ] , resultLineNumber , resultLineNumber ) ) ;
440411 resultLineNumber ++ ;
441412 }
442413 }
414+
443415 // Pad with empty lines to match Mine/Theirs panel height
444- int padding = regionLines - currentRegion . ResolvedContent . Count ;
416+ int added = resultLines . Count - oldLineCount ;
417+ int padding = regionLines - added ;
445418 for ( int p = 0 ; p < padding ; p ++ )
446419 resultLines . Add ( new Models . TextDiffLine ( ) ) ;
447420
448- int added = resultLines . Count - oldLineCount ;
421+ int blockSize = resultLines . Count - oldLineCount - 2 ;
449422 _lineStates . Add ( Models . ConflictLineState . ResolvedBlockStart ) ;
450- for ( var i = 0 ; i < added - 2 ; i ++ )
423+ for ( var i = 0 ; i < blockSize ; i ++ )
451424 _lineStates . Add ( Models . ConflictLineState . ResolvedBlock ) ;
452425 _lineStates . Add ( Models . ConflictLineState . ResolvedBlockEnd ) ;
453426 }
@@ -461,8 +434,7 @@ private void RefreshDisplayData()
461434 // Mine content lines (matches the deleted lines in Ours panel)
462435 foreach ( var line in currentRegion . OursContent )
463436 {
464- resultLines . Add ( new Models . TextDiffLine (
465- Models . TextDiffLineType . Deleted , line , 0 , resultLineNumber ++ ) ) ;
437+ resultLines . Add ( new Models . TextDiffLine ( Models . TextDiffLineType . Deleted , line , 0 , resultLineNumber ++ ) ) ;
466438 _lineStates . Add ( Models . ConflictLineState . ConflictBlock ) ;
467439 }
468440
@@ -473,8 +445,7 @@ private void RefreshDisplayData()
473445 // Theirs content lines (matches the added lines in Theirs panel)
474446 foreach ( var line in currentRegion . TheirsContent )
475447 {
476- resultLines . Add ( new Models . TextDiffLine (
477- Models . TextDiffLineType . Added , line , 0 , resultLineNumber ++ ) ) ;
448+ resultLines . Add ( new Models . TextDiffLine ( Models . TextDiffLineType . Added , line , 0 , resultLineNumber ++ ) ) ;
478449 _lineStates . Add ( Models . ConflictLineState . ConflictBlock ) ;
479450 }
480451
@@ -483,7 +454,7 @@ private void RefreshDisplayData()
483454 _lineStates . Add ( Models . ConflictLineState . ConflictBlockEnd ) ;
484455 }
485456
486- currentLine = currentRegion . PanelEndLine + 1 ;
457+ currentLine = currentRegion . EndLineInOriginal + 1 ;
487458 conflictIdx ++ ;
488459 }
489460 else
@@ -492,9 +463,7 @@ private void RefreshDisplayData()
492463 var oursLine = _oursDiffLines [ currentLine ] ;
493464 if ( oursLine . Type == Models . TextDiffLineType . Normal )
494465 {
495- resultLines . Add ( new Models . TextDiffLine (
496- Models . TextDiffLineType . Normal , oursLine . Content ,
497- resultLineNumber , resultLineNumber ) ) ;
466+ resultLines . Add ( new Models . TextDiffLine ( Models . TextDiffLineType . Normal , oursLine . Content , resultLineNumber , resultLineNumber ) ) ;
498467 resultLineNumber ++ ;
499468 }
500469 else
0 commit comments