From af2261eb2b60e48cb2d5260b4787168cc9f34ec4 Mon Sep 17 00:00:00 2001 From: Serhiy Mytrovtsiy Date: Sat, 3 Aug 2024 21:45:04 +0200 Subject: [PATCH] fix: added fastest fan to the popup view (#2056) --- Modules/Sensors/popup.swift | 74 ++++++++++++++++++++++--------------- 1 file changed, 45 insertions(+), 29 deletions(-) diff --git a/Modules/Sensors/popup.swift b/Modules/Sensors/popup.swift index 494cd12d..697cc8e2 100644 --- a/Modules/Sensors/popup.swift +++ b/Modules/Sensors/popup.swift @@ -20,12 +20,8 @@ private struct Sensor_t: KeyValue_p { var additional: Any? var index: Int { - get { - Store.shared.int(key: "sensors_\(self.key)_index", defaultValue: -1) - } - set { - Store.shared.set(key: "sensors_\(self.key)_index", value: newValue) - } + get { Store.shared.int(key: "sensors_\(self.key)_index", defaultValue: -1) } + set { Store.shared.set(key: "sensors_\(self.key)_index", value: newValue) } } init(key: String, value: String, name: String? = nil) { @@ -38,9 +34,7 @@ private struct Sensor_t: KeyValue_p { internal class Popup: PopupWrapper { private var list: [String: NSView] = [:] - private var unknownSensorsState: Bool { - Store.shared.bool(key: "Sensors_unknown", defaultValue: false) - } + private var unknownSensorsState: Bool { Store.shared.bool(key: "Sensors_unknown", defaultValue: false) } private var fanValueState: FanValue = .percentage private var sensors: [Sensor_p] = [] @@ -78,8 +72,8 @@ internal class Popup: PopupWrapper { internal func setup(_ values: [Sensor_p]? = nil, reload: Bool = false) { guard let values = reload ? self.sensors : values else { return } - let fans = values.filter({ $0.type == .fan && !$0.isComputed && $0.popupState }) - var sensors = values.filter({ !($0.type == .fan && $0.isComputed) }) + let fans = values.filter({ $0.type == .fan && $0.popupState }) + var sensors = values if !self.unknownSensorsState { sensors = sensors.filter({ $0.group != .unknown }) } @@ -100,15 +94,21 @@ internal class Popup: PopupWrapper { fans.forEach { (f: Sensor_p) in if let fan = f as? Fan { - let view = FanView(fan, width: self.frame.width) { [weak self] in - let h = container.arrangedSubviews.map({ $0.bounds.height + container.spacing }).reduce(0, +) - container.spacing - if container.frame.size.height != h && h >= 0 { - container.setFrameSize(NSSize(width: container.frame.width, height: h)) + if f.isComputed { + let sensor = SensorView(fan, width: self.frame.width, toggleable: false) {} + self.list[fan.key] = sensor + container.addArrangedSubview(sensor) + } else { + let view = FanView(fan, width: self.frame.width) { [weak self] in + let h = container.arrangedSubviews.map({ $0.bounds.height + container.spacing }).reduce(0, +) - container.spacing + if container.frame.size.height != h && h >= 0 { + container.setFrameSize(NSSize(width: container.frame.width, height: h)) + } + self?.recalculateHeight() } - self?.recalculateHeight() + self.list[fan.key] = view + container.addArrangedSubview(view) } - self.list[fan.key] = view - container.addArrangedSubview(view) } } @@ -158,7 +158,7 @@ internal class Popup: PopupWrapper { self.addArrangedSubview(separatorView(localizedString(typ.rawValue), width: self.frame.width)) groups.forEach { (group: SensorGroup) in filtered.filter{ $0.group == group }.forEach { (s: Sensor_p) in - let sensor = SensorView(s, width: self.frame.width) { [weak self] in + let sensor = SensorView(s, width: self.frame.width) { [weak self] in self?.recalculateHeight() } self.addArrangedSubview(sensor) @@ -280,7 +280,11 @@ internal class SensorView: NSStackView { private var openned: Bool = false - public init(_ sensor: Sensor_p, width: CGFloat, callback: @escaping (() -> Void)) { + private var fanValueState: FanValue { + FanValue(rawValue: Store.shared.string(key: "Sensors_popup_fanValue", defaultValue: FanValue.percentage.rawValue)) ?? .percentage + } + + public init(_ sensor: Sensor_p, width: CGFloat, toggleable: Bool = true, callback: @escaping (() -> Void)) { self.sizeCallback = callback super.init(frame: NSRect(x: 0, y: 0, width: width, height: 22)) @@ -289,7 +293,7 @@ internal class SensorView: NSStackView { self.distribution = .fillProportionally self.spacing = 0 - self.valueView = ValueSensorView(sensor, width: width, callback: { [weak self] in + self.valueView = ValueSensorView(sensor, width: width, toggleable: toggleable, callback: { [weak self] in self?.open() }) self.chartView = ChartSensorView(width: width, suffix: sensor.unit) @@ -306,7 +310,11 @@ internal class SensorView: NSStackView { } public func update(_ sensor: Sensor_p) { - self.valueView.update(sensor.formattedPopupValue) + var value = sensor.formattedPopupValue + if let fan = sensor as? Fan { + value = self.fanValueState == .percentage ? "\(fan.percentage)%" : fan.formattedValue + } + self.valueView.update(value) } public func addHistoryPoint(_ sensor: Sensor_p) { @@ -337,8 +345,11 @@ internal class ValueSensorView: NSStackView { }() private var valueView: ValueField = ValueField(frame: NSRect.zero) - public init(_ sensor: Sensor_p, width: CGFloat, callback: @escaping (() -> Void)) { + private let isToggleable: Bool + + public init(_ sensor: Sensor_p, width: CGFloat, toggleable: Bool = true, callback: @escaping (() -> Void)) { self.callback = callback + self.isToggleable = toggleable super.init(frame: NSRect(x: 0, y: 0, width: width, height: 22)) self.wantsLayer = true @@ -354,12 +365,14 @@ internal class ValueSensorView: NSStackView { self.addArrangedSubview(self.labelView) self.addArrangedSubview(self.valueView) - self.addTrackingArea(NSTrackingArea( - rect: NSRect(x: 0, y: 0, width: self.frame.width, height: 22), - options: [NSTrackingArea.Options.activeAlways, NSTrackingArea.Options.mouseEnteredAndExited, NSTrackingArea.Options.activeInActiveApp], - owner: self, - userInfo: nil - )) + if self.isToggleable { + self.addTrackingArea(NSTrackingArea( + rect: NSRect(x: 0, y: 0, width: self.frame.width, height: 22), + options: [NSTrackingArea.Options.activeAlways, NSTrackingArea.Options.mouseEnteredAndExited, NSTrackingArea.Options.activeInActiveApp], + owner: self, + userInfo: nil + )) + } NSLayoutConstraint.activate([ self.labelView.heightAnchor.constraint(equalToConstant: 16), @@ -377,14 +390,17 @@ internal class ValueSensorView: NSStackView { } override func mouseDown(with theEvent: NSEvent) { + guard self.isToggleable else { return } self.callback() } public override func mouseEntered(with: NSEvent) { + guard self.isToggleable else { return } self.layer?.backgroundColor = .init(gray: 0.01, alpha: 0.05) } public override func mouseExited(with: NSEvent) { + guard self.isToggleable else { return } self.layer?.backgroundColor = .none } }