Skip to content

Commit

Permalink
Merge pull request #9 from exelban/dev
Browse files Browse the repository at this point in the history
v1.2.3
  • Loading branch information
exelban authored Jul 9, 2019
2 parents d48e08d + 5a227c6 commit 3f810fb
Show file tree
Hide file tree
Showing 46 changed files with 450 additions and 244 deletions.
13 changes: 11 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,10 @@ You can download latest version [here](https://github.com/exelban/stats/releases

## Todo
- [X] Battery percentage
- [ ] Create new logo
- [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
- [ ] Colors toggle for each module
- [X] Colors toggle for each module
- [ ] temperature module
- [X] battery module
- [X] move to module system (CPU, RAM, DISK)
Expand All @@ -49,6 +49,15 @@ You can download latest version [here](https://github.com/exelban/stats/releases

## What's new

### 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
Expand Down
16 changes: 12 additions & 4 deletions Stats.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
9A426DB822C2B5EE00C064C4 /* macAppUpdater.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A426DB722C2B5EE00C064C4 /* macAppUpdater.swift */; };
9A426DBE22C2BE0000C064C4 /* Updates.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9A426DBD22C2BE0000C064C4 /* Updates.storyboard */; };
9A57A18522A1D26D0033E318 /* MenuBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A57A18422A1D26D0033E318 /* MenuBar.swift */; };
9A57A19B22A1E1C50033E318 /* Module.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A57A19A22A1E1C50033E318 /* Module.swift */; };
9A57A19D22A1E3270033E318 /* CPU.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A57A19C22A1E3270033E318 /* CPU.swift */; };
9A58D1B022C150C800405315 /* Network.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A58D1AF22C150C800405315 /* Network.swift */; };
9A58D1B222C150D700405315 /* NetworkReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A58D1B122C150D700405315 /* NetworkReader.swift */; };
Expand All @@ -25,6 +24,9 @@
9A6CFC0122A1C9F5001E782D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9A6CFC0022A1C9F5001E782D /* Assets.xcassets */; };
9A74D59422B4315C004FE1FA /* Chart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A74D59322B4315C004FE1FA /* Chart.swift */; };
9A74D59722B44498004FE1FA /* Mini.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A74D59622B44498004FE1FA /* Mini.swift */; };
9A79B36A22D3BEE600BF1C3A /* Widget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A79B36922D3BEE600BF1C3A /* Widget.swift */; };
9A79B36C22D3BEF000BF1C3A /* Module.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A79B36B22D3BEF000BF1C3A /* Module.swift */; };
9A79B36E22D3BEF900BF1C3A /* Reader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A79B36D22D3BEF900BF1C3A /* Reader.swift */; };
9A7B8F5E22A2A57600DEB352 /* CPUReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A7B8F5D22A2A57600DEB352 /* CPUReader.swift */; };
9A7B8F6922A2C3A100DEB352 /* Memory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A7B8F6822A2C3A100DEB352 /* Memory.swift */; };
9A7B8F6B22A2C3A700DEB352 /* Disk.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A7B8F6A22A2C3A700DEB352 /* Disk.swift */; };
Expand Down Expand Up @@ -63,7 +65,6 @@
9A426DB722C2B5EE00C064C4 /* macAppUpdater.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = macAppUpdater.swift; sourceTree = "<group>"; };
9A426DBD22C2BE0000C064C4 /* Updates.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Updates.storyboard; sourceTree = "<group>"; };
9A57A18422A1D26D0033E318 /* MenuBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuBar.swift; sourceTree = "<group>"; };
9A57A19A22A1E1C50033E318 /* Module.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Module.swift; sourceTree = "<group>"; };
9A57A19C22A1E3270033E318 /* CPU.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CPU.swift; sourceTree = "<group>"; };
9A58D1AF22C150C800405315 /* Network.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Network.swift; sourceTree = "<group>"; };
9A58D1B122C150D700405315 /* NetworkReader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkReader.swift; sourceTree = "<group>"; };
Expand All @@ -73,6 +74,9 @@
9A6CFC0022A1C9F5001E782D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
9A74D59322B4315C004FE1FA /* Chart.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Chart.swift; sourceTree = "<group>"; };
9A74D59622B44498004FE1FA /* Mini.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Mini.swift; sourceTree = "<group>"; };
9A79B36922D3BEE600BF1C3A /* Widget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Widget.swift; sourceTree = "<group>"; };
9A79B36B22D3BEF000BF1C3A /* Module.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Module.swift; sourceTree = "<group>"; };
9A79B36D22D3BEF900BF1C3A /* Reader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Reader.swift; sourceTree = "<group>"; };
9A7B8F5D22A2A57600DEB352 /* CPUReader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CPUReader.swift; sourceTree = "<group>"; };
9A7B8F6822A2C3A100DEB352 /* Memory.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Memory.swift; sourceTree = "<group>"; };
9A7B8F6A22A2C3A700DEB352 /* Disk.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Disk.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -178,6 +182,8 @@
9A7B8F6322A2C17500DEB352 /* Disk */,
9A09C89C22B3A7BB0018426F /* Battery */,
9A58D1AE22C150B800405315 /* Network */,
9A79B36B22D3BEF000BF1C3A /* Module.swift */,
9A79B36D22D3BEF900BF1C3A /* Reader.swift */,
);
path = Modules;
sourceTree = "<group>";
Expand All @@ -186,7 +192,6 @@
isa = PBXGroup;
children = (
9A5B1CBE229E78F0008B9D3C /* Observable.swift */,
9A57A19A22A1E1C50033E318 /* Module.swift */,
9A5B1CC4229E7B40008B9D3C /* Extensions.swift */,
9A426DB722C2B5EE00C064C4 /* macAppUpdater.swift */,
);
Expand All @@ -200,6 +205,7 @@
9A74D59322B4315C004FE1FA /* Chart.swift */,
9A74D59622B44498004FE1FA /* Mini.swift */,
9A58D1B322C179B200405315 /* NetworkView.swift */,
9A79B36922D3BEE600BF1C3A /* Widget.swift */,
);
path = Widgets;
sourceTree = "<group>";
Expand Down Expand Up @@ -362,24 +368,26 @@
files = (
9A09C8A222B3D94D0018426F /* BatteryView.swift in Sources */,
9A426DB822C2B5EE00C064C4 /* macAppUpdater.swift in Sources */,
9A79B36E22D3BEF900BF1C3A /* Reader.swift in Sources */,
9A7B8F6F22A2C57000DEB352 /* DiskReader.swift in Sources */,
9A7B8F6922A2C3A100DEB352 /* Memory.swift in Sources */,
9A7B8F5E22A2A57600DEB352 /* CPUReader.swift in Sources */,
9A74D59422B4315C004FE1FA /* Chart.swift in Sources */,
9A58D1B422C179B200405315 /* NetworkView.swift in Sources */,
9A09C89E22B3A7C90018426F /* Battery.swift in Sources */,
9A7B8F6D22A2C3D600DEB352 /* MemoryReader.swift in Sources */,
9A79B36C22D3BEF000BF1C3A /* Module.swift in Sources */,
9A57A18522A1D26D0033E318 /* MenuBar.swift in Sources */,
9A57A19D22A1E3270033E318 /* CPU.swift in Sources */,
9A58D1B222C150D700405315 /* NetworkReader.swift in Sources */,
9A09C8A022B3A7E20018426F /* BatteryReader.swift in Sources */,
9A58D1B022C150C800405315 /* Network.swift in Sources */,
9A57A19B22A1E1C50033E318 /* Module.swift in Sources */,
9A5B1CBF229E78F0008B9D3C /* Observable.swift in Sources */,
9A7B8F6B22A2C3A700DEB352 /* Disk.swift in Sources */,
9A1410F9229E721100D29793 /* AppDelegate.swift in Sources */,
9A74D59722B44498004FE1FA /* Mini.swift in Sources */,
9A5B1CC5229E7B40008B9D3C /* Extensions.swift in Sources */,
9A79B36A22D3BEE600BF1C3A /* Widget.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down
53 changes: 25 additions & 28 deletions Stats/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,6 @@ extension Notification.Name {
}

let modules: Observable<[Module]> = Observable([CPU(), Memory(), Disk(), Battery(), Network()])
let colors: Observable<Bool> = Observable(true)
let labelForChart: Observable<Bool> = Observable(true)

let updater = macAppUpdater(user: "exelban", repo: "stats")

@NSApplicationMain
Expand All @@ -30,28 +27,6 @@ class AppDelegate: NSObject, NSApplicationDelegate {
return
}

updater.check() { result, error in
if error != nil && error as! String == "No internet connection" {
return
}

guard error == nil, let version: version = result else {
print("Error: \(error ?? "check error")")
return
}

if version.newest {
DispatchQueue.main.async(execute: {
let updatesVC: NSWindowController? = NSStoryboard(name: "Updates", bundle: nil).instantiateController(withIdentifier: "UpdatesVC") as? NSWindowController
updatesVC?.window?.center()
updatesVC?.window?.level = .floating
updatesVC!.showWindow(self)
})
}
}

colors << (defaults.object(forKey: "colors") != nil ? defaults.bool(forKey: "colors") : false)
labelForChart << (defaults.object(forKey: "labelForChart") != nil ? defaults.bool(forKey: "labelForChart") : false)
_ = MenuBar(menuBarItem, menuBarButton: menuBarButton)

let launcherAppId = "eu.exelban.StatsLauncher"
Expand All @@ -65,9 +40,31 @@ class AppDelegate: NSObject, NSApplicationDelegate {
self.defaults.set(true, forKey: "runAtLogin")
}

if defaults.object(forKey: "labelForChart") == nil {
self.defaults.set(true, forKey: "labelForChart")
labelForChart << true
if defaults.object(forKey: "dockIcon") != nil {
let dockIconStatus = defaults.bool(forKey: "dockIcon") ? NSApplication.ActivationPolicy.regular : NSApplication.ActivationPolicy.accessory
NSApp.setActivationPolicy(dockIconStatus)
}

if defaults.object(forKey: "checkUpdatesOnLogin") == nil || defaults.bool(forKey: "checkUpdatesOnLogin") {
updater.check() { result, error in
if error != nil && error as! String == "No internet connection" {
return
}

guard error == nil, let version: version = result else {
print("Error: \(error ?? "check error")")
return
}

if version.newest {
DispatchQueue.main.async(execute: {
let updatesVC: NSWindowController? = NSStoryboard(name: "Updates", bundle: nil).instantiateController(withIdentifier: "UpdatesVC") as? NSWindowController
updatesVC?.window?.center()
updatesVC?.window?.level = .floating
updatesVC!.showWindow(self)
})
}
}
}

if isRunning {
Expand Down
33 changes: 16 additions & 17 deletions Stats/MenuBar.swift
Original file line number Diff line number Diff line change
Expand Up @@ -60,21 +60,21 @@ class MenuBar {
let preferences = NSMenuItem(title: "Preferences", action: nil, keyEquivalent: "")
let preferencesMenu = NSMenu()

let colorStatus = NSMenuItem(title: "Colors", action: #selector(toggleMenu), keyEquivalent: "")
colorStatus.state = defaults.bool(forKey: "colors") ? NSControl.StateValue.on : NSControl.StateValue.off
colorStatus.target = self
preferencesMenu.addItem(colorStatus)
let checkForUpdates = NSMenuItem(title: "Check for updates on start", action: #selector(toggleMenu), keyEquivalent: "")
checkForUpdates.state = defaults.bool(forKey: "checkUpdatesOnLogin") || defaults.object(forKey: "checkUpdatesOnLogin") == nil ? NSControl.StateValue.on : NSControl.StateValue.off
checkForUpdates.target = self
preferencesMenu.addItem(checkForUpdates)

let chartLabels = NSMenuItem(title: "Label in chart", action: #selector(toggleMenu), keyEquivalent: "")
chartLabels.state = defaults.bool(forKey: "labelForChart") || defaults.object(forKey: "labelForChart") == nil ? NSControl.StateValue.on : NSControl.StateValue.off
chartLabels.target = self
preferencesMenu.addItem(chartLabels)

let runAtLogin = NSMenuItem(title: "Run at login", action: #selector(toggleMenu), keyEquivalent: "")
let runAtLogin = NSMenuItem(title: "Start at login", action: #selector(toggleMenu), keyEquivalent: "")
runAtLogin.state = defaults.bool(forKey: "runAtLogin") || defaults.object(forKey: "runAtLogin") == nil ? NSControl.StateValue.on : NSControl.StateValue.off
runAtLogin.target = self
preferencesMenu.addItem(runAtLogin)

let dockIcon = NSMenuItem(title: "Show icon in dock", action: #selector(toggleMenu), keyEquivalent: "")
dockIcon.state = defaults.bool(forKey: "dockIcon") ? NSControl.StateValue.on : NSControl.StateValue.off
dockIcon.target = self
preferencesMenu.addItem(dockIcon)

preferences.submenu = preferencesMenu
menu.addItem(preferences)

Expand Down Expand Up @@ -116,13 +116,12 @@ class MenuBar {
case "Run at login":
SMLoginItemSetEnabled(launcherId as CFString, !status)
self.defaults.set(status, forKey: "runAtLogin")
case "Colors":
self.defaults.set(status, forKey: "colors")
colors << status
return
case "Label in chart":
self.defaults.set(status, forKey: "labelForChart")
labelForChart << status
case "Check for updates on start":
self.defaults.set(status, forKey: "checkUpdatesOnLogin")
case "Show icon in dock":
self.defaults.set(status, forKey: "dockIcon")
let iconStatus = status ? NSApplication.ActivationPolicy.regular : NSApplication.ActivationPolicy.accessory
NSApp.setActivationPolicy(iconStatus)
return
default: break
}
Expand Down
20 changes: 17 additions & 3 deletions Stats/Modules/Battery/Battery.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ class Battery: Module {
var submenu: NSMenu = NSMenu()
var active: Observable<Bool>
var available: Observable<Bool>
var color: Observable<Bool>
var reader: Reader = BatteryReader()

let defaults = UserDefaults.standard
Expand All @@ -26,20 +27,21 @@ class Battery: Module {
self.available = Observable(self.reader.available)
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.view = BatteryView(frame: NSMakeRect(0, 0, MODULE_WIDTH, MODULE_HEIGHT))
initMenu()
initWidget()
}

func start() {
if !self.reader.usage.value.isNaN {
let value = self.reader.usage!.value
if !self.reader.value.value.isNaN {
let value = self.reader.value!.value
(self.view as! BatteryView).setCharging(value: value > 0)
(self.view as! Widget).value(value: abs(value))
}

self.reader.start()
self.reader.usage.subscribe(observer: self) { (value, _) in
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))
Expand Down Expand Up @@ -69,7 +71,13 @@ class Battery: Module {
percentage.state = defaults.bool(forKey: "\(self.name)_percentage") ? NSControl.StateValue.on : NSControl.StateValue.off
percentage.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

submenu.addItem(percentage)
submenu.addItem(color)

menu.submenu = submenu
}

Expand Down Expand Up @@ -97,5 +105,11 @@ class Battery: Module {
self.percentageView << state
self.initWidget()
}

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

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 usage: Observable<Double>!
var value: Observable<Double>!
var available: Bool = false
var updateTimer: Timer!

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

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

self.usage << Double(cap)
self.value << Double(cap)
}
}
}
Expand Down
Loading

0 comments on commit 3f810fb

Please sign in to comment.