Files
steipete--codexbar/Sources/CodexBar/StatusItemController+CodexStackedMenu.swift
T
2026-07-13 12:22:33 +08:00

76 lines
3.2 KiB
Swift

import AppKit
extension StatusItemController {
func addStackedCodexMenuCards(
_ display: CodexAccountMenuDisplay,
to menu: NSMenu,
context: MenuCardContext)
{
let snapshotsByAccountID = Dictionary(uniqueKeysWithValues: display.snapshots.map {
($0.account.id, $0)
})
var cardIndex = 0
let sections = display.showsWorkspaceGroups ? display.workspaceSections : [
CodexAccountWorkspaceSection(title: "", accounts: display.accounts),
]
for (sectionIndex, section) in sections.enumerated() {
if display.showsWorkspaceGroups {
self.addCodexWorkspaceHeader(section.title, index: sectionIndex, to: menu)
}
for account in section.accounts {
let accountSnapshot = snapshotsByAccountID[account.id]
let health = CodexAccountHealth.status(for: account, error: accountSnapshot?.error)
let model = self.menuCardModel(
for: .codex,
snapshotOverride: accountSnapshot?.snapshot,
errorOverride: health.label,
forceOverrideCard: accountSnapshot == nil,
accountOverride: self.accountInfo(for: account))
guard let model else { continue }
menu.addItem(self.makeMenuCardItem(
UsageMenuCardView(model: model, width: context.menuWidth),
id: "menuCard-\(cardIndex)",
width: context.menuWidth,
heightCacheScope: account.id,
heightCacheFingerprint: model.heightFingerprint(section: "card"),
containsInteractiveControls: true))
cardIndex += 1
if account.id != section.accounts.last?.id {
menu.addItem(.separator())
}
}
if sectionIndex < sections.count - 1 {
menu.addItem(.separator())
}
}
if cardIndex == 0, let model = self.menuCardModel(for: context.selectedProvider) {
menu.addItem(self.makeMenuCardItem(
UsageMenuCardView(model: model, width: context.menuWidth),
id: "menuCard",
width: context.menuWidth,
heightCacheScope: context.currentProvider.rawValue,
heightCacheFingerprint: model.heightFingerprint(section: "card"),
containsInteractiveControls: true))
}
menu.addItem(.separator())
if self.addStorageMenuCardSection(to: menu, provider: context.currentProvider, width: context.menuWidth) {
menu.addItem(.separator())
}
}
private func addCodexWorkspaceHeader(_ title: String, index: Int, to menu: NSMenu) {
let header = NSMenuItem(title: title, action: nil, keyEquivalent: "")
header.isEnabled = false
header.representedObject = "codexWorkspace-\(index)"
let font = NSFont.systemFont(ofSize: NSFont.smallSystemFontSize, weight: .semibold)
header.attributedTitle = NSAttributedString(
string: title,
attributes: [.font: font, .foregroundColor: NSColor.secondaryLabelColor])
menu.addItem(header)
}
}