import Cocoa import FlutterMacOS import UniformTypeIdentifiers /// Registers a method channel for native file picking with hidden files visible. /// Called from Dart via `ensureInitialized`. class NativePickerRegistrar: NSObject, FlutterPlugin { public static func register(with registrar: FlutterPluginRegistrar) { let channel = FlutterMethodChannel( name: "com.svrnty.native_picker", binaryMessenger: registrar.messenger) let instance = NativePickerRegistrar() registrar.addMethodCallDelegate(instance, channel: channel) } public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { switch call.method { case "getDirectoryPath": let args = call.arguments as? [String: Any] ?? [:] let dialog = NSOpenPanel() if let initial = args["initialDirectory"] as? String, !initial.isEmpty { dialog.directoryURL = URL(fileURLWithPath: initial) } dialog.showsHiddenFiles = true dialog.canChooseDirectories = true dialog.canChooseFiles = false dialog.allowsMultipleSelection = false dialog.treatsFilePackagesAsDirectories = true dialog.message = "Select a folder containing session files" guard let window = NSApp.keyWindow else { result(FlutterError(code: "NO_WINDOW", message: "No key window found", details: nil)) return } dialog.beginSheetModal(for: window) { response in if response == .OK, let url = dialog.url { result(url.path) } else { result(nil) } } case "pickFiles": let args = call.arguments as? [String: Any] ?? [:] let dialog = NSOpenPanel() if let initial = args["initialDirectory"] as? String, !initial.isEmpty { dialog.directoryURL = URL(fileURLWithPath: initial) } dialog.showsHiddenFiles = true dialog.canChooseDirectories = false dialog.canChooseFiles = true dialog.allowsMultipleSelection = false if let extensions = args["allowedExtensions"] as? [String], !extensions.isEmpty { if #available(macOS 11.0, *) { let contentTypes = extensions.compactMap { UTType(filenameExtension: $0) } dialog.allowedContentTypes = contentTypes } else { dialog.allowedFileTypes = extensions } } dialog.message = "Select a session file" guard let window = NSApp.keyWindow else { result(FlutterError(code: "NO_WINDOW", message: "No key window found", details: nil)) return } dialog.beginSheetModal(for: window) { response in if response == .OK, let url = dialog.url { result([url.path]) } else { result(nil) } } default: result(FlutterMethodNotImplemented) } } }