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
|
||||
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()
|
||||
|
||||
for module in modules.value {
|
||||
menu.addItem(module.menu())
|
||||
if module.available.value {
|
||||
menu.addItem(module.menu())
|
||||
}
|
||||
}
|
||||
|
||||
menu.addItem(NSMenuItem.separator())
|
||||
@@ -103,7 +109,7 @@ class MenuBar {
|
||||
|
||||
WIDTH = 0
|
||||
for module in modules.value {
|
||||
if module.active.value {
|
||||
if module.active.value && module.available.value {
|
||||
module.start()
|
||||
WIDTH = WIDTH + module.view.frame.size.width
|
||||
stack.addView(module.view, in: NSStackView.Gravity.center)
|
||||
|
||||
@@ -14,9 +14,11 @@ class Battery: Module {
|
||||
let defaults = UserDefaults.standard
|
||||
|
||||
var active: Observable<Bool>
|
||||
var available: Observable<Bool>
|
||||
var reader: Reader = BatteryReader()
|
||||
|
||||
init() {
|
||||
self.available = Observable(self.reader.available)
|
||||
self.active = Observable(defaults.object(forKey: name) != nil ? defaults.bool(forKey: name) : true)
|
||||
self.view = BatteryView(frame: NSMakeRect(0, 0, MODULE_WIDTH, MODULE_HEIGHT))
|
||||
}
|
||||
|
||||
@@ -11,28 +11,9 @@ import IOKit.ps
|
||||
|
||||
class BatteryReader: Reader {
|
||||
var usage: Observable<Float>!
|
||||
var available: Bool = false
|
||||
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() {
|
||||
self.usage = Observable(0)
|
||||
read()
|
||||
@@ -56,10 +37,10 @@ class BatteryReader: Reader {
|
||||
@objc func read() {
|
||||
let psInfo = IOPSCopyPowerSourcesInfo().takeRetainedValue()
|
||||
let psList = IOPSCopyPowerSourcesList(psInfo).takeRetainedValue() as [CFTypeRef]
|
||||
self.available = psList.count != 0
|
||||
|
||||
for ps in psList {
|
||||
if let psDesc = IOPSGetPowerSourceDescription(psInfo, ps).takeUnretainedValue() as? [String: Any] {
|
||||
// let type = psDesc[kIOPSTypeKey] as? String
|
||||
let isCharging = (psDesc[kIOPSIsChargingKey] as? Bool)
|
||||
var cap: Float = Float(psDesc[kIOPSCurrentCapacityKey] as! Int) / 100
|
||||
|
||||
|
||||
@@ -14,11 +14,13 @@ class CPU: Module {
|
||||
let defaults = UserDefaults.standard
|
||||
|
||||
var active: Observable<Bool>
|
||||
var available: Observable<Bool>
|
||||
var reader: Reader = CPUReader()
|
||||
|
||||
@IBOutlet weak var value: NSTextField!
|
||||
|
||||
init() {
|
||||
self.available = Observable(true)
|
||||
self.active = Observable(defaults.object(forKey: name) != nil ? defaults.bool(forKey: name) : true)
|
||||
self.view = loadViewFromNib()
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ import Foundation
|
||||
|
||||
class CPUReader: Reader {
|
||||
var usage: Observable<Float>!
|
||||
var available: Bool = true
|
||||
var cpuInfo: processor_info_array_t!
|
||||
var prevCpuInfo: processor_info_array_t?
|
||||
var numCpuInfo: mach_msg_type_number_t = 0
|
||||
|
||||
@@ -14,11 +14,13 @@ class Disk: Module {
|
||||
let defaults = UserDefaults.standard
|
||||
|
||||
var active: Observable<Bool>
|
||||
var available: Observable<Bool>
|
||||
var reader: Reader = DiskReader()
|
||||
|
||||
@IBOutlet weak var value: NSTextField!
|
||||
|
||||
init() {
|
||||
self.available = Observable(true)
|
||||
self.active = Observable(defaults.object(forKey: name) != nil ? defaults.bool(forKey: name) : true)
|
||||
self.view = loadViewFromNib()
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ import Foundation
|
||||
|
||||
class DiskReader: Reader {
|
||||
var usage: Observable<Float>!
|
||||
var available: Bool = true
|
||||
var updateTimer: Timer!
|
||||
|
||||
init() {
|
||||
|
||||
@@ -14,11 +14,13 @@ class Memory: Module {
|
||||
let defaults = UserDefaults.standard
|
||||
|
||||
var active: Observable<Bool>
|
||||
var available: Observable<Bool>
|
||||
var reader: Reader = MemoryReader()
|
||||
|
||||
@IBOutlet weak var value: NSTextField!
|
||||
|
||||
init() {
|
||||
self.available = Observable(true)
|
||||
self.active = Observable(defaults.object(forKey: name) != nil ? defaults.bool(forKey: name) : true)
|
||||
self.view = loadViewFromNib()
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ import Foundation
|
||||
|
||||
class MemoryReader: Reader {
|
||||
var usage: Observable<Float>!
|
||||
var available: Bool = true
|
||||
var updateTimer: Timer!
|
||||
var totalSize: Float
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ import Cocoa
|
||||
protocol Module {
|
||||
var name: String { get }
|
||||
var active: Observable<Bool> { get }
|
||||
var available: Observable<Bool> { get }
|
||||
var reader: Reader { get }
|
||||
var view: NSView { get }
|
||||
|
||||
@@ -36,7 +37,9 @@ extension Module {
|
||||
|
||||
protocol Reader {
|
||||
var usage: Observable<Float>! { get }
|
||||
var available: Bool { get }
|
||||
var updateTimer: Timer! { get set }
|
||||
func start()
|
||||
func read()
|
||||
func stop()
|
||||
func read()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user