chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,102 @@
|
||||
import AppKit
|
||||
import CodexBarCore
|
||||
|
||||
extension StatusItemController {
|
||||
func refreshProviderSelectionDependentUI(
|
||||
refreshOpenMenus: Bool = false,
|
||||
deferRendering: Bool = false)
|
||||
{
|
||||
#if DEBUG
|
||||
guard !self.isReleasedForTesting else { return }
|
||||
#endif
|
||||
self.advanceMenuInteraction(for: self.mergedMenu)
|
||||
self.invalidateMenus(refreshOpenMenus: refreshOpenMenus)
|
||||
if deferRendering {
|
||||
self.scheduleProviderSelectionUIRefresh()
|
||||
return
|
||||
}
|
||||
self.refreshProviderSelectionRendering()
|
||||
}
|
||||
|
||||
private func scheduleProviderSelectionUIRefresh() {
|
||||
self.providerSelectionUIRefreshTask?.cancel()
|
||||
self.providerSelectionUIRefreshTask = Task { @MainActor [weak self] in
|
||||
await Task.yield()
|
||||
guard !Task.isCancelled, let self else { return }
|
||||
self.refreshProviderSelectionRendering()
|
||||
self.providerSelectionUIRefreshTask = nil
|
||||
}
|
||||
}
|
||||
|
||||
private func refreshProviderSelectionRendering() {
|
||||
self.updateAnimationState()
|
||||
self.updateBlinkingState()
|
||||
let phase: Double? = self.needsMenuBarIconAnimation() ? self.animationPhase : nil
|
||||
self.applyIcon(phase: phase)
|
||||
}
|
||||
|
||||
func navigateProviderSwitcher(
|
||||
_ direction: StatusItemMenuProviderNavigationDirection,
|
||||
menu: NSMenu? = nil)
|
||||
{
|
||||
guard self.shouldMergeIcons else { return }
|
||||
let enabledProviders = self.store.enabledProvidersForDisplay()
|
||||
guard enabledProviders.count > 1 else { return }
|
||||
|
||||
let includesOverview = !self.settings.resolvedMergedOverviewProviders(
|
||||
activeProviders: enabledProviders,
|
||||
maxVisibleProviders: SettingsStore.mergedOverviewProviderLimit).isEmpty
|
||||
var selections = enabledProviders.map(ProviderSwitcherSelection.provider)
|
||||
if includesOverview {
|
||||
selections.insert(.overview, at: 0)
|
||||
}
|
||||
|
||||
let current: ProviderSwitcherSelection = if includesOverview,
|
||||
self.settings.mergedMenuLastSelectedWasOverview
|
||||
{
|
||||
.overview
|
||||
} else {
|
||||
.provider(self.navigationResolvedProvider(enabledProviders: enabledProviders) ?? .codex)
|
||||
}
|
||||
guard let currentIndex = selections.firstIndex(of: current) else { return }
|
||||
|
||||
let delta = direction == .next ? 1 : -1
|
||||
let nextIndex = (currentIndex + delta + selections.count) % selections.count
|
||||
let selection = selections[nextIndex]
|
||||
let menuProvider: UsageProvider = switch selection {
|
||||
case .overview:
|
||||
self.navigationResolvedProvider(enabledProviders: enabledProviders) ?? .codex
|
||||
case let .provider(provider):
|
||||
provider
|
||||
}
|
||||
self.preservingMergedSwitcherContentCachesDuringInvalidation {
|
||||
switch selection {
|
||||
case .overview:
|
||||
self.settings.mergedMenuLastSelectedWasOverview = true
|
||||
self.lastMenuProvider = self.navigationResolvedProvider(enabledProviders: enabledProviders) ?? .codex
|
||||
case let .provider(provider):
|
||||
self.settings.mergedMenuLastSelectedWasOverview = false
|
||||
self.selectedMenuProvider = provider
|
||||
self.lastMenuProvider = provider
|
||||
}
|
||||
self.lastMergedSwitcherSelection = selection
|
||||
self.refreshProviderSelectionDependentUI(deferRendering: true)
|
||||
}
|
||||
let trackedMenu = menu ?? self.providerSwitcherShortcutMenuID.flatMap { self.openMenus[$0] }
|
||||
if let trackedMenu {
|
||||
self.requestProviderSwitcherMenuRebuild(
|
||||
trackedMenu,
|
||||
provider: menuProvider)
|
||||
}
|
||||
}
|
||||
|
||||
private func navigationResolvedProvider(enabledProviders: [UsageProvider]) -> UsageProvider? {
|
||||
if enabledProviders.isEmpty {
|
||||
return .codex
|
||||
}
|
||||
if let selected = self.selectedMenuProvider, enabledProviders.contains(selected) {
|
||||
return selected
|
||||
}
|
||||
return enabledProviders.first(where: { self.store.isProviderAvailable($0) }) ?? enabledProviders.first
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user