PadXcode-Daemon/App/PadXcodeDaemonApp.swift

69 lines
2.1 KiB
Swift
Raw Normal View History

2026-04-12 00:42:51 -07:00
import SwiftUI
2026-04-12 22:14:13 -07:00
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
2026-04-12 00:42:51 -07:00
@main
struct PadXcodeDaemonApp: App {
2026-04-12 22:14:13 -07:00
@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?
2026-04-12 00:42:51 -07:00
init() {
ensureConfigFile()
let prefs = AppPreferences()
2026-04-12 22:14:13 -07:00
let ctrl = DaemonController(preferences: prefs)
_preferences = StateObject(wrappedValue: prefs)
_controller = StateObject(wrappedValue: ctrl)
// Store before applicationDidFinishLaunching fires.
PadXcodeDaemonApp.sharedController = ctrl
2026-04-12 00:42:51 -07:00
}
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()
}
}