mirror of
https://github.com/sourcegit-scm/sourcegit
synced 2025-05-20 19:55:00 +00:00
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:
parent
1f35e83799
commit
c6747f72f9
11 changed files with 71 additions and 21 deletions
|
@ -36,7 +36,7 @@ namespace SourceGit.Models
|
||||||
{
|
{
|
||||||
if (startIdx > 0)
|
if (startIdx > 0)
|
||||||
OnReceive(buffer.Substring(0, startIdx));
|
OnReceive(buffer.Substring(0, startIdx));
|
||||||
|
|
||||||
var endIdx = buffer.IndexOf(">", startIdx + 1, StringComparison.Ordinal);
|
var endIdx = buffer.IndexOf(">", startIdx + 1, StringComparison.Ordinal);
|
||||||
if (endIdx <= startIdx)
|
if (endIdx <= startIdx)
|
||||||
{
|
{
|
||||||
|
|
|
@ -25,8 +25,15 @@ namespace SourceGit.ViewModels
|
||||||
|
|
||||||
public int ActivePageIndex
|
public int ActivePageIndex
|
||||||
{
|
{
|
||||||
get => _activePageIndex;
|
get => _repo.CommitDetailActivePageIndex;
|
||||||
set => SetProperty(ref _activePageIndex, value);
|
set
|
||||||
|
{
|
||||||
|
if (_repo.CommitDetailActivePageIndex != value)
|
||||||
|
{
|
||||||
|
_repo.CommitDetailActivePageIndex = value;
|
||||||
|
OnPropertyChanged();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Models.Commit Commit
|
public Models.Commit Commit
|
||||||
|
@ -617,11 +624,7 @@ namespace SourceGit.ViewModels
|
||||||
_changes = null;
|
_changes = null;
|
||||||
_revisionFiles.Clear();
|
_revisionFiles.Clear();
|
||||||
|
|
||||||
FullMessage = string.Empty;
|
|
||||||
SignInfo = null;
|
SignInfo = null;
|
||||||
Changes = [];
|
|
||||||
VisibleChanges = null;
|
|
||||||
SelectedChanges = null;
|
|
||||||
ViewRevisionFileContent = null;
|
ViewRevisionFileContent = null;
|
||||||
Children.Clear();
|
Children.Clear();
|
||||||
RevisionFileSearchFilter = string.Empty;
|
RevisionFileSearchFilter = string.Empty;
|
||||||
|
@ -821,7 +824,6 @@ namespace SourceGit.ViewModels
|
||||||
};
|
};
|
||||||
|
|
||||||
private Repository _repo = null;
|
private Repository _repo = null;
|
||||||
private int _activePageIndex = 0;
|
|
||||||
private Models.Commit _commit = null;
|
private Models.Commit _commit = null;
|
||||||
private string _fullMessage = string.Empty;
|
private string _fullMessage = string.Empty;
|
||||||
private Models.CommitSignInfo _signInfo = null;
|
private Models.CommitSignInfo _signInfo = null;
|
||||||
|
|
|
@ -453,6 +453,12 @@ namespace SourceGit.ViewModels
|
||||||
private set => SetProperty(ref _isAutoFetching, value);
|
private set => SetProperty(ref _isAutoFetching, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int CommitDetailActivePageIndex
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
set;
|
||||||
|
} = 0;
|
||||||
|
|
||||||
public Repository(bool isBare, string path, string gitDir)
|
public Repository(bool isBare, string path, string gitDir)
|
||||||
{
|
{
|
||||||
IsBare = isBare;
|
IsBare = isBare;
|
||||||
|
|
|
@ -1466,7 +1466,7 @@ namespace SourceGit.ViewModels
|
||||||
return unstaged;
|
return unstaged;
|
||||||
|
|
||||||
var visible = new List<Models.Change>();
|
var visible = new List<Models.Change>();
|
||||||
|
|
||||||
foreach (var c in unstaged)
|
foreach (var c in unstaged)
|
||||||
{
|
{
|
||||||
if (c.Path.Contains(_unstagedFilter, StringComparison.OrdinalIgnoreCase))
|
if (c.Path.Contains(_unstagedFilter, StringComparison.OrdinalIgnoreCase))
|
||||||
|
|
|
@ -134,6 +134,7 @@
|
||||||
<v:ChangeCollectionView ViewMode="{Binding Source={x:Static vm:Preferences.Instance}, Path=CommitChangeViewMode}"
|
<v:ChangeCollectionView ViewMode="{Binding Source={x:Static vm:Preferences.Instance}, Path=CommitChangeViewMode}"
|
||||||
Changes="{Binding VisibleChanges}"
|
Changes="{Binding VisibleChanges}"
|
||||||
SelectedChanges="{Binding SelectedChanges, Mode=TwoWay}"
|
SelectedChanges="{Binding SelectedChanges, Mode=TwoWay}"
|
||||||
|
AutoSelectFirstChange="True"
|
||||||
ContextRequested="OnChangeContextRequested"/>
|
ContextRequested="OnChangeContextRequested"/>
|
||||||
</Border>
|
</Border>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
|
@ -85,6 +85,15 @@ namespace SourceGit.Views
|
||||||
set => SetValue(ChangesProperty, value);
|
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 =
|
public static readonly StyledProperty<List<Models.Change>> SelectedChangesProperty =
|
||||||
AvaloniaProperty.Register<ChangeCollectionView, List<Models.Change>>(nameof(SelectedChanges));
|
AvaloniaProperty.Register<ChangeCollectionView, List<Models.Change>>(nameof(SelectedChanges));
|
||||||
|
|
||||||
|
@ -205,9 +214,9 @@ namespace SourceGit.Views
|
||||||
base.OnPropertyChanged(change);
|
base.OnPropertyChanged(change);
|
||||||
|
|
||||||
if (change.Property == ViewModeProperty)
|
if (change.Property == ViewModeProperty)
|
||||||
UpdateDataSource(false);
|
|
||||||
else if (change.Property == ChangesProperty)
|
|
||||||
UpdateDataSource(true);
|
UpdateDataSource(true);
|
||||||
|
else if (change.Property == ChangesProperty)
|
||||||
|
UpdateDataSource(false);
|
||||||
else if (change.Property == SelectedChangesProperty)
|
else if (change.Property == SelectedChangesProperty)
|
||||||
UpdateSelection();
|
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;
|
var changes = Changes;
|
||||||
if (changes == null || changes.Count == 0)
|
if (changes == null || changes.Count == 0)
|
||||||
|
@ -324,7 +333,19 @@ namespace SourceGit.Views
|
||||||
MakeTreeRows(rows, tree.Tree);
|
MakeTreeRows(rows, tree.Tree);
|
||||||
tree.Rows.AddRange(rows);
|
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>();
|
var sets = new HashSet<Models.Change>();
|
||||||
foreach (var c in selected)
|
foreach (var c in selected)
|
||||||
|
@ -346,16 +367,34 @@ namespace SourceGit.Views
|
||||||
{
|
{
|
||||||
var grid = new ViewModels.ChangeCollectionAsGrid();
|
var grid = new ViewModels.ChangeCollectionAsGrid();
|
||||||
grid.Changes.AddRange(changes);
|
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);
|
grid.SelectedChanges.AddRange(selected);
|
||||||
|
}
|
||||||
|
|
||||||
Content = grid;
|
Content = grid;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var list = new ViewModels.ChangeCollectionAsList();
|
var list = new ViewModels.ChangeCollectionAsList();
|
||||||
list.Changes.AddRange(changes);
|
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);
|
list.SelectedChanges.AddRange(selected);
|
||||||
|
}
|
||||||
|
|
||||||
Content = list;
|
Content = list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -49,6 +49,7 @@
|
||||||
ViewMode="{Binding Source={x:Static vm:Preferences.Instance}, Path=CommitChangeViewMode}"
|
ViewMode="{Binding Source={x:Static vm:Preferences.Instance}, Path=CommitChangeViewMode}"
|
||||||
Changes="{Binding VisibleChanges}"
|
Changes="{Binding VisibleChanges}"
|
||||||
SelectedChanges="{Binding SelectedChanges, Mode=TwoWay}"
|
SelectedChanges="{Binding SelectedChanges, Mode=TwoWay}"
|
||||||
|
AutoSelectFirstChange="True"
|
||||||
ContextRequested="OnChangeContextRequested"/>
|
ContextRequested="OnChangeContextRequested"/>
|
||||||
</Border>
|
</Border>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
|
@ -39,7 +39,7 @@ namespace SourceGit.Views
|
||||||
}
|
}
|
||||||
|
|
||||||
public static readonly RoutedEvent<LauncherTabSelectedEventArgs> PageSelectedEvent =
|
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
|
public event EventHandler<LauncherTabSelectedEventArgs> PageSelected
|
||||||
{
|
{
|
||||||
|
@ -74,7 +74,7 @@ namespace SourceGit.Views
|
||||||
|
|
||||||
private void OnPageSelectionChanged(object sender, SelectionChangedEventArgs e)
|
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;
|
_isProcessingSelection = true;
|
||||||
RaiseEvent(new LauncherTabSelectedEventArgs(page));
|
RaiseEvent(new LauncherTabSelectedEventArgs(page));
|
||||||
|
@ -88,7 +88,7 @@ namespace SourceGit.Views
|
||||||
{
|
{
|
||||||
if (_isProcessingSelection)
|
if (_isProcessingSelection)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
VisiblePages.Clear();
|
VisiblePages.Clear();
|
||||||
|
|
||||||
if (Pages == null)
|
if (Pages == null)
|
||||||
|
|
|
@ -522,7 +522,7 @@ namespace SourceGit.Views
|
||||||
|
|
||||||
private void OnRemoveSelectedHistoriesFilter(object sender, RoutedEventArgs e)
|
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);
|
repo.RemoveHistoriesFilter(filter);
|
||||||
|
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
|
|
|
@ -99,6 +99,7 @@
|
||||||
<v:ChangeCollectionView ViewMode="{Binding Source={x:Static vm:Preferences.Instance}, Path=CommitChangeViewMode}"
|
<v:ChangeCollectionView ViewMode="{Binding Source={x:Static vm:Preferences.Instance}, Path=CommitChangeViewMode}"
|
||||||
Changes="{Binding VisibleChanges}"
|
Changes="{Binding VisibleChanges}"
|
||||||
SelectedChanges="{Binding SelectedChanges, Mode=TwoWay}"
|
SelectedChanges="{Binding SelectedChanges, Mode=TwoWay}"
|
||||||
|
AutoSelectFirstChange="True"
|
||||||
ContextRequested="OnChangeContextRequested"/>
|
ContextRequested="OnChangeContextRequested"/>
|
||||||
</Border>
|
</Border>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
|
@ -1006,7 +1006,7 @@ namespace SourceGit.Views
|
||||||
|
|
||||||
if (startPosition.Location > endPosition.Location)
|
if (startPosition.Location > endPosition.Location)
|
||||||
(startPosition, endPosition) = (endPosition, startPosition);
|
(startPosition, endPosition) = (endPosition, startPosition);
|
||||||
|
|
||||||
var startIdx = Math.Min(startPosition.Line - 1, lines.Count - 1);
|
var startIdx = Math.Min(startPosition.Line - 1, lines.Count - 1);
|
||||||
var endIdx = Math.Min(endPosition.Line - 1, lines.Count - 1);
|
var endIdx = Math.Min(endPosition.Line - 1, lines.Count - 1);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue