Skip to content

Commit c6747f7

Browse files
committed
feature: auto-select first change in commit details panel and revision/branch compare panel (#1019)
Signed-off-by: leo <[email protected]>
1 parent 1f35e83 commit c6747f7

11 files changed

+71
-21
lines changed

src/Models/OpenAI.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public void Append(string text)
3636
{
3737
if (startIdx > 0)
3838
OnReceive(buffer.Substring(0, startIdx));
39-
39+
4040
var endIdx = buffer.IndexOf(">", startIdx + 1, StringComparison.Ordinal);
4141
if (endIdx <= startIdx)
4242
{

src/ViewModels/CommitDetail.cs

+9-7
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,15 @@ public DiffContext DiffContext
2525

2626
public int ActivePageIndex
2727
{
28-
get => _activePageIndex;
29-
set => SetProperty(ref _activePageIndex, value);
28+
get => _repo.CommitDetailActivePageIndex;
29+
set
30+
{
31+
if (_repo.CommitDetailActivePageIndex != value)
32+
{
33+
_repo.CommitDetailActivePageIndex = value;
34+
OnPropertyChanged();
35+
}
36+
}
3037
}
3138

3239
public Models.Commit Commit
@@ -617,11 +624,7 @@ private void Refresh()
617624
_changes = null;
618625
_revisionFiles.Clear();
619626

620-
FullMessage = string.Empty;
621627
SignInfo = null;
622-
Changes = [];
623-
VisibleChanges = null;
624-
SelectedChanges = null;
625628
ViewRevisionFileContent = null;
626629
Children.Clear();
627630
RevisionFileSearchFilter = string.Empty;
@@ -821,7 +824,6 @@ private void UpdateRevisionFileSearchSuggestion()
821824
};
822825

823826
private Repository _repo = null;
824-
private int _activePageIndex = 0;
825827
private Models.Commit _commit = null;
826828
private string _fullMessage = string.Empty;
827829
private Models.CommitSignInfo _signInfo = null;

src/ViewModels/Repository.cs

+6
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,12 @@ public bool IsAutoFetching
453453
private set => SetProperty(ref _isAutoFetching, value);
454454
}
455455

456+
public int CommitDetailActivePageIndex
457+
{
458+
get;
459+
set;
460+
} = 0;
461+
456462
public Repository(bool isBare, string path, string gitDir)
457463
{
458464
IsBare = isBare;

src/ViewModels/WorkingCopy.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1466,7 +1466,7 @@ public ContextMenu CreateContextForOpenAI()
14661466
return unstaged;
14671467

14681468
var visible = new List<Models.Change>();
1469-
1469+
14701470
foreach (var c in unstaged)
14711471
{
14721472
if (c.Path.Contains(_unstagedFilter, StringComparison.OrdinalIgnoreCase))

src/Views/BranchCompare.axaml

+1
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@
134134
<v:ChangeCollectionView ViewMode="{Binding Source={x:Static vm:Preferences.Instance}, Path=CommitChangeViewMode}"
135135
Changes="{Binding VisibleChanges}"
136136
SelectedChanges="{Binding SelectedChanges, Mode=TwoWay}"
137+
AutoSelectFirstChange="True"
137138
ContextRequested="OnChangeContextRequested"/>
138139
</Border>
139140
</Grid>

src/Views/ChangeCollectionView.axaml.cs

+46-7
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,15 @@ public List<Models.Change> Changes
8585
set => SetValue(ChangesProperty, value);
8686
}
8787

88+
public static readonly StyledProperty<bool> AutoSelectFirstChangeProperty =
89+
AvaloniaProperty.Register<ChangeCollectionView, bool>(nameof(AutoSelectFirstChange), false);
90+
91+
public bool AutoSelectFirstChange
92+
{
93+
get => GetValue(AutoSelectFirstChangeProperty);
94+
set => SetValue(AutoSelectFirstChangeProperty, value);
95+
}
96+
8897
public static readonly StyledProperty<List<Models.Change>> SelectedChangesProperty =
8998
AvaloniaProperty.Register<ChangeCollectionView, List<Models.Change>>(nameof(SelectedChanges));
9099

@@ -205,9 +214,9 @@ protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs chang
205214
base.OnPropertyChanged(change);
206215

207216
if (change.Property == ViewModeProperty)
208-
UpdateDataSource(false);
209-
else if (change.Property == ChangesProperty)
210217
UpdateDataSource(true);
218+
else if (change.Property == ChangesProperty)
219+
UpdateDataSource(false);
211220
else if (change.Property == SelectedChangesProperty)
212221
UpdateSelection();
213222
}
@@ -292,9 +301,9 @@ private void MakeTreeRows(List<ViewModels.ChangeTreeNode> rows, List<ViewModels.
292301
}
293302
}
294303

