feature: new way to expand/collapse folder node in TreeDataGrid

This commit is contained in:
leo 2024-05-30 09:53:07 +08:00
parent f4d379e3b8
commit 55c9fae110
10 changed files with 58 additions and 73 deletions

View file

@ -16,7 +16,7 @@
CanUserSortColumns="False"
ScrollViewer.BringIntoViewOnFocusChange="True">
<TreeDataGrid.Resources>
<DataTemplate x:Key="TreeModeTemplate" DataType="vm:FileTreeNode">
<DataTemplate x:Key="TreeModeTemplate" DataType="m:FileTreeNode">
<Grid HorizontalAlignment="Stretch" Height="24" ColumnDefinitions="Auto,*">
<Path Grid.Column="0" Classes="folder_icon" Width="14" Height="14" Margin="0,2,0,0" IsVisible="{Binding IsFolder}" Fill="Goldenrod" VerticalAlignment="Center"/>
<v:ChangeStatusIcon Grid.Column="0" Width="14" Height="14" IsWorkingCopyChange="{Binding #me.IsWorkingCopyChange}" Change="{Binding Backend}" IsVisible="{Binding !IsFolder}"/>

View file

@ -91,29 +91,25 @@ namespace SourceGit.Views
var viewMode = ViewMode;
if (viewMode == Models.ChangeViewMode.Tree)
{
var filetree = ViewModels.FileTreeNode.Build(changes, true);
var source = new HierarchicalTreeDataGridSource<ViewModels.FileTreeNode>(filetree)
var filetree = Models.FileTreeNode.Build(changes, true);
var source = new HierarchicalTreeDataGridSource<Models.FileTreeNode>(filetree)
{
Columns =
{
new HierarchicalExpanderColumn<ViewModels.FileTreeNode>(
new TemplateColumn<ViewModels.FileTreeNode>(null, "TreeModeTemplate", null, GridLength.Auto),
new HierarchicalExpanderColumn<Models.FileTreeNode>(
new TemplateColumn<Models.FileTreeNode>(null, "TreeModeTemplate", null, GridLength.Auto),
x => x.Children,
x => x.Children.Count > 0,
x => x.IsExpanded),
new TextColumn<ViewModels.FileTreeNode, string>(
null,
x => string.Empty,
GridLength.Star)
x => x.IsExpanded)
}
};
var selection = new Models.TreeDataGridSelectionModel<ViewModels.FileTreeNode>(source, x => x.Children);
var selection = new Models.TreeDataGridSelectionModel<Models.FileTreeNode>(source, x => x.Children);
selection.SingleSelect = SingleSelect;
selection.RowDoubleTapped += (_, e) => RaiseEvent(new RoutedEventArgs(ChangeDoubleTappedEvent));
selection.SelectionChanged += (s, _) =>
{
if (!_isSelecting && s is Models.TreeDataGridSelectionModel<ViewModels.FileTreeNode> model)
if (!_isSelecting && s is Models.TreeDataGridSelectionModel<Models.FileTreeNode> model)
{
var selection = new List<Models.Change>();
foreach (var c in model.SelectedItems)
@ -202,7 +198,7 @@ namespace SourceGit.Views
else
changeSelection.Select(selected);
}
else if (tree.Source.Selection is Models.TreeDataGridSelectionModel<ViewModels.FileTreeNode> treeSelection)
else if (tree.Source.Selection is Models.TreeDataGridSelectionModel<Models.FileTreeNode> treeSelection)
{
if (selected == null || selected.Count == 0)
{
@ -215,9 +211,9 @@ namespace SourceGit.Views
foreach (var c in selected)
set.Add(c);
var nodes = new List<ViewModels.FileTreeNode>();
var nodes = new List<Models.FileTreeNode>();
foreach (var node in tree.Source.Items)
CollectSelectedNodeByChange(nodes, node as ViewModels.FileTreeNode, set);
CollectSelectedNodeByChange(nodes, node as Models.FileTreeNode, set);
if (nodes.Count == 0)
{
@ -231,7 +227,7 @@ namespace SourceGit.Views
_isSelecting = false;
}
private void CollectChangesInNode(List<Models.Change> outs, ViewModels.FileTreeNode node)
private void CollectChangesInNode(List<Models.Change> outs, Models.FileTreeNode node)
{
if (node.IsFolder)
{
@ -246,7 +242,7 @@ namespace SourceGit.Views
}
}
private void CollectSelectedNodeByChange(List<ViewModels.FileTreeNode> outs, ViewModels.FileTreeNode node, HashSet<object> selected)
private void CollectSelectedNodeByChange(List<Models.FileTreeNode> outs, Models.FileTreeNode node, HashSet<object> selected)
{
if (node == null)
return;

View file

@ -48,7 +48,7 @@
Source="{Binding RevisionFiles}"
ContextRequested="OnFileContextRequested">
<TreeDataGrid.Resources>
<DataTemplate x:Key="FileTreeNodeExpanderTemplate" DataType="vm:FileTreeNode">
<DataTemplate x:Key="FileTreeNodeExpanderTemplate" DataType="m:FileTreeNode">
<Grid HorizontalAlignment="Stretch" Height="24" ColumnDefinitions="Auto,*">
<Path Grid.Column="0" Classes="folder_icon" Width="14" Height="14" Margin="0,2,0,0" IsVisible="{Binding IsFolder}" Fill="Goldenrod" VerticalAlignment="Center"/>
<Path Grid.Column="0" Width="14" Height="14" IsVisible="{Binding !IsFolder}" Data="{StaticResource Icons.File}" VerticalAlignment="Center"/>

View file

@ -217,7 +217,7 @@ namespace SourceGit.Views
{
if (DataContext is ViewModels.CommitDetail vm && sender is TreeDataGrid tree)
{
var selected = tree.RowSelection.SelectedItem as ViewModels.FileTreeNode;
var selected = tree.RowSelection.SelectedItem as Models.FileTreeNode;
if (selected != null && !selected.IsFolder && selected.Backend is Models.Object obj)
{
var menu = vm.CreateRevisionFileContextMenu(obj);