Some checks failed
Cache: Publish Nix / Publish Nix Cache (push) Waiting to run
Build Rust / Cargo Test (push) Successful in 4m14s
Build Site / Next.js Build (push) Failing after 6s
Infra: OpenTofu / OpenTofu (grafana) (push) Successful in 5s
Lint Governance / BEP Metadata (push) Successful in 0s
Build: Android / Android Rust Core Stub (push) Failing after 23s
112 lines
3.3 KiB
Swift
112 lines
3.3 KiB
Swift
#if os(macOS)
|
|
import AppKit
|
|
import BurrowUI
|
|
import Sparkle
|
|
import SwiftUI
|
|
|
|
@main
|
|
@MainActor
|
|
class AppDelegate: NSObject, NSApplicationDelegate {
|
|
private var windowController: NSWindowController?
|
|
private let updaterController = SPUStandardUpdaterController(
|
|
startingUpdater: true,
|
|
updaterDelegate: nil,
|
|
userDriverDelegate: nil
|
|
)
|
|
|
|
private let quitItem: NSMenuItem = {
|
|
let quitItem = NSMenuItem(
|
|
title: "Quit Burrow",
|
|
action: #selector(NSApplication.terminate(_:)),
|
|
keyEquivalent: "q"
|
|
)
|
|
quitItem.target = NSApplication.shared
|
|
quitItem.keyEquivalentModifierMask = .command
|
|
return quitItem
|
|
}()
|
|
|
|
private lazy var openItem: NSMenuItem = {
|
|
let item = NSMenuItem(
|
|
title: "Open Burrow",
|
|
action: #selector(openWindow),
|
|
keyEquivalent: "o"
|
|
)
|
|
item.target = self
|
|
item.keyEquivalentModifierMask = .command
|
|
return item
|
|
}()
|
|
|
|
private lazy var checkForUpdatesItem: NSMenuItem = {
|
|
let item = NSMenuItem(
|
|
title: "Check for Updates...",
|
|
action: #selector(checkForUpdates(_:)),
|
|
keyEquivalent: ""
|
|
)
|
|
item.target = self
|
|
return item
|
|
}()
|
|
|
|
private let toggleItem: NSMenuItem = {
|
|
let toggleView = NSHostingView(rootView: MenuItemToggleView())
|
|
toggleView.frame.size = CGSize(width: 300, height: 32)
|
|
toggleView.autoresizingMask = [.width]
|
|
|
|
let toggleItem = NSMenuItem()
|
|
toggleItem.view = toggleView
|
|
return toggleItem
|
|
}()
|
|
|
|
private lazy var menu: NSMenu = {
|
|
let menu = NSMenu()
|
|
menu.items = [
|
|
toggleItem,
|
|
openItem,
|
|
checkForUpdatesItem,
|
|
.separator(),
|
|
quitItem
|
|
]
|
|
return menu
|
|
}()
|
|
|
|
private lazy var statusItem: NSStatusItem = {
|
|
let statusBar = NSStatusBar.system
|
|
let statusItem = statusBar.statusItem(withLength: NSStatusItem.squareLength)
|
|
if let button = statusItem.button {
|
|
button.image = NSImage(systemSymbolName: "pipe.and.drop.fill", accessibilityDescription: nil)
|
|
}
|
|
return statusItem
|
|
}()
|
|
|
|
func applicationDidFinishLaunching(_ notification: Notification) {
|
|
statusItem.menu = menu
|
|
}
|
|
|
|
@objc
|
|
private func openWindow() {
|
|
if let window = windowController?.window {
|
|
window.makeKeyAndOrderFront(nil)
|
|
NSApplication.shared.activate(ignoringOtherApps: true)
|
|
return
|
|
}
|
|
|
|
let contentView = BurrowView()
|
|
let hostingController = NSHostingController(rootView: contentView)
|
|
let window = NSWindow(contentViewController: hostingController)
|
|
window.title = "Burrow"
|
|
window.setContentSize(NSSize(width: 820, height: 720))
|
|
window.styleMask.insert([.titled, .closable, .miniaturizable, .resizable])
|
|
window.center()
|
|
|
|
let controller = NSWindowController(window: window)
|
|
controller.shouldCascadeWindows = true
|
|
controller.showWindow(nil)
|
|
windowController = controller
|
|
NSApplication.shared.activate(ignoringOtherApps: true)
|
|
}
|
|
|
|
@objc
|
|
private func checkForUpdates(_ sender: Any?) {
|
|
updaterController.checkForUpdates(sender)
|
|
}
|
|
}
|
|
#endif
|