mirror of
https://github.com/livebook-dev/livebook.git
synced 2025-09-08 14:04:31 +08:00
79 lines
2.3 KiB
Swift
79 lines
2.3 KiB
Swift
import AppKit
|
|
import ElixirKit
|
|
|
|
@main
|
|
public struct Demo {
|
|
public static func main() {
|
|
let app = NSApplication.shared
|
|
let delegate = AppDelegate()
|
|
app.delegate = delegate
|
|
app.run()
|
|
}
|
|
}
|
|
|
|
class AppDelegate: NSObject, NSApplicationDelegate {
|
|
private var window: NSWindow!
|
|
private var button: NSButton!
|
|
|
|
func applicationDidFinishLaunching(_ aNotification: Notification) {
|
|
button = NSButton(title: "Press me!", target: self, action: #selector(pressMe))
|
|
button.isEnabled = false
|
|
|
|
ElixirKit.API.start(
|
|
name: "demo",
|
|
readyHandler: {
|
|
// GUI updates need to happen on the main thread.
|
|
DispatchQueue.main.sync {
|
|
self.button.isEnabled = true
|
|
}
|
|
|
|
ElixirKit.API.publish("log", "Hello from AppKit!")
|
|
|
|
ElixirKit.API.addObserver(queue: .main) { (name, data) in
|
|
switch name {
|
|
case "log":
|
|
print("[client] " + data)
|
|
default:
|
|
fatalError("unknown event \(name)")
|
|
}
|
|
}
|
|
},
|
|
terminationHandler: { _ in
|
|
NSApp.terminate(nil)
|
|
}
|
|
)
|
|
|
|
let menuItemOne = NSMenuItem()
|
|
menuItemOne.submenu = NSMenu(title: "Demo")
|
|
menuItemOne.submenu?.items = [
|
|
NSMenuItem(title: "Quit Demo", action: #selector(NSApplication.terminate(_:)), keyEquivalent: "q")
|
|
]
|
|
let menu = NSMenu()
|
|
menu.items = [menuItemOne]
|
|
NSApp.mainMenu = menu
|
|
|
|
window = NSWindow(contentRect: NSMakeRect(0, -1000, 200, 200),
|
|
styleMask: [.titled, .closable],
|
|
backing: .buffered,
|
|
defer: true)
|
|
window.orderFrontRegardless()
|
|
window.title = "Demo"
|
|
window.contentView!.subviews.append(button)
|
|
|
|
NSApp.setActivationPolicy(.regular)
|
|
NSApp.activate(ignoringOtherApps: true)
|
|
}
|
|
|
|
func applicationShouldTerminateAfterLastWindowClosed(_ app: NSApplication) -> Bool {
|
|
return true
|
|
}
|
|
|
|
func applicationWillTerminate(_ aNotification: Notification) {
|
|
ElixirKit.API.stop()
|
|
}
|
|
|
|
@objc
|
|
func pressMe() {
|
|
ElixirKit.API.publish("log", "button pressed!")
|
|
}
|
|
}
|