Repository navigation
Add focus and Recently Closed history #4160
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
125 commits
Select commit
Hold shift + click to select a range
2aa7e74
Add focus history
lawrencecchen 331eefd
Extract workspace attention flash ring view
lawrencecchen e9b6ada
Polish titlebar control interactions
lawrencecchen c8f8761
Wire focus history titlebar controls
lawrencecchen 5c47853
Refresh focus history menu state
lawrencecchen 506b10b
Disable unavailable titlebar focus history buttons
lawrencecchen bde6077
Refresh focus history after index updates
lawrencecchen bedd785
Tighten focus history edge cases
lawrencecchen e7851b7
Polish titlebar control chrome
lawrencecchen 6615de8
Cover minimal titlebar control hit isolation
lawrencecchen 5134f63
Fix minimal titlebar control chrome
lawrencecchen db54cce
Raise sidebar minimum width
lawrencecchen b264706
Fix notification popover titlebar anchor
lawrencecchen 4f8fac7
Add focus history context menu
lawrencecchen 0b9bb4d
Remove focus history context menu icons
lawrencecchen d5bca64
Shorten titlebar notification bell
lawrencecchen d200c1a
Revert "Shorten titlebar notification bell"
lawrencecchen 162fbd2
Split focus history menus by direction
lawrencecchen 97c608a
Merge remote-tracking branch 'origin/main' into feature-focus-workspa…
lawrencecchen d475e80
Extract focus history value types
lawrencecchen fd3dfe7
Remove unused focus history suppression state
lawrencecchen 5e08323
Keep notification popover anchors in window
lawrencecchen 791eb8d
Fix focus history removal edge cases
lawrencecchen bb159ce
Show focus history shortcuts in titlebar hints
lawrencecchen 3b399d6
Add workspace and window history
lawrencecchen ef1fbd8
Fix workspace history restore focus
lawrencecchen 14eedb2
Preserve closed window fallback history
lawrencecchen d2d7c4c
Preserve focus state on failed closed-panel restore
lawrencecchen 9b81380
Fix closed item history regressions
lawrencecchen a50a7d5
Fix closed item history restoration anchors
lawrencecchen df56eb2
Add recently closed history list
lawrencecchen a5dbeb5
Register recently closed history panel
lawrencecchen 185e0e0
Avoid deprecated recently closed activation
lawrencecchen ed8c692
Add searchable history pane
lawrencecchen b1ac783
Preserve skipped recently closed history entries
lawrencecchen c341e5b
Tighten recently closed restore paths
lawrencecchen dcbafef
Suppress recently closed cleanup records
lawrencecchen a5e9cd1
Keep skipped recently closed rows remappable
lawrencecchen b3f81e8
Show recent history previews inline
lawrencecchen 7490126
Merge remote-tracking branch 'origin/main' into feature-focus-workspa…
lawrencecchen 576755e
Merge branch 'feature-focus-workspace-history' into feature-workspace…
lawrencecchen 2b07bef
Stabilize titlebar control positioning
lawrencecchen 53d7ccd
Merge branch 'feature-focus-workspace-history' into feature-workspace…
lawrencecchen 22702b7
Clarify titlebar sizing state
lawrencecchen 151f2b2
Merge branch 'feature-focus-workspace-history' into feature-workspace…
lawrencecchen abb9e52
Align titlebar controls to traffic light bounds
lawrencecchen 1525af2
Merge branch 'feature-focus-workspace-history' into feature-workspace…
lawrencecchen f78a7d3
Stabilize titlebar geometry updates
lawrencecchen c03425f
Merge branch 'feature-focus-workspace-history' into feature-workspace…
lawrencecchen b5fc0ed
Localize titlebar layout debug controls
lawrencecchen f61439e
Merge branch 'feature-focus-workspace-history' into feature-workspace…
lawrencecchen 48a1927
Stop repositioning native titlebar buttons
lawrencecchen 5c2092f
Merge remote-tracking branch 'origin/feature-focus-workspace-history'…
lawrencecchen 40e2583
Fix plus menu icons and sidebar minimum default
lawrencecchen 624f058
Merge branch 'feature-focus-workspace-history' into feature-workspace…
lawrencecchen d421f54
Merge remote-tracking branch 'origin/main' into feature-focus-workspa…
lawrencecchen 5e788cf
Merge branch 'feature-focus-workspace-history' into feature-workspace…
lawrencecchen d75d89e
Merge remote-tracking branch 'origin/main' into feature-focus-workspa…
lawrencecchen 04c0a27
Merge branch 'feature-focus-workspace-history' into feature-workspace…
lawrencecchen 7bbc915
Fix focus history invalidation and header icon chrome
lawrencecchen c2dd289
Merge branch 'feature-focus-workspace-history' into feature-workspace…
lawrencecchen c4a9c3a
Register titlebar layout debug window
lawrencecchen f5c92b5
Merge branch 'feature-focus-workspace-history' into feature-workspace…
lawrencecchen bbd3883
Reject empty workspace history restores
lawrencecchen b8c99f6
Move titlebar shortcut hints below controls
lawrencecchen d4ef96c
Merge branch 'feature-focus-workspace-history' into feature-workspace…
lawrencecchen 11fd84d
Fix focus review followups
lawrencecchen 15ced20
Merge remote-tracking branch 'origin/feature-focus-workspace-history'…
lawrencecchen 5d25179
Record context tab closes in history
lawrencecchen 6b4e145
Record drawn titlebar geometry
lawrencecchen e87371d
Merge remote-tracking branch 'origin/feature-focus-workspace-history'…
lawrencecchen c93e6d7
Record minimal mode traffic lights
lawrencecchen 256dde4
Merge remote-tracking branch 'origin/feature-focus-workspace-history'…
lawrencecchen bcc5460
Keep titlebar shortcut hints off controls
lawrencecchen 8a66b2d
Merge remote-tracking branch 'origin/feature-focus-workspace-history'…
lawrencecchen 1e35b11
Match titlebar chrome icon sizing
lawrencecchen 75c2dc7
Merge remote-tracking branch 'origin/feature-focus-workspace-history'…
lawrencecchen 4e2e19c
Align right sidebar header controls
lawrencecchen 9397566
Merge remote-tracking branch 'origin/feature-focus-workspace-history'…
lawrencecchen 17f7089
Tighten titlebar shortcut hint placement
lawrencecchen 5fb4fc8
Merge remote-tracking branch 'origin/feature-focus-workspace-history'…
lawrencecchen 918e8e6
Center right sidebar header controls
lawrencecchen 3ae62bf
Merge remote-tracking branch 'origin/feature-focus-workspace-history'…
lawrencecchen 283cc81
Match header icon button metrics
lawrencecchen 362afee
Merge remote-tracking branch 'origin/feature-focus-workspace-history'…
lawrencecchen e5b8713
Record header icon geometry
lawrencecchen 42c022c
Merge remote-tracking branch 'origin/feature-focus-workspace-history'…
lawrencecchen c6e928c
Tune right header icons and titlebar hints
lawrencecchen 05d6f3a
Merge remote-tracking branch 'origin/feature-focus-workspace-history'…
lawrencecchen 51a4c3f
Use compact right sidebar header icons
lawrencecchen 86b39a9
Align right sidebar chrome button styling
lawrencecchen 17441f6
Record right sidebar mode icon geometry
lawrencecchen cadc726
Restore minimal titlebar button hover
lawrencecchen 624685f
Merge origin/main into feature-workspace-window-history
lawrencecchen 8baf43a
Resolve history review feedback
lawrencecchen 5814b19
Fix right sidebar test harness
lawrencecchen 74d0b84
Resolve remaining history review comments
lawrencecchen 0206a62
Fix history test compile error
lawrencecchen b199c24
Merge remote-tracking branch 'origin/main' into feature-workspace-win…
lawrencecchen 9e4dec9
Fix recently closed history edge cases
lawrencecchen 0c8ec40
Fix history shortcut hints and drag handling
lawrencecchen 6c0ebd8
Fix history menu title fallbacks
lawrencecchen 49d9052
Fix recently closed recency ordering
lawrencecchen 1ef92d2
Fix stale recently closed history paths
lawrencecchen fc26673
Fix history sidebar focus and palette entry
lawrencecchen 3b1ed70
Preserve pending close history
lawrencecchen d323e1c
Localize titlebar layout debug button
lawrencecchen e371809
ci: allow longer unit test run
lawrencecchen 129f423
Merge remote-tracking branch 'origin/main' into feature-workspace-win…
lawrencecchen 5f22153
Merge remote-tracking branch 'origin/main' into feature-workspace-win…
lawrencecchen f9bdb77
Tighten history restore closeout
lawrencecchen d939746
Merge remote-tracking branch 'origin/main' into feature-workspace-win…
lawrencecchen 641c2f7
Cover explicit last-panel close history
lawrencecchen 7d02e44
Consume unavailable focus history shortcuts
lawrencecchen 35b1a84
Beep on unavailable focus history shortcuts
lawrencecchen 05a4804
Skip failed closed history records per restore
lawrencecchen e20b9a1
Merge remote-tracking branch 'origin/main' into feature-workspace-win…
lawrencecchen 95d8866
Merge remote-tracking branch 'origin/main' into feature-workspace-win…
lawrencecchen d59e754
fix: preserve empty session windows in autosave
lawrencecchen 86dffe1
fix: remap closed workspace windows after restore
lawrencecchen 9a28543
Merge remote-tracking branch 'origin/main' into feature-workspace-win…
lawrencecchen ae78f6d
fix: wire minimal sidebar focus history after merge
lawrencecchen fa91aaa
fix: sync extension sidebar titlebar debug insets
lawrencecchen ae8ffa5
Merge remote-tracking branch 'origin/main' into feature-workspace-win…
lawrencecchen e6dce82
Merge remote-tracking branch 'origin/main' into feature-workspace-win…
lawrencecchen File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Some comments aren't visible on the classic Files Changed page.
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,171 @@ | ||
| import AppKit | ||
|
|
||
| extension AppDelegate { | ||
| func clearRecentlyClosedHistory(preferredTabManager: TabManager? = nil) { | ||
| ClosedItemHistoryStore.shared.removeAll() | ||
|
|
||
| var clearedManagers: Set<ObjectIdentifier> = [] | ||
| func clear(_ manager: TabManager?) { | ||
| guard let manager else { return } | ||
| guard clearedManagers.insert(ObjectIdentifier(manager)).inserted else { return } | ||
| manager.clearRecentlyClosedBrowserPanelHistory() | ||
| } | ||
|
|
||
| clear(preferredTabManager) | ||
| clear(tabManager) | ||
| for context in mainWindowContexts.values { | ||
| clear(context.tabManager) | ||
| } | ||
| for route in recoverableMainWindowRoutes() { | ||
| clear(route.tabManager) | ||
| } | ||
| } | ||
|
|
||
| @discardableResult | ||
| func reopenMostRecentlyClosedItem( | ||
| preferredTabManager: TabManager? = nil, | ||
| shouldActivate: Bool = true | ||
| ) -> Bool { | ||
| var failedStoreRecordIds: Set<UUID> = [] | ||
| let restoreStoreItem: (Date?) -> Bool = { cutoff in | ||
| ClosedItemHistoryStore.shared.restoreFirstRestorable( | ||
| newerThan: cutoff, | ||
| excluding: failedStoreRecordIds, | ||
| onFailure: { failedStoreRecordIds.insert($0) }, | ||
| using: { entry in | ||
| self.restoreClosedItem( | ||
| entry, | ||
| preferredTabManager: preferredTabManager, | ||
| shouldActivate: shouldActivate | ||
| ) | ||
| } | ||
| ) | ||
| } | ||
|
|
||
| for manager in recentlyClosedLegacyBrowserManagers(preferredTabManager: preferredTabManager) { | ||
| guard let closedAt = manager.mostRecentLegacyClosedBrowserPanelClosedAt() else { | ||
| continue | ||
| } | ||
| if restoreStoreItem(closedAt) { | ||
| return true | ||
| } | ||
| if manager.reopenMostRecentlyClosedBrowserPanelFromLegacyStack() { | ||
| return true | ||
| } | ||
| } | ||
|
|
||
| return restoreStoreItem(nil) | ||
| } | ||
|
|
||
| private func recentlyClosedLegacyBrowserManagers(preferredTabManager: TabManager?) -> [TabManager] { | ||
| var managers: [TabManager] = [] | ||
| var seen: Set<ObjectIdentifier> = [] | ||
|
|
||
| func append(_ manager: TabManager?) { | ||
| guard let manager else { return } | ||
| guard manager.mostRecentLegacyClosedBrowserPanelClosedAt() != nil else { return } | ||
| guard seen.insert(ObjectIdentifier(manager)).inserted else { return } | ||
| managers.append(manager) | ||
| } | ||
|
|
||
| append(preferredTabManager) | ||
| append(tabManager) | ||
| for context in mainWindowContexts.values { | ||
| append(context.tabManager) | ||
| } | ||
| for route in recoverableMainWindowRoutes() { | ||
| append(route.tabManager) | ||
| } | ||
|
|
||
| return managers.sorted { lhs, rhs in | ||
| let lhsDate = lhs.mostRecentLegacyClosedBrowserPanelClosedAt() ?? .distantPast | ||
| let rhsDate = rhs.mostRecentLegacyClosedBrowserPanelClosedAt() ?? .distantPast | ||
| return lhsDate > rhsDate | ||
| } | ||
| } | ||
|
|
||
| @discardableResult | ||
| private func restoreClosedItem( | ||
| _ entry: ClosedItemHistoryEntry, | ||
| preferredTabManager: TabManager? = nil, | ||
| shouldActivate: Bool | ||
| ) -> Bool { | ||
| switch entry { | ||
| case .panel(let panelEntry): | ||
| let manager = | ||
| tabManagerFor(tabId: panelEntry.workspaceId) | ||
| ?? preferredTabManager | ||
| ?? tabManager | ||
| guard let manager, manager.restoreClosedPanel(panelEntry) else { | ||
| return false | ||
| } | ||
| activateMainWindowIfNeeded(for: manager, shouldActivate: shouldActivate) | ||
| return true | ||
| case .workspace(let workspaceEntry): | ||
| let manager = | ||
| workspaceEntry.windowId.flatMap { tabManagerFor(windowId: $0) } | ||
| ?? preferredTabManager | ||
| ?? tabManager | ||
| guard let manager, manager.restoreClosedWorkspace(workspaceEntry) else { | ||
| return false | ||
| } | ||
| activateMainWindowIfNeeded(for: manager, shouldActivate: shouldActivate) | ||
| return true | ||
| case .window(let windowEntry): | ||
| var restoredPanelIdsByWorkspaceIndex: [[UUID: UUID]] = [] | ||
| var restoredTabManager: TabManager? | ||
| let windowId = createMainWindow( | ||
| sessionWindowSnapshot: windowEntry.snapshot, | ||
| shouldActivate: shouldActivate, | ||
| closedWindowHistoryWorkspaceIds: windowEntry.workspaceIds, | ||
| restoredSessionSnapshotHandler: { panelIdsByWorkspaceIndex, tabManager in | ||
| restoredPanelIdsByWorkspaceIndex = panelIdsByWorkspaceIndex | ||
| restoredTabManager = tabManager | ||
| } | ||
| ) | ||
| let hasLivePanels = restoredTabManager?.tabs.contains { !$0.panels.isEmpty } == true | ||
| guard ClosedWindowRestoreValidation.hasUsableRestoredContent( | ||
| snapshot: windowEntry.snapshot, | ||
| restoredPanelIdsByWorkspaceIndex: restoredPanelIdsByWorkspaceIndex, | ||
| hasLivePanels: hasLivePanels | ||
| ) else { | ||
| discardMainWindowWithoutClosedHistory(windowId: windowId) | ||
| return false | ||
| } | ||
| if let oldWindowId = windowEntry.windowId { | ||
| ClosedItemHistoryStore.shared.remapWorkspaceWindowIds(from: oldWindowId, to: windowId) | ||
| } | ||
| return true | ||
| } | ||
|
cursor[bot] marked this conversation as resolved.
|
||
| } | ||
|
|
||
| @discardableResult | ||
| func reopenClosedHistoryItem( | ||
| id: UUID, | ||
| preferredTabManager: TabManager? = nil, | ||
| shouldActivate: Bool = true | ||
| ) -> Bool { | ||
| guard let removed = ClosedItemHistoryStore.shared.removeRecord(id: id) else { | ||
| return false | ||
| } | ||
|
|
||
| if restoreClosedItem( | ||
| removed.record.entry, | ||
| preferredTabManager: preferredTabManager, | ||
| shouldActivate: shouldActivate | ||
| ) { | ||
| return true | ||
| } | ||
|
|
||
| ClosedItemHistoryStore.shared.insert(removed.record, at: removed.index) | ||
| return false | ||
| } | ||
|
|
||
| private func activateMainWindowIfNeeded(for manager: TabManager, shouldActivate: Bool) { | ||
| guard shouldActivate, | ||
| let windowId = windowId(for: manager) else { | ||
| return | ||
| } | ||
| _ = focusMainWindow(windowId: windowId) | ||
| } | ||
| } | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,139 @@ | ||
| import AppKit | ||
|
|
||
| private let focusHistoryContextMenuPreviewLimit = 12 | ||
|
|
||
| private final class FocusHistoryContextMenuItemBox: NSObject { | ||
| weak var tabManager: TabManager? | ||
| let item: FocusHistoryMenuItem | ||
|
|
||
| init(tabManager: TabManager, item: FocusHistoryMenuItem) { | ||
| self.tabManager = tabManager | ||
| self.item = item | ||
| } | ||
| } | ||
|
|
||
| private final class FocusHistoryShowFullContextMenuBox: NSObject { | ||
| weak var tabManager: TabManager? | ||
| weak var anchorView: NSView? | ||
| let direction: FocusHistoryMenuDirection | ||
|
|
||
| init(tabManager: TabManager, anchorView: NSView, direction: FocusHistoryMenuDirection) { | ||
| self.tabManager = tabManager | ||
| self.anchorView = anchorView | ||
| self.direction = direction | ||
| } | ||
| } | ||
|
|
||
| extension AppDelegate { | ||
| @discardableResult | ||
| func showFocusHistoryContextMenu( | ||
| anchorView: NSView, | ||
| event: NSEvent, | ||
| direction: FocusHistoryMenuDirection, | ||
| showFullHistory: Bool = false, | ||
| debugSource: String = "titlebar.focusHistory.contextMenu" | ||
| ) -> Bool { | ||
| let context = contextForMainWindow(anchorView.window) | ||
| ?? mainWindowContext(forShortcutEvent: event, debugSource: debugSource) | ||
| guard let context else { return false } | ||
|
|
||
| let menu = makeFocusHistoryContextMenu( | ||
| tabManager: context.tabManager, | ||
| anchorView: anchorView, | ||
| direction: direction, | ||
| showFullHistory: showFullHistory | ||
| ) | ||
| guard menu.items.contains(where: { !$0.isSeparatorItem }) else { return false } | ||
|
|
||
| NSMenu.popUpContextMenu(menu, with: event, for: anchorView) | ||
| return true | ||
| } | ||
|
|
||
| private func makeFocusHistoryContextMenu( | ||
| tabManager: TabManager, | ||
| anchorView: NSView, | ||
| direction: FocusHistoryMenuDirection, | ||
| showFullHistory: Bool | ||
| ) -> NSMenu { | ||
| let snapshot = tabManager.focusHistoryMenuSnapshot( | ||
| direction: direction, | ||
| maxItemCount: showFullHistory ? nil : focusHistoryContextMenuPreviewLimit | ||
| ) | ||
| let menu = NSMenu(title: String(localized: "menu.history.focusHistory", defaultValue: "Focus History")) | ||
|
|
||
| if snapshot.items.isEmpty { | ||
| let item = NSMenuItem( | ||
| title: String(localized: "menu.history.noFocusHistory", defaultValue: "No Focus History"), | ||
| action: nil, | ||
| keyEquivalent: "" | ||
| ) | ||
| item.isEnabled = false | ||
| menu.addItem(item) | ||
| return menu | ||
| } | ||
|
|
||
| for itemSnapshot in snapshot.items { | ||
| let item = NSMenuItem( | ||
| title: focusHistoryContextMenuTitle(for: itemSnapshot), | ||
| action: #selector(performFocusHistoryContextMenuItem(_:)), | ||
| keyEquivalent: "" | ||
| ) | ||
| item.target = self | ||
| item.representedObject = FocusHistoryContextMenuItemBox(tabManager: tabManager, item: itemSnapshot) | ||
| item.isEnabled = itemSnapshot.isNavigable | ||
| menu.addItem(item) | ||
| } | ||
|
|
||
| if snapshot.isLimited { | ||
| menu.addItem(.separator()) | ||
| let item = NSMenuItem( | ||
| title: String(localized: "menu.history.showFullFocusHistory", defaultValue: "Show Full History"), | ||
| action: #selector(showFullFocusHistoryContextMenu(_:)), | ||
| keyEquivalent: "" | ||
| ) | ||
| item.target = self | ||
| item.representedObject = FocusHistoryShowFullContextMenuBox( | ||
| tabManager: tabManager, | ||
| anchorView: anchorView, | ||
| direction: direction | ||
| ) | ||
| menu.addItem(item) | ||
| } | ||
|
|
||
| return menu | ||
| } | ||
|
|
||
| private func focusHistoryContextMenuTitle(for item: FocusHistoryMenuItem) -> String { | ||
| FocusHistoryMenuFormatter.title(for: item) | ||
| } | ||
|
|
||
| @objc private func performFocusHistoryContextMenuItem(_ sender: NSMenuItem) { | ||
| guard let box = sender.representedObject as? FocusHistoryContextMenuItemBox, | ||
| let tabManager = box.tabManager, | ||
| tabManager.navigateToFocusHistoryMenuItem(box.item) else { | ||
| NSSound.beep() | ||
| return | ||
| } | ||
| } | ||
|
|
||
| @objc private func showFullFocusHistoryContextMenu(_ sender: NSMenuItem) { | ||
| guard let box = sender.representedObject as? FocusHistoryShowFullContextMenuBox, | ||
| let tabManager = box.tabManager, | ||
| let anchorView = box.anchorView else { | ||
| NSSound.beep() | ||
| return | ||
| } | ||
|
|
||
| let menu = makeFocusHistoryContextMenu( | ||
| tabManager: tabManager, | ||
| anchorView: anchorView, | ||
| direction: box.direction, | ||
| showFullHistory: true | ||
| ) | ||
| guard menu.items.contains(where: { !$0.isSeparatorItem }) else { | ||
| NSSound.beep() | ||
| return | ||
| } | ||
| menu.popUp(positioning: nil, at: NSPoint(x: 0, y: anchorView.bounds.height), in: anchorView) | ||
| } | ||
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,23 @@ | ||
| import AppKit | ||
|
|
||
| extension AppDelegate { | ||
| @discardableResult | ||
| func openHistoryPane( | ||
| preferredTabManager: TabManager? = nil, | ||
| preferredWindow: NSWindow? = nil | ||
| ) -> Bool { | ||
| let manager = preferredTabManager | ||
| ?? activeTabManagerForCommands(preferredWindow: preferredWindow ?? NSApp.keyWindow ?? NSApp.mainWindow) | ||
| guard let workspace = manager?.selectedWorkspace, | ||
| let paneId = workspace.bonsplitController.focusedPaneId ?? workspace.bonsplitController.allPaneIds.first else { | ||
| return false | ||
| } | ||
|
|
||
| workspace.clearSplitZoom() | ||
| return workspace.openOrFocusRightSidebarToolSurface( | ||
| inPane: paneId, | ||
| mode: .history, | ||
| focus: true | ||
| ) != nil | ||
| } | ||
| } |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.