From 193182623ef8143952d68ea9adab54473a6b7374 Mon Sep 17 00:00:00 2001 From: jasmin Date: Tue, 1 Sep 2026 15:56:19 +0800 Subject: [PATCH] enhance: show parent folder name on tabs for repositories with duplicate names --- src/ViewModels/EditRepositoryNode.cs | 1 + src/ViewModels/Launcher.cs | 50 ++++++++++++++++++++++++++++ src/ViewModels/LauncherPage.cs | 8 +++++ src/Views/LauncherTabBar.axaml | 2 +- 4 files changed, 60 insertions(+), 1 deletion(-) diff --git a/src/ViewModels/EditRepositoryNode.cs b/src/ViewModels/EditRepositoryNode.cs index 40402ef67d..522fb3d604 100644 --- a/src/ViewModels/EditRepositoryNode.cs +++ b/src/ViewModels/EditRepositoryNode.cs @@ -48,6 +48,7 @@ public override Task Sure() { Preferences.Instance.SortByRenamedNode(_node); Welcome.Instance.Refresh(); + App.GetLauncher().RefreshTabDisplayNames(); } return Task.FromResult(true); diff --git a/src/ViewModels/Launcher.cs b/src/ViewModels/Launcher.cs index 1cf00a848c..a157771d7e 100644 --- a/src/ViewModels/Launcher.cs +++ b/src/ViewModels/Launcher.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.IO; using System.Text; @@ -244,6 +245,7 @@ public void CloseTab(LauncherPage page) CloseRepositoryInTab(page); Pages.RemoveAt(removeIdx); + RefreshTabDisplayNames(); GC.Collect(); } @@ -266,6 +268,7 @@ public void CloseOtherTabs() _activeWorkspace.ActiveIdx = 0; _ignoreIndexChange = false; + RefreshTabDisplayNames(); GC.Collect(); } @@ -281,6 +284,7 @@ public void CloseRightTabs() } _ignoreIndexChange = false; + RefreshTabDisplayNames(); GC.Collect(); } @@ -371,6 +375,8 @@ public void OpenRepositoryInTab(RepositoryNode node, LauncherPage page) PostActivePageChanged(); else ActivePage = page; + + RefreshTabDisplayNames(); } public void OpenSubRepository(LauncherPage ownerPage, string fullpath) @@ -437,6 +443,50 @@ public void OpenSubRepository(LauncherPage ownerPage, string fullpath) Pages.Insert(idxOfOwner + 1, page); _activeWorkspace.Repositories.Insert(idxOfOwner + 1, normalizedPath); ActivePage = page; + + RefreshTabDisplayNames(); + } + + public void RefreshTabDisplayNames() + { + var nameUsages = new Dictionary(StringComparer.OrdinalIgnoreCase); + foreach (var page in Pages) + { + if (page.Node is not { IsRepository: true }) + continue; + + nameUsages.TryGetValue(page.Node.Name, out var count); + nameUsages[page.Node.Name] = count + 1; + } + + foreach (var page in Pages) + { + if (page.Node is not { IsRepository: true } node) + continue; + + nameUsages.TryGetValue(node.Name, out var count); + if (count > 1) + { + var parent = GetParentFolderName(node.Id); + page.DisplayName = string.IsNullOrEmpty(parent) ? node.Name : $"{node.Name} ({parent})"; + } + else + { + page.DisplayName = node.Name; + } + } + } + + private static string GetParentFolderName(string repoPath) + { + var normalized = repoPath.Replace('\\', '/').TrimEnd('/'); + var idx = normalized.LastIndexOf('/'); + if (idx < 0) + return string.Empty; + + var parent = normalized.Substring(0, idx).TrimEnd('/'); + idx = parent.LastIndexOf('/'); + return idx < 0 ? parent : parent.Substring(idx + 1); } private void DispatchNotification(Models.Notification notification) diff --git a/src/ViewModels/LauncherPage.cs b/src/ViewModels/LauncherPage.cs index 370e5a25c7..23ffca5c8a 100644 --- a/src/ViewModels/LauncherPage.cs +++ b/src/ViewModels/LauncherPage.cs @@ -31,6 +31,12 @@ public Popup Popup set => SetProperty(ref _popup, value); } + public string DisplayName + { + get => _displayName; + set => SetProperty(ref _displayName, value); + } + public AvaloniaList Notifications { get; @@ -50,6 +56,7 @@ public LauncherPage(RepositoryNode node, Repository repo) { _node = node; _data = repo; + _displayName = node.Name; } public void ClearNotifications() @@ -124,6 +131,7 @@ public void TerminatePopup() private RepositoryNode _node = null; private object _data = null; + private string _displayName = string.Empty; private Models.DirtyState _dirtyState = Models.DirtyState.None; private Popup _popup = null; } diff --git a/src/Views/LauncherTabBar.axaml b/src/Views/LauncherTabBar.axaml index 76b4f7ddf7..c4db13964c 100644 --- a/src/Views/LauncherTabBar.axaml +++ b/src/Views/LauncherTabBar.axaml @@ -110,7 +110,7 @@ VerticalAlignment="Center" FontSize="{Binding Source={x:Static vm:Preferences.Instance}, Path=DefaultFontSize, Converter={x:Static c:DoubleConverters.Decrease}}" TextAlignment="Center" - Text="{Binding Node.Name}" + Text="{Binding DisplayName}" IsHitTestVisible="False"/>