mirror of
https://github.com/nicoverbruggen/phpmon.git
synced 2025-08-07 20:10:08 +02:00
🚛 Move async helpers to MainMenu+Async
This commit is contained in:
@ -85,6 +85,8 @@
|
|||||||
C44CCD4527AFE94900CE40E5 /* HomebrewPermissionError.swift in Sources */ = {isa = PBXBuildFile; fileRef = C44CCD4427AFE94900CE40E5 /* HomebrewPermissionError.swift */; };
|
C44CCD4527AFE94900CE40E5 /* HomebrewPermissionError.swift in Sources */ = {isa = PBXBuildFile; fileRef = C44CCD4427AFE94900CE40E5 /* HomebrewPermissionError.swift */; };
|
||||||
C44CCD4627AFE94900CE40E5 /* HomebrewPermissionError.swift in Sources */ = {isa = PBXBuildFile; fileRef = C44CCD4427AFE94900CE40E5 /* HomebrewPermissionError.swift */; };
|
C44CCD4627AFE94900CE40E5 /* HomebrewPermissionError.swift in Sources */ = {isa = PBXBuildFile; fileRef = C44CCD4427AFE94900CE40E5 /* HomebrewPermissionError.swift */; };
|
||||||
C44CCD4727AFE94900CE40E5 /* HomebrewPermissionError.swift in Sources */ = {isa = PBXBuildFile; fileRef = C44CCD4427AFE94900CE40E5 /* HomebrewPermissionError.swift */; };
|
C44CCD4727AFE94900CE40E5 /* HomebrewPermissionError.swift in Sources */ = {isa = PBXBuildFile; fileRef = C44CCD4427AFE94900CE40E5 /* HomebrewPermissionError.swift */; };
|
||||||
|
C44CCD4927AFF3B700CE40E5 /* MainMenu+Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = C44CCD4827AFF3B700CE40E5 /* MainMenu+Async.swift */; };
|
||||||
|
C44CCD4A27AFF3BC00CE40E5 /* MainMenu+Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = C44CCD4827AFF3B700CE40E5 /* MainMenu+Async.swift */; };
|
||||||
C464ADAC275A7A3F003FCD53 /* SiteListWC.swift in Sources */ = {isa = PBXBuildFile; fileRef = C464ADAB275A7A3F003FCD53 /* SiteListWC.swift */; };
|
C464ADAC275A7A3F003FCD53 /* SiteListWC.swift in Sources */ = {isa = PBXBuildFile; fileRef = C464ADAB275A7A3F003FCD53 /* SiteListWC.swift */; };
|
||||||
C464ADAD275A7A3F003FCD53 /* SiteListWC.swift in Sources */ = {isa = PBXBuildFile; fileRef = C464ADAB275A7A3F003FCD53 /* SiteListWC.swift */; };
|
C464ADAD275A7A3F003FCD53 /* SiteListWC.swift in Sources */ = {isa = PBXBuildFile; fileRef = C464ADAB275A7A3F003FCD53 /* SiteListWC.swift */; };
|
||||||
C464ADAF275A7A69003FCD53 /* SiteListVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = C464ADAE275A7A69003FCD53 /* SiteListVC.swift */; };
|
C464ADAF275A7A69003FCD53 /* SiteListVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = C464ADAE275A7A69003FCD53 /* SiteListVC.swift */; };
|
||||||
@ -272,6 +274,7 @@
|
|||||||
C44C1990276E44CB0072762D /* ProgressWindow.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = ProgressWindow.storyboard; sourceTree = "<group>"; };
|
C44C1990276E44CB0072762D /* ProgressWindow.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = ProgressWindow.storyboard; sourceTree = "<group>"; };
|
||||||
C44CCD3F27AFE2FC00CE40E5 /* AlertableError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlertableError.swift; sourceTree = "<group>"; };
|
C44CCD3F27AFE2FC00CE40E5 /* AlertableError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlertableError.swift; sourceTree = "<group>"; };
|
||||||
C44CCD4427AFE94900CE40E5 /* HomebrewPermissionError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomebrewPermissionError.swift; sourceTree = "<group>"; };
|
C44CCD4427AFE94900CE40E5 /* HomebrewPermissionError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomebrewPermissionError.swift; sourceTree = "<group>"; };
|
||||||
|
C44CCD4827AFF3B700CE40E5 /* MainMenu+Async.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MainMenu+Async.swift"; sourceTree = "<group>"; };
|
||||||
C464ADAB275A7A3F003FCD53 /* SiteListWC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SiteListWC.swift; sourceTree = "<group>"; };
|
C464ADAB275A7A3F003FCD53 /* SiteListWC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SiteListWC.swift; sourceTree = "<group>"; };
|
||||||
C464ADAE275A7A69003FCD53 /* SiteListVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SiteListVC.swift; sourceTree = "<group>"; };
|
C464ADAE275A7A69003FCD53 /* SiteListVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SiteListVC.swift; sourceTree = "<group>"; };
|
||||||
C464ADB1275A87CA003FCD53 /* SiteListCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SiteListCell.swift; sourceTree = "<group>"; };
|
C464ADB1275A87CA003FCD53 /* SiteListCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SiteListCell.swift; sourceTree = "<group>"; };
|
||||||
@ -551,6 +554,7 @@
|
|||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
C4811D2922D70F9A00B5F6B3 /* MainMenu.swift */,
|
C4811D2922D70F9A00B5F6B3 /* MainMenu.swift */,
|
||||||
|
C44CCD4827AFF3B700CE40E5 /* MainMenu+Async.swift */,
|
||||||
C4C3ED402783497000AB15D8 /* MainMenu+Startup.swift */,
|
C4C3ED402783497000AB15D8 /* MainMenu+Startup.swift */,
|
||||||
C47331A1247093B7009A0597 /* StatusMenu.swift */,
|
C47331A1247093B7009A0597 /* StatusMenu.swift */,
|
||||||
C48D0C9525CC80B100CC7490 /* HeaderView.swift */,
|
C48D0C9525CC80B100CC7490 /* HeaderView.swift */,
|
||||||
@ -957,6 +961,7 @@
|
|||||||
C42759672627662800093CAE /* NSMenuExtension.swift in Sources */,
|
C42759672627662800093CAE /* NSMenuExtension.swift in Sources */,
|
||||||
C464ADAF275A7A69003FCD53 /* SiteListVC.swift in Sources */,
|
C464ADAF275A7A69003FCD53 /* SiteListVC.swift in Sources */,
|
||||||
C4EC1E6D279DF87A0010F296 /* Async.swift in Sources */,
|
C4EC1E6D279DF87A0010F296 /* Async.swift in Sources */,
|
||||||
|
C44CCD4927AFF3B700CE40E5 /* MainMenu+Async.swift in Sources */,
|
||||||
C4EC1E73279DFCF40010F296 /* Events.swift in Sources */,
|
C4EC1E73279DFCF40010F296 /* Events.swift in Sources */,
|
||||||
C4B5853E2770FE3900DA4FBE /* Paths.swift in Sources */,
|
C4B5853E2770FE3900DA4FBE /* Paths.swift in Sources */,
|
||||||
C41C1B4B22B019FF00E7CF16 /* ActivePhpInstallation.swift in Sources */,
|
C41C1B4B22B019FF00E7CF16 /* ActivePhpInstallation.swift in Sources */,
|
||||||
@ -1053,6 +1058,7 @@
|
|||||||
C40B24F127A3106D0018C7D2 /* ServicesView.swift in Sources */,
|
C40B24F127A3106D0018C7D2 /* ServicesView.swift in Sources */,
|
||||||
C4F780C525D80B75000DBC97 /* MenuBarImageGenerator.swift in Sources */,
|
C4F780C525D80B75000DBC97 /* MenuBarImageGenerator.swift in Sources */,
|
||||||
C4F780B725D80B5D000DBC97 /* App.swift in Sources */,
|
C4F780B725D80B5D000DBC97 /* App.swift in Sources */,
|
||||||
|
C44CCD4A27AFF3BC00CE40E5 /* MainMenu+Async.swift in Sources */,
|
||||||
C48D6C71279CD2AC00F26D7E /* PhpVersionNumber.swift in Sources */,
|
C48D6C71279CD2AC00F26D7E /* PhpVersionNumber.swift in Sources */,
|
||||||
C4F780C925D80B75000DBC97 /* StringExtension.swift in Sources */,
|
C4F780C925D80B75000DBC97 /* StringExtension.swift in Sources */,
|
||||||
C4B5853F2770FE3900DA4FBE /* Paths.swift in Sources */,
|
C4B5853F2770FE3900DA4FBE /* Paths.swift in Sources */,
|
||||||
|
92
phpmon/Domain/Menu/MainMenu+Async.swift
Normal file
92
phpmon/Domain/Menu/MainMenu+Async.swift
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
//
|
||||||
|
// MainMenu+Async.swift
|
||||||
|
// PHP Monitor
|
||||||
|
//
|
||||||
|
// Created by Nico Verbruggen on 06/02/2022.
|
||||||
|
// Copyright © 2022 Nico Verbruggen. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
extension MainMenu {
|
||||||
|
|
||||||
|
// MARK: - Nicer callbacks
|
||||||
|
|
||||||
|
enum AsyncBehaviour {
|
||||||
|
case setsBusyUI
|
||||||
|
case reloadsPhpInstallation
|
||||||
|
case updatesMenuBarContents
|
||||||
|
case broadcastServicesUpdate
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Attempts asynchronous execution of a callback that may throw an Error.
|
||||||
|
While the callback is being executed, the UI will be marked as busy.
|
||||||
|
|
||||||
|
- Parameter execute: Callback of the work that needs to happen.
|
||||||
|
- Parameter success: Callback that is fired when all was OK.
|
||||||
|
- Parameter failure: Callback that is fired when an Error was thrown.
|
||||||
|
- Parameter behaviours: Various behaviours that can be tweaked, but usually best left to the default.
|
||||||
|
*/
|
||||||
|
func asyncExecution(
|
||||||
|
_ execute: @escaping () throws -> Void,
|
||||||
|
success: @escaping () -> Void = {},
|
||||||
|
failure: @escaping (Error) -> Void = { _ in },
|
||||||
|
behaviours: [AsyncBehaviour] = [
|
||||||
|
.setsBusyUI,
|
||||||
|
.reloadsPhpInstallation,
|
||||||
|
.updatesMenuBarContents,
|
||||||
|
.broadcastServicesUpdate
|
||||||
|
]
|
||||||
|
) {
|
||||||
|
if behaviours.contains(.reloadsPhpInstallation) {
|
||||||
|
PhpEnv.shared.isBusy = true
|
||||||
|
}
|
||||||
|
if behaviours.contains(.setsBusyUI) {
|
||||||
|
setBusyImage()
|
||||||
|
}
|
||||||
|
DispatchQueue.global(qos: .userInitiated).async { [unowned self] in
|
||||||
|
var error: Error? = nil
|
||||||
|
|
||||||
|
do { try execute() } catch let e { error = e }
|
||||||
|
|
||||||
|
if behaviours.contains(.setsBusyUI) {
|
||||||
|
PhpEnv.shared.isBusy = false
|
||||||
|
}
|
||||||
|
|
||||||
|
DispatchQueue.main.async { [self] in
|
||||||
|
if behaviours.contains(.reloadsPhpInstallation) {
|
||||||
|
PhpEnv.shared.currentInstall = ActivePhpInstallation()
|
||||||
|
}
|
||||||
|
|
||||||
|
if behaviours.contains(.updatesMenuBarContents) {
|
||||||
|
// Refresh the entire menu bar menu's contents
|
||||||
|
updatePhpVersionInStatusBar()
|
||||||
|
} else {
|
||||||
|
// We do still need to refresh the icon based on the busy state
|
||||||
|
if behaviours.contains(.setsBusyUI) {
|
||||||
|
refreshIcon()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if behaviours.contains(.broadcastServicesUpdate) {
|
||||||
|
NotificationCenter.default.post(name: Events.ServicesUpdated, object: nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
error == nil ? success() : failure(error!)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func asyncWithBusyUI(
|
||||||
|
_ execute: @escaping () throws -> Void,
|
||||||
|
completion: @escaping () -> Void = {}
|
||||||
|
) {
|
||||||
|
asyncExecution({
|
||||||
|
try! execute()
|
||||||
|
}, success: {
|
||||||
|
completion()
|
||||||
|
}, behaviours: [.setsBusyUI])
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -85,85 +85,6 @@ class MainMenu: NSObject, NSWindowDelegate, NSMenuDelegate {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Nicer callbacks
|
|
||||||
|
|
||||||
enum AsyncBehaviour {
|
|
||||||
case setsBusyUI
|
|
||||||
case reloadsPhpInstallation
|
|
||||||
case updatesMenuBarContents
|
|
||||||
case broadcastServicesUpdate
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
Attempts asynchronous execution of a callback that may throw an Error.
|
|
||||||
While the callback is being executed, the UI will be marked as busy.
|
|
||||||
|
|
||||||
- Parameter execute: Callback of the work that needs to happen.
|
|
||||||
- Parameter success: Callback that is fired when all was OK.
|
|
||||||
- Parameter failure: Callback that is fired when an Error was thrown.
|
|
||||||
- Parameter behaviours: Various behaviours that can be tweaked, but usually best left to the default.
|
|
||||||
*/
|
|
||||||
private func asyncExecution(
|
|
||||||
_ execute: @escaping () throws -> Void,
|
|
||||||
success: @escaping () -> Void = {},
|
|
||||||
failure: @escaping (Error) -> Void = { _ in },
|
|
||||||
behaviours: [AsyncBehaviour] = [
|
|
||||||
.setsBusyUI,
|
|
||||||
.reloadsPhpInstallation,
|
|
||||||
.updatesMenuBarContents,
|
|
||||||
.broadcastServicesUpdate
|
|
||||||
]
|
|
||||||
) {
|
|
||||||
if behaviours.contains(.reloadsPhpInstallation) {
|
|
||||||
PhpEnv.shared.isBusy = true
|
|
||||||
}
|
|
||||||
if behaviours.contains(.setsBusyUI) {
|
|
||||||
setBusyImage()
|
|
||||||
}
|
|
||||||
DispatchQueue.global(qos: .userInitiated).async { [unowned self] in
|
|
||||||
var error: Error? = nil
|
|
||||||
|
|
||||||
do { try execute() } catch let e { error = e }
|
|
||||||
|
|
||||||
if behaviours.contains(.setsBusyUI) {
|
|
||||||
PhpEnv.shared.isBusy = false
|
|
||||||
}
|
|
||||||
|
|
||||||
DispatchQueue.main.async { [self] in
|
|
||||||
if behaviours.contains(.reloadsPhpInstallation) {
|
|
||||||
PhpEnv.shared.currentInstall = ActivePhpInstallation()
|
|
||||||
}
|
|
||||||
|
|
||||||
if behaviours.contains(.updatesMenuBarContents) {
|
|
||||||
// Refresh the entire menu bar menu's contents
|
|
||||||
updatePhpVersionInStatusBar()
|
|
||||||
} else {
|
|
||||||
// We do still need to refresh the icon based on the busy state
|
|
||||||
if behaviours.contains(.setsBusyUI) {
|
|
||||||
refreshIcon()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if behaviours.contains(.broadcastServicesUpdate) {
|
|
||||||
NotificationCenter.default.post(name: Events.ServicesUpdated, object: nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
error == nil ? success() : failure(error!)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public func asyncWithBusyUI(
|
|
||||||
_ execute: @escaping () throws -> Void,
|
|
||||||
completion: @escaping () -> Void = {}
|
|
||||||
) {
|
|
||||||
asyncExecution({
|
|
||||||
try! execute()
|
|
||||||
}, success: {
|
|
||||||
completion()
|
|
||||||
}, behaviours: [.setsBusyUI])
|
|
||||||
}
|
|
||||||
|
|
||||||
// MARK: - User Interface
|
// MARK: - User Interface
|
||||||
|
|
||||||
@objc func refreshActiveInstallation() {
|
@objc func refreshActiveInstallation() {
|
||||||
|
Reference in New Issue
Block a user