From 31973f3ff32c837fd031d6ed386ebdb2e75cbc1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Mon, 21 Nov 2022 13:38:05 +0100 Subject: Teach QErrorMessage to use native dialog helper if available And implement for macOS. The default modality of the QErrorMessage on macOS now depends on whether the dialog has a parent or not. The QErrorMessage must be hidden and re-shown again after each message, so that the native dialog has a chance to recreate itself. Change-Id: I474ed35d6271118834fac8e97f6f540a6fb89b8c Reviewed-by: Volker Hilsheimer --- src/plugins/platforms/cocoa/qcocoamessagedialog.mm | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) (limited to 'src/plugins/platforms/cocoa/qcocoamessagedialog.mm') diff --git a/src/plugins/platforms/cocoa/qcocoamessagedialog.mm b/src/plugins/platforms/cocoa/qcocoamessagedialog.mm index 3d3970953d..84aea950c3 100644 --- a/src/plugins/platforms/cocoa/qcocoamessagedialog.mm +++ b/src/plugins/platforms/cocoa/qcocoamessagedialog.mm @@ -180,6 +180,8 @@ bool QCocoaMessageDialog::show(Qt::WindowFlags windowFlags, Qt::WindowModality w StandardButton::Ok, ButtonRole::AcceptRole); } + m_alert.showsSuppressionButton = options()->supressionCheckBoxEnabled(); + qCDebug(lcQpaDialogs) << "Showing" << m_alert; if (windowModality == Qt::WindowModal) { @@ -230,6 +232,15 @@ void QCocoaMessageDialog::processResponse(NSModalResponse response) { qCDebug(lcQpaDialogs) << "Processing response" << response << "for" << m_alert; + // We can't re-use the same dialog for the next show() anyways, + // since the options may have changed, so get rid of it now, + // before we emit anything that might recurse back to hide/show/etc. + auto alert = std::exchange(m_alert, nil); + [alert autorelease]; + + if (alert.showsSuppressionButton) + emit supressionCheckBoxChanged(alert.suppressionButton.state == NSControlStateValueOn); + if (response >= NSAlertFirstButtonReturn) { // Safe range for user-defined modal responses if (response == kModalResponseDialogHidden) { @@ -270,11 +281,6 @@ void QCocoaMessageDialog::processResponse(NSModalResponse response) if (m_eventLoop) m_eventLoop->exit(response); - - // We can't re-use the same dialog for the next show() anyways, - // since the options may have changed, so get rid of it now. - [m_alert release]; - m_alert = nil; } void QCocoaMessageDialog::hide() -- cgit v1.2.3