diff --git a/Sources/TabManager.swift b/Sources/TabManager.swift index 96fc3349..273cc43a 100644 --- a/Sources/TabManager.swift +++ b/Sources/TabManager.swift @@ -2003,17 +2003,28 @@ class TabManager: ObservableObject { placementOverride: NewWorkspacePlacement? = nil ) -> Int { let placement = placementOverride ?? WorkspacePlacementSettings.current() - let pinnedCount = snapshot.tabs.filter { $0.isPinned }.count - let selectedIndex = snapshot.selectedTabId.flatMap { tabId in - snapshot.tabs.firstIndex(where: { $0.id == tabId }) + let tabs = snapshot.tabs + var pinnedCount = 0 + var selectedIndex: Int? + var selectedIsPinned = false + let selectedTabId = snapshot.selectedTabId + + for (index, tab) in tabs.enumerated() { + if tab.isPinned { + pinnedCount += 1 + } + if selectedIndex == nil, tab.id == selectedTabId { + selectedIndex = index + selectedIsPinned = tab.isPinned + } } - let selectedIsPinned = selectedIndex.map { snapshot.tabs[$0].isPinned } ?? false + return WorkspacePlacementSettings.insertionIndex( placement: placement, selectedIndex: selectedIndex, selectedIsPinned: selectedIsPinned, pinnedCount: pinnedCount, - totalCount: snapshot.tabs.count + totalCount: tabs.count ) } diff --git a/cmuxTests/WorkspaceUnitTests.swift b/cmuxTests/WorkspaceUnitTests.swift index 32cd30b2..efe4f768 100644 --- a/cmuxTests/WorkspaceUnitTests.swift +++ b/cmuxTests/WorkspaceUnitTests.swift @@ -334,6 +334,24 @@ final class WorkspaceCreationPlacementTests: XCTestCase { XCTAssertEqual(insertedIndex, baselineCount) } + func testAddWorkspaceAfterCurrentOverrideAppendsAfterLastSelectedWorkspace() { + let manager = TabManager() + guard !manager.tabs.isEmpty else { + XCTFail("Expected TabManager to initialise with at least one workspace") + return + } + _ = manager.addWorkspace() + _ = manager.addWorkspace() + let fourth = manager.addWorkspace() + let baselineOrder = manager.tabs.map(\.id) + + manager.selectWorkspace(fourth) + let inserted = manager.addWorkspace(placementOverride: .afterCurrent) + + XCTAssertEqual(manager.tabs.map(\.id).filter { $0 != inserted.id }, baselineOrder) + XCTAssertEqual(manager.tabs.last?.id, inserted.id) + } + private func makeManagerWithThreeWorkspaces() -> TabManager { let manager = TabManager() _ = manager.addWorkspace()