small refactoring; improved widgets draw algorithm

This commit is contained in:
Serhiy Mytrovtsiy
2019-09-05 16:54:04 +02:00
parent a29b9e3e87
commit 65abcf5eb8
13 changed files with 195 additions and 164 deletions

View File

@@ -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 */,

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View 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)"
}
}
}

View File

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

View 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()
}
}

View File

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