Skip to content

Commit

Permalink
Merge pull request #13 from exelban/dev
Browse files Browse the repository at this point in the history
v1.2.5
  • Loading branch information
exelban authored Jul 11, 2019
2 parents 8c31a21 + 916d727 commit 61b64bf
Show file tree
Hide file tree
Showing 21 changed files with 257 additions and 146 deletions.
58 changes: 58 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
# Changelog
All notable changes to this project will be documented in this file.

### [v1.2.5]
- added chart bar widget for CPU, Memory and Disk module
- label in Charts are enabled by default
- color and label option are visible only if available in selected widget
- fixed few bugs

### [v1.2.4]
- fixed bug when widgets don't display properly (or don't shows at all)
- initialized bar chart widget
- fixed few bugs

### [v1.2.3]
- new icon
- small code refactoring
- changed font style name of the indicator in the Chart/Chart with value
- added dock icon visibility to preferences
- moved color and label preference from global to local (now each module can be configurated separately)
- now check for updates on start can be disabled in preferences
- fixed few bugs

### [v1.2.2]
- fully automated build and sign app process
- fixed update and about visibility window in dark mode
- added name of the indicators in the Chart/Chart with value
- added check for new version on start
- removed charts and charts with value to Disk module
- now module submenu is disabled if module is disabled
- fixed bug when network module stop working after turn on/of
- fixed few bugs

### [v1.2.1]
- added charts and charts with value to Disk module
- fixed bug when Chart with value does not shows

### [v1.2.0]
- added network module
- added Check for updates window
- fixed few bugs

### [v1.1.0]
- added battery module
- added chart widget for CPU and Memory
- added About Stats window

### [v1.0.0]
- first release

