@@ -109,12 +109,28 @@ public string UnstagedFilter
109
109
if ( _isLoadingData )
110
110
return ;
111
111
112
- VisibleUnstaged = GetVisibleUnstagedChanges ( _unstaged ) ;
112
+ VisibleUnstaged = GetVisibleChanges ( _unstaged , _unstagedFilter ) ;
113
113
SelectedUnstaged = [ ] ;
114
114
}
115
115
}
116
116
}
117
117
118
+ public string StagedFilter
119
+ {
120
+ get => _stagedFilter ;
121
+ set
122
+ {
123
+ if ( SetProperty ( ref _stagedFilter , value ) )
124
+ {
125
+ if ( _isLoadingData )
126
+ return ;
127
+
128
+ VisibleStaged = GetVisibleChanges ( _staged , _stagedFilter ) ;
129
+ SelectedStaged = [ ] ;
130
+ }
131
+ }
132
+ }
133
+
118
134
public List < Models . Change > Unstaged
119
135
{
120
136
get => _unstaged ;
@@ -133,6 +149,12 @@ public List<Models.Change> Staged
133
149
private set => SetProperty ( ref _staged , value ) ;
134
150
}
135
151
152
+ public List < Models . Change > VisibleStaged
153
+ {
154
+ get => _visibleStaged ;
155
+ private set => SetProperty ( ref _visibleStaged , value ) ;
156
+ }
157
+
136
158
public List < Models . Change > SelectedUnstaged
137
159
{
138
160
get => _selectedUnstaged ;
@@ -216,6 +238,9 @@ public void Cleanup()
216
238
_visibleUnstaged . Clear ( ) ;
217
239
OnPropertyChanged ( nameof ( VisibleUnstaged ) ) ;
218
240
241
+ _visibleStaged . Clear ( ) ;
242
+ OnPropertyChanged ( nameof ( VisibleStaged ) ) ;
243
+
219
244
_unstaged . Clear ( ) ;
220
245
OnPropertyChanged ( nameof ( Unstaged ) ) ;
221
246
@@ -269,7 +294,7 @@ public void SetData(List<Models.Change> changes)
269
294
}
270
295
}
271
296
272
- var visibleUnstaged = GetVisibleUnstagedChanges ( unstaged ) ;
297
+ var visibleUnstaged = GetVisibleChanges ( unstaged , _unstagedFilter ) ;
273
298
var selectedUnstaged = new List < Models . Change > ( ) ;
274
299
foreach ( var c in visibleUnstaged )
275
300
{
@@ -278,8 +303,10 @@ public void SetData(List<Models.Change> changes)
278
303
}
279
304
280
305
var staged = GetStagedChanges ( ) ;
306
+
307
+ var visibleStaged = GetVisibleChanges ( staged , _stagedFilter ) ;
281
308
var selectedStaged = new List < Models . Change > ( ) ;
282
- foreach ( var c in staged )
309
+ foreach ( var c in visibleStaged )
283
310
{
284
311
if ( lastSelectedStaged . Contains ( c . Path ) )
285
312
selectedStaged . Add ( c ) ;
@@ -290,6 +317,7 @@ public void SetData(List<Models.Change> changes)
290
317
_isLoadingData = true ;
291
318
HasUnsolvedConflicts = hasConflict ;
292
319
VisibleUnstaged = visibleUnstaged ;
320
+ VisibleStaged = visibleStaged ;
293
321
Unstaged = unstaged ;
294
322
Staged = staged ;
295
323
SelectedUnstaged = selectedUnstaged ;
@@ -337,7 +365,7 @@ public void UnstageSelected(Models.Change next)
337
365
338
366
public void UnstageAll ( )
339
367
{
340
- UnstageChanges ( _staged , null ) ;
368
+ UnstageChanges ( _visibleStaged , null ) ;
341
369
}
342
370
343
371
public void Discard ( List < Models . Change > changes )
@@ -350,6 +378,11 @@ public void ClearUnstagedFilter()
350
378
{
351
379
UnstagedFilter = string . Empty ;
352
380
}
381
+
382
+ public void ClearStagedFilter ( )
383
+ {
384
+ StagedFilter = string . Empty ;
385
+ }
353
386
354
387
public async void UseTheirs ( List < Models . Change > changes )
355
388
{
@@ -1472,16 +1505,16 @@ public ContextMenu CreateContextForOpenAI()
1472
1505
return menu ;
1473
1506
}
1474
1507
1475
- private List < Models . Change > GetVisibleUnstagedChanges ( List < Models . Change > unstaged )
1508
+ private List < Models . Change > GetVisibleChanges ( List < Models . Change > changes , string filter )
1476
1509
{
1477
- if ( string . IsNullOrEmpty ( _unstagedFilter ) )
1478
- return unstaged ;
1510
+ if ( string . IsNullOrEmpty ( filter ) )
1511
+ return changes ;
1479
1512
1480
1513
var visible = new List < Models . Change > ( ) ;
1481
1514
1482
- foreach ( var c in unstaged )
1515
+ foreach ( var c in changes )
1483
1516
{
1484
- if ( c . Path . Contains ( _unstagedFilter , StringComparison . OrdinalIgnoreCase ) )
1517
+ if ( c . Path . Contains ( filter , StringComparison . OrdinalIgnoreCase ) )
1485
1518
visible . Add ( c ) ;
1486
1519
}
1487
1520
@@ -1599,7 +1632,8 @@ private async void StageChanges(List<Models.Change> changes, Models.Change next)
1599
1632
1600
1633
private async void UnstageChanges ( List < Models . Change > changes , Models . Change next )
1601
1634
{
1602
- if ( changes . Count == 0 )
1635
+ var count = changes . Count ;
1636
+ if ( count == 0 )
1603
1637
return ;
1604
1638
1605
1639
// Use `_selectedStaged` instead of `SelectedStaged` to avoid UI refresh.
@@ -1611,16 +1645,15 @@ private async void UnstageChanges(List<Models.Change> changes, Models.Change nex
1611
1645
{
1612
1646
await Task . Run ( ( ) => new Commands . UnstageChangesForAmend ( _repo . FullPath , changes ) . Exec ( ) ) ;
1613
1647
}
1614
- else if ( changes . Count == _staged . Count )
1648
+ else if ( count == _staged . Count )
1615
1649
{
1616
1650
await Task . Run ( ( ) => new Commands . Reset ( _repo . FullPath ) . Exec ( ) ) ;
1617
1651
}
1618
1652
else
1619
1653
{
1620
- for ( int i = 0 ; i < changes . Count ; i += 10 )
1654
+ for ( int i = 0 ; i < count ; i += 10 )
1621
1655
{
1622
- var count = Math . Min ( 10 , changes . Count - i ) ;
1623
- var step = changes . GetRange ( i , count ) ;
1656
+ var step = changes . GetRange ( i , Math . Min ( 10 , count - i ) ) ;
1624
1657
await Task . Run ( ( ) => new Commands . Reset ( _repo . FullPath , step ) . Exec ( ) ) ;
1625
1658
}
1626
1659
}
@@ -1650,6 +1683,13 @@ private void DoCommit(bool autoStage, bool autoPush, bool allowEmpty)
1650
1683
return ;
1651
1684
}
1652
1685
1686
+ if ( ! string . IsNullOrEmpty ( _stagedFilter ) )
1687
+ {
1688
+ // FIXME - make this a proper warning message-box "Staged-area filter will not be applied to commit. Continue?" Yes/No
1689
+ App . RaiseException ( _repo . FullPath , "Committing with staged-area filter applied is NOT allowed!" ) ;
1690
+ return ;
1691
+ }
1692
+
1653
1693
if ( string . IsNullOrWhiteSpace ( _commitMessage ) )
1654
1694
{
1655
1695
App . RaiseException ( _repo . FullPath , "Commit without message is NOT allowed!" ) ;
@@ -1729,11 +1769,13 @@ private bool IsChanged(List<Models.Change> old, List<Models.Change> cur)
1729
1769
private List < Models . Change > _unstaged = [ ] ;
1730
1770
private List < Models . Change > _visibleUnstaged = [ ] ;
1731
1771
private List < Models . Change > _staged = [ ] ;
1772
+ private List < Models . Change > _visibleStaged = [ ] ;
1732
1773
private List < Models . Change > _selectedUnstaged = [ ] ;
1733
1774
private List < Models . Change > _selectedStaged = [ ] ;
1734
1775
private int _count = 0 ;
1735
1776
private object _detailContext = null ;
1736
1777
private string _unstagedFilter = string . Empty ;
1778
+ private string _stagedFilter = string . Empty ;
1737
1779
private string _commitMessage = string . Empty ;
1738
1780
1739
1781
private bool _hasUnsolvedConflicts = false ;
0 commit comments