From c7eb7b0c43744de82801c7a61c702bf2fd955a15 Mon Sep 17 00:00:00 2001 From: Berkan Uslu Date: Fri, 7 Aug 2026 16:59:47 +0200 Subject: [PATCH 1/4] feat(launcher): open submodule tabs next to parent Submodule tabs now insert right after the parent repo tab instead of appending at end. Makes related repos visually grouped. - Pass parent page hint from OpenSubmodule through both overloads - Insert new tab at parentIdx + 1 when parent is a repository --- src/ViewModels/Launcher.cs | 9 ++++++++- src/ViewModels/Repository.cs | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/ViewModels/Launcher.cs b/src/ViewModels/Launcher.cs index 7b17290a7..f5d59d02b 100644 --- a/src/ViewModels/Launcher.cs +++ b/src/ViewModels/Launcher.cs @@ -296,7 +296,7 @@ public void OpenRepositoryInTab(string repo, LauncherPage page) IsUnmanaged = true }; - OpenRepositoryInTab(node, null); + OpenRepositoryInTab(node, page); } public void OpenRepositoryInTab(RepositoryNode node, LauncherPage page) @@ -354,6 +354,13 @@ public void OpenRepositoryInTab(RepositoryNode node, LauncherPage page) page.Data = repo; } } + else if (page.Node.IsRepository) + { + var parent = page; + page = new LauncherPage(node, repo); + var parentIdx = Pages.IndexOf(parent); + Pages.Insert(parentIdx + 1, page); + } else { page.Node = node; diff --git a/src/ViewModels/Repository.cs b/src/ViewModels/Repository.cs index 99a3a47e2..80ff356f5 100644 --- a/src/ViewModels/Repository.cs +++ b/src/ViewModels/Repository.cs @@ -1552,7 +1552,7 @@ public void OpenSubmodule(string submodule) var root = Path.GetFullPath(Path.Combine(FullPath, submodule)); var normalizedPath = root.Replace('\\', '/').TrimEnd('/'); - App.GetLauncher().OpenRepositoryInTab(normalizedPath, null); + App.GetLauncher().OpenRepositoryInTab(normalizedPath, selfPage); } public void AddWorktree() From 6992b1ed8af37e5d29111b551f76d08e6f16c6d2 Mon Sep 17 00:00:00 2001 From: Berkan Uslu Date: Fri, 7 Aug 2026 17:09:52 +0200 Subject: [PATCH 2/4] =?UTF-8?q?=E2=9C=A8=20Prefix=20submodule=20titles=20w?= =?UTF-8?q?ith=20parent=20repo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ViewModels/Launcher.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/ViewModels/Launcher.cs b/src/ViewModels/Launcher.cs index f5d59d02b..8b8bb8c86 100644 --- a/src/ViewModels/Launcher.cs +++ b/src/ViewModels/Launcher.cs @@ -301,10 +301,21 @@ public void OpenRepositoryInTab(string repo, LauncherPage page) public void OpenRepositoryInTab(RepositoryNode node, LauncherPage page) { + // Compose submodule title from current parent name + if (page != null && page.Node.IsRepository) + { + var baseName = Path.GetFileName(node.Id); + node.Name = $"{page.Node.Name} : {baseName}"; + } + foreach (var one in Pages) { if (one.Node.Id == node.Id) { + // Update title in case parent was renamed + if (page != null && page.Node.IsRepository) + one.Node.Name = node.Name; + ActivePage = one; return; } @@ -357,6 +368,7 @@ public void OpenRepositoryInTab(RepositoryNode node, LauncherPage page) else if (page.Node.IsRepository) { var parent = page; + node.Name = $"{parent.Node.Name} : {node.Name}"; page = new LauncherPage(node, repo); var parentIdx = Pages.IndexOf(parent); Pages.Insert(parentIdx + 1, page); From 063be2c8a60dd38bb3d68fc89ab24ef4cb2df12e Mon Sep 17 00:00:00 2001 From: Berkan Uslu Date: Fri, 7 Aug 2026 17:59:27 +0200 Subject: [PATCH 3/4] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Refactor=20submodule?= =?UTF-8?q?=20title=20composition?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ViewModels/Launcher.cs | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/ViewModels/Launcher.cs b/src/ViewModels/Launcher.cs index 8b8bb8c86..b0d4741ce 100644 --- a/src/ViewModels/Launcher.cs +++ b/src/ViewModels/Launcher.cs @@ -301,20 +301,13 @@ public void OpenRepositoryInTab(string repo, LauncherPage page) public void OpenRepositoryInTab(RepositoryNode node, LauncherPage page) { - // Compose submodule title from current parent name - if (page != null && page.Node.IsRepository) - { - var baseName = Path.GetFileName(node.Id); - node.Name = $"{page.Node.Name} : {baseName}"; - } - foreach (var one in Pages) { if (one.Node.Id == node.Id) { // Update title in case parent was renamed if (page != null && page.Node.IsRepository) - one.Node.Name = node.Name; + one.Node.Name = ComposeSubmoduleTitle(page, node); ActivePage = one; return; @@ -368,7 +361,7 @@ public void OpenRepositoryInTab(RepositoryNode node, LauncherPage page) else if (page.Node.IsRepository) { var parent = page; - node.Name = $"{parent.Node.Name} : {node.Name}"; + node.Name = ComposeSubmoduleTitle(parent, node); page = new LauncherPage(node, repo); var parentIdx = Pages.IndexOf(parent); Pages.Insert(parentIdx + 1, page); @@ -487,6 +480,12 @@ private void PostActivePageChanged() CommandPalette = null; } + private static string ComposeSubmoduleTitle(LauncherPage parent, RepositoryNode node) + { + var baseName = Path.GetFileName(node.Id); + return $"{parent.Node.Name} : {baseName}"; + } + private Workspace _activeWorkspace; private LauncherPage _activePage; private bool _ignoreIndexChange; From ed9743642ee49156f886bc8cfe4f62e982531e10 Mon Sep 17 00:00:00 2001 From: Berkan Uslu Date: Fri, 7 Aug 2026 18:07:28 +0200 Subject: [PATCH 4/4] =?UTF-8?q?=F0=9F=A7=B9=20Remove=20obsolete=20submodul?= =?UTF-8?q?e=20title=20comment?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ViewModels/Launcher.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ViewModels/Launcher.cs b/src/ViewModels/Launcher.cs index b0d4741ce..3fdc83c97 100644 --- a/src/ViewModels/Launcher.cs +++ b/src/ViewModels/Launcher.cs @@ -305,7 +305,6 @@ public void OpenRepositoryInTab(RepositoryNode node, LauncherPage page) { if (one.Node.Id == node.Id) { - // Update title in case parent was renamed if (page != null && page.Node.IsRepository) one.Node.Name = ComposeSubmoduleTitle(page, node);