diff --git a/src/ViewModels/EditRepositoryNode.cs b/src/ViewModels/EditRepositoryNode.cs index 99567c13..4877ca9b 100644 --- a/src/ViewModels/EditRepositoryNode.cs +++ b/src/ViewModels/EditRepositoryNode.cs @@ -1,5 +1,4 @@ -using System; -using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations; using System.Threading.Tasks; namespace SourceGit.ViewModels @@ -50,8 +49,13 @@ namespace SourceGit.ViewModels public override Task Sure() { + bool needSort = _node.Name != _name; _node.Name = _name; _node.Bookmark = _bookmark; + + if (needSort) + Preference.SortByRenamedNode(_node); + return null; } diff --git a/src/ViewModels/Preference.cs b/src/ViewModels/Preference.cs index cf488328..075ec172 100644 --- a/src/ViewModels/Preference.cs +++ b/src/ViewModels/Preference.cs @@ -362,6 +362,30 @@ namespace SourceGit.ViewModels RemoveNodeRecursive(node, _instance._repositoryNodes); } + public static void SortByRenamedNode(RepositoryNode node) + { + var container = FindNodeContainer(node, _instance._repositoryNodes); + if (container == null) + return; + + var list = new List(); + list.AddRange(container); + list.Sort((l, r) => + { + if (l.IsRepository != r.IsRepository) + { + return l.IsRepository ? 1 : -1; + } + else + { + return l.Name.CompareTo(r.Name); + } + }); + + container.Clear(); + foreach (var one in list) container.Add(one); + } + public static Repository FindRepository(string path) { foreach (var repo in _instance.Repositories) @@ -417,6 +441,21 @@ namespace SourceGit.ViewModels return null; } + private static AvaloniaList FindNodeContainer(RepositoryNode node, AvaloniaList collection) + { + foreach (var sub in collection) + { + if (node == sub) + return collection; + + var subCollection = FindNodeContainer(node, sub.SubNodes); + if (subCollection != null) + return subCollection; + } + + return null; + } + private static bool RemoveNodeRecursive(RepositoryNode node, AvaloniaList collection) { if (collection.Contains(node))