76 lines
3.2 KiB
Swift
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)
|
|
}
|
|
}
|