From 1d29665e564540d7ebbd4c3187cd5df594dcab42 Mon Sep 17 00:00:00 2001 From: reuk Date: Tue, 20 Oct 2020 19:36:39 +0100 Subject: [PATCH] FileChooser: Fix issue where preview component may not receive full filename Some hosts (such as Reaper) weren't creating an instance of exactly NSOpenPanel or NSSavePanel, which meant that the call to `getSelectedPaths` was always returning an empty array. Now, rather than trying to cast the sender to an appropriate type, we assume that the sender is always the same panel that we opened earlier, so that we can just query the panel directly for its selection. --- .../native/juce_mac_FileChooser.mm | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/modules/juce_gui_basics/native/juce_mac_FileChooser.mm b/modules/juce_gui_basics/native/juce_mac_FileChooser.mm index 4d41127d0c..08ddaf10f0 100644 --- a/modules/juce_gui_basics/native/juce_mac_FileChooser.mm +++ b/modules/juce_gui_basics/native/juce_mac_FileChooser.mm @@ -254,26 +254,32 @@ private: void panelSelectionDidChange (id sender) { + jassert (sender == panel); + ignoreUnused (sender); + // NB: would need to extend FilePreviewComponent to handle the full list rather than just the first one if (preview != nullptr) - preview->selectedFileChanged (File (getSelectedPaths (sender)[0])); + preview->selectedFileChanged (File (getSelectedPaths()[0])); } - static StringArray getSelectedPaths (id sender) + StringArray getSelectedPaths() const { + if (panel == nullptr) + return {}; + StringArray paths; - if ([sender isKindOfClass: [NSOpenPanel class]]) + if (isSave) { - NSArray* urls = [(NSOpenPanel*) sender URLs]; + paths.add (nsStringToJuce ([[panel URL] path])); + } + else + { + auto* urls = [(NSOpenPanel*) panel URLs]; for (NSUInteger i = 0; i < [urls count]; ++i) paths.add (nsStringToJuce ([[urls objectAtIndex: i] path])); } - else if ([sender isKindOfClass: [NSSavePanel class]]) - { - paths.add (nsStringToJuce ([[(NSSavePanel*) sender URL] path])); - } return paths; }