mirror of
https://github.com/morgan9e/macos-stats
synced 2026-04-14 00:04:15 +09:00
added available flag to modules; disabled battery module on PC
This commit is contained in:
@@ -35,6 +35,10 @@ class MenuBar {
|
|||||||
module.active.subscribe(observer: self) { (value, _) in
|
module.active.subscribe(observer: self) { (value, _) in
|
||||||
self.buildModulesView()
|
self.buildModulesView()
|
||||||
}
|
}
|
||||||
|
module.available.subscribe(observer: self) { (value, _) in
|
||||||
|
self.buildModulesView()
|
||||||
|
self.menuBarItem.menu = self.buildMenu()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -42,7 +46,9 @@ class MenuBar {
|
|||||||
let menu = NSMenu()
|
let menu = NSMenu()
|
||||||
|
|
||||||
for module in modules.value {
|
for module in modules.value {
|
||||||
menu.addItem(module.menu())
|
if module.available.value {
|
||||||
|
menu.addItem(module.menu())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
menu.addItem(NSMenuItem.separator())
|
menu.addItem(NSMenuItem.separator())
|
||||||
@@ -103,7 +109,7 @@ class MenuBar {
|
|||||||
|
|
||||||
WIDTH = 0
|
WIDTH = 0
|
||||||
for module in modules.value {
|
for module in modules.value {
|
||||||
if module.active.value {
|
if module.active.value && module.available.value {
|
||||||
module.start()
|
module.start()
|
||||||
WIDTH = WIDTH + module.view.frame.size.width
|
WIDTH = WIDTH + module.view.frame.size.width
|
||||||
stack.addView(module.view, in: NSStackView.Gravity.center)
|
stack.addView(module.view, in: NSStackView.Gravity.center)
|
||||||
|
|||||||
@@ -14,9 +14,11 @@ class Battery: Module {
|
|||||||
let defaults = UserDefaults.standard
|
let defaults = UserDefaults.standard
|
||||||
|
|
||||||
var active: Observable<Bool>
|
var active: Observable<Bool>
|
||||||
|
var available: Observable<Bool>
|
||||||
var reader: Reader = BatteryReader()
|
var reader: Reader = BatteryReader()
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
|
self.available = Observable(self.reader.available)
|
||||||
self.active = Observable(defaults.object(forKey: name) != nil ? defaults.bool(forKey: name) : true)
|
self.active = Observable(defaults.object(forKey: name) != nil ? defaults.bool(forKey: name) : true)
|
||||||
self.view = BatteryView(frame: NSMakeRect(0, 0, MODULE_WIDTH, MODULE_HEIGHT))
|
self.view = BatteryView(frame: NSMakeRect(0, 0, MODULE_WIDTH, MODULE_HEIGHT))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,28 +11,9 @@ import IOKit.ps
|
|||||||
|
|
||||||
class BatteryReader: Reader {
|
class BatteryReader: Reader {
|
||||||
var usage: Observable<Float>!
|
var usage: Observable<Float>!
|
||||||
|
var available: Bool = false
|
||||||
var updateTimer: Timer!
|
var updateTimer: Timer!
|
||||||
|
|
||||||
fileprivate static let IOSERVICE_BATTERY = "AppleSmartBattery"
|
|
||||||
fileprivate var service: io_service_t = 0
|
|
||||||
fileprivate enum Key: String {
|
|
||||||
case ACPowered = "ExternalConnected"
|
|
||||||
case Amperage = "Amperage"
|
|
||||||
/// Current charge
|
|
||||||
case CurrentCapacity = "CurrentCapacity"
|
|
||||||
case CycleCount = "CycleCount"
|
|
||||||
/// Originally DesignCapacity == MaxCapacity
|
|
||||||
case DesignCapacity = "DesignCapacity"
|
|
||||||
case DesignCycleCount = "DesignCycleCount9C"
|
|
||||||
case FullyCharged = "FullyCharged"
|
|
||||||
case IsCharging = "IsCharging"
|
|
||||||
/// Current max charge (this degrades over time)
|
|
||||||
case MaxCapacity = "MaxCapacity"
|
|
||||||
case Temperature = "Temperature"
|
|
||||||
/// Time remaining to charge/discharge
|
|
||||||
case TimeRemaining = "TimeRemaining"
|
|
||||||
}
|
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
self.usage = Observable(0)
|
self.usage = Observable(0)
|
||||||
read()
|
read()
|
||||||
@@ -56,10 +37,10 @@ class BatteryReader: Reader {
|
|||||||
@objc func read() {
|
@objc func read() {
|
||||||
let psInfo = IOPSCopyPowerSourcesInfo().takeRetainedValue()
|
let psInfo = IOPSCopyPowerSourcesInfo().takeRetainedValue()
|
||||||
let psList = IOPSCopyPowerSourcesList(psInfo).takeRetainedValue() as [CFTypeRef]
|
let psList = IOPSCopyPowerSourcesList(psInfo).takeRetainedValue() as [CFTypeRef]
|
||||||
|
self.available = psList.count != 0
|
||||||
|
|
||||||
for ps in psList {
|
for ps in psList {
|
||||||
if let psDesc = IOPSGetPowerSourceDescription(psInfo, ps).takeUnretainedValue() as? [String: Any] {
|
if let psDesc = IOPSGetPowerSourceDescription(psInfo, ps).takeUnretainedValue() as? [String: Any] {
|
||||||
// let type = psDesc[kIOPSTypeKey] as? String
|
|
||||||
let isCharging = (psDesc[kIOPSIsChargingKey] as? Bool)
|
let isCharging = (psDesc[kIOPSIsChargingKey] as? Bool)
|
||||||
var cap: Float = Float(psDesc[kIOPSCurrentCapacityKey] as! Int) / 100
|
var cap: Float = Float(psDesc[kIOPSCurrentCapacityKey] as! Int) / 100
|
||||||
|
|
||||||
|
|||||||
@@ -14,11 +14,13 @@ class CPU: Module {
|
|||||||
let defaults = UserDefaults.standard
|
let defaults = UserDefaults.standard
|
||||||
|
|
||||||
var active: Observable<Bool>
|
var active: Observable<Bool>
|
||||||
|
var available: Observable<Bool>
|
||||||
var reader: Reader = CPUReader()
|
var reader: Reader = CPUReader()
|
||||||
|
|
||||||
@IBOutlet weak var value: NSTextField!
|
@IBOutlet weak var value: NSTextField!
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
|
self.available = Observable(true)
|
||||||
self.active = Observable(defaults.object(forKey: name) != nil ? defaults.bool(forKey: name) : true)
|
self.active = Observable(defaults.object(forKey: name) != nil ? defaults.bool(forKey: name) : true)
|
||||||
self.view = loadViewFromNib()
|
self.view = loadViewFromNib()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import Foundation
|
|||||||
|
|
||||||
class CPUReader: Reader {
|
class CPUReader: Reader {
|
||||||
var usage: Observable<Float>!
|
var usage: Observable<Float>!
|
||||||
|
var available: Bool = true
|
||||||
var cpuInfo: processor_info_array_t!
|
var cpuInfo: processor_info_array_t!
|
||||||
var prevCpuInfo: processor_info_array_t?
|
var prevCpuInfo: processor_info_array_t?
|
||||||
var numCpuInfo: mach_msg_type_number_t = 0
|
var numCpuInfo: mach_msg_type_number_t = 0
|
||||||
|
|||||||
@@ -14,11 +14,13 @@ class Disk: Module {
|
|||||||
let defaults = UserDefaults.standard
|
let defaults = UserDefaults.standard
|
||||||
|
|
||||||
var active: Observable<Bool>
|
var active: Observable<Bool>
|
||||||
|
var available: Observable<Bool>
|
||||||
var reader: Reader = DiskReader()
|
var reader: Reader = DiskReader()
|
||||||
|
|
||||||
@IBOutlet weak var value: NSTextField!
|
@IBOutlet weak var value: NSTextField!
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
|
self.available = Observable(true)
|
||||||
self.active = Observable(defaults.object(forKey: name) != nil ? defaults.bool(forKey: name) : true)
|
self.active = Observable(defaults.object(forKey: name) != nil ? defaults.bool(forKey: name) : true)
|
||||||
self.view = loadViewFromNib()
|
self.view = loadViewFromNib()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import Foundation
|
|||||||
|
|
||||||
class DiskReader: Reader {
|
class DiskReader: Reader {
|
||||||
var usage: Observable<Float>!
|
var usage: Observable<Float>!
|
||||||
|
var available: Bool = true
|
||||||
var updateTimer: Timer!
|
var updateTimer: Timer!
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
|
|||||||
@@ -14,11 +14,13 @@ class Memory: Module {
|
|||||||
let defaults = UserDefaults.standard
|
let defaults = UserDefaults.standard
|
||||||
|
|
||||||
var active: Observable<Bool>
|
var active: Observable<Bool>
|
||||||
|
var available: Observable<Bool>
|
||||||
var reader: Reader = MemoryReader()
|
var reader: Reader = MemoryReader()
|
||||||
|
|
||||||
@IBOutlet weak var value: NSTextField!
|
@IBOutlet weak var value: NSTextField!
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
|
self.available = Observable(true)
|
||||||
self.active = Observable(defaults.object(forKey: name) != nil ? defaults.bool(forKey: name) : true)
|
self.active = Observable(defaults.object(forKey: name) != nil ? defaults.bool(forKey: name) : true)
|
||||||
self.view = loadViewFromNib()
|
self.view = loadViewFromNib()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import Foundation
|
|||||||
|
|
||||||
class MemoryReader: Reader {
|
class MemoryReader: Reader {
|
||||||
var usage: Observable<Float>!
|
var usage: Observable<Float>!
|
||||||
|
var available: Bool = true
|
||||||
var updateTimer: Timer!
|
var updateTimer: Timer!
|
||||||
var totalSize: Float
|
var totalSize: Float
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import Cocoa
|
|||||||
protocol Module {
|
protocol Module {
|
||||||
var name: String { get }
|
var name: String { get }
|
||||||
var active: Observable<Bool> { get }
|
var active: Observable<Bool> { get }
|
||||||
|
var available: Observable<Bool> { get }
|
||||||
var reader: Reader { get }
|
var reader: Reader { get }
|
||||||
var view: NSView { get }
|
var view: NSView { get }
|
||||||
|
|
||||||
@@ -36,7 +37,9 @@ extension Module {
|
|||||||
|
|
||||||
protocol Reader {
|
protocol Reader {
|
||||||
var usage: Observable<Float>! { get }
|
var usage: Observable<Float>! { get }
|
||||||
|
var available: Bool { get }
|
||||||
|
var updateTimer: Timer! { get set }
|
||||||
func start()
|
func start()
|
||||||
func read()
|
|
||||||
func stop()
|
func stop()
|
||||||
|
func read()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user