enhance: only trigger UpdateSelectedChunk if needed

This commit is contained in:
leo 2024-07-19 11:01:31 +08:00
parent 5b95344453
commit 91801cff69
No known key found for this signature in database
3 changed files with 26 additions and 15 deletions

View file

@ -20,17 +20,10 @@ namespace SourceGit.ViewModels
set => SetProperty(ref _syncScrollOffset, value); set => SetProperty(ref _syncScrollOffset, value);
} }
public Models.DiffOption Option
{
get;
set;
}
public TwoSideTextDiff(Models.TextDiff diff, TwoSideTextDiff previous = null) public TwoSideTextDiff(Models.TextDiff diff, TwoSideTextDiff previous = null)
{ {
File = diff.File; File = diff.File;
MaxLineNumber = diff.MaxLineNumber; MaxLineNumber = diff.MaxLineNumber;
Option = diff.Option;
foreach (var line in diff.Lines) foreach (var line in diff.Lines)
{ {

View file

@ -26,6 +26,7 @@
UseSyntaxHighlighting="{Binding Source={x:Static vm:Preference.Instance}, Path=UseSyntaxHighlighting}" UseSyntaxHighlighting="{Binding Source={x:Static vm:Preference.Instance}, Path=UseSyntaxHighlighting}"
WordWrap="{Binding Source={x:Static vm:Preference.Instance}, Path=EnableDiffViewWordWrap}" WordWrap="{Binding Source={x:Static vm:Preference.Instance}, Path=EnableDiffViewWordWrap}"
ShowHiddenSymbols="{Binding Source={x:Static vm:Preference.Instance}, Path=ShowHiddenSymbolsInDiffView}" ShowHiddenSymbols="{Binding Source={x:Static vm:Preference.Instance}, Path=ShowHiddenSymbolsInDiffView}"
EnableChunkSelection="{Binding #ThisControl.EnableChunkSelection}"
SelectedChunk="{Binding #ThisControl.SelectedChunk, Mode=TwoWay}"/> SelectedChunk="{Binding #ThisControl.SelectedChunk, Mode=TwoWay}"/>
</DataTemplate> </DataTemplate>
@ -46,6 +47,7 @@
UseSyntaxHighlighting="{Binding Source={x:Static vm:Preference.Instance}, Path=UseSyntaxHighlighting}" UseSyntaxHighlighting="{Binding Source={x:Static vm:Preference.Instance}, Path=UseSyntaxHighlighting}"
WordWrap="{Binding Source={x:Static vm:Preference.Instance}, Path=EnableDiffViewWordWrap}" WordWrap="{Binding Source={x:Static vm:Preference.Instance}, Path=EnableDiffViewWordWrap}"
ShowHiddenSymbols="{Binding Source={x:Static vm:Preference.Instance}, Path=ShowHiddenSymbolsInDiffView}" ShowHiddenSymbols="{Binding Source={x:Static vm:Preference.Instance}, Path=ShowHiddenSymbolsInDiffView}"
EnableChunkSelection="{Binding #ThisControl.EnableChunkSelection}"
SelectedChunk="{Binding #ThisControl.SelectedChunk, Mode=TwoWay}"/> SelectedChunk="{Binding #ThisControl.SelectedChunk, Mode=TwoWay}"/>
<Rectangle Grid.Column="1" Fill="{DynamicResource Brush.Border2}" Width="1" HorizontalAlignment="Center" VerticalAlignment="Stretch"/> <Rectangle Grid.Column="1" Fill="{DynamicResource Brush.Border2}" Width="1" HorizontalAlignment="Center" VerticalAlignment="Stretch"/>
@ -65,6 +67,7 @@
UseSyntaxHighlighting="{Binding Source={x:Static vm:Preference.Instance}, Path=UseSyntaxHighlighting}" UseSyntaxHighlighting="{Binding Source={x:Static vm:Preference.Instance}, Path=UseSyntaxHighlighting}"
WordWrap="{Binding Source={x:Static vm:Preference.Instance}, Path=EnableDiffViewWordWrap}" WordWrap="{Binding Source={x:Static vm:Preference.Instance}, Path=EnableDiffViewWordWrap}"
ShowHiddenSymbols="{Binding Source={x:Static vm:Preference.Instance}, Path=ShowHiddenSymbolsInDiffView}" ShowHiddenSymbols="{Binding Source={x:Static vm:Preference.Instance}, Path=ShowHiddenSymbolsInDiffView}"
EnableChunkSelection="{Binding #ThisControl.EnableChunkSelection}"
SelectedChunk="{Binding #ThisControl.SelectedChunk, Mode=TwoWay}"/> SelectedChunk="{Binding #ThisControl.SelectedChunk, Mode=TwoWay}"/>
</Grid> </Grid>
</DataTemplate> </DataTemplate>

View file

@ -336,6 +336,15 @@ namespace SourceGit.Views
set => SetValue(ShowHiddenSymbolsProperty, value); set => SetValue(ShowHiddenSymbolsProperty, value);
} }
public static readonly StyledProperty<bool> EnableChunkSelectionProperty =
AvaloniaProperty.Register<ThemedTextDiffPresenter, bool>(nameof(EnableChunkSelection));
public bool EnableChunkSelection
{
get => GetValue(EnableChunkSelectionProperty);
set => SetValue(EnableChunkSelectionProperty, value);
}
public static readonly StyledProperty<TextDiffViewChunk> SelectedChunkProperty = public static readonly StyledProperty<TextDiffViewChunk> SelectedChunkProperty =
AvaloniaProperty.Register<ThemedTextDiffPresenter, TextDiffViewChunk>(nameof(SelectedChunk)); AvaloniaProperty.Register<ThemedTextDiffPresenter, TextDiffViewChunk>(nameof(SelectedChunk));
@ -479,13 +488,13 @@ namespace SourceGit.Views
private void OnTextViewPointerMoved(object sender, PointerEventArgs e) private void OnTextViewPointerMoved(object sender, PointerEventArgs e)
{ {
if (sender is TextView view) if (EnableChunkSelection && sender is TextView view)
UpdateSelectedChunk(e.GetPosition(view).Y + view.VerticalOffset); UpdateSelectedChunk(e.GetPosition(view).Y + view.VerticalOffset);
} }
private void OnTextViewPointerWheelChanged(object sender, PointerWheelEventArgs e) private void OnTextViewPointerWheelChanged(object sender, PointerWheelEventArgs e)
{ {
if (sender is TextView view) if (EnableChunkSelection && sender is TextView view)
{ {
var y = e.GetPosition(view).Y + view.VerticalOffset; var y = e.GetPosition(view).Y + view.VerticalOffset;
Dispatcher.UIThread.Post(() => UpdateSelectedChunk(y)); Dispatcher.UIThread.Post(() => UpdateSelectedChunk(y));
@ -636,7 +645,7 @@ namespace SourceGit.Views
public override void UpdateSelectedChunk(double y) public override void UpdateSelectedChunk(double y)
{ {
var diff = DataContext as Models.TextDiff; var diff = DataContext as Models.TextDiff;
if (diff == null || diff.Option.WorkingCopyChange == null) if (diff == null)
return; return;
var view = TextArea.TextView; var view = TextArea.TextView;
@ -796,7 +805,7 @@ namespace SourceGit.Views
public override void UpdateSelectedChunk(double y) public override void UpdateSelectedChunk(double y)
{ {
var diff = DataContext as ViewModels.TwoSideTextDiff; var diff = DataContext as ViewModels.TwoSideTextDiff;
if (diff == null || diff.Option.WorkingCopyChange == null) if (diff == null)
return; return;
var parent = this.FindAncestorOfType<TextDiffView>(); var parent = this.FindAncestorOfType<TextDiffView>();
@ -1012,6 +1021,15 @@ namespace SourceGit.Views
set => SetValue(IsUnstagedChangeProperty, value); set => SetValue(IsUnstagedChangeProperty, value);
} }
public static readonly StyledProperty<bool> EnableChunkSelectionProperty =
AvaloniaProperty.Register<TextDiffView, bool>(nameof(EnableChunkSelection));
public bool EnableChunkSelection
{
get => GetValue(EnableChunkSelectionProperty);
set => SetValue(EnableChunkSelectionProperty, value);
}
static TextDiffView() static TextDiffView()
{ {
UseSideBySideDiffProperty.Changed.AddClassHandler<TextDiffView>((v, _) => UseSideBySideDiffProperty.Changed.AddClassHandler<TextDiffView>((v, _) =>
@ -1069,6 +1087,7 @@ namespace SourceGit.Views
Editor.Content = diff; Editor.Content = diff;
IsUnstagedChange = diff.Option.IsUnstaged; IsUnstagedChange = diff.Option.IsUnstaged;
EnableChunkSelection = diff.Option.WorkingCopyChange != null;
} }
protected override void OnPointerExited(PointerEventArgs e) protected override void OnPointerExited(PointerEventArgs e)
@ -1160,8 +1179,6 @@ namespace SourceGit.Views
if (!selection.HasChanges) if (!selection.HasChanges)
return; return;
// If all changes has been selected the use method provided by ViewModels.WorkingCopy.
// Otherwise, use `git apply`
if (!selection.HasLeftChanges) if (!selection.HasLeftChanges)
{ {
var workcopyView = this.FindAncestorOfType<WorkingCopy>(); var workcopyView = this.FindAncestorOfType<WorkingCopy>();
@ -1218,8 +1235,6 @@ namespace SourceGit.Views
if (!selection.HasChanges) if (!selection.HasChanges)
return; return;
// If all changes has been selected the use method provided by ViewModels.WorkingCopy.
// Otherwise, use `git apply`
if (!selection.HasLeftChanges) if (!selection.HasLeftChanges)
{ {
var workcopyView = this.FindAncestorOfType<WorkingCopy>(); var workcopyView = this.FindAncestorOfType<WorkingCopy>();