From 6b0e4f7b919cc374488a0b7280dde8d52b8964cb Mon Sep 17 00:00:00 2001 From: der richter Date: Thu, 13 Feb 2025 15:57:52 +0100 Subject: [PATCH] mac/dialog: add file extension filtering for open dialogs use the configured file extensions from options to filter. --- osdep/mac/dialog.swift | 24 +++++++++++++++++++++++- osdep/mac/menu_bar.swift | 8 ++++---- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/osdep/mac/dialog.swift b/osdep/mac/dialog.swift index 9fce37ffd4..3b8f676566 100644 --- a/osdep/mac/dialog.swift +++ b/osdep/mac/dialog.swift @@ -16,12 +16,34 @@ */ import Cocoa +import UniformTypeIdentifiers class Dialog { - func open(directories: Bool, multiple: Bool) -> [String]? { + var option: OptionHelper? + + init(_ option: OptionHelper? = nil) { + self.option = option + } + + func openFiles() -> [String]? { + let types: [UTType] = (TypeHelper.toStringArray(option?.root.video_exts) + + TypeHelper.toStringArray(option?.root.audio_exts) + + TypeHelper.toStringArray(option?.root.image_exts) + + TypeHelper.toStringArray(option?.root.archive_exts) + + TypeHelper.toStringArray(option?.root.playlist_exts)).compactMap { UTType(filenameExtension: $0) } + return open(types: types) + } + + func openPlaylist() -> String? { + let types: [UTType] = TypeHelper.toStringArray(option?.root.playlist_exts).compactMap { UTType(filenameExtension: $0) } + return open(directories: false, multiple: false, types: types)?.first + } + + func open(directories: Bool = true, multiple: Bool = true, types: [UTType] = []) -> [String]? { let panel = NSOpenPanel() panel.canChooseDirectories = directories panel.allowsMultipleSelection = multiple + panel.allowedContentTypes = types if panel.runModal() == .OK { return panel.urls.map { $0.path } diff --git a/osdep/mac/menu_bar.swift b/osdep/mac/menu_bar.swift index 2b3c756068..a7ac546210 100644 --- a/osdep/mac/menu_bar.swift +++ b/osdep/mac/menu_bar.swift @@ -76,7 +76,7 @@ class MenuBar: NSObject { let servicesMenu = NSMenu(title: "Services") var menuConfigs: [Config] = [] var dynamicMenuItems: [Type: [MenuItem]] = [:] - let dialog = Dialog() + let dialog: Dialog let appIcon: NSImage @objc init(_ appHub: AppHub) { @@ -86,6 +86,7 @@ class MenuBar: NSObject { UserDefaults.standard.set(true, forKey: "NSDisabledCharacterPaletteMenuItem") NSWindow.allowsAutomaticWindowTabbing = false appIcon = appHub.getIcon() + dialog = Dialog(appHub.option) super.init() @@ -324,13 +325,12 @@ class MenuBar: NSObject { } @objc func openFiles() { - guard let files = dialog.open(directories: true, multiple: true) else { return } + guard let files = dialog.openFiles() else { return } appHub.input.open(files: files) } @objc func openPlaylist() { - guard let files = dialog.open(directories: false, multiple: false), - let file = files.first else { return } + guard let file = dialog.openPlaylist() else { return } appHub.input.command("loadlist \"\(file)\"") }