// // FileDialog.swift // Adwaita // // Created by david-swift on 08.12.23. // // swiftlint:disable discouraged_optional_collection import Foundation /// A structure representing a file dialog window. public struct FileDialog: WindowScene { /// The window's identifier. public var id: String /// Whether the window is an importer. public var importer = true /// Whether an instance of the window type should be opened when the app is starting up. public var open: Int { 0 } /// The identifier of the window's parent. public var parentID: String? /// The keyboard shortcuts on the app level. public var appShortcuts: [String: (GTUIApp) -> Void] = [:] /// The initial folder. var initialFolder: URL? /// The initial file name for the file exporter. var initialName: String? /// The accepted extensions for the file importer. var extensions: [String]? /// The closure to run when the import or export is successful. var result: ((URL) -> Void)? /// The closure to run when the import or export is not successful. var cancel: (() -> Void)? /// Create an importer file dialog window. /// - Parameters: /// - importer: The window's identifier. /// - initialFolder: The URL to the folder open when being opened. /// - extensions: The accepted file extensions. /// - folders: Whether folders are accepted. /// - onOpen: Run this when a file for importing has been chosen. /// - onClose: Run this when the user cancelled the action. public init( importer: String, initialFolder: URL? = nil, extensions: [String]? = nil, onOpen: @escaping (URL) -> Void, onClose: @escaping () -> Void ) { self.id = importer self.initialFolder = initialFolder self.extensions = extensions self.result = onOpen self.cancel = onClose } /// Create an exporter file dialog window. /// - Parameters: /// - exporter: The window's identifier. /// - initialFolder: The URL to the folder open when being opened. /// - initialName: The default file name. /// - onSave: Run this when a path for exporting has been chosen. /// - onClose: Run this when the user cancelled the action. public init( exporter: String, initialFolder: URL? = nil, initialName: String? = nil, onSave: @escaping (URL) -> Void, onClose: @escaping () -> Void ) { self.id = exporter self.importer = false self.initialFolder = initialFolder self.initialName = initialName self.result = onSave self.cancel = onClose } /// Get the storage for the window. /// - Parameter app: The application. /// - Returns: The storage. public func createWindow(app: GTUIApp) -> WindowStorage { let window = GTUIFileDialog() let windowStorage = WindowStorage(id: id, window: window, view: nil) windowStorage.parentID = parentID update(window: window) return windowStorage } /// Update a window. /// - Parameters: /// - storage: The storage to update. /// - app: The application. public func update(_ storage: WindowStorage, app: GTUIApp, force: Bool) { updateAppShortcuts(app: app) if let window = storage.window as? GTUIFileDialog { update(window: window) } storage.destroy = true } /// Update the window. /// - Parameter window: The window. func update(window: GTUIFileDialog) { window.isImporter = importer window.folder = initialFolder if let initialName { window.setInitialName(initialName) } window.setExtensions(extensions) if let result { window.onResult = result } if let cancel { window.onCancel = cancel } } } // swiftlint:enable discouraged_optional_collection