From 918a07150b7fd8a0d4d3f533e635e6f07f876148 Mon Sep 17 00:00:00 2001 From: Serhiy Mytrovtsiy Date: Mon, 2 Aug 2021 20:11:48 +0200 Subject: [PATCH] feat: change value type from Double to ColorValue in the BarChart (#441) --- Kit/Widgets/BarChart.swift | 82 +++++++++++++++++++------------------- Kit/types.swift | 15 +++++++ Modules/Battery/main.swift | 2 +- Modules/CPU/main.swift | 7 +++- Modules/Disk/main.swift | 2 +- Modules/Fans/main.swift | 4 +- Modules/GPU/main.swift | 2 +- Modules/RAM/main.swift | 4 +- 8 files changed, 69 insertions(+), 49 deletions(-) diff --git a/Kit/Widgets/BarChart.swift b/Kit/Widgets/BarChart.swift index 2d26c131..e1c26cf1 100644 --- a/Kit/Widgets/BarChart.swift +++ b/Kit/Widgets/BarChart.swift @@ -18,7 +18,7 @@ public class BarChart: WidgetWrapper { private var colorState: Color = .systemAccent private var colors: [Color] = Color.allCases - private var value: [Double] = [] + private var value: [[ColorValue]] = [[]] private var pressureLevel: Int = 0 private var colorZones: colorZones = (0.6, 0.8) @@ -38,7 +38,7 @@ public class BarChart: WidgetWrapper { if let previewConfig = config!["Preview"] as? NSDictionary { configuration = previewConfig if let value = configuration["Value"] as? String { - self.value = value.split(separator: ",").map{ (Double($0) ?? 0) } + self.value = value.split(separator: ",").map{ ([ColorValue(Double($0) ?? 0)]) } } } } @@ -77,7 +77,7 @@ public class BarChart: WidgetWrapper { if preview { if self.value.isEmpty { - self.value = [0.72, 0.38] + self.value = [[ColorValue(0.72)], [ColorValue(0.38)]] } self.setFrameSize(NSSize(width: 36, height: self.frame.size.height)) self.invalidateIntrinsicContentSize() @@ -124,10 +124,10 @@ public class BarChart: WidgetWrapper { NSAttributedString.Key.foregroundColor: NSColor.textColor, NSAttributedString.Key.paragraphStyle: style ] - + let letterHeight = self.frame.height / 3 let letterWidth: CGFloat = 6.0 - + var yMargin: CGFloat = 0 for char in String(self.title.prefix(3)).uppercased().reversed() { let rect = CGRect(x: x, y: yMargin, width: letterWidth, height: letterHeight) @@ -135,7 +135,7 @@ public class BarChart: WidgetWrapper { str.draw(with: rect) yMargin += letterHeight } - + width += letterWidth + Constants.Widget.spacing x = letterWidth + Constants.Widget.spacing } @@ -161,26 +161,35 @@ public class BarChart: WidgetWrapper { x += offset for i in 0.. NSView { - let rowHeight: CGFloat = 30 - let settingsNumber: CGFloat = 4 - let height: CGFloat = ((rowHeight + Constants.Settings.margin) * settingsNumber) + Constants.Settings.margin + let view = SettingsContainerView(width: width) - let view: NSView = NSView(frame: NSRect( - x: Constants.Settings.margin, - y: Constants.Settings.margin, - width: width - (Constants.Settings.margin*2), - height: height - )) - - view.addSubview(toggleTitleRow( - frame: NSRect(x: 0, y: (rowHeight + Constants.Settings.margin) * 3, width: view.frame.width, height: rowHeight), + view.addArrangedSubview(toggleTitleRow( + frame: NSRect(x: 0, y: 0, width: view.frame.width, height: Constants.Settings.row), title: localizedString("Label"), action: #selector(toggleLabel), state: self.labelState )) self.boxSettingsView = toggleTitleRow( - frame: NSRect(x: 0, y: (rowHeight + Constants.Settings.margin) * 2, width: view.frame.width, height: rowHeight), + frame: NSRect(x: 0, y: 0, width: view.frame.width, height: Constants.Settings.row), title: localizedString("Box"), action: #selector(toggleBox), state: self.boxState ) - view.addSubview(self.boxSettingsView!) + view.addArrangedSubview(self.boxSettingsView!) self.frameSettingsView = toggleTitleRow( - frame: NSRect(x: 0, y: (rowHeight + Constants.Settings.margin) * 1, width: view.frame.width, height: rowHeight), + frame: NSRect(x: 0, y: 0, width: view.frame.width, height: Constants.Settings.row), title: localizedString("Frame"), action: #selector(toggleFrame), state: self.frameState ) - view.addSubview(self.frameSettingsView!) + view.addArrangedSubview(self.frameSettingsView!) - view.addSubview(selectRow( - frame: NSRect(x: 0, y: (rowHeight + Constants.Settings.margin) * 0, width: view.frame.width, height: rowHeight), + view.addArrangedSubview(selectRow( + frame: NSRect(x: 0, y: 0, width: view.frame.width, height: Constants.Settings.row), title: localizedString("Color"), action: #selector(toggleColor), items: self.colors, diff --git a/Kit/types.swift b/Kit/types.swift index 5bba6d46..5eae497b 100644 --- a/Kit/types.swift +++ b/Kit/types.swift @@ -11,6 +11,21 @@ import Cocoa +public struct ColorValue: Equatable { + public let value: Double + public let color: NSColor? + + public init(_ value: Double, color: NSColor? = nil) { + self.value = value + self.color = color + } + + // swiftlint:disable operator_whitespace + public static func ==(lhs: ColorValue, rhs: ColorValue) -> Bool { + return lhs.value == rhs.value + } +} + public enum AppUpdateInterval: String { case atStart = "At start" case separator1 = "separator_1" diff --git a/Modules/Battery/main.swift b/Modules/Battery/main.swift index c47b5b30..3bf1f96e 100644 --- a/Modules/Battery/main.swift +++ b/Modules/Battery/main.swift @@ -112,7 +112,7 @@ public class Battery: Module { self.widgets.filter{ $0.isActive }.forEach { (w: Widget) in switch w.item { case let widget as Mini: widget.setValue(abs(value.level)) - case let widget as BarChart: widget.setValue([value.level]) + case let widget as BarChart: widget.setValue([[ColorValue(value.level)]]) case let widget as BatterykWidget: widget.setValue( percentage: value.level , diff --git a/Modules/CPU/main.swift b/Modules/CPU/main.swift index dbef299a..11c3f7e3 100644 --- a/Modules/CPU/main.swift +++ b/Modules/CPU/main.swift @@ -128,7 +128,12 @@ public class CPU: Module { switch w.item { case let widget as Mini: widget.setValue(value.totalUsage) case let widget as LineChart: widget.setValue(value.totalUsage) - case let widget as BarChart: widget.setValue(self.usagePerCoreState ? value.usagePerCore : [value.totalUsage]) + case let widget as BarChart: + var val: [[ColorValue]] = [[ColorValue(value.totalUsage)]] + if self.usagePerCoreState { + val = value.usagePerCore.map({ [ColorValue($0)] }) + } + widget.setValue(val) case let widget as PieChart: widget.setValue([ circle_segment(value: value.systemLoad, color: NSColor.systemRed), diff --git a/Modules/Disk/main.swift b/Modules/Disk/main.swift index 9b2ef0fe..d1e2bf91 100644 --- a/Modules/Disk/main.swift +++ b/Modules/Disk/main.swift @@ -200,7 +200,7 @@ public class Disk: Module { self.widgets.filter{ $0.isActive }.forEach { (w: Widget) in switch w.item { case let widget as Mini: widget.setValue(percentage) - case let widget as BarChart: widget.setValue([percentage]) + case let widget as BarChart: widget.setValue([[ColorValue(percentage)]]) case let widget as MemoryWidget: widget.setValue((DiskSize(free).getReadableMemory(), DiskSize(usedSpace).getReadableMemory())) default: break } diff --git a/Modules/Fans/main.swift b/Modules/Fans/main.swift index 16c461b8..493853e8 100644 --- a/Modules/Fans/main.swift +++ b/Modules/Fans/main.swift @@ -89,12 +89,12 @@ public class Fans: Module { let label: Bool = Store.shared.bool(key: "Fans_label", defaultValue: false) var list: [KeyValue_t] = [] - var flatList: [Double] = [] + var flatList: [[ColorValue]] = [] value.forEach { (f: Fan) in if f.state { let str = label ? "\(f.name.prefix(1).uppercased()): \(Int(f.value))" : f.formattedValue list.append(KeyValue_t(key: "Fan#\(f.id)", value: str)) - flatList.append(((f.value*100)/f.maxSpeed)/100) + flatList.append([ColorValue(((f.value*100)/f.maxSpeed)/100)]) } } diff --git a/Modules/GPU/main.swift b/Modules/GPU/main.swift index 1a92eed1..8e3c56f9 100644 --- a/Modules/GPU/main.swift +++ b/Modules/GPU/main.swift @@ -133,7 +133,7 @@ public class GPU: Module { widget.setValue(utilization) widget.setTitle(self.showType ? "\(selectedGPU.type)GPU" : nil) case let widget as LineChart: widget.setValue(utilization) - case let widget as BarChart: widget.setValue([utilization]) + case let widget as BarChart: widget.setValue([[ColorValue(utilization)]]) default: break } } diff --git a/Modules/RAM/main.swift b/Modules/RAM/main.swift index 29454788..68510a72 100644 --- a/Modules/RAM/main.swift +++ b/Modules/RAM/main.swift @@ -110,6 +110,7 @@ public class RAM: Module { self.popupView.loadCallback(value) + let total: Double = value.total == 0 ? 1 : value.total self.widgets.filter{ $0.isActive }.forEach { (w: Widget) in switch w.item { case let widget as Mini: @@ -119,11 +120,10 @@ public class RAM: Module { widget.setValue(value.usage) widget.setPressure(value.pressureLevel) case let widget as BarChart: - widget.setValue([value.usage]) + widget.setValue([[ColorValue(value.usage)]]) widget.setColorZones((0.8, 0.95)) widget.setPressure(value.pressureLevel) case let widget as PieChart: - let total: Double = value.total == 0 ? 1 : value.total widget.setValue([ circle_segment(value: value.app/total, color: NSColor.systemBlue), circle_segment(value: value.wired/total, color: NSColor.systemOrange),