diff --git a/Stats.xcodeproj/project.pbxproj b/Stats.xcodeproj/project.pbxproj index bfeed53d..0e0182de 100644 --- a/Stats.xcodeproj/project.pbxproj +++ b/Stats.xcodeproj/project.pbxproj @@ -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 = ""; }; 9A141101229E721200D29793 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 9A141102229E721200D29793 /* Stats.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Stats.entitlements; sourceTree = ""; }; - 9A426DB722C2B5EE00C064C4 /* macAppUpdater.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = macAppUpdater.swift; sourceTree = ""; }; + 9A426DB722C2B5EE00C064C4 /* MacAppUpdater.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MacAppUpdater.swift; sourceTree = ""; }; 9A426DBD22C2BE0000C064C4 /* Updates.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Updates.storyboard; sourceTree = ""; }; 9A493CDE23202B620064570C /* MemoryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MemoryView.swift; sourceTree = ""; }; 9A57A18422A1D26D0033E318 /* MenuBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MenuBar.swift; sourceTree = ""; }; @@ -86,6 +88,8 @@ 9A5B1CBE229E78F0008B9D3C /* Observable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Observable.swift; sourceTree = ""; }; 9A5B1CC4229E7B40008B9D3C /* Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = ""; }; 9A606B472321025C00642F51 /* BatteryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BatteryView.swift; sourceTree = ""; }; + 9A606B492321577400642F51 /* UpdatesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdatesViewController.swift; sourceTree = ""; }; + 9A606B4B232157BA00642F51 /* AboutViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutViewController.swift; sourceTree = ""; }; 9A6CFC0022A1C9F5001E782D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 9A74D59622B44498004FE1FA /* Mini.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Mini.swift; sourceTree = ""; }; 9A79B36922D3BEE600BF1C3A /* Widget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Widget.swift; sourceTree = ""; }; @@ -106,7 +110,7 @@ 9AF0F32422DA92C400026AE6 /* NetworkText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkText.swift; sourceTree = ""; }; 9AF0F32622DA92DD00026AE6 /* NetworkDotsText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkDotsText.swift; sourceTree = ""; }; 9AF0F32822DA92E800026AE6 /* NetworkArrowsText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkArrowsText.swift; sourceTree = ""; }; - 9AF6F1FD231D732600B8E1E4 /* MainViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainViewController.swift; sourceTree = ""; }; + 9AF6F1FD231D732600B8E1E4 /* PopupViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PopupViewController.swift; sourceTree = ""; }; 9AFFCB3A22B3FD0500B0E6D8 /* About.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = About.storyboard; sourceTree = ""; }; 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 = ""; @@ -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 */, diff --git a/Stats/AppDelegate.swift b/Stats/AppDelegate.swift index 495cdeca..1eb47d14 100755 --- a/Stats/AppDelegate.swift +++ b/Stats/AppDelegate.swift @@ -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() - } -} diff --git a/Stats/MenuBar.swift b/Stats/MenuBar.swift index 0698e0f6..dc07c583 100644 --- a/Stats/MenuBar.swift +++ b/Stats/MenuBar.swift @@ -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 } } } diff --git a/Stats/Modules/Battery/Battery.swift b/Stats/Modules/Battery/Battery.swift index e04aaeb0..a03208f3 100644 --- a/Stats/Modules/Battery/Battery.swift +++ b/Stats/Modules/Battery/Battery.swift @@ -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 - var available: Observable - 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 + public var available: Observable + 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 + public var widgetType: WidgetType = Widgets.Mini + public let percentageView: Observable + + private let defaults = UserDefaults.standard + private var submenu: NSMenu = NSMenu() init() { self.available = Observable(self.reader.available) diff --git a/Stats/Modules/Battery/BatteryView.swift b/Stats/Modules/Battery/BatteryView.swift index 8037d97c..7b740ca3 100644 --- a/Stats/Modules/Battery/BatteryView.swift +++ b/Stats/Modules/Battery/BatteryView.swift @@ -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) %" } } diff --git a/Stats/Modules/CPU/CPU.swift b/Stats/Modules/CPU/CPU.swift index cceec87b..f440a2e3 100644 --- a/Stats/Modules/CPU/CPU.swift +++ b/Stats/Modules/CPU/CPU.swift @@ -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 diff --git a/Stats/Modules/Disk/Disk.swift b/Stats/Modules/Disk/Disk.swift index adb0d9ff..42339f4a 100644 --- a/Stats/Modules/Disk/Disk.swift +++ b/Stats/Modules/Disk/Disk.swift @@ -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 - var available: Observable - var viewAvailable: Bool = false - var tabView: NSTabViewItem = NSTabViewItem() + public var active: Observable + public var available: Observable + 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) diff --git a/Stats/Modules/Network/Network.swift b/Stats/Modules/Network/Network.swift index f42b04a1..cc0e3dd5 100644 --- a/Stats/Modules/Network/Network.swift +++ b/Stats/Modules/Network/Network.swift @@ -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 - var available: Observable - 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 + public var available: Observable + 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) diff --git a/Stats/Views/AboutViewController.swift b/Stats/Views/AboutViewController.swift new file mode 100644 index 00000000..52c1320a --- /dev/null +++ b/Stats/Views/AboutViewController.swift @@ -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)" + } + } +} diff --git a/Stats/Views/MainViewController.swift b/Stats/Views/PopupViewController.swift similarity index 96% rename from Stats/Views/MainViewController.swift rename to Stats/Views/PopupViewController.swift index f40e6bc9..c385f409 100644 --- a/Stats/Views/MainViewController.swift +++ b/Stats/Views/PopupViewController.swift @@ -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 diff --git a/Stats/Views/UpdatesViewController.swift b/Stats/Views/UpdatesViewController.swift new file mode 100644 index 00000000..98a5a056 --- /dev/null +++ b/Stats/Views/UpdatesViewController.swift @@ -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() + } +} diff --git a/Stats/Widgets/Mini.swift b/Stats/Widgets/Mini.swift index 40408b38..56fb21e1 100644 --- a/Stats/Widgets/Mini.swift +++ b/Stats/Widgets/Mini.swift @@ -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() } } diff --git a/Stats/libs/macAppUpdater.swift b/Stats/libs/MacAppUpdater.swift similarity index 100% rename from Stats/libs/macAppUpdater.swift rename to Stats/libs/MacAppUpdater.swift