From fdf09a6dde82b8885bdce33634fb4c10e6a05651 Mon Sep 17 00:00:00 2001 From: reuk Date: Mon, 19 Oct 2020 18:18:04 +0100 Subject: [PATCH] FileChooser: Ensure that macOS preview component always receives user events Previously, when a file dialog was launched synchronously, the 'dummy' modal component was preventing user input events from reaching the preview component. Now, we explicitly allow input events to reach the file preview component, if it exists. --- .../native/juce_mac_FileChooser.mm | 10 ++----- .../native/juce_mac_MainMenu.mm | 26 ++++++++++++++++--- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/modules/juce_gui_basics/native/juce_mac_FileChooser.mm b/modules/juce_gui_basics/native/juce_mac_FileChooser.mm index d0fcb48ad2..4d41127d0c 100644 --- a/modules/juce_gui_basics/native/juce_mac_FileChooser.mm +++ b/modules/juce_gui_basics/native/juce_mac_FileChooser.mm @@ -182,7 +182,7 @@ public: std::unique_ptr tempMenu; if (JUCEApplicationBase::isStandaloneApp()) - tempMenu.reset (new TemporaryMainMenuWithStandardCommands()); + tempMenu = std::make_unique (preview); jassert (panel != nil); auto result = [panel runModal]; @@ -191,13 +191,7 @@ public: bool canModalEventBeSentToComponent (const Component* targetComponent) override { - if (targetComponent == nullptr) - return false; - - if (targetComponent == preview) - return true; - - return targetComponent->findParentComponentOfClass() != nullptr; + return TemporaryMainMenuWithStandardCommands::checkModalEvent (preview, targetComponent); } private: diff --git a/modules/juce_gui_basics/native/juce_mac_MainMenu.mm b/modules/juce_gui_basics/native/juce_mac_MainMenu.mm index 216bfe952c..9c147cafde 100644 --- a/modules/juce_gui_basics/native/juce_mac_MainMenu.mm +++ b/modules/juce_gui_basics/native/juce_mac_MainMenu.mm @@ -550,8 +550,8 @@ JuceMainMenuHandler* JuceMainMenuHandler::instance = nullptr; class TemporaryMainMenuWithStandardCommands { public: - TemporaryMainMenuWithStandardCommands() - : oldMenu (MenuBarModel::getMacMainMenu()) + explicit TemporaryMainMenuWithStandardCommands (FilePreviewComponent* filePreviewComponent) + : oldMenu (MenuBarModel::getMacMainMenu()), dummyModalComponent (filePreviewComponent) { if (auto* appleMenu = MenuBarModel::getMacExtraAppleItemsMenu()) oldAppleMenu = std::make_unique (*appleMenu); @@ -601,8 +601,17 @@ public: MenuBarModel::setMacMainMenu (oldMenu, oldAppleMenu.get(), oldRecentItems); } + static bool checkModalEvent (FilePreviewComponent* preview, const Component* targetComponent) + { + if (targetComponent == nullptr) + return false; + + return (targetComponent == preview + || targetComponent->findParentComponentOfClass() != nullptr); + } + private: - MenuBarModel* const oldMenu; + MenuBarModel* const oldMenu = nullptr; std::unique_ptr oldAppleMenu; String oldRecentItems; NSInteger editMenuIndex; @@ -615,8 +624,17 @@ private: // recursive when file dialogs are involved struct SilentDummyModalComp : public Component { - SilentDummyModalComp() {} + explicit SilentDummyModalComp (FilePreviewComponent* p) + : preview (p) {} + void inputAttemptWhenModal() override {} + + bool canModalEventBeSentToComponent (const Component* targetComponent) override + { + return checkModalEvent (preview, targetComponent); + } + + FilePreviewComponent* preview = nullptr; }; SilentDummyModalComp dummyModalComponent;