fix: added fastest fan to the popup view (#2056)

This commit is contained in:
Serhiy Mytrovtsiy
2024-08-03 21:45:04 +02:00
parent d0f4354c05
commit af2261eb2b

View File

@@ -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
}
}