added option to set update time for each module

This commit is contained in:
Serhiy Mytrovtsiy
2019-09-15 15:51:50 +02:00
parent 56d58559a0
commit 3fb0eeabce
12 changed files with 336 additions and 12 deletions

View File

@@ -19,6 +19,7 @@ class Battery: Module {
public var tabAvailable: Bool = true
public var tabInitialized: Bool = false
public var tabView: NSTabViewItem = NSTabViewItem()
public var updateInterval: Int
public var widgetType: WidgetType = Widgets.Battery
public let percentageView: Observable<Bool>
@@ -33,6 +34,8 @@ class Battery: Module {
self.percentageView = Observable(defaults.object(forKey: "\(self.name)_percentage") != nil ? defaults.bool(forKey: "\(self.name)_percentage") : false)
self.timeView = Observable(defaults.object(forKey: "\(self.name)_time") != nil ? defaults.bool(forKey: "\(self.name)_time") : false)
self.widgetType = defaults.object(forKey: "\(name)_widget") != nil ? defaults.float(forKey: "\(name)_widget") : Widgets.Battery
self.updateInterval = defaults.object(forKey: "\(name)_interval") != nil ? defaults.integer(forKey: "\(name)_interval") : 3
self.reader.updateInterval << self.updateInterval
}
func start() {
@@ -86,6 +89,9 @@ class Battery: Module {
}
}
submenu.addItem(NSMenuItem.separator())
submenu.addItem(generateIntervalMenu())
if active {
menu.submenu = submenu
}
@@ -137,5 +143,73 @@ class Battery: Module {
self.initMenu(active: true)
menuBar!.updateWidget(name: self.name)
}
func generateIntervalMenu() -> NSMenuItem {
let updateInterval = NSMenuItem(title: "Update interval", action: nil, keyEquivalent: "")
let updateIntervals = NSMenu()
let updateInterval_1 = NSMenuItem(title: "1s", action: #selector(changeInterval), keyEquivalent: "")
updateInterval_1.state = self.updateInterval == 1 ? NSControl.StateValue.on : NSControl.StateValue.off
updateInterval_1.target = self
let updateInterval_2 = NSMenuItem(title: "3s", action: #selector(changeInterval), keyEquivalent: "")
updateInterval_2.state = self.updateInterval == 3 ? NSControl.StateValue.on : NSControl.StateValue.off
updateInterval_2.target = self
let updateInterval_3 = NSMenuItem(title: "5s", action: #selector(changeInterval), keyEquivalent: "")
updateInterval_3.state = self.updateInterval == 5 ? NSControl.StateValue.on : NSControl.StateValue.off
updateInterval_3.target = self
let updateInterval_4 = NSMenuItem(title: "10s", action: #selector(changeInterval), keyEquivalent: "")
updateInterval_4.state = self.updateInterval == 10 ? NSControl.StateValue.on : NSControl.StateValue.off
updateInterval_4.target = self
let updateInterval_5 = NSMenuItem(title: "15s", action: #selector(changeInterval), keyEquivalent: "")
updateInterval_5.state = self.updateInterval == 15 ? NSControl.StateValue.on : NSControl.StateValue.off
updateInterval_5.target = self
updateIntervals.addItem(updateInterval_1)
updateIntervals.addItem(updateInterval_2)
updateIntervals.addItem(updateInterval_3)
updateIntervals.addItem(updateInterval_4)
updateIntervals.addItem(updateInterval_5)
updateInterval.submenu = updateIntervals
return updateInterval
}
@objc func changeInterval(_ sender: NSMenuItem) {
var interval: Int = self.updateInterval
switch sender.title {
case "1s":
interval = 1
case "3s":
interval = 3
case "5s":
interval = 5
case "10s":
interval = 10
case "15s":
interval = 15
default:
break
}
if interval == self.updateInterval {
return
}
for item in self.submenu.items {
if item.title == "Update interval" {
for subitem in item.submenu!.items {
subitem.state = NSControl.StateValue.off
}
}
}
sender.state = NSControl.StateValue.on
self.updateInterval = interval
self.defaults.set(interval, forKey: "\(name)_interval")
self.reader.updateInterval << interval
}
}

View File

@@ -30,6 +30,7 @@ struct BatteryUsage {
class BatteryReader: Reader {
public var value: Observable<[Double]>!
public var updateInterval: Observable<Int> = Observable(0)
public var usage: Observable<BatteryUsage> = Observable(BatteryUsage())
public var updateTimer: Timer!
@@ -52,6 +53,10 @@ class BatteryReader: Reader {
init() {
self.value = Observable([])
read()
self.updateInterval.subscribe(observer: self) { (value, _) in
self.stop()
self.start()
}
}
func start() {
@@ -59,7 +64,7 @@ class BatteryReader: Reader {
if updateTimer != nil {
return
}
updateTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(read), userInfo: nil, repeats: true)
updateTimer = Timer.scheduledTimer(timeInterval: TimeInterval(self.updateInterval.value), target: self, selector: #selector(read), userInfo: nil, repeats: true)
}
func stop() {

View File

@@ -23,6 +23,7 @@ class CPU: Module {
public var tabInitialized: Bool = false
public var widgetType: WidgetType
public var chart: LineChartView = LineChartView()
public var updateInterval: Int
private let defaults = UserDefaults.standard
private var submenu: NSMenu = NSMenu()
@@ -32,7 +33,9 @@ class CPU: Module {
self.active = Observable(defaults.object(forKey: name) != nil ? defaults.bool(forKey: name) : true)
self.hyperthreading = Observable(defaults.object(forKey: "\(name)_hyperthreading") != nil ? defaults.bool(forKey: "\(name)_hyperthreading") : false)
self.widgetType = defaults.object(forKey: "\(name)_widget") != nil ? defaults.float(forKey: "\(name)_widget") : Widgets.Mini
self.updateInterval = defaults.object(forKey: "\(name)_interval") != nil ? defaults.integer(forKey: "\(name)_interval") : 3
self.reader.updateInterval << self.updateInterval
if self.widgetType == Widgets.BarChart {
(self.reader as! CPUReader).perCoreMode = true
(self.reader as! CPUReader).hyperthreading = self.hyperthreading.value
@@ -87,6 +90,9 @@ class CPU: Module {
submenu.addItem(hyperthreading)
}
submenu.addItem(NSMenuItem.separator())
submenu.addItem(generateIntervalMenu())
if active {
menu.submenu = submenu
}
@@ -153,4 +159,72 @@ class CPU: Module {
self.hyperthreading << (sender.state == NSControl.StateValue.on)
(self.reader as! CPUReader).hyperthreading = sender.state == NSControl.StateValue.on
}
func generateIntervalMenu() -> NSMenuItem {
let updateInterval = NSMenuItem(title: "Update interval", action: nil, keyEquivalent: "")
let updateIntervals = NSMenu()
let updateInterval_1 = NSMenuItem(title: "1s", action: #selector(changeInterval), keyEquivalent: "")
updateInterval_1.state = self.updateInterval == 1 ? NSControl.StateValue.on : NSControl.StateValue.off
updateInterval_1.target = self
let updateInterval_2 = NSMenuItem(title: "3s", action: #selector(changeInterval), keyEquivalent: "")
updateInterval_2.state = self.updateInterval == 3 ? NSControl.StateValue.on : NSControl.StateValue.off
updateInterval_2.target = self
let updateInterval_3 = NSMenuItem(title: "5s", action: #selector(changeInterval), keyEquivalent: "")
updateInterval_3.state = self.updateInterval == 5 ? NSControl.StateValue.on : NSControl.StateValue.off
updateInterval_3.target = self
let updateInterval_4 = NSMenuItem(title: "10s", action: #selector(changeInterval), keyEquivalent: "")
updateInterval_4.state = self.updateInterval == 10 ? NSControl.StateValue.on : NSControl.StateValue.off
updateInterval_4.target = self
let updateInterval_5 = NSMenuItem(title: "15s", action: #selector(changeInterval), keyEquivalent: "")
updateInterval_5.state = self.updateInterval == 15 ? NSControl.StateValue.on : NSControl.StateValue.off
updateInterval_5.target = self
updateIntervals.addItem(updateInterval_1)
updateIntervals.addItem(updateInterval_2)
updateIntervals.addItem(updateInterval_3)
updateIntervals.addItem(updateInterval_4)
updateIntervals.addItem(updateInterval_5)
updateInterval.submenu = updateIntervals
return updateInterval
}
@objc func changeInterval(_ sender: NSMenuItem) {
var interval: Int = self.updateInterval
switch sender.title {
case "1s":
interval = 1
case "3s":
interval = 3
case "5s":
interval = 5
case "10s":
interval = 10
case "15s":
interval = 15
default:
break
}
if interval == self.updateInterval {
return
}
for item in self.submenu.items {
if item.title == "Update interval" {
for subitem in item.submenu!.items {
subitem.state = NSControl.StateValue.off
}
}
}
sender.state = NSControl.StateValue.on
self.updateInterval = interval
self.defaults.set(interval, forKey: "\(name)_interval")
self.reader.updateInterval << interval
}
}

View File

@@ -23,6 +23,7 @@ struct TopProcess {
class CPUReader: Reader {
public var value: Observable<[Double]>!
public var updateInterval: Observable<Int> = Observable(0)
public var usage: Observable<CPUUsage> = Observable(CPUUsage())
public var processes: Observable<[TopProcess]> = Observable([TopProcess]())
public var available: Bool = true
@@ -57,13 +58,18 @@ class CPUReader: Reader {
}
read()
}
self.updateInterval.subscribe(observer: self) { (value, _) in
self.stop()
self.start()
}
}
func start() {
if updateTimer != nil {
return
}
updateTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(read), userInfo: nil, repeats: true)
updateTimer = Timer.scheduledTimer(timeInterval: TimeInterval(self.updateInterval.value), target: self, selector: #selector(read), userInfo: nil, repeats: true)
if topProcess.isRunning {
return

View File

@@ -22,6 +22,7 @@ class Disk: Module {
public var tabView: NSTabViewItem = NSTabViewItem()
public var reader: Reader = DiskReader()
public var updateInterval: Int
private var submenu: NSMenu = NSMenu()
private let defaults = UserDefaults.standard
@@ -30,6 +31,8 @@ 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.updateInterval = defaults.object(forKey: "\(name)_interval") != nil ? defaults.integer(forKey: "\(name)_interval") : 3
self.reader.updateInterval << self.updateInterval
}
func initTab() {
@@ -67,6 +70,9 @@ class Disk: Module {
}
}
submenu.addItem(NSMenuItem.separator())
submenu.addItem(generateIntervalMenu())
if active {
menu.submenu = submenu
}
@@ -116,4 +122,72 @@ class Disk: Module {
self.initMenu(active: true)
self.active << true
}
func generateIntervalMenu() -> NSMenuItem {
let updateInterval = NSMenuItem(title: "Update interval", action: nil, keyEquivalent: "")
let updateIntervals = NSMenu()
let updateInterval_1 = NSMenuItem(title: "1s", action: #selector(changeInterval), keyEquivalent: "")
updateInterval_1.state = self.updateInterval == 1 ? NSControl.StateValue.on : NSControl.StateValue.off
updateInterval_1.target = self
let updateInterval_2 = NSMenuItem(title: "3s", action: #selector(changeInterval), keyEquivalent: "")
updateInterval_2.state = self.updateInterval == 3 ? NSControl.StateValue.on : NSControl.StateValue.off
updateInterval_2.target = self
let updateInterval_3 = NSMenuItem(title: "5s", action: #selector(changeInterval), keyEquivalent: "")
updateInterval_3.state = self.updateInterval == 5 ? NSControl.StateValue.on : NSControl.StateValue.off
updateInterval_3.target = self
let updateInterval_4 = NSMenuItem(title: "10s", action: #selector(changeInterval), keyEquivalent: "")
updateInterval_4.state = self.updateInterval == 10 ? NSControl.StateValue.on : NSControl.StateValue.off
updateInterval_4.target = self
let updateInterval_5 = NSMenuItem(title: "15s", action: #selector(changeInterval), keyEquivalent: "")
updateInterval_5.state = self.updateInterval == 15 ? NSControl.StateValue.on : NSControl.StateValue.off
updateInterval_5.target = self
updateIntervals.addItem(updateInterval_1)
updateIntervals.addItem(updateInterval_2)
updateIntervals.addItem(updateInterval_3)
updateIntervals.addItem(updateInterval_4)
updateIntervals.addItem(updateInterval_5)
updateInterval.submenu = updateIntervals
return updateInterval
}
@objc func changeInterval(_ sender: NSMenuItem) {
var interval: Int = self.updateInterval
switch sender.title {
case "1s":
interval = 1
case "3s":
interval = 3
case "5s":
interval = 5
case "10s":
interval = 10
case "15s":
interval = 15
default:
break
}
if interval == self.updateInterval {
return
}
for item in self.submenu.items {
if item.title == "Update interval" {
for subitem in item.submenu!.items {
subitem.state = NSControl.StateValue.off
}
}
}
sender.state = NSControl.StateValue.on
self.updateInterval = interval
self.defaults.set(interval, forKey: "\(name)_interval")
self.reader.updateInterval << interval
}
}

View File

@@ -9,20 +9,25 @@
import Foundation
class DiskReader: Reader {
var value: Observable<[Double]>!
var available: Bool = true
var updateTimer: Timer!
public var value: Observable<[Double]>!
public var updateInterval: Observable<Int> = Observable(0)
public var available: Bool = true
public var updateTimer: Timer!
init() {
self.value = Observable([])
read()
self.updateInterval.subscribe(observer: self) { (value, _) in
self.stop()
self.start()
}
}
func start() {
if updateTimer != nil {
return
}
updateTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(read), userInfo: nil, repeats: true)
updateTimer = Timer.scheduledTimer(timeInterval: TimeInterval(self.updateInterval.value), target: self, selector: #selector(read), userInfo: nil, repeats: true)
}
func stop() {

View File

@@ -22,6 +22,7 @@ class Memory: Module {
public var tabInitialized: Bool = false
public var tabView: NSTabViewItem = NSTabViewItem()
public var chart: LineChartView = LineChartView()
public var updateInterval: Int
private let defaults = UserDefaults.standard
private var submenu: NSMenu = NSMenu()
@@ -30,6 +31,8 @@ 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.updateInterval = defaults.object(forKey: "\(name)_interval") != nil ? defaults.integer(forKey: "\(name)_interval") : 3
self.reader.updateInterval << self.updateInterval
}
func initMenu(active: Bool) {
@@ -72,6 +75,9 @@ class Memory: Module {
}
}
submenu.addItem(NSMenuItem.separator())
submenu.addItem(generateIntervalMenu())
if active {
menu.submenu = submenu
}
@@ -127,4 +133,72 @@ class Memory: Module {
self.initMenu(active: true)
self.active << true
}
func generateIntervalMenu() -> NSMenuItem {
let updateInterval = NSMenuItem(title: "Update interval", action: nil, keyEquivalent: "")
let updateIntervals = NSMenu()
let updateInterval_1 = NSMenuItem(title: "1s", action: #selector(changeInterval), keyEquivalent: "")
updateInterval_1.state = self.updateInterval == 1 ? NSControl.StateValue.on : NSControl.StateValue.off
updateInterval_1.target = self
let updateInterval_2 = NSMenuItem(title: "3s", action: #selector(changeInterval), keyEquivalent: "")
updateInterval_2.state = self.updateInterval == 3 ? NSControl.StateValue.on : NSControl.StateValue.off
updateInterval_2.target = self
let updateInterval_3 = NSMenuItem(title: "5s", action: #selector(changeInterval), keyEquivalent: "")
updateInterval_3.state = self.updateInterval == 5 ? NSControl.StateValue.on : NSControl.StateValue.off
updateInterval_3.target = self
let updateInterval_4 = NSMenuItem(title: "10s", action: #selector(changeInterval), keyEquivalent: "")
updateInterval_4.state = self.updateInterval == 10 ? NSControl.StateValue.on : NSControl.StateValue.off
updateInterval_4.target = self
let updateInterval_5 = NSMenuItem(title: "15s", action: #selector(changeInterval), keyEquivalent: "")
updateInterval_5.state = self.updateInterval == 15 ? NSControl.StateValue.on : NSControl.StateValue.off
updateInterval_5.target = self
updateIntervals.addItem(updateInterval_1)
updateIntervals.addItem(updateInterval_2)
updateIntervals.addItem(updateInterval_3)
updateIntervals.addItem(updateInterval_4)
updateIntervals.addItem(updateInterval_5)
updateInterval.submenu = updateIntervals
return updateInterval
}
@objc func changeInterval(_ sender: NSMenuItem) {
var interval: Int = self.updateInterval
switch sender.title {
case "1s":
interval = 1
case "3s":
interval = 3
case "5s":
interval = 5
case "10s":
interval = 10
case "15s":
interval = 15
default:
break
}
if interval == self.updateInterval {
return
}
for item in self.submenu.items {
if item.title == "Update interval" {
for subitem in item.submenu!.items {
subitem.state = NSControl.StateValue.off
}
}
}
sender.state = NSControl.StateValue.on
self.updateInterval = interval
self.defaults.set(interval, forKey: "\(name)_interval")
self.reader.updateInterval << interval
}
}

View File

@@ -16,6 +16,7 @@ struct MemoryUsage {
class MemoryReader: Reader {
public var value: Observable<[Double]>!
public var updateInterval: Observable<Int> = Observable(0)
public var usage: Observable<MemoryUsage> = Observable(MemoryUsage())
public var processes: Observable<[TopProcess]> = Observable([TopProcess]())
public var available: Bool = true
@@ -49,13 +50,18 @@ class MemoryReader: Reader {
}
read()
self.updateInterval.subscribe(observer: self) { (value, _) in
self.stop()
self.start()
}
}
func start() {
if updateTimer != nil {
return
}
updateTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(read), userInfo: nil, repeats: true)
updateTimer = Timer.scheduledTimer(timeInterval: TimeInterval(self.updateInterval.value), target: self, selector: #selector(read), userInfo: nil, repeats: true)
if topProcess.isRunning {
return

View File

@@ -24,6 +24,7 @@ protocol Module: class {
var tabInitialized: Bool { get }
var reader: Reader { get }
var updateInterval: Int { get }
func start()
func stop()

View File

@@ -20,6 +20,7 @@ class Network: Module {
public var tabAvailable: Bool = false
public var tabInitialized: Bool = false
public var tabView: NSTabViewItem = NSTabViewItem()
public var updateInterval: Int
private let defaults = UserDefaults.standard
private var submenu: NSMenu = NSMenu()
@@ -28,6 +29,8 @@ 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.updateInterval = defaults.object(forKey: "\(name)_interval") != nil ? defaults.integer(forKey: "\(name)_interval") : 3
self.reader.updateInterval << self.updateInterval
}
func initTab() {

View File

@@ -9,12 +9,13 @@
import Cocoa
class NetworkReader: Reader {
var value: Observable<[Double]>!
var available: Bool = true
var updateTimer: Timer!
public var value: Observable<[Double]>!
public var updateInterval: Observable<Int> = Observable(0)
public var available: Bool = true
public var updateTimer: Timer!
var netProcess: Process = Process()
var pipe: Pipe = Pipe()
private var netProcess: Process = Process()
private var pipe: Pipe = Pipe()
init() {
self.value = Observable([])

View File

@@ -10,6 +10,7 @@ import Foundation
protocol Reader {
var value: Observable<[Double]>! { get }
var updateInterval: Observable<Int> { get }
var available: Bool { get }
var updateTimer: Timer! { get set }