diff --git a/src/Models/OpenAI.cs b/src/Models/OpenAI.cs index 264230c6..76daacd0 100644 --- a/src/Models/OpenAI.cs +++ b/src/Models/OpenAI.cs @@ -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) { diff --git a/src/ViewModels/CommitDetail.cs b/src/ViewModels/CommitDetail.cs index d90e97d6..702a757c 100644 --- a/src/ViewModels/CommitDetail.cs +++ b/src/ViewModels/CommitDetail.cs @@ -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; diff --git a/src/ViewModels/Repository.cs b/src/ViewModels/Repository.cs index 6e8a5290..104ff60b 100644 --- a/src/ViewModels/Repository.cs +++ b/src/ViewModels/Repository.cs @@ -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; diff --git a/src/ViewModels/WorkingCopy.cs b/src/ViewModels/WorkingCopy.cs index ce2a2ac1..afaf5868 100644 --- a/src/ViewModels/WorkingCopy.cs +++ b/src/ViewModels/WorkingCopy.cs @@ -1466,7 +1466,7 @@ namespace SourceGit.ViewModels return unstaged; var visible = new List(); - + foreach (var c in unstaged) { if (c.Path.Contains(_unstagedFilter, StringComparison.OrdinalIgnoreCase)) diff --git a/src/Views/BranchCompare.axaml b/src/Views/BranchCompare.axaml index 04b77306..f73860c5 100644 --- a/src/Views/BranchCompare.axaml +++ b/src/Views/BranchCompare.axaml @@ -134,6 +134,7 @@ diff --git a/src/Views/ChangeCollectionView.axaml.cs b/src/Views/ChangeCollectionView.axaml.cs index d6982dda..6ef79861 100644 --- a/src/Views/ChangeCollectionView.axaml.cs +++ b/src/Views/ChangeCollectionView.axaml.cs @@ -85,6 +85,15 @@ namespace SourceGit.Views set => SetValue(ChangesProperty, value); } + public static readonly StyledProperty AutoSelectFirstChangeProperty = + AvaloniaProperty.Register(nameof(AutoSelectFirstChange), false); + + public bool AutoSelectFirstChange + { + get => GetValue(AutoSelectFirstChangeProperty); + set => SetValue(AutoSelectFirstChangeProperty, value); + } + public static readonly StyledProperty> SelectedChangesProperty = AvaloniaProperty.Register>(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(); 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; } diff --git a/src/Views/CommitChanges.axaml b/src/Views/CommitChanges.axaml index 377be944..2fac9365 100644 --- a/src/Views/CommitChanges.axaml +++ b/src/Views/CommitChanges.axaml @@ -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"/> diff --git a/src/Views/LauncherTabsSelector.axaml.cs b/src/Views/LauncherTabsSelector.axaml.cs index 01c5fa0d..61d7a966 100644 --- a/src/Views/LauncherTabsSelector.axaml.cs +++ b/src/Views/LauncherTabsSelector.axaml.cs @@ -39,7 +39,7 @@ namespace SourceGit.Views } public static readonly RoutedEvent PageSelectedEvent = - RoutedEvent.Register(nameof(PageSelected), RoutingStrategies.Tunnel | RoutingStrategies.Bubble); + RoutedEvent.Register(nameof(PageSelected), RoutingStrategies.Tunnel | RoutingStrategies.Bubble); public event EventHandler 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) diff --git a/src/Views/Repository.axaml.cs b/src/Views/Repository.axaml.cs index 53bb2d53..2b3b7c30 100644 --- a/src/Views/Repository.axaml.cs +++ b/src/Views/Repository.axaml.cs @@ -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; diff --git a/src/Views/RevisionCompare.axaml b/src/Views/RevisionCompare.axaml index 46b667ac..73703ff1 100644 --- a/src/Views/RevisionCompare.axaml +++ b/src/Views/RevisionCompare.axaml @@ -99,6 +99,7 @@ diff --git a/src/Views/TextDiffView.axaml.cs b/src/Views/TextDiffView.axaml.cs index 323fde03..dccbb9b2 100644 --- a/src/Views/TextDiffView.axaml.cs +++ b/src/Views/TextDiffView.axaml.cs @@ -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);