From 678d813d7541b438afe29bd9b075a93631003f68 Mon Sep 17 00:00:00 2001 From: Serhiy Mytrovtsiy Date: Thu, 12 Mar 2026 16:52:00 +0100 Subject: [PATCH] feat: added sleep mode to the reader, in some cases there is no need for reads since the widget is not visualizing anything. In this case, the reader could go to sleep mode and be active only when popup is open. It's available only for the sensor module for now. --- Kit/Widgets/Label.swift | 2 +- Kit/module/reader.swift | 24 +++++++++++++++++++++--- Modules/Sensors/main.swift | 5 ++++- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/Kit/Widgets/Label.swift b/Kit/Widgets/Label.swift index c69f1ebc..f3a39020 100644 --- a/Kit/Widgets/Label.swift +++ b/Kit/Widgets/Label.swift @@ -11,7 +11,7 @@ import Cocoa -internal class Label: WidgetWrapper { +public class Label: WidgetWrapper { private var label: String internal init(title: String, config: NSDictionary) { diff --git a/Kit/module/reader.swift b/Kit/module/reader.swift index 41286390..cced6e7b 100644 --- a/Kit/module/reader.swift +++ b/Kit/module/reader.swift @@ -12,8 +12,9 @@ import Cocoa public protocol Reader_p { - var optional: Bool { get } var popup: Bool { get } + var preview: Bool { get } + var sleep: Bool { get } func setup() func read() @@ -28,6 +29,7 @@ public protocol Reader_p { func initStoreValues(title: String) func setInterval(_ value: Int) + func sleepMode(state: Bool) } public protocol ReaderInternal_p { @@ -55,6 +57,8 @@ open class Reader: NSObject, ReaderInternal_p { public var defaultInterval: Int = 1 public var optional: Bool = false public var popup: Bool = false + public var preview: Bool = false + public var sleep: Bool = false public var callbackHandler: (T?) -> Void @@ -73,8 +77,9 @@ open class Reader: NSObject, ReaderInternal_p { private var lastDBWrite: Date? = nil - public init(_ module: ModuleType, popup: Bool = false, history: Bool = false, callback: @escaping (T?) -> Void = {_ in }) { + public init(_ module: ModuleType, popup: Bool = false, preview: Bool = false, history: Bool = false, callback: @escaping (T?) -> Void = {_ in }) { self.popup = popup + self.preview = preview self.module = module self.history = history self.callbackHandler = callback @@ -121,7 +126,7 @@ open class Reader: NSObject, ReaderInternal_p { open func terminate() {} open func start() { - if self.popup && self.locked { + if (self.popup || self.preview) && self.locked { DispatchQueue.global(qos: .background).async { self.read() } @@ -169,6 +174,19 @@ open class Reader: NSObject, ReaderInternal_p { public func save(_ value: T) { DB.shared.insert(key: "\(self.module.stringValue)@\(self.name)", value: value, ts: self.history, force: true) } + + public func sleepMode(state: Bool) { + guard state != self.sleep else { return } + + debug("Sleep mode: \(state ? "on" : "off")", log: self.log) + self.sleep = state + + if state { + self.pause() + } else { + self.start() + } + } } extension Reader: Reader_p { diff --git a/Modules/Sensors/main.swift b/Modules/Sensors/main.swift index 02701c47..3804616d 100644 --- a/Modules/Sensors/main.swift +++ b/Modules/Sensors/main.swift @@ -106,7 +106,10 @@ public class Sensors: Module { self.portalView.usageCallback(value.sensors) self.notificationsView.usageCallback(value.sensors) - self.menuBar.widgets.filter{ $0.isActive }.forEach { (w: SWidget) in + let activeWidgets = self.menuBar.widgets.filter{ $0.isActive } + self.sensorsReader?.sleepMode(state: activeWidgets.contains(where: {$0.item is Label}) && activeWidgets.count == 1) + + activeWidgets.forEach { (w: SWidget) in switch w.item { case let widget as Mini: if let active = value.sensors.first(where: { $0.key == self.selectedSensor }) {