@@ -59,16 +59,14 @@ struct WorktrunkSidebarView: View {
5959
6060 Spacer ( minLength: 0 )
6161
62- if !sidebarTabsEnabled {
63- Button {
64- toggleSidebarListMode ( )
65- } label: {
66- Image ( systemName: store. sidebarListMode == . flatWorktrees ? " list.bullet.indent " : " list.bullet " )
67- . foregroundStyle ( . secondary)
68- }
69- . buttonStyle ( . plain)
70- . help ( store. sidebarListMode == . flatWorktrees ? " Switch to nested list " : " Switch to flat list " )
62+ Button {
63+ toggleSidebarListMode ( )
64+ } label: {
65+ Image ( systemName: store. sidebarListMode == . flatWorktrees ? " list.bullet.indent " : " list.bullet " )
66+ . foregroundStyle ( . secondary)
7167 }
68+ . buttonStyle ( . plain)
69+ . help ( store. sidebarListMode == . flatWorktrees ? " Switch to nested list " : " Switch to flat list " )
7270
7371 Menu {
7472 ForEach ( WorktreeSortOrder . allCases, id: \. self) { order in
@@ -187,19 +185,12 @@ struct WorktrunkSidebarView: View {
187185 . onChange ( of: store. sidebarListMode) { _ in
188186 clearSelectionIfMainInFlatMode ( )
189187 }
190- . onChange ( of: sidebarTabsEnabled) { enabled in
191- if enabled {
192- forceFlatModeIfNeeded ( )
193- }
194- }
195188 . onAppear {
196- if sidebarTabsEnabled {
197- forceFlatModeIfNeeded ( )
198- }
199189 if store. sidebarListMode == . nestedByRepo, sidebarState. expandedRepoIDs. isEmpty {
200190 sidebarState. applyExpandedRepoIDs (
201191 Set ( store. sidebarSnapshot. repositories. map ( \. id) ) ,
202- listMode: store. sidebarListMode
192+ listMode: store. sidebarListMode,
193+ alwaysVisibleWorktreePaths: currentAlwaysVisibleWorktreePaths ( )
203194 )
204195 }
205196 clearSelectionIfMainInFlatMode ( )
@@ -297,7 +288,7 @@ struct WorktrunkSidebarView: View {
297288 if store. sidebarListMode == . flatWorktrees {
298289 flatWorktreeList ( snapshot: snapshot, excludingWorktreePaths: topWorktreePaths)
299290 } else {
300- nestedRepoList ( snapshot: snapshot)
291+ nestedRepoList ( snapshot: snapshot, excludingWorktreePaths : topWorktreePaths )
301292 }
302293 }
303294 . background ( SidebarListScrollFinder ( preserver: sidebarScrollPreserver) )
@@ -321,14 +312,11 @@ struct WorktrunkSidebarView: View {
321312 return nil
322313 }
323314
324- private func forceFlatModeIfNeeded( ) {
325- if store. sidebarListMode != . flatWorktrees {
326- store. sidebarListMode = . flatWorktrees
327- }
328- if store. worktreeSortOrder != . recentActivity {
329- store. worktreeSortOrder = . recentActivity
330- }
331- clearSelectionIfMainInFlatMode ( )
315+ private func currentAlwaysVisibleWorktreePaths( ) -> Set < String > {
316+ guard sidebarTabsEnabled else { return [ ] }
317+ guard store. sidebarListMode == . nestedByRepo else { return [ ] }
318+ let tabRoots = Set ( openTabsModel. tabs. compactMap ( \. worktreeRootPath) . map ( standardizedPath) )
319+ return tabRoots. intersection ( store. sidebarWorktreePaths)
332320 }
333321
334322 @ViewBuilder
@@ -347,6 +335,7 @@ struct WorktrunkSidebarView: View {
347335 return ( key, item. tab. windowNumber)
348336 }
349337 )
338+ let alwaysVisibleWorktreePaths = Set ( windowNumberByWorktreePath. keys)
350339 let moveBeforePreservingScroll : ( Int , Int ) -> Void = { moving, target in
351340 let scrollY = sidebarScrollPreserver. captureScrollY ( )
352341 moveNativeTabBefore ( moving, target)
@@ -379,6 +368,7 @@ struct WorktrunkSidebarView: View {
379368 openWorktreeAgent: openWorktreeAgent,
380369 defaultAction: defaultAction,
381370 availableAgents: availableAgents,
371+ alwaysVisibleWorktreePaths: alwaysVisibleWorktreePaths,
382372 focusNativeTab: focusNativeTab,
383373 moveBefore: moveBeforePreservingScroll,
384374 moveAfter: moveAfterPreservingScroll,
@@ -419,7 +409,10 @@ struct WorktrunkSidebarView: View {
419409 }
420410
421411 @ViewBuilder
422- private func nestedRepoList( snapshot: WorktrunkStore . SidebarSnapshot ) -> some View {
412+ private func nestedRepoList(
413+ snapshot: WorktrunkStore . SidebarSnapshot ,
414+ excludingWorktreePaths: Set < String >
415+ ) -> some View {
423416 ForEach ( snapshot. repositories) { repo in
424417 DisclosureGroup (
425418 isExpanded: Binding (
@@ -431,7 +424,11 @@ struct WorktrunkSidebarView: View {
431424 } else {
432425 next. remove ( repo. id)
433426 }
434- sidebarState. applyExpandedRepoIDs ( next, listMode: store. sidebarListMode)
427+ sidebarState. applyExpandedRepoIDs (
428+ next,
429+ listMode: store. sidebarListMode,
430+ alwaysVisibleWorktreePaths: excludingWorktreePaths
431+ )
435432 }
436433 )
437434 ) {
@@ -449,7 +446,9 @@ struct WorktrunkSidebarView: View {
449446 }
450447 . help ( " Create worktree " )
451448
452- let worktrees = snapshot. worktreesByRepositoryID [ repo. id] ?? [ ]
449+ let worktrees = ( snapshot. worktreesByRepositoryID [ repo. id] ?? [ ] ) . filter { wt in
450+ !excludingWorktreePaths. contains ( standardizedPath ( wt. path) )
451+ }
453452 if worktrees. isEmpty {
454453 Text ( " No worktrees " )
455454 . foregroundStyle ( . secondary)
@@ -601,7 +600,11 @@ struct WorktrunkSidebarView: View {
601600 } else {
602601 next. remove ( wt. path)
603602 }
604- sidebarState. applyExpandedWorktreePaths ( next, listMode: store. sidebarListMode)
603+ sidebarState. applyExpandedWorktreePaths (
604+ next,
605+ listMode: store. sidebarListMode,
606+ alwaysVisibleWorktreePaths: currentAlwaysVisibleWorktreePaths ( )
607+ )
605608 }
606609 )
607610 ) {
@@ -867,6 +870,7 @@ private struct WorktreeTabDisclosureGroup: View {
867870 let openWorktreeAgent : ( String , WorktrunkAgent ) -> Void
868871 let defaultAction : WorktrunkDefaultAction
869872 let availableAgents : [ WorktrunkAgent ]
873+ let alwaysVisibleWorktreePaths : Set < String >
870874 let focusNativeTab : ( Int ) -> Void
871875 let moveBefore : ( Int , Int ) -> Void
872876 let moveAfter : ( Int , Int ) -> Void
@@ -883,7 +887,11 @@ private struct WorktreeTabDisclosureGroup: View {
883887 } else {
884888 next. remove ( worktree. path)
885889 }
886- sidebarState. applyExpandedWorktreePaths ( next, listMode: store. sidebarListMode)
890+ sidebarState. applyExpandedWorktreePaths (
891+ next,
892+ listMode: store. sidebarListMode,
893+ alwaysVisibleWorktreePaths: alwaysVisibleWorktreePaths
894+ )
887895 }
888896 )
889897 ) {
0 commit comments