Files
phbar/Sources/phbar/Controllers/PHController.swift
T
2026-07-12 00:08:46 +02:00

76 lines
1.5 KiB
Swift

import SwiftUI
@MainActor
final class PHController: ObservableObject {
let config: PHConfig
let screen: NSScreen
let theme: PHTheme
var debug: Bool = false {
didSet {
for block in blocks {
block.debug = debug
}
}
}
@Published var blocks: [PHBlock]
var arrangedBlocks: [PHBlock] {
blocks.filter { $0.centered != true }
}
var centeredBlocks: [PHBlock] {
blocks.filter { $0.centered == true }
}
init(config: PHConfig, screen: NSScreen, theme: PHTheme, blocks: [PHBlock]) {
self.config = config
self.screen = screen
self.theme = theme
self.blocks = blocks
for block in blocks {
block.style = style(for: block)
}
}
}
// Style
extension PHController {
func style(for block: PHBlock) -> PHThemeStyle {
guard let style = theme.styles.first(where: { $0.name == block.styleName }) else {
guard let defaultStyle = theme.styles.first(where: { $0.name == "default" }) else {
return PHThemeStyle.default
}
return defaultStyle
}
return style
}
}
// Refresh
extension PHController {
/// Start auto-refresh for every block.
func startAutoRefresh() {
for block in blocks {
block.startAutoRefresh()
}
}
/// Stop auto-refresh for every block.
func stopAutoRefresh() {
for block in blocks {
block.stopAutoRefresh()
}
}
/// Force every block to recompute its label immediately (manual refresh).
/// Each block updates concurrently; the view refreshes as results arrive.
func refresh() {
for block in blocks {
Task { await block.update() }
}
}
}