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