295-
private void UpdateDataSource(bool disableEvents)
304+
private void UpdateDataSource(bool onlyViewModeChange)
296305
{
297-
_disableSelectionChangingEvent = disableEvents;
306+
_disableSelectionChangingEvent = !onlyViewModeChange;
298307

299308
var changes = Changes;
300309
if (changes == null || changes.Count == 0)
@@ -324,7 +333,19 @@ private void UpdateDataSource(bool disableEvents)
324333
MakeTreeRows(rows, tree.Tree);
325334
tree.Rows.AddRange(rows);
326335

327-
if (selected.Count > 0)
336+
if (!onlyViewModeChange && AutoSelectFirstChange)
337+
{
338+
foreach (var row in tree.Rows)
339+
{
340+
if (row.Change != null)
341+
{
342+
tree.SelectedRows.Add(row);
343+
SetCurrentValue(SelectedChangesProperty, [row.Change]);
344+
break;
345+
}
346+
}
347+
}
348+
else if (selected.Count > 0)
328349
{
329350
var sets = new HashSet<Models.Change>();
330351
foreach (var c in selected)
@@ -346,16 +367,34 @@ private void UpdateDataSource(bool disableEvents)
346367
{
347368
var grid = new ViewModels.ChangeCollectionAsGrid();
348369
grid.Changes.AddRange(changes);
349-
if (selected.Count > 0)
370+
371+
if (!onlyViewModeChange && AutoSelectFirstChange)
372+
{
373+
grid.SelectedChanges.Add(changes[0]);
374+
SetCurrentValue(SelectedChangesProperty, [changes[0]]);
375+
}
376+
else if (selected.Count > 0)
377+
{
350378
grid.SelectedChanges.AddRange(selected);
379+
}
380+
351381
Content = grid;
352382
}
353383
else
354384
{
355385
var list = new ViewModels.ChangeCollectionAsList();
356386
list.Changes.AddRange(changes);
357-
if (selected.Count > 0)
387+
388+
if (!onlyViewModeChange && AutoSelectFirstChange)
389+
{
390+
list.SelectedChanges.Add(changes[0]);
391+
SetCurrentValue(SelectedChangesProperty, [changes[0]]);
392+
}
393+
else if (selected.Count > 0)
394+
{
358395
list.SelectedChanges.AddRange(selected);
396+
}
397+
359398
Content = list;
360399
}
361400

src/Views/CommitChanges.axaml

+1
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
ViewMode="{Binding Source={x:Static vm:Preferences.Instance}, Path=CommitChangeViewMode}"
5050
Changes="{Binding VisibleChanges}"
5151
SelectedChanges="{Binding SelectedChanges, Mode=TwoWay}"
52+
AutoSelectFirstChange="True"
5253
ContextRequested="OnChangeContextRequested"/>
5354
</Border>
5455
</Grid>

src/Views/LauncherTabsSelector.axaml.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public string SearchFilter
3939
}
4040

4141
public static readonly RoutedEvent<LauncherTabSelectedEventArgs> PageSelectedEvent =
42-
RoutedEvent.Register<ChangeCollectionView, LauncherTabSelectedEventArgs>(nameof(PageSelected), RoutingStrategies.Tunnel | RoutingStrategies.Bubble);
42+
RoutedEvent.Register<LauncherTabsSelector, LauncherTabSelectedEventArgs>(nameof(PageSelected), RoutingStrategies.Tunnel | RoutingStrategies.Bubble);
4343

4444
public event EventHandler<LauncherTabSelectedEventArgs> PageSelected
4545
{
@@ -74,7 +74,7 @@ private void OnClearSearchFilter(object sender, RoutedEventArgs e)
7474

7575
private void OnPageSelectionChanged(object sender, SelectionChangedEventArgs e)
7676
{
77-
if (sender is ListBox { SelectedItem : ViewModels.LauncherPage page })
77+
if (sender is ListBox { SelectedItem: ViewModels.LauncherPage page })
7878
{
7979
_isProcessingSelection = true;
8080
RaiseEvent(new LauncherTabSelectedEventArgs(page));
@@ -88,7 +88,7 @@ private void UpdateVisiblePages()
8888
{
8989
if (_isProcessingSelection)
9090
return;
91-
91+
9292
VisiblePages.Clear();
9393

9494
if (Pages == null)

src/Views/Repository.axaml.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,7 @@ private void OnSkipInProgress(object sender, RoutedEventArgs e)
522522

523523
private void OnRemoveSelectedHistoriesFilter(object sender, RoutedEventArgs e)
524524
{
525-
if (DataContext is ViewModels.Repository repo && sender is Button { DataContext: Models.Filter filter})
525+
if (DataContext is ViewModels.Repository repo && sender is Button { DataContext: Models.Filter filter })
526526
repo.RemoveHistoriesFilter(filter);
527527

528528
e.Handled = true;

src/Views/RevisionCompare.axaml

+1
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@
9999
<v:ChangeCollectionView ViewMode="{Binding Source={x:Static vm:Preferences.Instance}, Path=CommitChangeViewMode}"
100100
Changes="{Binding VisibleChanges}"
101101
SelectedChanges="{Binding SelectedChanges, Mode=TwoWay}"
102+
AutoSelectFirstChange="True"
102103
ContextRequested="OnChangeContextRequested"/>
103104
</Border>
104105
</Grid>

src/Views/TextDiffView.axaml.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1006,7 +1006,7 @@ private void CopyWithoutIndicators()
10061006

10071007
if (startPosition.Location > endPosition.Location)
10081008
(startPosition, endPosition) = (endPosition, startPosition);
1009-
1009+
10101010
var startIdx = Math.Min(startPosition.Line - 1, lines.Count - 1);
10111011
var endIdx = Math.Min(endPosition.Line - 1, lines.Count - 1);
10121012

0 commit comments

Comments
 (0)