68 lines
2.1 KiB
Swift
68 lines
2.1 KiB
Swift
import SwiftUI
|
|
import AppKit
|
|
|
|
// MARK: - App Delegate
|
|
|
|
final class PadXcodeDaemonDelegate: NSObject, NSApplicationDelegate {
|
|
|
|
func applicationDidFinishLaunching(_ notification: Notification) {
|
|
// Start daemon on app launch. The controller is created by the App
|
|
// struct before this fires and stored in the shared reference below.
|
|
guard let controller = PadXcodeDaemonApp.sharedController else { return }
|
|
Task { @MainActor in
|
|
await controller.start()
|
|
}
|
|
}
|
|
|
|
func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
|
|
return false
|
|
}
|
|
}
|
|
|
|
// MARK: - App
|
|
|
|
@main
|
|
struct PadXcodeDaemonApp: App {
|
|
|
|
@NSApplicationDelegateAdaptor(PadXcodeDaemonDelegate.self) private var appDelegate
|
|
@StateObject private var preferences = AppPreferences()
|
|
@StateObject private var controller: DaemonController
|
|
|
|
// Static reference so the delegate can access the controller before
|
|
// SwiftUI finishes wiring up @State bindings.
|
|
static var sharedController: DaemonController?
|
|
|
|
init() {
|
|
ensureConfigFile()
|
|
let prefs = AppPreferences()
|
|
let ctrl = DaemonController(preferences: prefs)
|
|
_preferences = StateObject(wrappedValue: prefs)
|
|
_controller = StateObject(wrappedValue: ctrl)
|
|
// Store before applicationDidFinishLaunching fires.
|
|
PadXcodeDaemonApp.sharedController = ctrl
|
|
}
|
|
|
|
var body: some Scene {
|
|
MenuBarExtra {
|
|
MenuBarView(controller: controller, preferences: preferences)
|
|
} label: {
|
|
MenuBarIcon(controller: controller)
|
|
}
|
|
.menuBarExtraStyle(.window)
|
|
|
|
Window("PadXcode Daemon Settings", id: "settings") {
|
|
DaemonSettingsView(controller: controller, preferences: preferences)
|
|
}
|
|
.windowResizability(.contentSize)
|
|
.defaultSize(width: 520, height: 580)
|
|
.windowStyle(.titleBar)
|
|
.commandsRemoved()
|
|
|
|
Window("Daemon Log", id: "log") {
|
|
DaemonLogWindowView(controller: controller)
|
|
}
|
|
.defaultSize(width: 700, height: 500)
|
|
.windowStyle(.titleBar)
|
|
.commandsRemoved()
|
|
}
|
|
}
|