Initial MultiTimer macOS app
This commit is contained in:
@@ -0,0 +1,100 @@
|
||||
import AppKit
|
||||
import SwiftUI
|
||||
|
||||
@MainActor
|
||||
final class AlarmWindowManager {
|
||||
static let shared = AlarmWindowManager()
|
||||
|
||||
private var windows: [UUID: NSWindow] = [:]
|
||||
|
||||
private init() {}
|
||||
|
||||
func showAlarm(
|
||||
timerID: UUID,
|
||||
timerName: String,
|
||||
onRepeat: @escaping () -> Void,
|
||||
onFinish: @escaping () -> Void
|
||||
) {
|
||||
if let existingWindow = windows[timerID] {
|
||||
existingWindow.makeKeyAndOrderFront(nil)
|
||||
NSApp.activate(ignoringOtherApps: true)
|
||||
return
|
||||
}
|
||||
|
||||
let view = AlarmPopupView(
|
||||
timerName: timerName,
|
||||
repeatAction: { [weak self] in
|
||||
onRepeat()
|
||||
self?.closeWindow(timerID: timerID)
|
||||
},
|
||||
finishAction: { [weak self] in
|
||||
onFinish()
|
||||
self?.closeWindow(timerID: timerID)
|
||||
}
|
||||
)
|
||||
|
||||
let hostingView = NSHostingView(rootView: view)
|
||||
|
||||
let window = NSWindow(
|
||||
contentRect: NSRect(x: 0, y: 0, width: 360, height: 210),
|
||||
styleMask: [.titled, .closable],
|
||||
backing: .buffered,
|
||||
defer: false
|
||||
)
|
||||
|
||||
window.title = "Timer abgelaufen"
|
||||
window.contentView = hostingView
|
||||
window.isReleasedWhenClosed = false
|
||||
window.level = .floating
|
||||
window.center()
|
||||
|
||||
windows[timerID] = window
|
||||
|
||||
window.makeKeyAndOrderFront(nil)
|
||||
NSApp.activate(ignoringOtherApps: true)
|
||||
}
|
||||
|
||||
func closeWindow(timerID: UUID) {
|
||||
windows[timerID]?.close()
|
||||
windows.removeValue(forKey: timerID)
|
||||
}
|
||||
}
|
||||
|
||||
struct AlarmPopupView: View {
|
||||
let timerName: String
|
||||
let repeatAction: () -> Void
|
||||
let finishAction: () -> Void
|
||||
|
||||
var body: some View {
|
||||
VStack(spacing: 18) {
|
||||
Image(systemName: "timer")
|
||||
.font(.system(size: 42))
|
||||
.foregroundStyle(.orange)
|
||||
|
||||
VStack(spacing: 6) {
|
||||
Text("Timer abgelaufen")
|
||||
.font(.title2)
|
||||
.bold()
|
||||
|
||||
Text("„\(timerName)” ist fertig.")
|
||||
.font(.body)
|
||||
.multilineTextAlignment(.center)
|
||||
.foregroundStyle(.secondary)
|
||||
}
|
||||
|
||||
HStack(spacing: 12) {
|
||||
Button("Beenden") {
|
||||
finishAction()
|
||||
}
|
||||
.keyboardShortcut(.cancelAction)
|
||||
|
||||
Button("Wiederholen") {
|
||||
repeatAction()
|
||||
}
|
||||
.keyboardShortcut(.defaultAction)
|
||||
}
|
||||
}
|
||||
.padding(24)
|
||||
.frame(width: 360, height: 210)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user