[v1.2.5]: https:/exelban/stats/releases/tag/v1.2.5
[v1.2.4]: https:/exelban/stats/releases/tag/v1.2.4
[v1.2.3]: https:/exelban/stats/releases/tag/v1.2.3
[v1.2.2]: https:/exelban/stats/releases/tag/v1.2.2
[v1.2.1]: https:/exelban/stats/releases/tag/v1.2.1
[v1.2.0]: https:/exelban/stats/releases/tag/v1.2.0
[v1.1.0]: https:/exelban/stats/releases/tag/v1.1.0
[v1.0.0]: https:/exelban/stats/releases/tag/v1.0.0
62 changes: 4 additions & 58 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,9 @@ You can download latest version [here](https:/exelban/stats/releases

| Name | Available widgets | Description |
| --- | --- | --- |
| **CPU** | Percentage / Chart / Chart with value | Shows CPU usage |
| **Memory** | Percentage / Chart / Chart with value | Shows RAM usage |
| **Disk** | Percentage | Shows disk utilization |
| **CPU** | Percentage / Chart / Chart with value / Chart Bar | Shows CPU usage |
| **Memory** | Percentage / Chart / Chart with value / Chart Bar | Shows RAM usage |
| **Disk** | Percentage / Chart Bar | Shows disk utilization |
| **Battery** | Graphic / Percentage | Shows battery level and charging status |
| **Newtork** | Dots / Upload/Download traffic | Shows network activity |

Expand All @@ -32,63 +32,9 @@ You can download latest version [here](https:/exelban/stats/releases
| 10.13.6 *(High Sierra)* | **true** |
| 10.14.1 *(Mojave)* | **true** |

## Todo
- [X] Battery percentage
- [X] Create new logo ([IconArchive](http://www.iconarchive.com/show/simple-icons-by-kxmylo/utilities-system-monitor-icon.html))
- [ ] Window with preferences
- [ ] Save last modules values
- [X] Colors toggle for each module
- [ ] temperature module
- [X] battery module
- [X] move to module system (CPU, RAM, DISK)
- [X] network module
- [X] save settings
- [ ] OTA updates
- [X] charts
- [X] autostart on boot

## What's new
[CHANGELOG](https:/exelban/stats/blob/master/CHANGELOG.md)

### v1.2.4
- fixed bug when widgets don't display properly (or don't shows at all)
- initialized bar chart widget
- fixed few bugs

### v1.2.3
- new icon
- small code refactoring
- changed font style name of the indicator in the Chart/Chart with value
- added dock icon visibility to preferences
- moved color and label preference from global to local (now each module can be configurated separately)
- now check for updates on start can be disabled in preferences
- fixed few bugs

### v1.2.2
- fully automated build and sign app process
- fixed update and about visibility window in dark mode
- added name of the indicators in the Chart/Chart with value
- added check for new version on start
- removed charts and charts with value to Disk module
- now module submenu is disabled if module is disabled
- fixed bug when network module stop working after turn on/of
- fixed few bugs

### v1.2.1
- added charts and charts with value to Disk module
- fixed bug when Chart with value does not shows

### v1.2.0
- added network module
- added Check for updates window
- fixed few bugs

### v1.1.0
- added battery module
- added chart widget for CPU and Memory
- added About Stats window

### v1.0.0
- first release

## License
[MIT License](https:/exelban/stats/blob/master/LICENSE)
12 changes: 6 additions & 6 deletions Stats/Modules/Battery/Battery.swift
Original file line number Diff line number Diff line change
Expand Up @@ -36,17 +36,17 @@ class Battery: Module {
}

func start() {
if !self.reader.value.value.isNaN {
if !self.reader.value.value.isEmpty {
let value = self.reader.value!.value
(self.view as! BatteryView).setCharging(value: value > 0)
(self.view as! Widget).value(value: abs(value))
(self.view as! BatteryView).setCharging(value: value.first! > 0)
(self.view as! Widget).setValue(data: [abs(value.first!)])
}

self.reader.start()
self.reader.value.subscribe(observer: self) { (value, _) in
if !value.isNaN {
(self.view as! BatteryView).setCharging(value: value > 0)
(self.view as! Widget).value(value: abs(value))
if !value.isEmpty {
(self.view as! BatteryView).setCharging(value: value.first! > 0)
(self.view as! Widget).setValue(data: [abs(value.first!)])
}
}
}
Expand Down
6 changes: 3 additions & 3 deletions Stats/Modules/Battery/BatteryReader.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ import Foundation
import IOKit.ps

class BatteryReader: Reader {
var value: Observable<Double>!
var value: Observable<[Double]>!
var available: Bool = false
var updateTimer: Timer!

init() {
self.value = Observable(0)
self.value = Observable([])
read()
}

Expand Down Expand Up @@ -49,7 +49,7 @@ class BatteryReader: Reader {
cap = 0 - cap
}

self.value << Double(cap)
self.value << [Double(cap)]
}
}
}
Expand Down
19 changes: 12 additions & 7 deletions Stats/Modules/CPU/CPU.swift
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ 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)
self.label = Observable(defaults.object(forKey: "\(name)_label") != nil ? defaults.bool(forKey: "\(name)_label") : true)
initMenu()
initWidget()
}
Expand Down Expand Up @@ -61,22 +61,26 @@ class CPU: Module {
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.state = self.color.value ? NSControl.StateValue.on : NSControl.StateValue.off
color.target = self

let label = NSMenuItem(title: "Label", action: #selector(toggleLabel), keyEquivalent: "")
label.state = defaults.bool(forKey: "\(name)_label") || defaults.object(forKey: "\(name)_label") == nil ? NSControl.StateValue.on : NSControl.StateValue.off
label.state = self.label.value ? NSControl.StateValue.on : NSControl.StateValue.off
label.target = self

submenu.addItem(mini)
submenu.addItem(chart)
submenu.addItem(chartWithValue)
// submenu.addItem(barChart)
submenu.addItem(barChart)

submenu.addItem(NSMenuItem.separator())

submenu.addItem(label)
submenu.addItem(color)
if self.widgetType == Widgets.BarChart || self.widgetType == Widgets.ChartWithValue || self.widgetType == Widgets.Chart {
submenu.addItem(label)
}
if self.widgetType == Widgets.Mini || self.widgetType == Widgets.ChartWithValue {
submenu.addItem(color)
}

menu.submenu = submenu
}
Expand Down Expand Up @@ -126,7 +130,8 @@ class CPU: Module {
self.defaults.set(widgetCode, forKey: "\(name)_widget")
self.widgetType = widgetCode
self.active << false
initWidget()
self.initWidget()
self.initMenu()
self.active << true
}

Expand Down
16 changes: 13 additions & 3 deletions Stats/Modules/CPU/CPUReader.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import Foundation

class CPUReader: Reader {
var value: Observable<Double>!
var value: Observable<[Double]>!
var available: Bool = true
var cpuInfo: processor_info_array_t!
var prevCpuInfo: processor_info_array_t?
Expand All @@ -19,9 +19,11 @@ class CPUReader: Reader {
var updateTimer: Timer!
let CPUUsageLock: NSLock = NSLock()

var perCoreMode: Bool = true

init() {
let mibKeys: [Int32] = [ CTL_HW, HW_NCPU ]
self.value = Observable(0)
self.value = Observable([])
mibKeys.withUnsafeBufferPointer() { mib in
var sizeOfNumCPUs: size_t = MemoryLayout<uint>.size
let status = sysctl(processor_info_array_t(mutating: mib.baseAddress), 2, &numCPUs, &sizeOfNumCPUs, nil, 0)
Expand Down Expand Up @@ -55,6 +57,8 @@ class CPUReader: Reader {

var inUseOnAllCores: Int32 = 0
var totalOnAllCores: Int32 = 0
var usagePerCore: [Double] = []

for i in 0 ..< Int32(numCPUs) {
var inUse: Int32
var total: Int32
Expand All @@ -76,8 +80,14 @@ class CPUReader: Reader {

inUseOnAllCores = inUseOnAllCores + inUse
totalOnAllCores = totalOnAllCores + total
usagePerCore.insert((Double(inUse) / Double(total)), at: Int(i))
}

if perCoreMode {
self.value << usagePerCore
} else {
self.value << [(Double(inUseOnAllCores) / Double(totalOnAllCores))]
}
self.value << (Double(inUseOnAllCores) / Double(totalOnAllCores))

CPUUsageLock.unlock()

Expand Down
67 changes: 64 additions & 3 deletions Stats/Modules/Disk/Disk.swift
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +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.label = Observable(defaults.object(forKey: "\(name)_label") != nil ? defaults.bool(forKey: "\(name)_label") : true)

self.initMenu()
self.initWidget()
Expand All @@ -48,11 +48,33 @@ class Disk: Module {
}
menu.target = self

let mini = NSMenuItem(title: "Mini", action: #selector(toggleWidget), keyEquivalent: "")
mini.state = self.widgetType == Widgets.Mini ? NSControl.StateValue.on : NSControl.StateValue.off
mini.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.state = self.color.value ? NSControl.StateValue.on : NSControl.StateValue.off
color.target = self

submenu.addItem(color)
let label = NSMenuItem(title: "Label", action: #selector(toggleLabel), keyEquivalent: "")
label.state = self.label.value ? NSControl.StateValue.on : NSControl.StateValue.off
label.target = self

submenu.addItem(mini)
submenu.addItem(barChart)

submenu.addItem(NSMenuItem.separator())

if self.widgetType == Widgets.BarChart {
submenu.addItem(label)
}
if self.widgetType == Widgets.Mini {
submenu.addItem(color)
}

menu.submenu = submenu
}
Expand All @@ -71,9 +93,48 @@ class Disk: Module {
}
}

@objc func toggleWidget(_ sender: NSMenuItem) {
var widgetCode: Float = 0.0

switch sender.title {
case "Mini":
widgetCode = Widgets.Mini
case "Bar chart":
widgetCode = Widgets.BarChart
default:
break
}

if self.widgetType == widgetCode {
return
}

for item in self.submenu.items {
if item.title == "Mini" || item.title == "Bar chart" {
item.state = NSControl.StateValue.off
}
}

sender.state = sender.state == NSControl.StateValue.on ? NSControl.StateValue.off : NSControl.StateValue.on
self.defaults.set(widgetCode, forKey: "\(name)_widget")
self.widgetType = widgetCode
self.active << false
self.initMenu()
self.initWidget()
self.active << true
}

@objc func toggleColor(_ 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)_color")
self.color << (sender.state == NSControl.StateValue.on)
}

@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")
self.active << false
self.label << (sender.state == NSControl.StateValue.on)
self.active << true
}
}
Loading

0 comments on commit 61b64bf

Please sign in to comment.