refactor: use TreeDataGrid instead of TreeView/DataGrid to improve performance (#148)

This commit is contained in:
leo 2024-05-28 21:19:53 +08:00
parent 3160f1d142
commit b192a1c423
24 changed files with 1333 additions and 1330 deletions

View file

@ -35,48 +35,17 @@ namespace SourceGit.ViewModels
private set => SetProperty(ref _visibleChanges, value);
}
public List<FileTreeNode> ChangeTree
public List<Models.Change> SelectedChanges
{
get => _changeTree;
private set => SetProperty(ref _changeTree, value);
}
public Models.Change SelectedChange
{
get => _selectedChange;
get => _selectedChanges;
set
{
if (SetProperty(ref _selectedChange, value))
if (SetProperty(ref _selectedChanges, value))
{
if (value == null)
{
SelectedNode = null;
if (value != null && value.Count == 1)
DiffContext = new DiffContext(_repo, new Models.DiffOption(StartPoint.SHA, _endPoint, value[0]), _diffContext);
else
DiffContext = null;
}
else
{
SelectedNode = FileTreeNode.SelectByPath(_changeTree, value.Path);
DiffContext = new DiffContext(_repo, new Models.DiffOption(StartPoint.SHA, _endPoint, value), _diffContext);
}
}
}
}
public FileTreeNode SelectedNode
{
get => _selectedNode;
set
{
if (SetProperty(ref _selectedNode, value))
{
if (value == null)
{
SelectedChange = null;
}
else
{
SelectedChange = value.Backend as Models.Change;
}
}
}
}
@ -126,17 +95,14 @@ namespace SourceGit.ViewModels
foreach (var c in _changes)
{
if (c.Path.Contains(_searchFilter, StringComparison.OrdinalIgnoreCase))
{
visible.Add(c);
}
}
}
var tree = FileTreeNode.Build(visible);
var tree = FileTreeNode.Build(visible, true);
Dispatcher.UIThread.Invoke(() =>
{
VisibleChanges = visible;
ChangeTree = tree;
});
});
}
@ -148,10 +114,8 @@ namespace SourceGit.ViewModels
_changes.Clear();
if (_visibleChanges != null)
_visibleChanges.Clear();
if (_changeTree != null)
_changeTree.Clear();
_selectedChange = null;
_selectedNode = null;
if (_selectedChanges != null)
_selectedChanges.Clear();
_searchFilter = null;
_diffContext = null;
}
@ -168,8 +132,12 @@ namespace SourceGit.ViewModels
SearchFilter = string.Empty;
}
public ContextMenu CreateChangeContextMenu(Models.Change change)
public ContextMenu CreateChangeContextMenu()
{
if (_selectedChanges == null || _selectedChanges.Count != 1)
return null;
var change = _selectedChanges[0];
var menu = new ContextMenu();
var diffWithMerger = new MenuItem();
@ -237,24 +205,18 @@ namespace SourceGit.ViewModels
foreach (var c in _changes)
{
if (c.Path.Contains(_searchFilter, StringComparison.OrdinalIgnoreCase))
{
visible.Add(c);
}
}
VisibleChanges = visible;
}
ChangeTree = FileTreeNode.Build(_visibleChanges);
}
private string _repo = string.Empty;
private string _endPoint = string.Empty;
private List<Models.Change> _changes = null;
private List<Models.Change> _visibleChanges = null;
private List<FileTreeNode> _changeTree = null;
private Models.Change _selectedChange = null;
private FileTreeNode _selectedNode = null;
private List<Models.Change> _selectedChanges = null;
private string _searchFilter = string.Empty;
private DiffContext _diffContext = null;
}