mirror of
https://github.com/sourcegit-scm/sourcegit.git
synced 2024-12-23 20:47:25 -08:00
feature: double-click on single-selecte change tree or file tree will expand/collapse folder node
This commit is contained in:
parent
cce4e5348c
commit
9d13b17aaf
8 changed files with 70 additions and 12 deletions
|
@ -171,22 +171,27 @@ namespace SourceGit.Models
|
||||||
if (!IsSelected(modelIndex))
|
if (!IsSelected(modelIndex))
|
||||||
{
|
{
|
||||||
PointerSelect(sender, row, e);
|
PointerSelect(sender, row, e);
|
||||||
|
_pressedPoint = s_InvalidPoint;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var point = e.GetCurrentPoint(sender);
|
var point = e.GetCurrentPoint(sender);
|
||||||
if (point.Properties.IsRightButtonPressed)
|
if (point.Properties.IsRightButtonPressed)
|
||||||
|
{
|
||||||
|
_pressedPoint = s_InvalidPoint;
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (e.KeyModifiers == KeyModifiers.Control)
|
if (e.KeyModifiers == KeyModifiers.Control)
|
||||||
{
|
{
|
||||||
Deselect(modelIndex);
|
Deselect(modelIndex);
|
||||||
}
|
}
|
||||||
else if (e.ClickCount == 2)
|
else if (e.ClickCount % 2 == 0)
|
||||||
{
|
{
|
||||||
_rowDoubleTapped?.Invoke(this, e);
|
_rowDoubleTapped?.Invoke(this, e);
|
||||||
|
e.Handled = true;
|
||||||
}
|
}
|
||||||
else
|
else if (sender.RowSelection.Count > 1)
|
||||||
{
|
{
|
||||||
using (BatchUpdate())
|
using (BatchUpdate())
|
||||||
{
|
{
|
||||||
|
@ -194,9 +199,9 @@ namespace SourceGit.Models
|
||||||
Select(modelIndex);
|
Select(modelIndex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_pressedPoint = s_InvalidPoint;
|
||||||
}
|
}
|
||||||
|
|
||||||
_pressedPoint = s_InvalidPoint;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<OutputType>WinExe</OutputType>
|
<OutputType>Exe</OutputType>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<BuiltInComInteropSupport>true</BuiltInComInteropSupport>
|
<BuiltInComInteropSupport>true</BuiltInComInteropSupport>
|
||||||
<ApplicationManifest>App.manifest</ApplicationManifest>
|
<ApplicationManifest>App.manifest</ApplicationManifest>
|
||||||
|
|
|
@ -511,14 +511,22 @@ namespace SourceGit.ViewModels
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
source.Selection = new Models.TreeDataGridSelectionModel<FileTreeNode>(source, x => x.Children);
|
var selection = new Models.TreeDataGridSelectionModel<FileTreeNode>(source, x => x.Children);
|
||||||
source.RowSelection.SingleSelect = true;
|
selection.SingleSelect = true;
|
||||||
source.RowSelection.SelectionChanged += (s, _) =>
|
selection.RowDoubleTapped += (s, e) =>
|
||||||
|
{
|
||||||
|
var model = s as Models.TreeDataGridSelectionModel<FileTreeNode>;
|
||||||
|
var node = model.SelectedItem;
|
||||||
|
if (node != null && node.IsFolder)
|
||||||
|
node.IsExpanded = !node.IsExpanded;
|
||||||
|
};
|
||||||
|
selection.SelectionChanged += (s, _) =>
|
||||||
{
|
{
|
||||||
if (s is Models.TreeDataGridSelectionModel<FileTreeNode> selection)
|
if (s is Models.TreeDataGridSelectionModel<FileTreeNode> selection)
|
||||||
RefreshViewRevisionFile(selection.SelectedItem?.Backend as Models.Object);
|
RefreshViewRevisionFile(selection.SelectedItem?.Backend as Models.Object);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
source.Selection = selection;
|
||||||
RevisionFiles = source;
|
RevisionFiles = source;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,7 +50,14 @@
|
||||||
ViewMode="{Binding Source={x:Static vm:Preference.Instance}, Path=CommitChangeViewMode}"
|
ViewMode="{Binding Source={x:Static vm:Preference.Instance}, Path=CommitChangeViewMode}"
|
||||||
Changes="{Binding VisibleChanges}"
|
Changes="{Binding VisibleChanges}"
|
||||||
SelectedChanges="{Binding SelectedChanges, Mode=TwoWay}"
|
SelectedChanges="{Binding SelectedChanges, Mode=TwoWay}"
|
||||||
ContextRequested="OnChangeContextRequested"/>
|
ContextRequested="OnChangeContextRequested"
|
||||||
|
ChangeDoubleTapped="OnChangeDoubleTapped">
|
||||||
|
<v:ChangeCollectionView.Styles>
|
||||||
|
<Style Selector="TreeDataGridExpanderCell" x:DataType="vm:FileTreeNode">
|
||||||
|
<Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/>
|
||||||
|
</Style>
|
||||||
|
</v:ChangeCollectionView.Styles>
|
||||||
|
</v:ChangeCollectionView>
|
||||||
</Border>
|
</Border>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
using Avalonia;
|
|
||||||
using Avalonia.Controls;
|
using Avalonia.Controls;
|
||||||
|
using Avalonia.Interactivity;
|
||||||
|
|
||||||
namespace SourceGit.Views
|
namespace SourceGit.Views
|
||||||
{
|
{
|
||||||
|
@ -19,7 +19,19 @@ namespace SourceGit.Views
|
||||||
{
|
{
|
||||||
var menu = vm.CreateChangeContextMenu(selected[0]);
|
var menu = vm.CreateChangeContextMenu(selected[0]);
|
||||||
(sender as Control)?.OpenContextMenu(menu);
|
(sender as Control)?.OpenContextMenu(menu);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
e.Handled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnChangeDoubleTapped(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
if (sender is ChangeCollectionView view)
|
||||||
|
{
|
||||||
|
var selected = view.tree?.RowSelection?.SelectedItem as ViewModels.FileTreeNode;
|
||||||
|
if (selected != null && selected.IsFolder)
|
||||||
|
selected.IsExpanded = !selected.IsExpanded;
|
||||||
}
|
}
|
||||||
|
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
|
|
|
@ -105,7 +105,14 @@
|
||||||
ViewMode="{Binding Source={x:Static vm:Preference.Instance}, Path=CommitChangeViewMode}"
|
ViewMode="{Binding Source={x:Static vm:Preference.Instance}, Path=CommitChangeViewMode}"
|
||||||
Changes="{Binding VisibleChanges}"
|
Changes="{Binding VisibleChanges}"
|
||||||
SelectedChanges="{Binding SelectedChanges, Mode=TwoWay}"
|
SelectedChanges="{Binding SelectedChanges, Mode=TwoWay}"
|
||||||
ContextRequested="OnChangeContextRequested"/>
|
ContextRequested="OnChangeContextRequested"
|
||||||
|
ChangeDoubleTapped="OnChangeDoubleTapped">
|
||||||
|
<v:ChangeCollectionView.Styles>
|
||||||
|
<Style Selector="TreeDataGridExpanderCell" x:DataType="vm:FileTreeNode">
|
||||||
|
<Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/>
|
||||||
|
</Style>
|
||||||
|
</v:ChangeCollectionView.Styles>
|
||||||
|
</v:ChangeCollectionView>
|
||||||
</Border>
|
</Border>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
using Avalonia.Controls;
|
using Avalonia.Controls;
|
||||||
using Avalonia.Input;
|
using Avalonia.Input;
|
||||||
|
using Avalonia.Interactivity;
|
||||||
|
|
||||||
namespace SourceGit.Views
|
namespace SourceGit.Views
|
||||||
{
|
{
|
||||||
|
@ -21,6 +22,18 @@ namespace SourceGit.Views
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnChangeDoubleTapped(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
if (sender is ChangeCollectionView view)
|
||||||
|
{
|
||||||
|
var selected = view.tree?.RowSelection?.SelectedItem as ViewModels.FileTreeNode;
|
||||||
|
if (selected != null && selected.IsFolder)
|
||||||
|
selected.IsExpanded = !selected.IsExpanded;
|
||||||
|
}
|
||||||
|
|
||||||
|
e.Handled = true;
|
||||||
|
}
|
||||||
|
|
||||||
private void OnPressedSHA(object sender, PointerPressedEventArgs e)
|
private void OnPressedSHA(object sender, PointerPressedEventArgs e)
|
||||||
{
|
{
|
||||||
if (DataContext is ViewModels.RevisionCompare vm && sender is TextBlock block)
|
if (DataContext is ViewModels.RevisionCompare vm && sender is TextBlock block)
|
||||||
|
|
|
@ -56,6 +56,12 @@
|
||||||
</Grid>
|
</Grid>
|
||||||
</DataTemplate>
|
</DataTemplate>
|
||||||
</TreeDataGrid.Resources>
|
</TreeDataGrid.Resources>
|
||||||
|
|
||||||
|
<TreeDataGrid.Styles>
|
||||||
|
<Style Selector="TreeDataGridExpanderCell" x:DataType="vm:FileTreeNode">
|
||||||
|
<Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/>
|
||||||
|
</Style>
|
||||||
|
</TreeDataGrid.Styles>
|
||||||
</TreeDataGrid>
|
</TreeDataGrid>
|
||||||
</Border>
|
</Border>
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|
Loading…
Reference in a new issue