feature: auto-select first change in commit details panel and revision/branch compare panel (#1019)

Signed-off-by: leo <longshuang@msn.cn>
This commit is contained in:
leo 2025-02-25 10:53:42 +08:00
parent 1f35e83799
commit c6747f72f9
No known key found for this signature in database
11 changed files with 71 additions and 21 deletions

View file

@ -36,7 +36,7 @@ namespace SourceGit.Models
{
if (startIdx > 0)
OnReceive(buffer.Substring(0, startIdx));
var endIdx = buffer.IndexOf(">", startIdx + 1, StringComparison.Ordinal);
if (endIdx <= startIdx)
{

View file

@ -25,8 +25,15 @@ namespace SourceGit.ViewModels
public int ActivePageIndex
{
get => _activePageIndex;
set => SetProperty(ref _activePageIndex, value);
get => _repo.CommitDetailActivePageIndex;
set
{
if (_repo.CommitDetailActivePageIndex != value)
{
_repo.CommitDetailActivePageIndex = value;
OnPropertyChanged();
}
}
}
public Models.Commit Commit
@ -617,11 +624,7 @@ namespace SourceGit.ViewModels
_changes = null;
_revisionFiles.Clear();
FullMessage = string.Empty;
SignInfo = null;
Changes = [];
VisibleChanges = null;
SelectedChanges = null;
ViewRevisionFileContent = null;
Children.Clear();
RevisionFileSearchFilter = string.Empty;
@ -821,7 +824,6 @@ namespace SourceGit.ViewModels
};
private Repository _repo = null;
private int _activePageIndex = 0;
private Models.Commit _commit = null;
private string _fullMessage = string.Empty;
private Models.CommitSignInfo _signInfo = null;

View file

@ -453,6 +453,12 @@ namespace SourceGit.ViewModels
private set => SetProperty(ref _isAutoFetching, value);
}
public int CommitDetailActivePageIndex
{
get;
set;
} = 0;
public Repository(bool isBare, string path, string gitDir)
{
IsBare = isBare;

View file

@ -1466,7 +1466,7 @@ namespace SourceGit.ViewModels
return unstaged;
var visible = new List<Models.Change>();
foreach (var c in unstaged)
{
if (c.Path.Contains(_unstagedFilter, StringComparison.OrdinalIgnoreCase))

View file

@ -134,6 +134,7 @@
<v:ChangeCollectionView ViewMode="{Binding Source={x:Static vm:Preferences.Instance}, Path=CommitChangeViewMode}"
Changes="{Binding VisibleChanges}"
SelectedChanges="{Binding SelectedChanges, Mode=TwoWay}"
AutoSelectFirstChange="True"
ContextRequested="OnChangeContextRequested"/>
</Border>
</Grid>

View file

@ -85,6 +85,15 @@ namespace SourceGit.Views
set => SetValue(ChangesProperty, value);
}
public static readonly StyledProperty<bool> AutoSelectFirstChangeProperty =
AvaloniaProperty.Register<ChangeCollectionView, bool>(nameof(AutoSelectFirstChange), false);
public bool AutoSelectFirstChange
{
get => GetValue(AutoSelectFirstChangeProperty);
set => SetValue(AutoSelectFirstChangeProperty, value);
}
public static readonly StyledProperty<List<Models.Change>> SelectedChangesProperty =
AvaloniaProperty.Register<ChangeCollectionView, List<Models.Change>>(nameof(SelectedChanges));
@ -205,9 +214,9 @@ namespace SourceGit.Views
base.OnPropertyChanged(change);
if (change.Property == ViewModeProperty)
UpdateDataSource(false);
else if (change.Property == ChangesProperty)
UpdateDataSource(true);
else if (change.Property == ChangesProperty)
UpdateDataSource(false);
else if (change.Property == SelectedChangesProperty)
UpdateSelection();
}
@ -292,9 +301,9 @@ namespace SourceGit.Views
}
}
private void UpdateDataSource(bool disableEvents)
private void UpdateDataSource(bool onlyViewModeChange)
{
_disableSelectionChangingEvent = disableEvents;
_disableSelectionChangingEvent = !onlyViewModeChange;
var changes = Changes;
if (changes == null || changes.Count == 0)
@ -324,7 +333,19 @@ namespace SourceGit.Views
MakeTreeRows(rows, tree.Tree);
tree.Rows.AddRange(rows);
if (selected.Count > 0)
if (!onlyViewModeChange && AutoSelectFirstChange)
{
foreach (var row in tree.Rows)
{
if (row.Change != null)
{
tree.SelectedRows.Add(row);
SetCurrentValue(SelectedChangesProperty, [row.Change]);
break;
}
}
}
else if (selected.Count > 0)
{
var sets = new HashSet<Models.Change>();
foreach (var c in selected)
@ -346,16 +367,34 @@ namespace SourceGit.Views
{
var grid = new ViewModels.ChangeCollectionAsGrid();
grid.Changes.AddRange(changes);
if (selected.Count > 0)
if (!onlyViewModeChange && AutoSelectFirstChange)
{
grid.SelectedChanges.Add(changes[0]);
SetCurrentValue(SelectedChangesProperty, [changes[0]]);
}
else if (selected.Count > 0)
{
grid.SelectedChanges.AddRange(selected);
}
Content = grid;
}
else
{
var list = new ViewModels.ChangeCollectionAsList();
list.Changes.AddRange(changes);
if (selected.Count > 0)
if (!onlyViewModeChange && AutoSelectFirstChange)
{
list.SelectedChanges.Add(changes[0]);
SetCurrentValue(SelectedChangesProperty, [changes[0]]);
}
else if (selected.Count > 0)
{
list.SelectedChanges.AddRange(selected);
}
Content = list;
}

View file

@ -49,6 +49,7 @@
ViewMode="{Binding Source={x:Static vm:Preferences.Instance}, Path=CommitChangeViewMode}"
Changes="{Binding VisibleChanges}"
SelectedChanges="{Binding SelectedChanges, Mode=TwoWay}"
AutoSelectFirstChange="True"
ContextRequested="OnChangeContextRequested"/>
</Border>
</Grid>

View file

@ -39,7 +39,7 @@ namespace SourceGit.Views
}
public static readonly RoutedEvent<LauncherTabSelectedEventArgs> PageSelectedEvent =
RoutedEvent.Register<ChangeCollectionView, LauncherTabSelectedEventArgs>(nameof(PageSelected), RoutingStrategies.Tunnel | RoutingStrategies.Bubble);
RoutedEvent.Register<LauncherTabsSelector, LauncherTabSelectedEventArgs>(nameof(PageSelected), RoutingStrategies.Tunnel | RoutingStrategies.Bubble);
public event EventHandler<LauncherTabSelectedEventArgs> PageSelected
{
@ -74,7 +74,7 @@ namespace SourceGit.Views
private void OnPageSelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (sender is ListBox { SelectedItem : ViewModels.LauncherPage page })
if (sender is ListBox { SelectedItem: ViewModels.LauncherPage page })
{
_isProcessingSelection = true;
RaiseEvent(new LauncherTabSelectedEventArgs(page));
@ -88,7 +88,7 @@ namespace SourceGit.Views
{
if (_isProcessingSelection)
return;
VisiblePages.Clear();
if (Pages == null)

View file

@ -522,7 +522,7 @@ namespace SourceGit.Views
private void OnRemoveSelectedHistoriesFilter(object sender, RoutedEventArgs e)
{
if (DataContext is ViewModels.Repository repo && sender is Button { DataContext: Models.Filter filter})
if (DataContext is ViewModels.Repository repo && sender is Button { DataContext: Models.Filter filter })
repo.RemoveHistoriesFilter(filter);
e.Handled = true;

View file

@ -99,6 +99,7 @@
<v:ChangeCollectionView ViewMode="{Binding Source={x:Static vm:Preferences.Instance}, Path=CommitChangeViewMode}"
Changes="{Binding VisibleChanges}"
SelectedChanges="{Binding SelectedChanges, Mode=TwoWay}"
AutoSelectFirstChange="True"
ContextRequested="OnChangeContextRequested"/>
</Border>
</Grid>

View file

@ -1006,7 +1006,7 @@ namespace SourceGit.Views
if (startPosition.Location > endPosition.Location)
(startPosition, endPosition) = (endPosition, startPosition);
var startIdx = Math.Min(startPosition.Line - 1, lines.Count - 1);
var endIdx = Math.Min(endPosition.Line - 1, lines.Count - 1);