61 lines
1.6 KiB
Swift
61 lines
1.6 KiB
Swift
import SwiftUI
|
|
import IOBluetooth
|
|
import IOKit
|
|
import CoreAudio
|
|
|
|
@main
|
|
struct BLTSTrackerApp: App {
|
|
@ObservedObject var tracker = BluetoothTracker.shared
|
|
|
|
var body: some Scene {
|
|
MenuBarExtra {
|
|
menuContent
|
|
} label: {
|
|
menuBarLabel
|
|
}
|
|
}
|
|
|
|
@ViewBuilder
|
|
private var menuBarLabel: some View {
|
|
let active = tracker.activeHeadphone
|
|
let isConn = active?.isConnected == true
|
|
let percent = active?.primaryBatteryPercent
|
|
|
|
if isConn, let p = percent {
|
|
Label(" \(p)%", systemImage: "headphones")
|
|
.labelStyle(.titleAndIcon)
|
|
} else if isConn {
|
|
Label(" 100%", systemImage: "headphones")
|
|
.labelStyle(.titleAndIcon)
|
|
} else {
|
|
Label("", systemImage: "headphones")
|
|
.labelStyle(.iconOnly)
|
|
}
|
|
}
|
|
|
|
@ViewBuilder
|
|
private var menuContent: some View {
|
|
if let dev = tracker.activeHeadphone, dev.isConnected {
|
|
let percentStr = dev.primaryBatteryPercent != nil ? "\(dev.primaryBatteryPercent!)%" : "100%"
|
|
Text("🎧 \(dev.name): \(percentStr)")
|
|
.font(.headline)
|
|
} else {
|
|
Text("🎧 Наушники не подключены")
|
|
.foregroundColor(.secondary)
|
|
}
|
|
|
|
Divider()
|
|
|
|
Button("Обновить статус") {
|
|
tracker.refreshNow()
|
|
}
|
|
.keyboardShortcut("r")
|
|
|
|
Divider()
|
|
|
|
Button("Завершить") {
|
|
NSApplication.shared.terminate(nil)
|
|
}
|
|
.keyboardShortcut("q")
|
|
}
|
|
}
|