mirror of
https://github.com/sourcegit-scm/sourcegit
synced 2025-06-21 02:15:00 +00:00
Merge 633242bf22
into ae46728bbc
This commit is contained in:
commit
0c449d9d93
2 changed files with 56 additions and 2 deletions
|
@ -8,7 +8,7 @@
|
||||||
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
|
||||||
x:Class="SourceGit.Views.RevisionFileTreeView"
|
x:Class="SourceGit.Views.RevisionFileTreeView"
|
||||||
x:Name="ThisControl">
|
x:Name="ThisControl">
|
||||||
<v:RevisionFileRowsListBox ItemsSource="{Binding #ThisControl.Rows}"
|
<v:RevisionFileRowsListBox x:Name="RevisionFileRowsListBox" ItemsSource="{Binding #ThisControl.Rows}"
|
||||||
Background="Transparent"
|
Background="Transparent"
|
||||||
SelectionMode="Single"
|
SelectionMode="Single"
|
||||||
SelectionChanged="OnRowsSelectionChanged"
|
SelectionChanged="OnRowsSelectionChanged"
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using Avalonia;
|
using Avalonia;
|
||||||
using Avalonia.Collections;
|
using Avalonia.Collections;
|
||||||
using Avalonia.Controls;
|
using Avalonia.Controls;
|
||||||
|
@ -9,6 +9,7 @@ using Avalonia.Input;
|
||||||
using Avalonia.Layout;
|
using Avalonia.Layout;
|
||||||
using Avalonia.Media;
|
using Avalonia.Media;
|
||||||
using Avalonia.VisualTree;
|
using Avalonia.VisualTree;
|
||||||
|
using SourceGit.ViewModels;
|
||||||
|
|
||||||
namespace SourceGit.Views
|
namespace SourceGit.Views
|
||||||
{
|
{
|
||||||
|
@ -249,6 +250,17 @@ namespace SourceGit.Views
|
||||||
|
|
||||||
if (change.Property == RevisionProperty)
|
if (change.Property == RevisionProperty)
|
||||||
{
|
{
|
||||||
|
var selectedNode = _revisionFileRowsListBox?.SelectedItem as RevisionFileTreeNode;
|
||||||
|
|
||||||
|
var expandedObjects = new List<Models.Object>();
|
||||||
|
foreach (var node in _rows)
|
||||||
|
{
|
||||||
|
if (node.IsExpanded)
|
||||||
|
{
|
||||||
|
expandedObjects.Add(node.Backend);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_tree.Clear();
|
_tree.Clear();
|
||||||
_rows.Clear();
|
_rows.Clear();
|
||||||
_searchResult.Clear();
|
_searchResult.Clear();
|
||||||
|
@ -275,10 +287,51 @@ namespace SourceGit.Views
|
||||||
var topTree = new List<ViewModels.RevisionFileTreeNode>();
|
var topTree = new List<ViewModels.RevisionFileTreeNode>();
|
||||||
MakeRows(topTree, _tree, 0);
|
MakeRows(topTree, _tree, 0);
|
||||||
_rows.AddRange(topTree);
|
_rows.AddRange(topTree);
|
||||||
|
|
||||||
|
_revisionFileRowsListBox ??= this.Find<RevisionFileRowsListBox>("RevisionFileRowsListBox");
|
||||||
|
|
||||||
|
if (_revisionFileRowsListBox is { IsArrangeValid: true })
|
||||||
|
{
|
||||||
|
RestoreTreeState(expandedObjects, selectedNode);
|
||||||
|
}
|
||||||
|
|
||||||
GC.Collect();
|
GC.Collect();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void RestoreTreeState(List<Models.Object> expandedObjects, RevisionFileTreeNode selectedNode)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < _rows.Count; i++)
|
||||||
|
{
|
||||||
|
var revisionFileTreeNode = _rows[i];
|
||||||
|
|
||||||
|
if (!revisionFileTreeNode.IsFolder)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (expandedObjects.FirstOrDefault(o => o.SHA == revisionFileTreeNode.Backend.SHA || o.Path == revisionFileTreeNode.Backend.Path) != null)
|
||||||
|
{
|
||||||
|
ToggleNodeIsExpanded(revisionFileTreeNode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (selectedNode != null)
|
||||||
|
{
|
||||||
|
foreach (var node in _rows)
|
||||||
|
{
|
||||||
|
if (node.Backend.SHA != selectedNode.Backend.SHA && node.Backend.Path != selectedNode.Backend.Path)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
selectedNode = node;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_revisionFileRowsListBox != null)
|
||||||
|
{
|
||||||
|
_revisionFileRowsListBox.SelectedItem = selectedNode;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void OnTreeNodeContextRequested(object sender, ContextRequestedEventArgs e)
|
private void OnTreeNodeContextRequested(object sender, ContextRequestedEventArgs e)
|
||||||
{
|
{
|
||||||
if (DataContext is ViewModels.CommitDetail vm &&
|
if (DataContext is ViewModels.CommitDetail vm &&
|
||||||
|
@ -368,5 +421,6 @@ namespace SourceGit.Views
|
||||||
private AvaloniaList<ViewModels.RevisionFileTreeNode> _rows = [];
|
private AvaloniaList<ViewModels.RevisionFileTreeNode> _rows = [];
|
||||||
private bool _disableSelectionChangingEvent = false;
|
private bool _disableSelectionChangingEvent = false;
|
||||||
private List<ViewModels.RevisionFileTreeNode> _searchResult = [];
|
private List<ViewModels.RevisionFileTreeNode> _searchResult = [];
|
||||||
|
private RevisionFileRowsListBox _revisionFileRowsListBox;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue