From 21c050d19a0c52fb0811e68fe8499d11e2963e9c Mon Sep 17 00:00:00 2001 From: Serhiy Mytrovtsiy Date: Mon, 8 Jul 2019 21:51:55 +0200 Subject: [PATCH] now color and label preferences menu not global, but local for each module --- Stats/AppDelegate.swift | 9 ------ Stats/MenuBar.swift | 18 ----------- Stats/Modules/Battery/Battery.swift | 14 ++++++++ Stats/Modules/CPU/CPU.swift | 48 ++++++++++++++++++++++----- Stats/Modules/Disk/Disk.swift | 25 ++++++++++++--- Stats/Modules/Memory/Memory.swift | 46 ++++++++++++++++++++++---- Stats/Modules/Module.swift | 49 ++++++++++++---------------- Stats/Modules/Network/Network.swift | 2 ++ Stats/Widgets/BatteryView.swift | 11 ++++++- Stats/Widgets/Chart.swift | 17 ++++++++-- Stats/Widgets/Mini.swift | 12 +++++-- Stats/Widgets/NetworkView.swift | 50 +++++++++++++++++++++++++++++ Stats/Widgets/Widget.swift | 4 +++ Stats/libs/Extensions.swift | 12 +++---- 14 files changed, 231 insertions(+), 86 deletions(-) diff --git a/Stats/AppDelegate.swift b/Stats/AppDelegate.swift index 4b46408a..7239eff9 100755 --- a/Stats/AppDelegate.swift +++ b/Stats/AppDelegate.swift @@ -14,8 +14,6 @@ extension Notification.Name { } let modules: Observable<[Module]> = Observable([CPU(), Memory(), Disk(), Battery(), Network()]) -let colors: Observable = Observable(true) -let labelForChart: Observable = Observable(true) let updater = macAppUpdater(user: "exelban", repo: "stats") @@ -50,8 +48,6 @@ class AppDelegate: NSObject, NSApplicationDelegate { } } - colors << (defaults.object(forKey: "colors") != nil ? defaults.bool(forKey: "colors") : false) - labelForChart << (defaults.object(forKey: "labelForChart") != nil ? defaults.bool(forKey: "labelForChart") : false) _ = MenuBar(menuBarItem, menuBarButton: menuBarButton) let launcherAppId = "eu.exelban.StatsLauncher" @@ -65,11 +61,6 @@ class AppDelegate: NSObject, NSApplicationDelegate { self.defaults.set(true, forKey: "runAtLogin") } - if defaults.object(forKey: "labelForChart") == nil { - self.defaults.set(true, forKey: "labelForChart") - labelForChart << true - } - if defaults.object(forKey: "dockIcon") != nil { let dockIconStatus = defaults.bool(forKey: "dockIcon") ? NSApplication.ActivationPolicy.regular : NSApplication.ActivationPolicy.accessory NSApp.setActivationPolicy(dockIconStatus) diff --git a/Stats/MenuBar.swift b/Stats/MenuBar.swift index 0c4c9d4e..b4c4dc60 100644 --- a/Stats/MenuBar.swift +++ b/Stats/MenuBar.swift @@ -60,16 +60,6 @@ class MenuBar { let preferences = NSMenuItem(title: "Preferences", action: nil, keyEquivalent: "") let preferencesMenu = NSMenu() - let colorStatus = NSMenuItem(title: "Colors", action: #selector(toggleMenu), keyEquivalent: "") - colorStatus.state = defaults.bool(forKey: "colors") ? NSControl.StateValue.on : NSControl.StateValue.off - colorStatus.target = self - preferencesMenu.addItem(colorStatus) - - let chartLabels = NSMenuItem(title: "Label in chart", action: #selector(toggleMenu), keyEquivalent: "") - chartLabels.state = defaults.bool(forKey: "labelForChart") || defaults.object(forKey: "labelForChart") == nil ? NSControl.StateValue.on : NSControl.StateValue.off - chartLabels.target = self - preferencesMenu.addItem(chartLabels) - let runAtLogin = NSMenuItem(title: "Start at login", action: #selector(toggleMenu), keyEquivalent: "") runAtLogin.state = defaults.bool(forKey: "runAtLogin") || defaults.object(forKey: "runAtLogin") == nil ? NSControl.StateValue.on : NSControl.StateValue.off runAtLogin.target = self @@ -126,14 +116,6 @@ class MenuBar { let iconStatus = status ? NSApplication.ActivationPolicy.regular : NSApplication.ActivationPolicy.accessory NSApp.setActivationPolicy(iconStatus) return - case "Colors": - self.defaults.set(status, forKey: "colors") - colors << status - return - case "Label in chart": - self.defaults.set(status, forKey: "labelForChart") - labelForChart << status - return default: break } } diff --git a/Stats/Modules/Battery/Battery.swift b/Stats/Modules/Battery/Battery.swift index 4b43f5a6..7ead5e5f 100644 --- a/Stats/Modules/Battery/Battery.swift +++ b/Stats/Modules/Battery/Battery.swift @@ -16,6 +16,7 @@ class Battery: Module { var submenu: NSMenu = NSMenu() var active: Observable var available: Observable + var color: Observable var reader: Reader = BatteryReader() let defaults = UserDefaults.standard @@ -26,6 +27,7 @@ class Battery: Module { self.available = Observable(self.reader.available) self.active = Observable(defaults.object(forKey: name) != nil ? defaults.bool(forKey: name) : true) self.percentageView = Observable(defaults.object(forKey: "\(self.name)_percentage") != nil ? defaults.bool(forKey: "\(self.name)_percentage") : false) + self.color = Observable(defaults.object(forKey: "\(name)_color") != nil ? defaults.bool(forKey: "\(name)_color") : false) self.view = BatteryView(frame: NSMakeRect(0, 0, MODULE_WIDTH, MODULE_HEIGHT)) initMenu() initWidget() @@ -69,7 +71,13 @@ class Battery: Module { percentage.state = defaults.bool(forKey: "\(self.name)_percentage") ? NSControl.StateValue.on : NSControl.StateValue.off percentage.target = self + let color = NSMenuItem(title: "Color", action: #selector(toggleColor), keyEquivalent: "") + color.state = defaults.bool(forKey: "\(name)_color") ? NSControl.StateValue.on : NSControl.StateValue.off + color.target = self + submenu.addItem(percentage) + submenu.addItem(color) + menu.submenu = submenu } @@ -97,5 +105,11 @@ class Battery: Module { self.percentageView << state self.initWidget() } + + @objc func toggleColor(_ sender: NSMenuItem) { + sender.state = sender.state == NSControl.StateValue.on ? NSControl.StateValue.off : NSControl.StateValue.on + self.defaults.set(sender.state == NSControl.StateValue.on, forKey: "\(name)_color") + self.color << (sender.state == NSControl.StateValue.on) + } } diff --git a/Stats/Modules/CPU/CPU.swift b/Stats/Modules/CPU/CPU.swift index 211fe05d..9e307a62 100644 --- a/Stats/Modules/CPU/CPU.swift +++ b/Stats/Modules/CPU/CPU.swift @@ -16,6 +16,7 @@ class CPU: Module { var submenu: NSMenu = NSMenu() var active: Observable var available: Observable + var color: Observable var reader: Reader = CPUReader() let defaults = UserDefaults.standard @@ -25,17 +26,17 @@ class CPU: Module { self.available = Observable(true) self.active = Observable(defaults.object(forKey: name) != nil ? defaults.bool(forKey: name) : true) self.widgetType = defaults.object(forKey: "\(name)_widget") != nil ? defaults.float(forKey: "\(name)_widget") : Widgets.Mini + self.color = Observable(defaults.object(forKey: "\(name)_color") != nil ? defaults.bool(forKey: "\(name)_color") : false) initMenu() initWidget() - labelForChart.subscribe(observer: self) { (value, _) in - guard let chartView: Chart = self.view as? Chart else { - return - } - self.active << false - chartView.toggleLabel(value: value) - self.active << true + let labelStatus = defaults.bool(forKey: "\(name)_label") || defaults.object(forKey: "\(name)_label") == nil ? true : false + guard let chartView: Chart = self.view as? Chart else { + return } + self.active << false + chartView.toggleLabel(value: labelStatus) + self.active << true } func initMenu() { @@ -61,10 +62,23 @@ class CPU: Module { chartWithValue.state = self.widgetType == Widgets.ChartWithValue ? NSControl.StateValue.on : NSControl.StateValue.off chartWithValue.target = self + let color = NSMenuItem(title: "Color", action: #selector(toggleColor), keyEquivalent: "") + color.state = defaults.bool(forKey: "\(name)_color") ? NSControl.StateValue.on : NSControl.StateValue.off + color.target = self + + let label = NSMenuItem(title: "Label", action: #selector(toggleLabel), keyEquivalent: "") + label.state = defaults.bool(forKey: "\(name)_label") || defaults.object(forKey: "\(name)_label") == nil ? NSControl.StateValue.on : NSControl.StateValue.off + label.target = self + submenu.addItem(mini) submenu.addItem(chart) submenu.addItem(chartWithValue) + submenu.addItem(NSMenuItem.separator()) + + submenu.addItem(label) + submenu.addItem(color) + menu.submenu = submenu } @@ -111,7 +125,25 @@ class CPU: Module { self.defaults.set(widgetCode, forKey: "\(name)_widget") self.widgetType = widgetCode self.active << false - initWidget() + initWidget(color: defaults.object(forKey: "\(name)_color") != nil ? defaults.bool(forKey: "\(name)_color") : false) + self.active << true + } + + @objc func toggleColor(_ sender: NSMenuItem) { + sender.state = sender.state == NSControl.StateValue.on ? NSControl.StateValue.off : NSControl.StateValue.on + self.defaults.set(sender.state == NSControl.StateValue.on, forKey: "\(name)_color") + self.color << (sender.state == NSControl.StateValue.on) + } + + @objc func toggleLabel(_ sender: NSMenuItem) { + sender.state = sender.state == NSControl.StateValue.on ? NSControl.StateValue.off : NSControl.StateValue.on + self.defaults.set(sender.state == NSControl.StateValue.on, forKey: "\(name)_label") + + guard let chartView: Chart = self.view as? Chart else { + return + } + self.active << false + chartView.toggleLabel(value: sender.state == NSControl.StateValue.on) self.active << true } } diff --git a/Stats/Modules/Disk/Disk.swift b/Stats/Modules/Disk/Disk.swift index aba607c6..a8580c64 100644 --- a/Stats/Modules/Disk/Disk.swift +++ b/Stats/Modules/Disk/Disk.swift @@ -19,6 +19,8 @@ class Disk: Module { var active: Observable var available: Observable + var color: Observable + var reader: Reader = DiskReader() @IBOutlet weak var value: NSTextField! @@ -27,23 +29,30 @@ class Disk: Module { self.available = Observable(true) self.active = Observable(defaults.object(forKey: name) != nil ? defaults.bool(forKey: name) : true) self.widgetType = defaults.object(forKey: "\(name)_widget") != nil ? defaults.float(forKey: "\(name)_widget") : Widgets.Mini + self.color = Observable(defaults.object(forKey: "\(name)_color") != nil ? defaults.bool(forKey: "\(name)_color") : false) self.initMenu() - - let widget = Mini(frame: NSMakeRect(0, 0, MODULE_WIDTH, MODULE_HEIGHT)) - widget.label = self.shortName - self.view = widget + self.initWidget() } func initMenu() { menu = NSMenuItem(title: name, action: #selector(toggle), keyEquivalent: "") + submenu = NSMenu() + if defaults.object(forKey: name) != nil { menu.state = defaults.bool(forKey: name) ? NSControl.StateValue.on : NSControl.StateValue.off } else { menu.state = NSControl.StateValue.on } menu.target = self - menu.isEnabled = true + + let color = NSMenuItem(title: "Color", action: #selector(toggleColor), keyEquivalent: "") + color.state = defaults.bool(forKey: "\(name)_color") ? NSControl.StateValue.on : NSControl.StateValue.off + color.target = self + + submenu.addItem(color) + + menu.submenu = submenu } @objc func toggle(_ sender: NSMenuItem) { @@ -59,4 +68,10 @@ class Disk: Module { self.start() } } + + @objc func toggleColor(_ sender: NSMenuItem) { + sender.state = sender.state == NSControl.StateValue.on ? NSControl.StateValue.off : NSControl.StateValue.on + self.defaults.set(sender.state == NSControl.StateValue.on, forKey: "\(name)_color") + self.color << (sender.state == NSControl.StateValue.on) + } } diff --git a/Stats/Modules/Memory/Memory.swift b/Stats/Modules/Memory/Memory.swift index dd4fb1af..7d883e81 100644 --- a/Stats/Modules/Memory/Memory.swift +++ b/Stats/Modules/Memory/Memory.swift @@ -16,6 +16,7 @@ class Memory: Module { var submenu: NSMenu = NSMenu() var active: Observable var available: Observable + var color: Observable var reader: Reader = MemoryReader() var widgetType: WidgetType @@ -27,17 +28,17 @@ class Memory: Module { self.available = Observable(true) self.active = Observable(defaults.object(forKey: name) != nil ? defaults.bool(forKey: name) : true) self.widgetType = defaults.object(forKey: "\(name)_widget") != nil ? defaults.float(forKey: "\(name)_widget") : Widgets.Mini + self.color = Observable(defaults.object(forKey: "\(name)_color") != nil ? defaults.bool(forKey: "\(name)_color") : false) initMenu() initWidget() - labelForChart.subscribe(observer: self) { (value, _) in - guard let chartView: Chart = self.view as? Chart else { - return - } - self.active << false - chartView.toggleLabel(value: value) - self.active << true + let labelStatus = defaults.bool(forKey: "\(name)_label") || defaults.object(forKey: "\(name)_label") == nil ? true : false + guard let chartView: Chart = self.view as? Chart else { + return } + self.active << false + chartView.toggleLabel(value: labelStatus) + self.active << true } func initMenu() { @@ -63,10 +64,23 @@ class Memory: Module { chartWithValue.state = self.widgetType == Widgets.ChartWithValue ? NSControl.StateValue.on : NSControl.StateValue.off chartWithValue.target = self + let color = NSMenuItem(title: "Color", action: #selector(toggleColor), keyEquivalent: "") + color.state = defaults.bool(forKey: "\(name)_color") ? NSControl.StateValue.on : NSControl.StateValue.off + color.target = self + + let label = NSMenuItem(title: "Label", action: #selector(toggleLabel), keyEquivalent: "") + label.state = defaults.bool(forKey: "\(name)_label") || defaults.object(forKey: "\(name)_label") == nil ? NSControl.StateValue.on : NSControl.StateValue.off + label.target = self + submenu.addItem(mini) submenu.addItem(chart) submenu.addItem(chartWithValue) + submenu.addItem(NSMenuItem.separator()) + + submenu.addItem(label) + submenu.addItem(color) + menu.submenu = submenu } @@ -117,4 +131,22 @@ class Memory: Module { self.initWidget() self.active << true } + + @objc func toggleColor(_ sender: NSMenuItem) { + sender.state = sender.state == NSControl.StateValue.on ? NSControl.StateValue.off : NSControl.StateValue.on + self.defaults.set(sender.state == NSControl.StateValue.on, forKey: "\(name)_color") + self.color << (sender.state == NSControl.StateValue.on) + } + + @objc func toggleLabel(_ sender: NSMenuItem) { + sender.state = sender.state == NSControl.StateValue.on ? NSControl.StateValue.off : NSControl.StateValue.on + self.defaults.set(sender.state == NSControl.StateValue.on, forKey: "\(name)_label") + + guard let chartView: Chart = self.view as? Chart else { + return + } + self.active << false + chartView.toggleLabel(value: sender.state == NSControl.StateValue.on) + self.active << true + } } diff --git a/Stats/Modules/Module.swift b/Stats/Modules/Module.swift index d95a77dc..759a9136 100644 --- a/Stats/Modules/Module.swift +++ b/Stats/Modules/Module.swift @@ -18,6 +18,8 @@ protocol Module: class { var active: Observable { get } var available: Observable { get } + var color: Observable { get set } + var reader: Reader { get } func start() @@ -25,43 +27,33 @@ protocol Module: class { } extension Module { - func initWidget() { + func initWidget(color: Bool = false) { + var widget: Widget = Mini(frame: NSMakeRect(0, 0, MODULE_WIDTH, MODULE_HEIGHT)) + switch self.widgetType { case Widgets.Mini: - let widget = Mini(frame: NSMakeRect(0, 0, MODULE_WIDTH, MODULE_HEIGHT)) - widget.label = self.shortName - self.view = widget - break + widget = Mini(frame: NSMakeRect(0, 0, MODULE_WIDTH, MODULE_HEIGHT)) case Widgets.Chart: - let widget = Chart(frame: NSMakeRect(0, 0, MODULE_WIDTH + 7, MODULE_HEIGHT)) - widget.label = self.shortName - self.view = widget - break + widget = Chart(frame: NSMakeRect(0, 0, MODULE_WIDTH + 7, MODULE_HEIGHT)) case Widgets.ChartWithValue: - let widget = ChartWithValue(frame: NSMakeRect(0, 0, MODULE_WIDTH + 7, MODULE_HEIGHT)) - widget.label = self.shortName - self.view = widget - break + widget = ChartWithValue(frame: NSMakeRect(0, 0, MODULE_WIDTH + 7, MODULE_HEIGHT)) case Widgets.NetworkDots: - self.view = NetworkDotsView(frame: NSMakeRect(0, 0, MODULE_WIDTH, MODULE_HEIGHT)) - break + widget = NetworkDotsView(frame: NSMakeRect(0, 0, MODULE_WIDTH, MODULE_HEIGHT)) case Widgets.NetworkArrows: - self.view = NetworkArrowsView(frame: NSMakeRect(0, 0, MODULE_WIDTH, MODULE_HEIGHT)) - break + widget = NetworkArrowsView(frame: NSMakeRect(0, 0, MODULE_WIDTH, MODULE_HEIGHT)) case Widgets.NetworkText: - self.view = NetworkTextView(frame: NSMakeRect(0, 0, MODULE_WIDTH, MODULE_HEIGHT)) - break + widget = NetworkTextView(frame: NSMakeRect(0, 0, MODULE_WIDTH, MODULE_HEIGHT)) case Widgets.NetworkDotsWithText: - self.view = NetworkDotsTextView(frame: NSMakeRect(0, 0, MODULE_WIDTH, MODULE_HEIGHT)) - break + widget = NetworkDotsTextView(frame: NSMakeRect(0, 0, MODULE_WIDTH, MODULE_HEIGHT)) case Widgets.NetworkArrowsWithText: - self.view = NetworkArrowsTextView(frame: NSMakeRect(0, 0, MODULE_WIDTH, MODULE_HEIGHT)) - break + widget = NetworkArrowsTextView(frame: NSMakeRect(0, 0, MODULE_WIDTH, MODULE_HEIGHT)) default: - let widget = Mini(frame: NSMakeRect(0, 0, MODULE_WIDTH, MODULE_HEIGHT)) - widget.label = self.shortName - self.view = widget + widget = Mini(frame: NSMakeRect(0, 0, MODULE_WIDTH, MODULE_HEIGHT)) } + + widget.label = self.shortName + widget.color(state: self.color.value) + self.view = widget as! NSView } func start() { @@ -82,10 +74,11 @@ extension Module { } } - colors.subscribe(observer: self) { (value, _) in + self.color.subscribe(observer: self) { (value, _) in guard let widget = self.view as? Widget else { return } + widget.color(state: value) widget.redraw() } } @@ -93,6 +86,6 @@ extension Module { func stop() { self.reader.stop() self.reader.value.unsubscribe(observer: self) - colors.unsubscribe(observer: self) + self.color.unsubscribe(observer: self) } } diff --git a/Stats/Modules/Network/Network.swift b/Stats/Modules/Network/Network.swift index f5f2b6e2..3ed2cf33 100644 --- a/Stats/Modules/Network/Network.swift +++ b/Stats/Modules/Network/Network.swift @@ -16,6 +16,7 @@ class Network: Module { var submenu: NSMenu = NSMenu() var active: Observable var available: Observable + var color: Observable var reader: Reader = NetworkReader() var widgetType: WidgetType = 2.0 @@ -25,6 +26,7 @@ class Network: Module { self.available = Observable(self.reader.available) self.active = Observable(defaults.object(forKey: name) != nil ? defaults.bool(forKey: name) : true) self.widgetType = defaults.object(forKey: "\(name)_widget") != nil ? defaults.float(forKey: "\(name)_widget") : Widgets.NetworkDots + self.color = Observable(defaults.object(forKey: "\(name)_color") != nil ? defaults.bool(forKey: "\(name)_color") : false) initMenu() initWidget() } diff --git a/Stats/Widgets/BatteryView.swift b/Stats/Widgets/BatteryView.swift index 8db7eb15..c96e9738 100644 --- a/Stats/Widgets/BatteryView.swift +++ b/Stats/Widgets/BatteryView.swift @@ -9,9 +9,12 @@ import Cocoa class BatteryView: NSView, Widget { + var label: String = "" + let batteryWidth: CGFloat = 32 let percentageWidth: CGFloat = 40 + var color: Bool = false var value: Double { didSet { self.redraw() @@ -72,7 +75,7 @@ class BatteryView: NSView, Widget { let maxWidth = w-4 let inner = NSBezierPath(roundedRect: NSRect(x: x+0.5, y: y+1.5, width: maxWidth*CGFloat(self.value), height: h-3), xRadius: 0.5, yRadius: 0.5) - self.value.batteryColor().set() + self.value.batteryColor(color: self.color).set() inner.lineWidth = 0 inner.stroke() inner.close() @@ -127,6 +130,12 @@ class BatteryView: NSView, Widget { } } + func color(state: Bool) { + if self.color != state { + self.color = state + } + } + func setCharging(value: Bool) { if self.charging != value { self.charging = value diff --git a/Stats/Widgets/Chart.swift b/Stats/Widgets/Chart.swift index f044a49c..df69c9d7 100644 --- a/Stats/Widgets/Chart.swift +++ b/Stats/Widgets/Chart.swift @@ -14,6 +14,7 @@ class Chart: NSView, Widget { var label: String = "" var height: CGFloat = 0.0 + var color: Bool = false var points: [Double] { didSet { self.redraw() @@ -25,7 +26,6 @@ class Chart: NSView, Widget { super.init(frame: frame) self.wantsLayer = true self.addSubview(NSView()) - self.labelEnabled = labelForChart.value if self.labelEnabled { self.frame = CGRect(x: self.frame.origin.x, y: self.frame.origin.y, width: self.frame.size.width + labelPadding, height: self.frame.size.height) @@ -138,6 +138,12 @@ class Chart: NSView, Widget { } } + func color(state: Bool) { + if self.color != state { + self.color = state + } + } + func toggleLabel(value: Bool) { labelEnabled = value if value { @@ -182,7 +188,7 @@ class ChartWithValue: Chart { override func value(value: Double) { self.valueLabel.stringValue = "\(Int(Float(value.roundTo(decimalPlaces: 2))! * 100))%" - self.valueLabel.textColor = value.usageColor() + self.valueLabel.textColor = value.usageColor(color: self.color) if self.points.count < 50 { self.points.append(value) @@ -208,4 +214,11 @@ class ChartWithValue: Chart { self.frame = CGRect(x: self.frame.origin.x, y: self.frame.origin.y, width: self.frame.size.width - labelPadding, height: self.frame.size.height) } } + + override func color(state: Bool) { + if self.color != state { + self.color = state + self.valueLabel.textColor = self.points.last?.usageColor(color: state) + } + } } diff --git a/Stats/Widgets/Mini.swift b/Stats/Widgets/Mini.swift index a057455e..8fdd71f8 100644 --- a/Stats/Widgets/Mini.swift +++ b/Stats/Widgets/Mini.swift @@ -12,6 +12,7 @@ class Mini: NSView, Widget { var valueView: NSTextField = NSTextField() var labelView: NSTextField = NSTextField() + var color: Bool = false var value: Double = 0 var label: String = "" { didSet { @@ -66,7 +67,7 @@ class Mini: NSView, Widget { } func redraw() { - self.valueView.textColor = self.value.usageColor() + self.valueView.textColor = self.value.usageColor(color: self.color) self.needsDisplay = true setNeedsDisplay(self.frame) } @@ -76,7 +77,14 @@ class Mini: NSView, Widget { self.value = value self.valueView.stringValue = "\(Int(Float(value.roundTo(decimalPlaces: 2))! * 100))%" - self.valueView.textColor = value.usageColor() + self.valueView.textColor = value.usageColor(color: self.color) + } + } + + func color(state: Bool) { + if self.color != state { + self.color = state + self.valueView.textColor = value.usageColor(color: state) } } } diff --git a/Stats/Widgets/NetworkView.swift b/Stats/Widgets/NetworkView.swift index 90f9d984..cb9b273b 100644 --- a/Stats/Widgets/NetworkView.swift +++ b/Stats/Widgets/NetworkView.swift @@ -9,6 +9,9 @@ import Cocoa class NetworkDotsView: NSView, Widget { + var label: String = "" + + var color: Bool = false var download: Int64 { didSet { self.redraw() @@ -71,9 +74,19 @@ class NetworkDotsView: NSView, Widget { self.upload = values[1] } } + + func color(state: Bool) { + if self.color != state { + self.color = state + self.redraw() + } + } } class NetworkTextView: NSView, Widget { + var label: String = "" + + var color: Bool = false var downloadValue: NSTextField = NSTextField() var uploadValue: NSTextField = NSTextField() @@ -102,6 +115,13 @@ class NetworkTextView: NSView, Widget { uploadValue.stringValue = Units(bytes: values[1]).getReadableUnit() } + func color(state: Bool) { + if self.color != state { + self.color = state + self.redraw() + } + } + func valueView() { downloadValue = NSTextField(frame: NSMakeRect(MODULE_MARGIN, MODULE_MARGIN, self.frame.size.width - MODULE_MARGIN, 9)) downloadValue.isEditable = false @@ -133,6 +153,9 @@ class NetworkTextView: NSView, Widget { } class NetworkArrowsView: NSView, Widget { + var label: String = "" + + var color: Bool = false var download: Int64 { didSet { self.redraw() @@ -209,9 +232,19 @@ class NetworkArrowsView: NSView, Widget { self.upload = values[1] } } + + func color(state: Bool) { + if self.color != state { + self.color = state + self.redraw() + } + } } class NetworkDotsTextView: NSView, Widget { + var label: String = "" + + var color: Bool = false var download: Int64 { didSet { self.redraw() @@ -280,6 +313,13 @@ class NetworkDotsTextView: NSView, Widget { } } + func color(state: Bool) { + if self.color != state { + self.color = state + self.redraw() + } + } + func valueView() { downloadValue = NSTextField(frame: NSMakeRect(MODULE_MARGIN, MODULE_MARGIN, self.frame.size.width - MODULE_MARGIN, 9)) downloadValue.isEditable = false @@ -311,6 +351,9 @@ class NetworkDotsTextView: NSView, Widget { } class NetworkArrowsTextView: NSView, Widget { + var label: String = "" + + var color: Bool = false var download: Int64 { didSet { self.redraw() @@ -393,6 +436,13 @@ class NetworkArrowsTextView: NSView, Widget { } } + func color(state: Bool) { + if self.color != state { + self.color = state + self.redraw() + } + } + func valueView() { downloadValue = NSTextField(frame: NSMakeRect(MODULE_MARGIN, MODULE_MARGIN, self.frame.size.width - MODULE_MARGIN, 9)) downloadValue.isEditable = false diff --git a/Stats/Widgets/Widget.swift b/Stats/Widgets/Widget.swift index 5f9442a5..5e2e66ee 100644 --- a/Stats/Widgets/Widget.swift +++ b/Stats/Widgets/Widget.swift @@ -9,7 +9,11 @@ import Foundation protocol Widget { + var label: String { get set } + func value(value: Double) + func color(state: Bool) + func redraw() } diff --git a/Stats/libs/Extensions.swift b/Stats/libs/Extensions.swift index 16eb29c8..3b047c10 100755 --- a/Stats/libs/Extensions.swift +++ b/Stats/libs/Extensions.swift @@ -14,11 +14,11 @@ extension Double { return NSString(format: "%.\(decimalPlaces)f" as NSString, self) as String } - func usageColor(reversed: Bool = false) -> NSColor { - if !colors.value { + func usageColor(reversed: Bool = false, color: Bool = false) -> NSColor { + if !color { return NSColor.textColor } - + if reversed { switch self { case 0.6...0.8: @@ -40,10 +40,10 @@ extension Double { } } - func batteryColor() -> NSColor { + func batteryColor(color: Bool = false) -> NSColor { switch self { case 0.2...0.4: - if !colors.value { + if !color { return NSColor.controlTextColor } return NSColor.systemOrange @@ -51,7 +51,7 @@ extension Double { if self == 1 { return NSColor.controlTextColor } - if !colors.value { + if !color { return NSColor.controlTextColor } return NSColor.systemGreen