mirror of
https://github.com/morgan9e/macos-stats
synced 2026-04-14 00:04:15 +09:00
small refactoring; improved widgets draw algorithm
This commit is contained in:
@@ -13,7 +13,7 @@
|
||||
9A09C8A222B3D94D0018426F /* BatteryWidget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A09C8A122B3D94D0018426F /* BatteryWidget.swift */; };
|
||||
9A1410F9229E721100D29793 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A1410F8229E721100D29793 /* AppDelegate.swift */; };
|
||||
9A141100229E721200D29793 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9A1410FE229E721200D29793 /* Main.storyboard */; };
|
||||
9A426DB822C2B5EE00C064C4 /* macAppUpdater.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A426DB722C2B5EE00C064C4 /* macAppUpdater.swift */; };
|
||||
9A426DB822C2B5EE00C064C4 /* MacAppUpdater.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A426DB722C2B5EE00C064C4 /* MacAppUpdater.swift */; };
|
||||
9A426DBE22C2BE0000C064C4 /* Updates.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9A426DBD22C2BE0000C064C4 /* Updates.storyboard */; };
|
||||
9A493CDF23202B620064570C /* MemoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A493CDE23202B620064570C /* MemoryView.swift */; };
|
||||
9A57A18522A1D26D0033E318 /* MenuBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A57A18422A1D26D0033E318 /* MenuBar.swift */; };
|
||||
@@ -25,6 +25,8 @@
|
||||
9A5B1CBF229E78F0008B9D3C /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A5B1CBE229E78F0008B9D3C /* Observable.swift */; };
|
||||
9A5B1CC5229E7B40008B9D3C /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A5B1CC4229E7B40008B9D3C /* Extensions.swift */; };
|
||||
9A606B482321025C00642F51 /* BatteryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A606B472321025C00642F51 /* BatteryView.swift */; };
|
||||
9A606B4A2321577400642F51 /* UpdatesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A606B492321577400642F51 /* UpdatesViewController.swift */; };
|
||||
9A606B4C232157BA00642F51 /* AboutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A606B4B232157BA00642F51 /* AboutViewController.swift */; };
|
||||
9A6CFC0122A1C9F5001E782D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9A6CFC0022A1C9F5001E782D /* Assets.xcassets */; };
|
||||
9A74D59722B44498004FE1FA /* Mini.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A74D59622B44498004FE1FA /* Mini.swift */; };
|
||||
9A79B36A22D3BEE600BF1C3A /* Widget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A79B36922D3BEE600BF1C3A /* Widget.swift */; };
|
||||
@@ -43,7 +45,7 @@
|
||||
9AF0F32522DA92C400026AE6 /* NetworkText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AF0F32422DA92C400026AE6 /* NetworkText.swift */; };
|
||||
9AF0F32722DA92DD00026AE6 /* NetworkDotsText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AF0F32622DA92DD00026AE6 /* NetworkDotsText.swift */; };
|
||||
9AF0F32922DA92E800026AE6 /* NetworkArrowsText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AF0F32822DA92E800026AE6 /* NetworkArrowsText.swift */; };
|
||||
9AF6F1FE231D732600B8E1E4 /* MainViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AF6F1FD231D732600B8E1E4 /* MainViewController.swift */; };
|
||||
9AF6F1FE231D732600B8E1E4 /* PopupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AF6F1FD231D732600B8E1E4 /* PopupViewController.swift */; };
|
||||
9AFFCB3B22B3FD0500B0E6D8 /* About.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9AFFCB3A22B3FD0500B0E6D8 /* About.storyboard */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
@@ -74,7 +76,7 @@
|
||||
9A1410FF229E721200D29793 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
|
||||
9A141101229E721200D29793 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
9A141102229E721200D29793 /* Stats.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Stats.entitlements; sourceTree = "<group>"; };
|
||||
9A426DB722C2B5EE00C064C4 /* macAppUpdater.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = macAppUpdater.swift; sourceTree = "<group>"; };
|
||||
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>"; };
|
||||
9A493CDE23202B620064570C /* MemoryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MemoryView.swift; sourceTree = "<group>"; };
|
||||
9A57A18422A1D26D0033E318 /* MenuBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuBar.swift; sourceTree = "<group>"; };
|
||||
@@ -86,6 +88,8 @@
|
||||
9A5B1CBE229E78F0008B9D3C /* Observable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Observable.swift; sourceTree = "<group>"; };
|
||||
9A5B1CC4229E7B40008B9D3C /* Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = "<group>"; };
|
||||
9A606B472321025C00642F51 /* BatteryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BatteryView.swift; sourceTree = "<group>"; };
|
||||
9A606B492321577400642F51 /* UpdatesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdatesViewController.swift; sourceTree = "<group>"; };
|
||||
9A606B4B232157BA00642F51 /* AboutViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutViewController.swift; sourceTree = "<group>"; };
|
||||
9A6CFC0022A1C9F5001E782D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; 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>"; };
|
||||
@@ -106,7 +110,7 @@
|
||||
9AF0F32422DA92C400026AE6 /* NetworkText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkText.swift; sourceTree = "<group>"; };
|
||||
9AF0F32622DA92DD00026AE6 /* NetworkDotsText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkDotsText.swift; sourceTree = "<group>"; };
|
||||
9AF0F32822DA92E800026AE6 /* NetworkArrowsText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkArrowsText.swift; sourceTree = "<group>"; };
|
||||
9AF6F1FD231D732600B8E1E4 /* MainViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainViewController.swift; sourceTree = "<group>"; };
|
||||
9AF6F1FD231D732600B8E1E4 /* PopupViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PopupViewController.swift; sourceTree = "<group>"; };
|
||||
9AFFCB3A22B3FD0500B0E6D8 /* About.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = About.storyboard; sourceTree = "<group>"; };
|
||||
B76EECB31DFC37E1EA558662 /* Pods_StatsLauncher.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_StatsLauncher.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
/* End PBXFileReference section */
|
||||
@@ -206,7 +210,7 @@
|
||||
children = (
|
||||
9A5B1CBE229E78F0008B9D3C /* Observable.swift */,
|
||||
9A5B1CC4229E7B40008B9D3C /* Extensions.swift */,
|
||||
9A426DB722C2B5EE00C064C4 /* macAppUpdater.swift */,
|
||||
9A426DB722C2B5EE00C064C4 /* MacAppUpdater.swift */,
|
||||
9A59AE55231EE02F007989D6 /* ChartMarker.swift */,
|
||||
);
|
||||
path = libs;
|
||||
@@ -289,7 +293,9 @@
|
||||
9AF6F1FC231D72EC00B8E1E4 /* Views */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
9AF6F1FD231D732600B8E1E4 /* MainViewController.swift */,
|
||||
9AF6F1FD231D732600B8E1E4 /* PopupViewController.swift */,
|
||||
9A606B492321577400642F51 /* UpdatesViewController.swift */,
|
||||
9A606B4B232157BA00642F51 /* AboutViewController.swift */,
|
||||
);
|
||||
path = Views;
|
||||
sourceTree = "<group>";
|
||||
@@ -450,20 +456,22 @@
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
9A09C8A222B3D94D0018426F /* BatteryWidget.swift in Sources */,
|
||||
9A426DB822C2B5EE00C064C4 /* macAppUpdater.swift in Sources */,
|
||||
9A426DB822C2B5EE00C064C4 /* MacAppUpdater.swift in Sources */,
|
||||
9A79B36E22D3BEF900BF1C3A /* Reader.swift in Sources */,
|
||||
9A606B4C232157BA00642F51 /* AboutViewController.swift in Sources */,
|
||||
9A59AE54231ED1AC007989D6 /* CPUView.swift in Sources */,
|
||||
9A7B8F6F22A2C57000DEB352 /* DiskReader.swift in Sources */,
|
||||
9A7B8F6922A2C3A100DEB352 /* Memory.swift in Sources */,
|
||||
9AF0F32522DA92C400026AE6 /* NetworkText.swift in Sources */,
|
||||
9A7B8F5E22A2A57600DEB352 /* CPUReader.swift in Sources */,
|
||||
9AF0F32322DA92B900026AE6 /* NetworkArrows.swift in Sources */,
|
||||
9A606B4A2321577400642F51 /* UpdatesViewController.swift in Sources */,
|
||||
9AF0F31D22DA925000026AE6 /* LineChartWithValue.swift in Sources */,
|
||||
9A09C89E22B3A7C90018426F /* Battery.swift in Sources */,
|
||||
9A7B8F6D22A2C3D600DEB352 /* MemoryReader.swift in Sources */,
|
||||
9A79B36C22D3BEF000BF1C3A /* Module.swift in Sources */,
|
||||
9A57A18522A1D26D0033E318 /* MenuBar.swift in Sources */,
|
||||
9AF6F1FE231D732600B8E1E4 /* MainViewController.swift in Sources */,
|
||||
9AF6F1FE231D732600B8E1E4 /* PopupViewController.swift in Sources */,
|
||||
9A57A19D22A1E3270033E318 /* CPU.swift in Sources */,
|
||||
9A58D1B222C150D700405315 /* NetworkReader.swift in Sources */,
|
||||
9A09C8A022B3A7E20018426F /* BatteryReader.swift in Sources */,
|
||||
|
||||
@@ -16,8 +16,8 @@ let popover = NSPopover()
|
||||
|
||||
@NSApplicationMain
|
||||
class AppDelegate: NSObject, NSApplicationDelegate {
|
||||
let defaults = UserDefaults.standard
|
||||
var menuBarItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.squareLength)
|
||||
private let defaults = UserDefaults.standard
|
||||
private var menuBarItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.squareLength)
|
||||
|
||||
func applicationDidFinishLaunching(_ aNotification: Notification) {
|
||||
guard let menuBarButton = self.menuBarItem.button else {
|
||||
@@ -87,95 +87,3 @@ class AppDelegate: NSObject, NSApplicationDelegate {
|
||||
popover.performClose(self)
|
||||
}
|
||||
}
|
||||
|
||||
class AboutVC: NSViewController {
|
||||
@IBOutlet weak var versionLabel: NSTextField!
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
self.view.wantsLayer = true
|
||||
}
|
||||
|
||||
@IBAction func openLink(_ sender: Any) {
|
||||
NSWorkspace.shared.open(URL(string: "https://github.com/exelban/stats")!)
|
||||
}
|
||||
|
||||
@IBAction func exit(_ sender: Any) {
|
||||
self.view.window?.close()
|
||||
}
|
||||
|
||||
override func awakeFromNib() {
|
||||
if self.view.layer != nil {
|
||||
self.view.window?.backgroundColor = .windowBackgroundColor
|
||||
let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
|
||||
versionLabel.stringValue = "Version \(versionNumber)"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class UpdatesVC: NSViewController {
|
||||
@IBOutlet weak var mainView: NSStackView!
|
||||
@IBOutlet weak var spinnerView: NSView!
|
||||
@IBOutlet weak var noInternetView: NSView!
|
||||
@IBOutlet weak var mainTextLabel: NSTextFieldCell!
|
||||
@IBOutlet weak var currentVersionLabel: NSTextField!
|
||||
@IBOutlet weak var latestVersionLabel: NSTextField!
|
||||
@IBOutlet weak var downloadButton: NSButton!
|
||||
@IBOutlet weak var spinner: NSProgressIndicator!
|
||||
|
||||
var url: String?
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
self.view.wantsLayer = true
|
||||
|
||||
self.spinner.startAnimation(self)
|
||||
|
||||
updater.check() { result, error in
|
||||
if error != nil && error as! String == "No internet connection" {
|
||||
DispatchQueue.main.async(execute: {
|
||||
self.spinnerView.isHidden = true
|
||||
self.noInternetView.isHidden = false
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
guard error == nil, let version: version = result else {
|
||||
print("Error: \(error ?? "check error")")
|
||||
return
|
||||
}
|
||||
|
||||
DispatchQueue.main.async(execute: {
|
||||
self.spinner.stopAnimation(self)
|
||||
self.spinnerView.isHidden = true
|
||||
self.mainView.isHidden = false
|
||||
self.currentVersionLabel.stringValue = version.current
|
||||
self.latestVersionLabel.stringValue = version.latest
|
||||
self.url = version.url
|
||||
|
||||
if !version.newest {
|
||||
self.mainTextLabel.stringValue = "No new version available"
|
||||
self.downloadButton.isEnabled = false
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
override func awakeFromNib() {
|
||||
if self.view.layer != nil {
|
||||
self.view.window?.backgroundColor = .windowBackgroundColor
|
||||
}
|
||||
}
|
||||
|
||||
@IBAction func download(_ sender: Any) {
|
||||
guard let urlString = self.url, let url = URL(string: urlString) else {
|
||||
return
|
||||
}
|
||||
NSWorkspace.shared.open(url)
|
||||
self.view.window?.close()
|
||||
}
|
||||
|
||||
@IBAction func exit(_ sender: Any) {
|
||||
self.view.window?.close()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,9 +10,10 @@ import Cocoa
|
||||
import ServiceManagement
|
||||
|
||||
class MenuBar {
|
||||
let defaults = UserDefaults.standard
|
||||
let menuBarItem: NSStatusItem
|
||||
lazy var menuBarButton: NSButton = NSButton()
|
||||
private let defaults = UserDefaults.standard
|
||||
private let menuBarItem: NSStatusItem
|
||||
private var menuBarButton: NSButton = NSButton()
|
||||
private var view: NSView? = nil
|
||||
|
||||
init(_ menuBarItem: NSStatusItem, menuBarButton: NSButton) {
|
||||
self.menuBarItem = menuBarItem
|
||||
@@ -24,7 +25,7 @@ class MenuBar {
|
||||
}
|
||||
}
|
||||
|
||||
func generateMenuBar() {
|
||||
private func generateMenuBar() {
|
||||
buildModulesView()
|
||||
|
||||
for module in modules.value {
|
||||
@@ -39,16 +40,14 @@ class MenuBar {
|
||||
}
|
||||
}
|
||||
|
||||
func buildModulesView() {
|
||||
for subview in self.menuBarButton.subviews {
|
||||
subview.removeFromSuperview()
|
||||
private func buildModulesView() {
|
||||
if self.view == nil {
|
||||
self.view = NSView(frame: NSMakeRect(0, 0, widgetSize.width, widgetSize.height))
|
||||
self.menuBarButton.addSubview(self.view!)
|
||||
}
|
||||
let view = self.view!
|
||||
|
||||
self.menuBarButton.image = NSImage(named:NSImage.Name("tray_icon"))
|
||||
self.menuBarItem.length = widgetSize.width
|
||||
var WIDTH = CGFloat(modules.value.count) * widgetSize.width
|
||||
|
||||
WIDTH = 0
|
||||
var WIDTH: CGFloat = 0
|
||||
for module in modules.value {
|
||||
if module.active.value && module.available.value {
|
||||
module.start()
|
||||
@@ -56,7 +55,10 @@ class MenuBar {
|
||||
}
|
||||
}
|
||||
|
||||
let view: NSView = NSView(frame: NSMakeRect(0, 0, WIDTH, widgetSize.height))
|
||||
self.menuBarButton.image = nil
|
||||
for v in view.subviews {
|
||||
v.removeFromSuperview()
|
||||
}
|
||||
|
||||
var x: CGFloat = 0
|
||||
for module in modules.value {
|
||||
@@ -67,11 +69,12 @@ class MenuBar {
|
||||
}
|
||||
}
|
||||
|
||||
if view.subviews.count != 0 {
|
||||
view.frame.size.width = WIDTH
|
||||
self.menuBarButton.image = nil
|
||||
if view.subviews.count == 0 {
|
||||
self.menuBarButton.image = NSImage(named:NSImage.Name("tray_icon"))
|
||||
self.menuBarItem.length = widgetSize.width
|
||||
} else {
|
||||
self.menuBarItem.length = WIDTH
|
||||
self.menuBarButton.addSubview(view)
|
||||
view.frame.size.width = WIDTH
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,20 +9,21 @@
|
||||
import Cocoa
|
||||
|
||||
class Battery: Module {
|
||||
let name: String = "Battery"
|
||||
let shortName: String = ""
|
||||
var view: NSView = NSView()
|
||||
var menu: NSMenuItem = NSMenuItem()
|
||||
var submenu: NSMenu = NSMenu()
|
||||
var active: Observable<Bool>
|
||||
var available: Observable<Bool>
|
||||
var reader: Reader = BatteryReader()
|
||||
var viewAvailable: Bool = true
|
||||
var tabView: NSTabViewItem = NSTabViewItem()
|
||||
public let name: String = "Battery"
|
||||
public let shortName: String = ""
|
||||
public var view: NSView = NSView()
|
||||
public var menu: NSMenuItem = NSMenuItem()
|
||||
public var active: Observable<Bool>
|
||||
public var available: Observable<Bool>
|
||||
public var reader: Reader = BatteryReader()
|
||||
public var viewAvailable: Bool = true
|
||||
public var tabView: NSTabViewItem = NSTabViewItem()
|
||||
|
||||
let defaults = UserDefaults.standard
|
||||
var widgetType: WidgetType = Widgets.Mini
|
||||
let percentageView: Observable<Bool>
|
||||
public var widgetType: WidgetType = Widgets.Mini
|
||||
public let percentageView: Observable<Bool>
|
||||
|
||||
private let defaults = UserDefaults.standard
|
||||
private var submenu: NSMenu = NSMenu()
|
||||
|
||||
init() {
|
||||
self.available = Observable(self.reader.available)
|
||||
|
||||
@@ -29,7 +29,7 @@ extension Battery {
|
||||
level.orientation = .horizontal
|
||||
level.distribution = .equalCentering
|
||||
let levelLabel = LabelField(string: "Level")
|
||||
let levelValue = ValueField(string: "0%")
|
||||
let levelValue = ValueField(string: "0 %")
|
||||
level.addView(levelLabel, in: .center)
|
||||
level.addView(levelValue, in: .center)
|
||||
|
||||
@@ -56,7 +56,7 @@ extension Battery {
|
||||
self.tabView.view?.addSubview(vertical)
|
||||
|
||||
(self.reader as! BatteryReader).usage.subscribe(observer: self) { (value, _) in
|
||||
levelValue.stringValue = "\(Int(value.capacity * 100))%"
|
||||
levelValue.stringValue = "\(Int(value.capacity * 100)) %"
|
||||
sourceValue.stringValue = value.powerSource
|
||||
|
||||
if value.powerSource == "Battery Power" {
|
||||
@@ -139,7 +139,7 @@ extension Battery {
|
||||
(self.reader as! BatteryReader).usage.subscribe(observer: self) { (value, _) in
|
||||
cyclesValue.stringValue = "\(value.cycles)"
|
||||
stateValue.stringValue = value.state
|
||||
healthValue.stringValue = "\(value.health)%"
|
||||
healthValue.stringValue = "\(value.health) %"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -21,7 +21,6 @@ class CPU: Module {
|
||||
public var tabView: NSTabViewItem = NSTabViewItem()
|
||||
public var viewAvailable: Bool = true
|
||||
public var widgetType: WidgetType
|
||||
|
||||
public var chart: LineChartView = LineChartView()
|
||||
|
||||
private let defaults = UserDefaults.standard
|
||||
|
||||
@@ -9,22 +9,21 @@
|
||||
import Cocoa
|
||||
|
||||
class Disk: Module {
|
||||
let name: String = "Disk"
|
||||
let shortName: String = "SSD"
|
||||
var view: NSView = NSView()
|
||||
var menu: NSMenuItem = NSMenuItem()
|
||||
var submenu: NSMenu = NSMenu()
|
||||
let defaults = UserDefaults.standard
|
||||
var widgetType: WidgetType
|
||||
public let name: String = "Disk"
|
||||
public let shortName: String = "SSD"
|
||||
public var view: NSView = NSView()
|
||||
public var menu: NSMenuItem = NSMenuItem()
|
||||
public var widgetType: WidgetType
|
||||
|
||||
var active: Observable<Bool>
|
||||
var available: Observable<Bool>
|
||||
var viewAvailable: Bool = false
|
||||
var tabView: NSTabViewItem = NSTabViewItem()
|
||||
public var active: Observable<Bool>
|
||||
public var available: Observable<Bool>
|
||||
public var viewAvailable: Bool = false
|
||||
public var tabView: NSTabViewItem = NSTabViewItem()
|
||||
|
||||
var reader: Reader = DiskReader()
|
||||
public var reader: Reader = DiskReader()
|
||||
|
||||
@IBOutlet weak var value: NSTextField!
|
||||
private var submenu: NSMenu = NSMenu()
|
||||
private let defaults = UserDefaults.standard
|
||||
|
||||
init() {
|
||||
self.available = Observable(true)
|
||||
|
||||
@@ -9,19 +9,19 @@
|
||||
import Cocoa
|
||||
|
||||
class Network: Module {
|
||||
var name: String = "Network"
|
||||
var shortName: String = "NET"
|
||||
var view: NSView = NSView()
|
||||
var menu: NSMenuItem = NSMenuItem()
|
||||
var submenu: NSMenu = NSMenu()
|
||||
var active: Observable<Bool>
|
||||
var available: Observable<Bool>
|
||||
var reader: Reader = NetworkReader()
|
||||
var widgetType: WidgetType = 2.0
|
||||
var viewAvailable: Bool = false
|
||||
var tabView: NSTabViewItem = NSTabViewItem()
|
||||
public var name: String = "Network"
|
||||
public var shortName: String = "NET"
|
||||
public var view: NSView = NSView()
|
||||
public var menu: NSMenuItem = NSMenuItem()
|
||||
public var active: Observable<Bool>
|
||||
public var available: Observable<Bool>
|
||||
public var reader: Reader = NetworkReader()
|
||||
public var widgetType: WidgetType = 2.0
|
||||
public var viewAvailable: Bool = false
|
||||
public var tabView: NSTabViewItem = NSTabViewItem()
|
||||
|
||||
let defaults = UserDefaults.standard
|
||||
private let defaults = UserDefaults.standard
|
||||
private var submenu: NSMenu = NSMenu()
|
||||
|
||||
init() {
|
||||
self.available = Observable(self.reader.available)
|
||||
|
||||
35
Stats/Views/AboutViewController.swift
Normal file
35
Stats/Views/AboutViewController.swift
Normal file
@@ -0,0 +1,35 @@
|
||||
//
|
||||
// AboutViewController.swift
|
||||
// Stats
|
||||
//
|
||||
// Created by Serhiy Mytrovtsiy on 05/09/2019.
|
||||
// Copyright © 2019 Serhiy Mytrovtsiy. All rights reserved.
|
||||
//
|
||||
|
||||
import Cocoa
|
||||
import Foundation
|
||||
|
||||
class AboutVC: NSViewController {
|
||||
@IBOutlet weak var versionLabel: NSTextField!
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
self.view.wantsLayer = true
|
||||
}
|
||||
|
||||
@IBAction func openLink(_ sender: Any) {
|
||||
NSWorkspace.shared.open(URL(string: "https://github.com/exelban/stats")!)
|
||||
}
|
||||
|
||||
@IBAction func exit(_ sender: Any) {
|
||||
self.view.window?.close()
|
||||
}
|
||||
|
||||
override func awakeFromNib() {
|
||||
if self.view.layer != nil {
|
||||
self.view.window?.backgroundColor = .windowBackgroundColor
|
||||
let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
|
||||
versionLabel.stringValue = "Version \(versionNumber)"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -40,10 +40,10 @@ class MainViewController: NSViewController {
|
||||
}
|
||||
|
||||
func makeHeader() {
|
||||
var items: [String] = []
|
||||
var list: [String] = []
|
||||
for module in modules.value {
|
||||
if module.viewAvailable && module.available.value {
|
||||
items.append(module.name)
|
||||
list.append(module.name)
|
||||
|
||||
let tab = module.tabView
|
||||
tab.label = module.name
|
||||
@@ -55,7 +55,7 @@ class MainViewController: NSViewController {
|
||||
}
|
||||
}
|
||||
|
||||
self.segmentsControl = NSSegmentedControl(labels: items, trackingMode: NSSegmentedControl.SwitchTracking.selectOne, target: self, action: #selector(switchTabs))
|
||||
self.segmentsControl = NSSegmentedControl(labels: list, trackingMode: NSSegmentedControl.SwitchTracking.selectOne, target: self, action: #selector(switchTabs))
|
||||
self.segmentsControl.setSelected(true, forSegment: 0)
|
||||
// self.tabView.selectTabViewItem(at: 2)
|
||||
self.segmentsControl.segmentDistribution = .fillEqually
|
||||
77
Stats/Views/UpdatesViewController.swift
Normal file
77
Stats/Views/UpdatesViewController.swift
Normal file
@@ -0,0 +1,77 @@
|
||||
//
|
||||
// UpdatesViewController.swift
|
||||
// Stats
|
||||
//
|
||||
// Created by Serhiy Mytrovtsiy on 05/09/2019.
|
||||
// Copyright © 2019 Serhiy Mytrovtsiy. All rights reserved.
|
||||
//
|
||||
|
||||
import Cocoa
|
||||
import Foundation
|
||||
|
||||
class UpdatesVC: NSViewController {
|
||||
@IBOutlet weak var mainView: NSStackView!
|
||||
@IBOutlet weak var spinnerView: NSView!
|
||||
@IBOutlet weak var noInternetView: NSView!
|
||||
@IBOutlet weak var mainTextLabel: NSTextFieldCell!
|
||||
@IBOutlet weak var currentVersionLabel: NSTextField!
|
||||
@IBOutlet weak var latestVersionLabel: NSTextField!
|
||||
@IBOutlet weak var downloadButton: NSButton!
|
||||
@IBOutlet weak var spinner: NSProgressIndicator!
|
||||
|
||||
var url: String?
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
self.view.wantsLayer = true
|
||||
|
||||
self.spinner.startAnimation(self)
|
||||
|
||||
updater.check() { result, error in
|
||||
if error != nil && error as! String == "No internet connection" {
|
||||
DispatchQueue.main.async(execute: {
|
||||
self.spinnerView.isHidden = true
|
||||
self.noInternetView.isHidden = false
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
guard error == nil, let version: version = result else {
|
||||
print("Error: \(error ?? "check error")")
|
||||
return
|
||||
}
|
||||
|
||||
DispatchQueue.main.async(execute: {
|
||||
self.spinner.stopAnimation(self)
|
||||
self.spinnerView.isHidden = true
|
||||
self.mainView.isHidden = false
|
||||
self.currentVersionLabel.stringValue = version.current
|
||||
self.latestVersionLabel.stringValue = version.latest
|
||||
self.url = version.url
|
||||
|
||||
if !version.newest {
|
||||
self.mainTextLabel.stringValue = "No new version available"
|
||||
self.downloadButton.isEnabled = false
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
override func awakeFromNib() {
|
||||
if self.view.layer != nil {
|
||||
self.view.window?.backgroundColor = .windowBackgroundColor
|
||||
}
|
||||
}
|
||||
|
||||
@IBAction func download(_ sender: Any) {
|
||||
guard let urlString = self.url, let url = URL(string: urlString) else {
|
||||
return
|
||||
}
|
||||
NSWorkspace.shared.open(url)
|
||||
self.view.window?.close()
|
||||
}
|
||||
|
||||
@IBAction func exit(_ sender: Any) {
|
||||
self.view.window?.close()
|
||||
}
|
||||
}
|
||||
@@ -106,5 +106,6 @@ class Mini: NSView, Widget {
|
||||
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
|
||||
self.redraw()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user