From aec2b28eea3354ec80350e25f4305c74ca9bc184 Mon Sep 17 00:00:00 2001
From: Shawn Rutledge <shawn.rutledge@digia.com>
Date: Tue, 16 Jun 2015 15:09:09 +0200
Subject: [PATCH] OSX: show file dialog in showCocoaFilePanel, don't wait for
 exec()

This reverts commit 21e6c7ae4745a76b676dfaa9fe17a2dd40fc0c5c
because in QtQuick.Controls, we do not call exec(): we just set the
dialog visible.  If it is a sheet, then it is already acting as a
modal dialog, basically.

Task-number: QTBUG-46691
Change-Id: I7fe89f2a2ade0d4ddcf540c9bfc4f5963a077471
Reviewed-by: Timur Pocheptsov <Timur.Pocheptsov@digia.com>
---
 src/gui/kernel/qplatformdialoghelper.cpp      |  6 ----
 src/gui/kernel/qplatformdialoghelper.h        |  1 -
 .../platforms/cocoa/qcocoafiledialoghelper.h  |  1 -
 .../platforms/cocoa/qcocoafiledialoghelper.mm | 28 +++++--------------
 src/widgets/dialogs/qdialog.cpp               |  5 +---
 5 files changed, 8 insertions(+), 33 deletions(-)

diff --git a/src/gui/kernel/qplatformdialoghelper.cpp b/src/gui/kernel/qplatformdialoghelper.cpp
index 3d7c2f7bf0d..3d37088182c 100644
--- a/src/gui/kernel/qplatformdialoghelper.cpp
+++ b/src/gui/kernel/qplatformdialoghelper.cpp
@@ -137,12 +137,6 @@ QVariant  QPlatformDialogHelper::defaultStyleHint(QPlatformDialogHelper::StyleHi
     return QVariant();
 }
 
-void QPlatformDialogHelper::execModalForWindow(QWindow *parent)
-{
-    Q_UNUSED(parent);
-    exec();
-}
-
 // Font dialog
 
 class QFontDialogOptionsPrivate : public QSharedData
diff --git a/src/gui/kernel/qplatformdialoghelper.h b/src/gui/kernel/qplatformdialoghelper.h
index 6d3a367e603..8b2b9881b7f 100644
--- a/src/gui/kernel/qplatformdialoghelper.h
+++ b/src/gui/kernel/qplatformdialoghelper.h
@@ -145,7 +145,6 @@ public:
     virtual QVariant styleHint(StyleHint hint) const;
 
     virtual void exec() = 0;
-    virtual void execModalForWindow(QWindow *parent);
     virtual bool show(Qt::WindowFlags windowFlags,
                           Qt::WindowModality windowModality,
                           QWindow *parent) = 0;
diff --git a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.h b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.h
index 36943a563e1..48d7efe1747 100644
--- a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.h
+++ b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.h
@@ -51,7 +51,6 @@ public:
     virtual ~QCocoaFileDialogHelper();
 
     void exec();
-    void execModalForWindow(QWindow *parent);
 
     bool defaultNameFilterDisables() const;
 
diff --git a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm
index 19f81c72a13..4ece1b5a22f 100644
--- a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm
+++ b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm
@@ -254,22 +254,17 @@ static QString strippedText(QString s)
         || [self panel:nil shouldShowFilename:filepath];
 
     [self updateProperties];
+    QCocoaMenuBar::redirectKnownMenuItemsToFirstResponder();
     [mSavePanel setDirectoryURL: [NSURL fileURLWithPath:mCurrentDir]];
 
     [mSavePanel setNameFieldStringValue:selectable ? QCFString::toNSString(info.fileName()) : @""];
     NSWindow *nsparent = static_cast<NSWindow *>(qGuiApp->platformNativeInterface()->nativeResourceForWindow("nswindow", parent));
 
-    qApp->processEvents(QEventLoop::ExcludeUserInputEvents | QEventLoop::ExcludeSocketNotifiers);
-    QCocoaMenuBar::redirectKnownMenuItemsToFirstResponder();
-
     [mSavePanel beginSheetModalForWindow:nsparent completionHandler:^(NSInteger result){
-        [[NSApplication sharedApplication] stopModalWithCode:result];
+        mReturnCode = result;
+        if (mHelper)
+            mHelper->QNSOpenSavePanelDelegate_panelClosed(result == NSOKButton);
     }];
-
-    mReturnCode = [[NSApplication sharedApplication] runModalForWindow:nsparent];
-    QAbstractEventDispatcher::instance()->interrupt();
-    if (mHelper)
-        mHelper->QNSOpenSavePanelDelegate_panelClosed(mReturnCode == NSOKButton);
 }
 
 - (BOOL)isHiddenFile:(NSString *)filename isDir:(BOOL)isDir
@@ -711,15 +706,14 @@ void QCocoaFileDialogHelper::createNSOpenSavePanelDelegate()
 
 bool QCocoaFileDialogHelper::showCocoaFilePanel(Qt::WindowModality windowModality, QWindow *parent)
 {
-    Q_UNUSED(parent)
-
     createNSOpenSavePanelDelegate();
     if (!mDelegate)
         return false;
     if (windowModality == Qt::NonModal)
         [mDelegate showModelessPanel];
-    // no need to show a Qt::ApplicationModal dialog here, since it will be done in exec;
-    // Qt::WindowModal will be done in execModalForWindow.
+    else if (windowModality == Qt::WindowModal && parent)
+        [mDelegate showWindowModalSheet:parent];
+    // no need to show a Qt::ApplicationModal dialog here, since it will be done in _q_platformRunNativeAppModalPanel()
     return true;
 }
 
@@ -751,14 +745,6 @@ void QCocoaFileDialogHelper::exec()
 
 }
 
-void QCocoaFileDialogHelper::execModalForWindow(QWindow *parent)
-{
-    if (!parent)
-        return exec();
-
-    [mDelegate showWindowModalSheet:parent];
-}
-
 bool QCocoaFileDialogHelper::defaultNameFilterDisables() const
 {
     return true;
diff --git a/src/widgets/dialogs/qdialog.cpp b/src/widgets/dialogs/qdialog.cpp
index 6676a3ccba6..65def6d4b83 100644
--- a/src/widgets/dialogs/qdialog.cpp
+++ b/src/widgets/dialogs/qdialog.cpp
@@ -534,10 +534,7 @@ int QDialog::exec()
 
     QPointer<QDialog> guard = this;
     if (d->nativeDialogInUse) {
-        if (windowModality() == Qt::WindowModal)
-            d->platformHelper()->execModalForWindow(d->parentWindow());
-        else
-            d->platformHelper()->exec();
+        d->platformHelper()->exec();
     } else {
         QEventLoop eventLoop;
         d->eventLoop = &eventLoop;
-- 
GitLab