SoyuzCapsule/Soyuz/Views/PrinterConfigView.swift

108 lines
4.0 KiB
Swift
Executable File

//
// PrinterConfigView.swift
// KlipperMon
//
// Created by maddiefuzz on 2/8/23.
//
import SwiftUI
import Network
// MARK: PrinterConfigView
struct PrinterConfigView: View {
@ObservedObject var printerManager: MoonrakerSocketManager
@ObservedObject var bonjourBrowser = BonjourBrowser()
//@State var bonjourBrowser = NWBrowser(for: .bonjourWithTXTRecord(type: "_moonraker._tcp", domain: "local."), using: .tcp)
@Environment(\.openURL) private var openURL
var body: some View {
VStack {
if(printerManager.isConnected) {
VStack {
Text("Soyuz Capsule is running in your menubar")
.font(.title)
.padding(4)
Image("menubar")
.resizable()
.frame(width: 225, height: 100)
.padding([.top], 2)
.padding([.leading, .trailing, .bottom], 8)
HStack {
Image(systemName: "network")
Text(printerManager.friendlyHostname)
Text("\(printerManager.socketHost):\(printerManager.socketPort)")
Button {
printerManager.disconnect()
} label: {
Text("Disconnect")
}
}
}
.frame(width: 500, height: 200)
} else {
VStack {
HStack {
Text("Auto-detected Printers")
.font(.title)
// Help button
Button {
let locBookName = Bundle.main.object(forInfoDictionaryKey: "CFBundleHelpBookName") as? String
NSHelpManager.shared.openHelpAnchor("bonjour", inBook: locBookName)
} label: {
ZStack {
Circle()
.strokeBorder(Color(NSColor.controlShadowColor), lineWidth: 0.5)
.background(Circle().foregroundColor(Color(NSColor.controlColor)))
.shadow(color: Color(NSColor.controlShadowColor).opacity(0.3), radius: 1)
.frame(width: 20, height: 20)
Text("?").font(.system(size: 15, weight: .medium ))
}
}.buttonStyle(PlainButtonStyle())
}
ForEach(bonjourBrowser.networkResults, id: \.hashValue) { result in
HStack {
Text(result.endpoint.toFriendlyString())
Button {
printerManager.connectToBonjourEndpoint(result.endpoint)
} label: {
Text("Connect")
//.foregroundColor(.white)
.padding()
}
}
}
}
.frame(width: 500, height: 100)
}
}
.onAppear {
NSApplication.shared.activate(ignoringOtherApps: true)
bonjourBrowser.enableScan(DispatchQueue.main)
}
.onDisappear {
bonjourBrowser.disableScan()
}
}
}
struct PrinterConfigView_Previews: PreviewProvider {
@State static var printerManager = MoonrakerSocketManager()
static var previews: some View {
PrinterConfigView(printerManager: printerManager)
}
}
extension NWEndpoint {
func toFriendlyString() -> String {
let regex = /\.(.+)/
let match = self.debugDescription.firstMatch(of: regex)
return self.debugDescription.replacingOccurrences(of: match!.0, with: "")
}
}