Merge pull request #2023 from manaflow-ai/task-fix-add-workspace-insert-index-crash
Avoid crash when creating a new workspace
This commit is contained in:
commit
22c50a4416
2 changed files with 34 additions and 5 deletions
|
|
@ -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
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue