mirror of
https://github.com/morgan9e/macos-stats
synced 2026-04-14 00:04:15 +09:00
- fixed bug when widgets display not properly (or not shows at all)
- initialized bar chart widget - fixed few bugs
This commit is contained in:
@@ -49,6 +49,11 @@ You can download latest version [here](https://github.com/exelban/stats/releases
|
||||
|
||||
## What's new
|
||||
|
||||
### v1.2.4
|
||||
- fixed bug when widgets display not properly (or not shows at all)
|
||||
- initialized bar chart widget
|
||||
- fixed few bugs
|
||||
|
||||
### v1.2.3
|
||||
- new icon
|
||||
- small code refactoring
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
9A7B8F6B22A2C3A700DEB352 /* Disk.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A7B8F6A22A2C3A700DEB352 /* Disk.swift */; };
|
||||
9A7B8F6D22A2C3D600DEB352 /* MemoryReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A7B8F6C22A2C3D600DEB352 /* MemoryReader.swift */; };
|
||||
9A7B8F6F22A2C57000DEB352 /* DiskReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A7B8F6E22A2C57000DEB352 /* DiskReader.swift */; };
|
||||
9A9696EC22D526D900F967A5 /* BarChart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A9696EB22D526D900F967A5 /* BarChart.swift */; };
|
||||
9AFA402522AE49A200FE90BC /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9AFA402422AE49A200FE90BC /* Assets.xcassets */; };
|
||||
9AFA402822AE49A200FE90BC /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9AFA402622AE49A200FE90BC /* Main.storyboard */; };
|
||||
9AFA402F22AE49AE00FE90BC /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AFA402E22AE49AE00FE90BC /* AppDelegate.swift */; };
|
||||
@@ -82,6 +83,7 @@
|
||||
9A7B8F6A22A2C3A700DEB352 /* Disk.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Disk.swift; sourceTree = "<group>"; };
|
||||
9A7B8F6C22A2C3D600DEB352 /* MemoryReader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MemoryReader.swift; sourceTree = "<group>"; };
|
||||
9A7B8F6E22A2C57000DEB352 /* DiskReader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiskReader.swift; sourceTree = "<group>"; };
|
||||
9A9696EB22D526D900F967A5 /* BarChart.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BarChart.swift; sourceTree = "<group>"; };
|
||||
9A998CD722A199920087ADE7 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
|
||||
9A998CD922A199970087ADE7 /* ServiceManagement.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ServiceManagement.framework; path = System/Library/Frameworks/ServiceManagement.framework; sourceTree = SDKROOT; };
|
||||
9AFA401E22AE49A100FE90BC /* StatsLauncher.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = StatsLauncher.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
@@ -206,6 +208,7 @@
|
||||
9A74D59622B44498004FE1FA /* Mini.swift */,
|
||||
9A58D1B322C179B200405315 /* NetworkView.swift */,
|
||||
9A79B36922D3BEE600BF1C3A /* Widget.swift */,
|
||||
9A9696EB22D526D900F967A5 /* BarChart.swift */,
|
||||
);
|
||||
path = Widgets;
|
||||
sourceTree = "<group>";
|
||||
@@ -385,6 +388,7 @@
|
||||
9A5B1CBF229E78F0008B9D3C /* Observable.swift in Sources */,
|
||||
9A7B8F6B22A2C3A700DEB352 /* Disk.swift in Sources */,
|
||||
9A1410F9229E721100D29793 /* AppDelegate.swift in Sources */,
|
||||
9A9696EC22D526D900F967A5 /* BarChart.swift in Sources */,
|
||||
9A74D59722B44498004FE1FA /* Mini.swift in Sources */,
|
||||
9A5B1CC5229E7B40008B9D3C /* Extensions.swift in Sources */,
|
||||
9A79B36A22D3BEE600BF1C3A /* Widget.swift in Sources */,
|
||||
|
||||
@@ -17,6 +17,7 @@ class Battery: Module {
|
||||
var active: Observable<Bool>
|
||||
var available: Observable<Bool>
|
||||
var color: Observable<Bool>
|
||||
var label: Observable<Bool>
|
||||
var reader: Reader = BatteryReader()
|
||||
|
||||
let defaults = UserDefaults.standard
|
||||
@@ -28,6 +29,7 @@ class Battery: Module {
|
||||
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.label = Observable(defaults.object(forKey: "\(name)_label") != nil ? defaults.bool(forKey: "\(name)_label") : false)
|
||||
self.view = BatteryView(frame: NSMakeRect(0, 0, MODULE_WIDTH, MODULE_HEIGHT))
|
||||
initMenu()
|
||||
initWidget()
|
||||
|
||||
@@ -17,6 +17,7 @@ class CPU: Module {
|
||||
var active: Observable<Bool>
|
||||
var available: Observable<Bool>
|
||||
var color: Observable<Bool>
|
||||
var label: Observable<Bool>
|
||||
var reader: Reader = CPUReader()
|
||||
|
||||
let defaults = UserDefaults.standard
|
||||
@@ -27,16 +28,9 @@ class CPU: Module {
|
||||
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.label = Observable(defaults.object(forKey: "\(name)_label") != nil ? defaults.bool(forKey: "\(name)_label") : false)
|
||||
initMenu()
|
||||
initWidget()
|
||||
|
||||
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() {
|
||||
@@ -62,6 +56,10 @@ class CPU: Module {
|
||||
chartWithValue.state = self.widgetType == Widgets.ChartWithValue ? NSControl.StateValue.on : NSControl.StateValue.off
|
||||
chartWithValue.target = self
|
||||
|
||||
let barChart = NSMenuItem(title: "Bar chart", action: #selector(toggleWidget), keyEquivalent: "")
|
||||
barChart.state = self.widgetType == Widgets.BarChart ? NSControl.StateValue.on : NSControl.StateValue.off
|
||||
barChart.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
|
||||
@@ -73,6 +71,7 @@ class CPU: Module {
|
||||
submenu.addItem(mini)
|
||||
submenu.addItem(chart)
|
||||
submenu.addItem(chartWithValue)
|
||||
// submenu.addItem(barChart)
|
||||
|
||||
submenu.addItem(NSMenuItem.separator())
|
||||
|
||||
@@ -107,6 +106,8 @@ class CPU: Module {
|
||||
widgetCode = Widgets.Chart
|
||||
case "Chart with value":
|
||||
widgetCode = Widgets.ChartWithValue
|
||||
case "Bar chart":
|
||||
widgetCode = Widgets.BarChart
|
||||
default:
|
||||
break
|
||||
}
|
||||
@@ -116,7 +117,7 @@ class CPU: Module {
|
||||
}
|
||||
|
||||
for item in self.submenu.items {
|
||||
if item.title == "Mini" || item.title == "Chart" || item.title == "Chart with value" {
|
||||
if item.title == "Mini" || item.title == "Chart" || item.title == "Chart with value" || item.title == "Bar chart" {
|
||||
item.state = NSControl.StateValue.off
|
||||
}
|
||||
}
|
||||
@@ -125,7 +126,7 @@ class CPU: Module {
|
||||
self.defaults.set(widgetCode, forKey: "\(name)_widget")
|
||||
self.widgetType = widgetCode
|
||||
self.active << false
|
||||
initWidget(color: defaults.object(forKey: "\(name)_color") != nil ? defaults.bool(forKey: "\(name)_color") : false)
|
||||
initWidget()
|
||||
self.active << true
|
||||
}
|
||||
|
||||
@@ -138,12 +139,8 @@ class CPU: Module {
|
||||
@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.label << (sender.state == NSControl.StateValue.on)
|
||||
self.active << true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@ class Disk: Module {
|
||||
var active: Observable<Bool>
|
||||
var available: Observable<Bool>
|
||||
var color: Observable<Bool>
|
||||
var label: Observable<Bool>
|
||||
|
||||
var reader: Reader = DiskReader()
|
||||
|
||||
@@ -30,6 +31,7 @@ class Disk: Module {
|
||||
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.label = Observable(defaults.object(forKey: "\(name)_label") != nil ? defaults.bool(forKey: "\(name)_label") : false)
|
||||
|
||||
self.initMenu()
|
||||
self.initWidget()
|
||||
|
||||
@@ -17,6 +17,7 @@ class Memory: Module {
|
||||
var active: Observable<Bool>
|
||||
var available: Observable<Bool>
|
||||
var color: Observable<Bool>
|
||||
var label: Observable<Bool>
|
||||
var reader: Reader = MemoryReader()
|
||||
var widgetType: WidgetType
|
||||
|
||||
@@ -29,16 +30,9 @@ class Memory: Module {
|
||||
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.label = Observable(defaults.object(forKey: "\(name)_label") != nil ? defaults.bool(forKey: "\(name)_label") : false)
|
||||
initMenu()
|
||||
initWidget()
|
||||
|
||||
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() {
|
||||
@@ -110,6 +104,8 @@ class Memory: Module {
|
||||
widgetCode = Widgets.Chart
|
||||
case "Chart with value":
|
||||
widgetCode = Widgets.ChartWithValue
|
||||
case "Bar chart":
|
||||
widgetCode = Widgets.BarChart
|
||||
default:
|
||||
break
|
||||
}
|
||||
@@ -141,12 +137,8 @@ class Memory: Module {
|
||||
@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.label << (sender.state == NSControl.StateValue.on)
|
||||
self.active << true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,7 +18,8 @@ protocol Module: class {
|
||||
|
||||
var active: Observable<Bool> { get }
|
||||
var available: Observable<Bool> { get }
|
||||
var color: Observable<Bool> { get set }
|
||||
var color: Observable<Bool> { get }
|
||||
var label: Observable<Bool> { get }
|
||||
|
||||
var reader: Reader { get }
|
||||
|
||||
@@ -27,7 +28,7 @@ protocol Module: class {
|
||||
}
|
||||
|
||||
extension Module {
|
||||
func initWidget(color: Bool = false) {
|
||||
func initWidget(label: Bool = false) {
|
||||
var widget: Widget = Mini(frame: NSMakeRect(0, 0, MODULE_WIDTH, MODULE_HEIGHT))
|
||||
|
||||
switch self.widgetType {
|
||||
@@ -47,12 +48,15 @@ extension Module {
|
||||
widget = NetworkDotsTextView(frame: NSMakeRect(0, 0, MODULE_WIDTH, MODULE_HEIGHT))
|
||||
case Widgets.NetworkArrowsWithText:
|
||||
widget = NetworkArrowsTextView(frame: NSMakeRect(0, 0, MODULE_WIDTH, MODULE_HEIGHT))
|
||||
case Widgets.BarChart:
|
||||
widget = BarChart(frame: NSMakeRect(0, 0, MODULE_WIDTH + 10, MODULE_HEIGHT))
|
||||
default:
|
||||
widget = Mini(frame: NSMakeRect(0, 0, MODULE_WIDTH, MODULE_HEIGHT))
|
||||
}
|
||||
|
||||
widget.label = self.shortName
|
||||
widget.color(state: self.color.value)
|
||||
widget.label(state: self.label.value)
|
||||
self.view = widget as! NSView
|
||||
}
|
||||
|
||||
@@ -81,11 +85,19 @@ extension Module {
|
||||
widget.color(state: value)
|
||||
widget.redraw()
|
||||
}
|
||||
|
||||
self.label.subscribe(observer: self) { (value, _) in
|
||||
guard let widget = self.view as? Widget else {
|
||||
return
|
||||
}
|
||||
widget.label(state: value)
|
||||
}
|
||||
}
|
||||
|
||||
func stop() {
|
||||
self.reader.stop()
|
||||
self.reader.value.unsubscribe(observer: self)
|
||||
self.color.unsubscribe(observer: self)
|
||||
self.label.unsubscribe(observer: self)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ class Network: Module {
|
||||
var active: Observable<Bool>
|
||||
var available: Observable<Bool>
|
||||
var color: Observable<Bool>
|
||||
var label: Observable<Bool>
|
||||
var reader: Reader = NetworkReader()
|
||||
var widgetType: WidgetType = 2.0
|
||||
|
||||
@@ -27,6 +28,7 @@ class Network: Module {
|
||||
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)
|
||||
self.label = Observable(defaults.object(forKey: "\(name)_label") != nil ? defaults.bool(forKey: "\(name)_label") : false)
|
||||
initMenu()
|
||||
initWidget()
|
||||
}
|
||||
|
||||
@@ -17,9 +17,9 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.2.3</string>
|
||||
<string>1.2.4</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>8</string>
|
||||
<string>1</string>
|
||||
<key>LSApplicationCategoryType</key>
|
||||
<string>public.app-category.utilities</string>
|
||||
<key>LSMinimumSystemVersion</key>
|
||||
|
||||
123
Stats/Widgets/BarChart.swift
Normal file
123
Stats/Widgets/BarChart.swift
Normal file
@@ -0,0 +1,123 @@
|
||||
//
|
||||
// BarChart.swift
|
||||
// Stats
|
||||
//
|
||||
// Created by Serhiy Mytrovtsiy on 09.07.2019.
|
||||
// Copyright © 2019 Serhiy Mytrovtsiy. All rights reserved.
|
||||
//
|
||||
|
||||
import Cocoa
|
||||
|
||||
class BarChart: NSView, Widget {
|
||||
var size: CGFloat = MODULE_WIDTH + 10
|
||||
|
||||
var labelPadding: CGFloat = 12.0
|
||||
var labelEnabled: Bool = false
|
||||
var label: String = ""
|
||||
var color: Bool = false
|
||||
|
||||
var partitions: [Double] {
|
||||
didSet {
|
||||
self.redraw()
|
||||
}
|
||||
}
|
||||
|
||||
override init(frame: NSRect) {
|
||||
self.partitions = Array(repeating: 0.0, count: 1)
|
||||
super.init(frame: frame)
|
||||
self.wantsLayer = true
|
||||
self.addSubview(NSView())
|
||||
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
||||
required init?(coder decoder: NSCoder) {
|
||||
fatalError("init(coder:) has not been implemented")
|
||||
}
|
||||
|
||||
override func draw(_ dirtyRect: NSRect) {
|
||||
super.draw(dirtyRect)
|
||||
|
||||
let gradientColor: NSColor = NSColor(red: (26/255.0), green: (126/255.0), blue: (252/255.0), alpha: 0.8)
|
||||
|
||||
let width = self.frame.size.width - (MODULE_MARGIN * 2)
|
||||
let height = self.frame.size.height - (MODULE_MARGIN * 2) + 1
|
||||
|
||||
var x = MODULE_MARGIN
|
||||
if labelEnabled {
|
||||
x = x + labelPadding
|
||||
}
|
||||
|
||||
let partitionMargin: CGFloat = 0.5
|
||||
let partitionsWidth: CGFloat = width - (partitionMargin * 2) - x
|
||||
var partitionWidth: CGFloat = partitionsWidth
|
||||
if partitions.count > 1 {
|
||||
partitionWidth = (partitionsWidth - (partitionMargin * (CGFloat(partitions.count) - 1))) / CGFloat(partitions.count)
|
||||
}
|
||||
|
||||
for i in 0..<partitions.count {
|
||||
let partitionValue = partitions[i]
|
||||
let partitonHeight = (((height - 4.8) * CGFloat(partitionValue)) / 1)
|
||||
let partition = NSBezierPath(rect: NSRect(x: x, y: MODULE_MARGIN, width: partitionWidth - 0.5, height: partitonHeight))
|
||||
gradientColor.setFill()
|
||||
partition.fill()
|
||||
partition.close()
|
||||
|
||||
x += partitionWidth + partitionMargin
|
||||
}
|
||||
|
||||
if !self.labelEnabled {
|
||||
return
|
||||
}
|
||||
|
||||
let style = NSMutableParagraphStyle()
|
||||
style.alignment = .center
|
||||
let stringAttributes = [
|
||||
NSAttributedString.Key.font: NSFont.systemFont(ofSize: 7.2, weight: .regular),
|
||||
NSAttributedString.Key.foregroundColor: NSColor.labelColor,
|
||||
NSAttributedString.Key.paragraphStyle: style
|
||||
]
|
||||
|
||||
let letterHeight = (self.frame.size.height - (MODULE_MARGIN*2)) / 3
|
||||
let letterWidth: CGFloat = 10.0
|
||||
|
||||
var yMargin = MODULE_MARGIN
|
||||
for char in self.label.reversed() {
|
||||
let rect = CGRect(x: MODULE_MARGIN, y: yMargin, width: letterWidth, height: letterHeight)
|
||||
let str = NSAttributedString.init(string: "\(char)", attributes: stringAttributes)
|
||||
str.draw(with: rect)
|
||||
|
||||
yMargin += letterHeight
|
||||
}
|
||||
}
|
||||
|
||||
func value(value: Double) {
|
||||
if self.partitions[0] != value {
|
||||
self.partitions[0] = value
|
||||
}
|
||||
}
|
||||
|
||||
func label(state: Bool) {
|
||||
labelEnabled = state
|
||||
var width = self.frame.size.width
|
||||
if width == MODULE_WIDTH + 10 && state {
|
||||
width = width + labelPadding
|
||||
} else {
|
||||
width = MODULE_WIDTH + 10
|
||||
}
|
||||
self.frame = CGRect(x: self.frame.origin.x, y: self.frame.origin.y, width: width, height: self.frame.size.height)
|
||||
}
|
||||
|
||||
func color(state: Bool) {
|
||||
if self.color != state {
|
||||
self.color = state
|
||||
}
|
||||
}
|
||||
|
||||
func redraw() {
|
||||
self.needsDisplay = true
|
||||
setNeedsDisplay(self.frame)
|
||||
}
|
||||
}
|
||||
@@ -9,6 +9,7 @@
|
||||
import Cocoa
|
||||
|
||||
class BatteryView: NSView, Widget {
|
||||
var size: CGFloat = MODULE_WIDTH
|
||||
var label: String = ""
|
||||
|
||||
let batteryWidth: CGFloat = 32
|
||||
@@ -136,6 +137,8 @@ class BatteryView: NSView, Widget {
|
||||
}
|
||||
}
|
||||
|
||||
func label(state: Bool) {}
|
||||
|
||||
func setCharging(value: Bool) {
|
||||
if self.charging != value {
|
||||
self.charging = value
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
import Cocoa
|
||||
|
||||
class Chart: NSView, Widget {
|
||||
var size: CGFloat = MODULE_WIDTH + 7
|
||||
var labelPadding: CGFloat = 10.0
|
||||
var labelEnabled: Bool = false
|
||||
var label: String = ""
|
||||
@@ -144,13 +145,14 @@ class Chart: NSView, Widget {
|
||||
}
|
||||
}
|
||||
|
||||
func toggleLabel(value: Bool) {
|
||||
labelEnabled = value
|
||||
if value {
|
||||
self.frame = CGRect(x: self.frame.origin.x, y: self.frame.origin.y, width: self.frame.size.width + labelPadding, height: self.frame.size.height)
|
||||
} else {
|
||||
self.frame = CGRect(x: self.frame.origin.x, y: self.frame.origin.y, width: self.frame.size.width - labelPadding, height: self.frame.size.height)
|
||||
func label(state: Bool) {
|
||||
labelEnabled = state
|
||||
var width = self.size
|
||||
if state {
|
||||
width = width + labelPadding
|
||||
}
|
||||
self.frame = CGRect(x: self.frame.origin.x, y: self.frame.origin.y, width: width, height: self.frame.size.height)
|
||||
self.redraw()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -160,26 +162,7 @@ class ChartWithValue: Chart {
|
||||
override init(frame: NSRect) {
|
||||
super.init(frame: frame)
|
||||
self.wantsLayer = true
|
||||
|
||||
valueLabel = NSTextField(frame: NSMakeRect(2, MODULE_HEIGHT - 11, self.frame.size.width, 10))
|
||||
if labelEnabled {
|
||||
valueLabel = NSTextField(frame: NSMakeRect(labelPadding + 2, MODULE_HEIGHT - 11, self.frame.size.width, 10))
|
||||
}
|
||||
valueLabel.textColor = NSColor.red
|
||||
valueLabel.isEditable = false
|
||||
valueLabel.isSelectable = false
|
||||
valueLabel.isBezeled = false
|
||||
valueLabel.wantsLayer = true
|
||||
valueLabel.textColor = .labelColor
|
||||
valueLabel.backgroundColor = .controlColor
|
||||
valueLabel.canDrawSubviewsIntoLayer = true
|
||||
valueLabel.alignment = .natural
|
||||
valueLabel.font = NSFont.systemFont(ofSize: 8, weight: .ultraLight)
|
||||
valueLabel.stringValue = ""
|
||||
valueLabel.addSubview(NSView())
|
||||
|
||||
self.height = 7.0
|
||||
self.addSubview(valueLabel)
|
||||
self.drawValue()
|
||||
}
|
||||
|
||||
required init?(coder decoder: NSCoder) {
|
||||
@@ -204,15 +187,14 @@ class ChartWithValue: Chart {
|
||||
}
|
||||
}
|
||||
|
||||
override func toggleLabel(value: Bool) {
|
||||
labelEnabled = value
|
||||
if value {
|
||||
valueLabel.frame = NSMakeRect(labelPadding + 2, MODULE_HEIGHT - 11, self.frame.size.width, 10)
|
||||
self.frame = CGRect(x: self.frame.origin.x, y: self.frame.origin.y, width: self.frame.size.width + labelPadding, height: self.frame.size.height)
|
||||
} else {
|
||||
valueLabel.frame = NSMakeRect(2, MODULE_HEIGHT - 11, self.frame.size.width, 10)
|
||||
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 label(state: Bool) {
|
||||
labelEnabled = state
|
||||
var width = self.size
|
||||
if state {
|
||||
width = width + labelPadding
|
||||
}
|
||||
self.frame = CGRect(x: self.frame.origin.x, y: self.frame.origin.y, width: width, height: self.frame.size.height)
|
||||
self.drawValue()
|
||||
}
|
||||
|
||||
override func color(state: Bool) {
|
||||
@@ -221,4 +203,30 @@ class ChartWithValue: Chart {
|
||||
self.valueLabel.textColor = self.points.last?.usageColor(color: state)
|
||||
}
|
||||
}
|
||||
|
||||
func drawValue () {
|
||||
for subview in self.subviews {
|
||||
subview.removeFromSuperview()
|
||||
}
|
||||
|
||||
valueLabel = NSTextField(frame: NSMakeRect(2, MODULE_HEIGHT - 11, self.frame.size.width, 10))
|
||||
if labelEnabled {
|
||||
valueLabel = NSTextField(frame: NSMakeRect(labelPadding + 2, MODULE_HEIGHT - 11, self.frame.size.width, 10))
|
||||
}
|
||||
valueLabel.textColor = NSColor.red
|
||||
valueLabel.isEditable = false
|
||||
valueLabel.isSelectable = false
|
||||
valueLabel.isBezeled = false
|
||||
valueLabel.wantsLayer = true
|
||||
valueLabel.textColor = .labelColor
|
||||
valueLabel.backgroundColor = .controlColor
|
||||
valueLabel.canDrawSubviewsIntoLayer = true
|
||||
valueLabel.alignment = .natural
|
||||
valueLabel.font = NSFont.systemFont(ofSize: 8, weight: .ultraLight)
|
||||
valueLabel.stringValue = ""
|
||||
valueLabel.addSubview(NSView())
|
||||
|
||||
self.height = 7.0
|
||||
self.addSubview(valueLabel)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
import Cocoa
|
||||
|
||||
class Mini: NSView, Widget {
|
||||
var size: CGFloat = MODULE_WIDTH
|
||||
var valueView: NSTextField = NSTextField()
|
||||
var labelView: NSTextField = NSTextField()
|
||||
|
||||
@@ -87,4 +88,6 @@ class Mini: NSView, Widget {
|
||||
self.valueView.textColor = value.usageColor(color: state)
|
||||
}
|
||||
}
|
||||
|
||||
func label(state: Bool) {}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
import Cocoa
|
||||
|
||||
class NetworkDotsView: NSView, Widget {
|
||||
var size: CGFloat = 12
|
||||
var label: String = ""
|
||||
|
||||
var color: Bool = false
|
||||
@@ -26,7 +27,7 @@ class NetworkDotsView: NSView, Widget {
|
||||
override init(frame: NSRect) {
|
||||
self.download = 0
|
||||
self.upload = 0
|
||||
super.init(frame: CGRect(x: 0, y: 0, width: 12, height: frame.size.height))
|
||||
super.init(frame: CGRect(x: 0, y: 0, width: self.size, height: frame.size.height))
|
||||
self.wantsLayer = true
|
||||
self.addSubview(NSView())
|
||||
}
|
||||
@@ -81,9 +82,12 @@ class NetworkDotsView: NSView, Widget {
|
||||
self.redraw()
|
||||
}
|
||||
}
|
||||
|
||||
func label(state: Bool) {}
|
||||
}
|
||||
|
||||
class NetworkTextView: NSView, Widget {
|
||||
var size: CGFloat = MODULE_WIDTH + 20
|
||||
var label: String = ""
|
||||
|
||||
var color: Bool = false
|
||||
@@ -91,7 +95,7 @@ class NetworkTextView: NSView, Widget {
|
||||
var uploadValue: NSTextField = NSTextField()
|
||||
|
||||
override init(frame: NSRect) {
|
||||
super.init(frame: CGRect(x: 0, y: 0, width: MODULE_WIDTH + 20, height: frame.size.height))
|
||||
super.init(frame: CGRect(x: 0, y: 0, width: self.size, height: frame.size.height))
|
||||
self.wantsLayer = true
|
||||
self.valueView()
|
||||
}
|
||||
@@ -122,6 +126,8 @@ class NetworkTextView: NSView, Widget {
|
||||
}
|
||||
}
|
||||
|
||||
func label(state: Bool) {}
|
||||
|
||||
func valueView() {
|
||||
downloadValue = NSTextField(frame: NSMakeRect(MODULE_MARGIN, MODULE_MARGIN, self.frame.size.width - MODULE_MARGIN, 9))
|
||||
downloadValue.isEditable = false
|
||||
@@ -153,6 +159,7 @@ class NetworkTextView: NSView, Widget {
|
||||
}
|
||||
|
||||
class NetworkArrowsView: NSView, Widget {
|
||||
var size: CGFloat = 8
|
||||
var label: String = ""
|
||||
|
||||
var color: Bool = false
|
||||
@@ -170,7 +177,7 @@ class NetworkArrowsView: NSView, Widget {
|
||||
override init(frame: NSRect) {
|
||||
self.download = 0
|
||||
self.upload = 0
|
||||
super.init(frame: CGRect(x: 0, y: 0, width: 8, height: frame.size.height))
|
||||
super.init(frame: CGRect(x: 0, y: 0, width: self.size, height: frame.size.height))
|
||||
self.wantsLayer = true
|
||||
self.addSubview(NSView())
|
||||
}
|
||||
@@ -239,9 +246,12 @@ class NetworkArrowsView: NSView, Widget {
|
||||
self.redraw()
|
||||
}
|
||||
}
|
||||
|
||||
func label(state: Bool) {}
|
||||
}
|
||||
|
||||
class NetworkDotsTextView: NSView, Widget {
|
||||
var size: CGFloat = MODULE_WIDTH + 26
|
||||
var label: String = ""
|
||||
|
||||
var color: Bool = false
|
||||
@@ -262,7 +272,7 @@ class NetworkDotsTextView: NSView, Widget {
|
||||
override init(frame: NSRect) {
|
||||
self.download = 0
|
||||
self.upload = 0
|
||||
super.init(frame: CGRect(x: 0, y: 0, width: MODULE_WIDTH + 26, height: frame.size.height))
|
||||
super.init(frame: CGRect(x: 0, y: 0, width: self.size, height: frame.size.height))
|
||||
self.wantsLayer = true
|
||||
self.valueView()
|
||||
}
|
||||
@@ -320,6 +330,8 @@ class NetworkDotsTextView: NSView, Widget {
|
||||
}
|
||||
}
|
||||
|
||||
func label(state: Bool) {}
|
||||
|
||||
func valueView() {
|
||||
downloadValue = NSTextField(frame: NSMakeRect(MODULE_MARGIN, MODULE_MARGIN, self.frame.size.width - MODULE_MARGIN, 9))
|
||||
downloadValue.isEditable = false
|
||||
@@ -351,6 +363,7 @@ class NetworkDotsTextView: NSView, Widget {
|
||||
}
|
||||
|
||||
class NetworkArrowsTextView: NSView, Widget {
|
||||
var size: CGFloat = MODULE_WIDTH + 24
|
||||
var label: String = ""
|
||||
|
||||
var color: Bool = false
|
||||
@@ -371,7 +384,7 @@ class NetworkArrowsTextView: NSView, Widget {
|
||||
override init(frame: NSRect) {
|
||||
self.download = 0
|
||||
self.upload = 0
|
||||
super.init(frame: CGRect(x: 0, y: 0, width: MODULE_WIDTH + 24, height: frame.size.height))
|
||||
super.init(frame: CGRect(x: 0, y: 0, width: self.size, height: frame.size.height))
|
||||
self.wantsLayer = true
|
||||
self.valueView()
|
||||
}
|
||||
@@ -443,6 +456,8 @@ class NetworkArrowsTextView: NSView, Widget {
|
||||
}
|
||||
}
|
||||
|
||||
func label(state: Bool) {}
|
||||
|
||||
func valueView() {
|
||||
downloadValue = NSTextField(frame: NSMakeRect(MODULE_MARGIN, MODULE_MARGIN, self.frame.size.width - MODULE_MARGIN, 9))
|
||||
downloadValue.isEditable = false
|
||||
|
||||
@@ -9,14 +9,20 @@
|
||||
import Foundation
|
||||
|
||||
protocol Widget {
|
||||
var size: CGFloat { get }
|
||||
var label: String { get set }
|
||||
|
||||
func value(value: Double)
|
||||
func color(state: Bool)
|
||||
func label(state: Bool)
|
||||
|
||||
func redraw()
|
||||
}
|
||||
|
||||
extension Widget {
|
||||
func lable(state: Bool) {}
|
||||
}
|
||||
|
||||
typealias WidgetType = Float
|
||||
|
||||
struct Widgets {
|
||||
@@ -29,4 +35,6 @@ struct Widgets {
|
||||
static let NetworkText: WidgetType = 2.2
|
||||
static let NetworkDotsWithText: WidgetType = 2.3
|
||||
static let NetworkArrowsWithText: WidgetType = 2.4
|
||||
|
||||
static let BarChart: WidgetType = 3.0
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user