Files
venera/macos/Runner/AppDelegate.swift

92 lines
3.4 KiB
Swift

import Cocoa
import FlutterMacOS
@main
class AppDelegate: FlutterAppDelegate {
var flutterResult: FlutterResult?
var directoryPath: URL!
override func applicationDidFinishLaunching(_ notification: Notification) {
let controller: FlutterViewController = mainFlutterWindow?.contentViewController as! FlutterViewController
let methodChannel = FlutterMethodChannel(name: "venera/method_channel", binaryMessenger: controller.engine.binaryMessenger)
methodChannel.setMethodCallHandler { (call, result) in
switch call.method {
case "getProxy":
if let proxySettings = CFNetworkCopySystemProxySettings()?.takeUnretainedValue() as NSDictionary? {
if let httpProxy = proxySettings[kCFNetworkProxiesHTTPProxy] as? String,
let httpPort = proxySettings[kCFNetworkProxiesHTTPPort] as? Int {
let proxyConfig = "\(httpProxy):\(httpPort)"
result(proxyConfig)
} else if let socksProxy = proxySettings[kCFNetworkProxiesSOCKSProxy] as? String,
let socksPort = proxySettings[kCFNetworkProxiesSOCKSPort] as? Int {
let proxyConfig = "\(socksProxy):\(socksPort)"
result(proxyConfig)
} else {
result("")
}
} else {
result("")
}
case "getDirectoryPath":
self.flutterResult = result
self.getDirectoryPath()
case "stopAccessingSecurityScopedResource":
self.directoryPath?.stopAccessingSecurityScopedResource()
result(nil)
default:
result(FlutterMethodNotImplemented)
}
}
let clipboardChannel = FlutterMethodChannel(name: "venera/clipboard", binaryMessenger: controller.engine.binaryMessenger)
clipboardChannel.setMethodCallHandler { (call, result) in
switch call.method {
case "writeImageToClipboard":
guard let arguments = call.arguments as? [String: Any],
let data = arguments["data"] as? FlutterStandardTypedData else {
result(FlutterError(code: "INVALID_ARGUMENTS", message: "Invalid arguments", details: nil))
return
}
guard let image = NSImage(data: data.data) else {
result(FlutterError(code: "INVALID_IMAGE", message: "Could not create image from data", details: nil))
return
}
let pasteboard = NSPasteboard.general
pasteboard.clearContents()
pasteboard.writeObjects([image])
result(true)
default:
result(FlutterMethodNotImplemented)
}
}
}
func getDirectoryPath() {
let openPanel = NSOpenPanel()
openPanel.canChooseDirectories = true
openPanel.canChooseFiles = false
openPanel.allowsMultipleSelection = false
openPanel.begin { (result) in
if result == .OK {
self.directoryPath = openPanel.urls.first
if let directoryPath = self.directoryPath, !directoryPath.startAccessingSecurityScopedResource() {
self.flutterResult?(nil)
return
}
self.flutterResult?(self.directoryPath?.path)
} else {
self.flutterResult?(nil)
}
}
}
override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
return true
}
}