feature<CommitDetail>: goto diff view by double click changed file in commit information panel

This commit is contained in:
leo 2021-05-13 10:55:25 +08:00
parent 0810e19f93
commit b9b0899d48
6 changed files with 66 additions and 6 deletions

View file

@ -16,6 +16,7 @@ namespace SourceGit.Views.Widgets {
private List<Models.Commit> range = null;
private List<Models.Change> cachedChanges = new List<Models.Change>();
private string filter = null;
private bool isSelecting = false;
public class ChangeNode {
public string Path { get; set; } = "";
@ -37,7 +38,28 @@ namespace SourceGit.Views.Widgets {
UpdateVisible();
}
public void UpdateVisible() {
public void Select(Models.Change change) {
isSelecting = true;
switch (modeSwitcher.Mode) {
case Models.Change.DisplayMode.Tree:
var node = FindNodeByChange(modeTree.ItemsSource as List<ChangeNode>, change);
modeTree.Select(node);
break;
case Models.Change.DisplayMode.List:
modeList.SelectedItem = change;
modeList.ScrollIntoView(change);
break;
case Models.Change.DisplayMode.Grid:
modeGrid.SelectedItem = change;
modeGrid.ScrollIntoView(change);
break;
}
isSelecting = false;
}
private void UpdateVisible() {
Task.Run(() => {
// 筛选出可见的列表
List<Models.Change> visible;
@ -115,6 +137,21 @@ namespace SourceGit.Views.Widgets {
});
}
private ChangeNode FindNodeByChange(List<ChangeNode> nodes, Models.Change change) {
if (nodes == null || nodes.Count == 0) return null;
foreach (var node in nodes) {
if (node.IsFolder) {
var found = FindNodeByChange(node.Children, change);
if (found != null) return found;
} else if (node.Change == change) {
return node;
}
}
return null;
}
private void SortFileNodes(List<ChangeNode> nodes) {
nodes.Sort((l, r) => {
if (l.IsFolder == r.IsFolder) {
@ -237,7 +274,7 @@ namespace SourceGit.Views.Widgets {
}
private void OnRequestBringIntoView(object sender, RequestBringIntoViewEventArgs e) {
e.Handled = true;
if (!isSelecting) e.Handled = true;
}
private void OnTreeSelectionChanged(object sender, RoutedEventArgs e) {