- fixed bug when widgets display not properly (or not shows at all)

- initialized bar chart widget
  - fixed few bugs
This commit is contained in:
Serhiy Mytrovtsiy
2019-07-09 23:57:40 +02:00
parent 5a227c69f9
commit 9c46928c84
15 changed files with 247 additions and 71 deletions

View File

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

View File

@@ -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 */,

View File

@@ -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()

View File

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

View File

@@ -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()

View File

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

View File

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

View File

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

View File

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

View 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)
}
}

View File

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

View File

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

View File

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

View File

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

View File

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