mirror of
https://github.com/nicoverbruggen/phpmon.git
synced 2025-08-07 03:50:08 +02:00
♻️ Move logic away from AppDelegate
This commit is contained in:
@ -17,6 +17,7 @@
|
|||||||
C41C1B4D22B0215A00E7CF16 /* Actions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C41C1B4C22B0215A00E7CF16 /* Actions.swift */; };
|
C41C1B4D22B0215A00E7CF16 /* Actions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C41C1B4C22B0215A00E7CF16 /* Actions.swift */; };
|
||||||
C476FF9822B0DD830098105B /* Alert.swift in Sources */ = {isa = PBXBuildFile; fileRef = C476FF9722B0DD830098105B /* Alert.swift */; };
|
C476FF9822B0DD830098105B /* Alert.swift in Sources */ = {isa = PBXBuildFile; fileRef = C476FF9722B0DD830098105B /* Alert.swift */; };
|
||||||
C4811D2422D70A4700B5F6B3 /* App.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4811D2322D70A4700B5F6B3 /* App.swift */; };
|
C4811D2422D70A4700B5F6B3 /* App.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4811D2322D70A4700B5F6B3 /* App.swift */; };
|
||||||
|
C4811D2A22D70F9A00B5F6B3 /* MainMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4811D2922D70F9A00B5F6B3 /* MainMenu.swift */; };
|
||||||
C4D8016622B1584700C6DA1B /* Startup.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D8016522B1584700C6DA1B /* Startup.swift */; };
|
C4D8016622B1584700C6DA1B /* Startup.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D8016522B1584700C6DA1B /* Startup.swift */; };
|
||||||
C4EE188422D3386B00E126E5 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4EE188322D3386B00E126E5 /* Constants.swift */; };
|
C4EE188422D3386B00E126E5 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4EE188322D3386B00E126E5 /* Constants.swift */; };
|
||||||
C4F8C0A422D4F12C002EFE61 /* DateExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4F8C0A322D4F12C002EFE61 /* DateExtension.swift */; };
|
C4F8C0A422D4F12C002EFE61 /* DateExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4F8C0A322D4F12C002EFE61 /* DateExtension.swift */; };
|
||||||
@ -37,6 +38,7 @@
|
|||||||
C41C1B4C22B0215A00E7CF16 /* Actions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Actions.swift; sourceTree = "<group>"; };
|
C41C1B4C22B0215A00E7CF16 /* Actions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Actions.swift; sourceTree = "<group>"; };
|
||||||
C476FF9722B0DD830098105B /* Alert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Alert.swift; sourceTree = "<group>"; };
|
C476FF9722B0DD830098105B /* Alert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Alert.swift; sourceTree = "<group>"; };
|
||||||
C4811D2322D70A4700B5F6B3 /* App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = App.swift; sourceTree = "<group>"; };
|
C4811D2322D70A4700B5F6B3 /* App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = App.swift; sourceTree = "<group>"; };
|
||||||
|
C4811D2922D70F9A00B5F6B3 /* MainMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMenu.swift; sourceTree = "<group>"; };
|
||||||
C4D8016522B1584700C6DA1B /* Startup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Startup.swift; sourceTree = "<group>"; };
|
C4D8016522B1584700C6DA1B /* Startup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Startup.swift; sourceTree = "<group>"; };
|
||||||
C4EE188322D3386B00E126E5 /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = "<group>"; };
|
C4EE188322D3386B00E126E5 /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = "<group>"; };
|
||||||
C4F8C0A322D4F12C002EFE61 /* DateExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateExtension.swift; sourceTree = "<group>"; };
|
C4F8C0A322D4F12C002EFE61 /* DateExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateExtension.swift; sourceTree = "<group>"; };
|
||||||
@ -110,6 +112,7 @@
|
|||||||
children = (
|
children = (
|
||||||
C41C1B4622B009A400E7CF16 /* Shell.swift */,
|
C41C1B4622B009A400E7CF16 /* Shell.swift */,
|
||||||
C4811D2322D70A4700B5F6B3 /* App.swift */,
|
C4811D2322D70A4700B5F6B3 /* App.swift */,
|
||||||
|
C4811D2922D70F9A00B5F6B3 /* MainMenu.swift */,
|
||||||
);
|
);
|
||||||
path = Singletons;
|
path = Singletons;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@ -218,6 +221,7 @@
|
|||||||
C41C1B4D22B0215A00E7CF16 /* Actions.swift in Sources */,
|
C41C1B4D22B0215A00E7CF16 /* Actions.swift in Sources */,
|
||||||
C4811D2422D70A4700B5F6B3 /* App.swift in Sources */,
|
C4811D2422D70A4700B5F6B3 /* App.swift in Sources */,
|
||||||
C41C1B4922B00A9800E7CF16 /* MenuBarImageGenerator.swift in Sources */,
|
C41C1B4922B00A9800E7CF16 /* MenuBarImageGenerator.swift in Sources */,
|
||||||
|
C4811D2A22D70F9A00B5F6B3 /* MainMenu.swift in Sources */,
|
||||||
C41C1B3922B0097F00E7CF16 /* LogViewController.swift in Sources */,
|
C41C1B3922B0097F00E7CF16 /* LogViewController.swift in Sources */,
|
||||||
C41C1B3722B0097F00E7CF16 /* AppDelegate.swift in Sources */,
|
C41C1B3722B0097F00E7CF16 /* AppDelegate.swift in Sources */,
|
||||||
C41C1B4B22B019FF00E7CF16 /* PhpVersion.swift in Sources */,
|
C41C1B4B22B019FF00E7CF16 /* PhpVersion.swift in Sources */,
|
||||||
|
@ -9,155 +9,30 @@
|
|||||||
import Cocoa
|
import Cocoa
|
||||||
|
|
||||||
@NSApplicationMain
|
@NSApplicationMain
|
||||||
class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {
|
class AppDelegate: NSObject, NSApplicationDelegate {
|
||||||
|
|
||||||
// MARK: - Variables
|
// MARK: - Variables
|
||||||
|
|
||||||
let sharedShell : Shell
|
let sharedShell : Shell
|
||||||
let state : App
|
let state : App
|
||||||
let statusItem = NSStatusBar.system.statusItem(withLength: 32)
|
let menu : MainMenu
|
||||||
|
|
||||||
// MARK: - Initializer
|
// MARK: - Initializer
|
||||||
|
|
||||||
override init() {
|
override init() {
|
||||||
self.sharedShell = Shell.shared
|
self.sharedShell = Shell.shared
|
||||||
self.state = App.shared
|
self.state = App.shared
|
||||||
|
self.menu = MainMenu.shared
|
||||||
super.init()
|
super.init()
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Lifecycle
|
// MARK: - Lifecycle
|
||||||
|
|
||||||
func applicationDidFinishLaunching(_ aNotification: Notification) {
|
func applicationDidFinishLaunching(_ aNotification: Notification) {
|
||||||
// Start with the icon
|
self.menu.startup()
|
||||||
self.setStatusBar(image: NSImage(named: NSImage.Name("StatusBarIcon"))!)
|
|
||||||
// Perform environment boot checks
|
|
||||||
DispatchQueue.global(qos: .userInitiated).async { [unowned self] in
|
|
||||||
Startup.checkEnvironment()
|
|
||||||
App.shared.availablePhpVersions = Actions.detectPhpVersions()
|
|
||||||
self.updatePhpVersionInStatusBar()
|
|
||||||
// Schedule a request to fetch the PHP version every 60 seconds
|
|
||||||
DispatchQueue.main.async {
|
|
||||||
App.shared.timer = Timer.scheduledTimer(
|
|
||||||
timeInterval: 60,
|
|
||||||
target: self,
|
|
||||||
selector: #selector(self.updatePhpVersionInStatusBar),
|
|
||||||
userInfo: nil,
|
|
||||||
repeats: true
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func applicationWillTerminate(_ aNotification: Notification) {
|
func applicationWillTerminate(_ aNotification: Notification) {
|
||||||
// Insert code here to tear down your application
|
// Insert code here to tear down your application
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - UI related
|
|
||||||
|
|
||||||
func setStatusBarImage(version: String) {
|
|
||||||
self.setStatusBar(image: MenuBarImageGenerator.textToImage(width: 32.0, text: version))
|
|
||||||
}
|
|
||||||
|
|
||||||
func setStatusBar(image: NSImage) {
|
|
||||||
if let button = statusItem.button {
|
|
||||||
image.isTemplate = true
|
|
||||||
button.image = image
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func updateMenu() {
|
|
||||||
DispatchQueue.global(qos: .userInitiated).async { [unowned self] in
|
|
||||||
let menu = NSMenu()
|
|
||||||
var string = "We are not sure what version of PHP you are running."
|
|
||||||
if (App.shared.currentVersion != nil) {
|
|
||||||
string = "You are running PHP \(App.shared.currentVersion!.long)"
|
|
||||||
}
|
|
||||||
menu.addItem(NSMenuItem(title: string, action: nil, keyEquivalent: ""))
|
|
||||||
if (App.shared.currentVersion != nil) {
|
|
||||||
// Actions
|
|
||||||
menu.addItem(NSMenuItem.separator())
|
|
||||||
menu.addItem(NSMenuItem(title: "PHP configuration file (php.ini)", action: #selector(self.openActiveConfigFolder), keyEquivalent: ""))
|
|
||||||
}
|
|
||||||
menu.addItem(NSMenuItem.separator())
|
|
||||||
if (App.shared.availablePhpVersions.count > 0 && !App.shared.busy) {
|
|
||||||
var shortcutKey = 1
|
|
||||||
for index in (0..<App.shared.availablePhpVersions.count).reversed() {
|
|
||||||
let version = App.shared.availablePhpVersions[index]
|
|
||||||
let action = #selector(self.switchToPhpVersion(sender:))
|
|
||||||
let menuItem = NSMenuItem(title: "Switch to PHP \(version)", action: (version == App.shared.currentVersion?.short) ? nil : action, keyEquivalent: "\(shortcutKey)")
|
|
||||||
menuItem.tag = index
|
|
||||||
shortcutKey = shortcutKey + 1
|
|
||||||
menu.addItem(menuItem)
|
|
||||||
}
|
|
||||||
menu.addItem(NSMenuItem.separator())
|
|
||||||
}
|
|
||||||
if (App.shared.busy) {
|
|
||||||
menu.addItem(NSMenuItem(title: "Switching PHP versions...", action: nil, keyEquivalent: ""))
|
|
||||||
menu.addItem(NSMenuItem.separator())
|
|
||||||
}
|
|
||||||
menu.addItem(NSMenuItem(title: "View Shell Output", action: #selector(self.openOutput), keyEquivalent: ""))
|
|
||||||
menu.addItem(NSMenuItem(title: "About phpmon", action: #selector(self.openAbout), keyEquivalent: ""))
|
|
||||||
menu.addItem(NSMenuItem(title: "Quit phpmon", action: #selector(NSApplication.terminate(_:)), keyEquivalent: "q"))
|
|
||||||
DispatchQueue.main.async {
|
|
||||||
self.statusItem.menu = menu
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// MARK: - Callable via Obj-C (#selector)
|
|
||||||
|
|
||||||
@objc func openOutput() {
|
|
||||||
LogViewController.show(delegate: self)
|
|
||||||
}
|
|
||||||
|
|
||||||
@objc func updatePhpVersionInStatusBar() {
|
|
||||||
App.shared.currentVersion = PhpVersion()
|
|
||||||
if (App.shared.busy) {
|
|
||||||
DispatchQueue.main.async {
|
|
||||||
self.setStatusBar(image: NSImage(named: NSImage.Name("StatusBarIcon"))!)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
DispatchQueue.main.async {
|
|
||||||
self.setStatusBarImage(version: App.shared.currentVersion!.short)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
self.updateMenu()
|
|
||||||
}
|
|
||||||
|
|
||||||
@objc public func openAbout() {
|
|
||||||
NSApplication.shared.activate(ignoringOtherApps: true)
|
|
||||||
NSApplication.shared.orderFrontStandardAboutPanel()
|
|
||||||
}
|
|
||||||
|
|
||||||
@objc public func openActiveConfigFolder() {
|
|
||||||
Actions.openPhpConfigFolder(version: App.shared.currentVersion!.short)
|
|
||||||
}
|
|
||||||
|
|
||||||
@objc public func switchToPhpVersion(sender: AnyObject) {
|
|
||||||
self.setStatusBar(image: NSImage(named: NSImage.Name("StatusBarIcon"))!)
|
|
||||||
let index = sender.tag!
|
|
||||||
let version = App.shared.availablePhpVersions[index]
|
|
||||||
App.shared.busy = true
|
|
||||||
DispatchQueue.global(qos: .userInitiated).async { [unowned self] in
|
|
||||||
// Update the PHP version in the status bar
|
|
||||||
self.updatePhpVersionInStatusBar()
|
|
||||||
// Update the menu
|
|
||||||
self.updateMenu()
|
|
||||||
// Switch the PHP version
|
|
||||||
Actions.switchToPhpVersion(version: version, availableVersions: App.shared.availablePhpVersions)
|
|
||||||
// Mark as no longer busy
|
|
||||||
App.shared.busy = false
|
|
||||||
// Perform UI updates on main thread
|
|
||||||
DispatchQueue.main.async {
|
|
||||||
self.updatePhpVersionInStatusBar()
|
|
||||||
self.updateMenu()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func windowWillClose(_ notification: Notification) {
|
|
||||||
App.shared.windowController = nil
|
|
||||||
Shell.shared.delegate = nil
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>APPL</string>
|
<string>APPL</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>1.2</string>
|
<string>1.3</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>10</string>
|
<string>10</string>
|
||||||
<key>LSApplicationCategoryType</key>
|
<key>LSApplicationCategoryType</key>
|
||||||
|
156
phpmon/Singletons/MainMenu.swift
Normal file
156
phpmon/Singletons/MainMenu.swift
Normal file
@ -0,0 +1,156 @@
|
|||||||
|
//
|
||||||
|
// MainMenu.swift
|
||||||
|
// phpmon
|
||||||
|
//
|
||||||
|
// Created by Nico Verbruggen on 11/07/2019.
|
||||||
|
// Copyright © 2019 Nico Verbruggen. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Cocoa
|
||||||
|
|
||||||
|
class MainMenu: NSObject, NSWindowDelegate {
|
||||||
|
|
||||||
|
static let shared = MainMenu()
|
||||||
|
|
||||||
|
let statusItem = NSStatusBar.system.statusItem(withLength: 32)
|
||||||
|
|
||||||
|
// MARK: - UI related
|
||||||
|
|
||||||
|
public func startup() {
|
||||||
|
// Start with the icon
|
||||||
|
self.setStatusBar(image: NSImage(named: NSImage.Name("StatusBarIcon"))!)
|
||||||
|
// Perform environment boot checks
|
||||||
|
DispatchQueue.global(qos: .userInitiated).async { [unowned self] in
|
||||||
|
Startup.checkEnvironment()
|
||||||
|
App.shared.availablePhpVersions = Actions.detectPhpVersions()
|
||||||
|
self.updatePhpVersionInStatusBar()
|
||||||
|
// Schedule a request to fetch the PHP version every 60 seconds
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
App.shared.timer = Timer.scheduledTimer(
|
||||||
|
timeInterval: 60,
|
||||||
|
target: self,
|
||||||
|
selector: #selector(self.updatePhpVersionInStatusBar),
|
||||||
|
userInfo: nil,
|
||||||
|
repeats: true
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public func update() {
|
||||||
|
DispatchQueue.global(qos: .userInitiated).async { [unowned self] in
|
||||||
|
let menu = NSMenu()
|
||||||
|
var string = "We are not sure what version of PHP you are running."
|
||||||
|
if (App.shared.currentVersion != nil) {
|
||||||
|
string = "You are running PHP \(App.shared.currentVersion!.long)"
|
||||||
|
}
|
||||||
|
menu.addItem(NSMenuItem(title: string, action: nil, keyEquivalent: ""))
|
||||||
|
if (App.shared.currentVersion != nil) {
|
||||||
|
// Actions
|
||||||
|
menu.addItem(NSMenuItem.separator())
|
||||||
|
menu.addItem(NSMenuItem(title: "PHP configuration file (php.ini)", action: #selector(self.openActiveConfigFolder), keyEquivalent: ""))
|
||||||
|
}
|
||||||
|
menu.addItem(NSMenuItem.separator())
|
||||||
|
if (App.shared.availablePhpVersions.count > 0 && !App.shared.busy) {
|
||||||
|
var shortcutKey = 1
|
||||||
|
for index in (0..<App.shared.availablePhpVersions.count).reversed() {
|
||||||
|
let version = App.shared.availablePhpVersions[index]
|
||||||
|
let action = #selector(self.switchToPhpVersion(sender:))
|
||||||
|
let menuItem = NSMenuItem(title: "Switch to PHP \(version)", action: (version == App.shared.currentVersion?.short) ? nil : action, keyEquivalent: "\(shortcutKey)")
|
||||||
|
menuItem.tag = index
|
||||||
|
shortcutKey = shortcutKey + 1
|
||||||
|
menu.addItem(menuItem)
|
||||||
|
}
|
||||||
|
menu.addItem(NSMenuItem.separator())
|
||||||
|
}
|
||||||
|
if (App.shared.busy) {
|
||||||
|
menu.addItem(NSMenuItem(title: "Switching PHP versions...", action: nil, keyEquivalent: ""))
|
||||||
|
menu.addItem(NSMenuItem.separator())
|
||||||
|
}
|
||||||
|
menu.addItem(NSMenuItem(title: "View Shell Output", action: #selector(self.openOutput), keyEquivalent: ""))
|
||||||
|
menu.addItem(NSMenuItem(title: "About phpmon", action: #selector(self.openAbout), keyEquivalent: ""))
|
||||||
|
menu.addItem(NSMenuItem(title: "Quit phpmon", action: #selector(NSApplication.terminate(_:)), keyEquivalent: "q"))
|
||||||
|
menu.items.forEach({ (item) in
|
||||||
|
item.target = self
|
||||||
|
})
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
self.statusItem.menu = menu
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func setStatusBarImage(version: String) {
|
||||||
|
self.setStatusBar(
|
||||||
|
image: MenuBarImageGenerator.textToImage(
|
||||||
|
width: 32.0,
|
||||||
|
text: version
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func setStatusBar(image: NSImage) {
|
||||||
|
if let button = statusItem.button {
|
||||||
|
image.isTemplate = true
|
||||||
|
button.image = image
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - Callable via Obj-C (#selector)
|
||||||
|
|
||||||
|
@objc func openOutput() {
|
||||||
|
LogViewController.show(delegate: self)
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc func updatePhpVersionInStatusBar() {
|
||||||
|
App.shared.currentVersion = PhpVersion()
|
||||||
|
if (App.shared.busy) {
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
self.setStatusBar(image: NSImage(named: NSImage.Name("StatusBarIcon"))!)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
self.setStatusBarImage(version: App.shared.currentVersion!.short)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.update()
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc public func openAbout() {
|
||||||
|
NSApplication.shared.activate(ignoringOtherApps: true)
|
||||||
|
NSApplication.shared.orderFrontStandardAboutPanel()
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc public func openActiveConfigFolder() {
|
||||||
|
Actions.openPhpConfigFolder(version: App.shared.currentVersion!.short)
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc public func switchToPhpVersion(sender: AnyObject) {
|
||||||
|
self.setStatusBar(image: NSImage(named: NSImage.Name("StatusBarIcon"))!)
|
||||||
|
let index = sender.tag!
|
||||||
|
let version = App.shared.availablePhpVersions[index]
|
||||||
|
App.shared.busy = true
|
||||||
|
DispatchQueue.global(qos: .userInitiated).async { [unowned self] in
|
||||||
|
// Update the PHP version in the status bar
|
||||||
|
self.updatePhpVersionInStatusBar()
|
||||||
|
// Update the menu
|
||||||
|
self.update()
|
||||||
|
// Switch the PHP version
|
||||||
|
Actions.switchToPhpVersion(
|
||||||
|
version: version,
|
||||||
|
availableVersions: App.shared.availablePhpVersions
|
||||||
|
)
|
||||||
|
// Mark as no longer busy
|
||||||
|
App.shared.busy = false
|
||||||
|
// Perform UI updates on main thread
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
self.updatePhpVersionInStatusBar()
|
||||||
|
self.update()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func windowWillClose(_ notification: Notification) {
|
||||||
|
App.shared.windowController = nil
|
||||||
|
Shell.shared.delegate = nil
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user