summaryrefslogtreecommitdiffstats
path: root/vcl/qt5/QtInstanceMessageDialog.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'vcl/qt5/QtInstanceMessageDialog.cxx')
-rw-r--r--vcl/qt5/QtInstanceMessageDialog.cxx63
1 files changed, 63 insertions, 0 deletions
diff --git a/vcl/qt5/QtInstanceMessageDialog.cxx b/vcl/qt5/QtInstanceMessageDialog.cxx
index 7e505aff7cd0..cbda4c6ae0dd 100644
--- a/vcl/qt5/QtInstanceMessageDialog.cxx
+++ b/vcl/qt5/QtInstanceMessageDialog.cxx
@@ -8,6 +8,7 @@
*/
#include <QtInstanceMessageDialog.hxx>
+#include <QtInstanceMessageDialog.moc>
#include <QtWidgets/QPushButton>
@@ -20,7 +21,9 @@ const char* const PROPERTY_VCL_RESPONSE_CODE = "response-code";
QtInstanceMessageDialog::QtInstanceMessageDialog(QMessageBox* pMessageDialog)
: QtInstanceDialog(pMessageDialog)
, m_pMessageDialog(pMessageDialog)
+ , m_aRunAsyncFunc(nullptr)
{
+ assert(m_pMessageDialog);
}
void QtInstanceMessageDialog::set_primary_text(const rtl::OUString& rText)
@@ -81,4 +84,64 @@ int QtInstanceMessageDialog::run()
return pClickedButton->property(PROPERTY_VCL_RESPONSE_CODE).toInt();
}
+bool QtInstanceMessageDialog::runAsync(const std::shared_ptr<weld::DialogController>& rxOwner,
+ const std::function<void(sal_Int32)>& func)
+{
+ assert(m_pMessageDialog);
+
+ m_xRunAsyncDialogController = rxOwner;
+ m_aRunAsyncFunc = func;
+ connect(m_pMessageDialog, &QDialog::finished, this, &QtInstanceMessageDialog::dialogFinished);
+ m_pMessageDialog->open();
+
+ return true;
+}
+
+bool QtInstanceMessageDialog::runAsync(std::shared_ptr<Dialog> const& rxSelf,
+ const std::function<void(sal_Int32)>& func)
+{
+ assert(m_pMessageDialog);
+ assert(rxSelf.get() == this);
+
+ m_xRunAsyncDialog = rxSelf;
+ m_aRunAsyncFunc = func;
+ connect(m_pMessageDialog, &QDialog::finished, this, &QtInstanceMessageDialog::dialogFinished);
+ m_pMessageDialog->open();
+
+ return true;
+}
+
+void QtInstanceMessageDialog::response(int nResponse)
+{
+ assert(m_pMessageDialog);
+ m_pMessageDialog->done(nResponse);
+}
+
+void QtInstanceMessageDialog::dialogFinished(int nResult)
+{
+ assert(m_aRunAsyncFunc);
+
+ disconnect(m_pMessageDialog, &QDialog::finished, this,
+ &QtInstanceMessageDialog::dialogFinished);
+
+ // use local variables for these, as members might have got de-allocated by the time they're reset
+ std::shared_ptr<weld::Dialog> xRunAsyncDialog = m_xRunAsyncDialog;
+ std::shared_ptr<weld::DialogController> xRunAsyncDialogController = m_xRunAsyncDialogController;
+ std::function<void(sal_Int32)> aFunc = m_aRunAsyncFunc;
+ m_aRunAsyncFunc = nullptr;
+ m_xRunAsyncDialogController.reset();
+ m_xRunAsyncDialog.reset();
+
+ // if a button was clicked, use its response code, otherwise the passed one
+ int nRet = nResult;
+ if (QAbstractButton* pClickedButton = m_pMessageDialog->clickedButton())
+ nRet = pClickedButton->property(PROPERTY_VCL_RESPONSE_CODE).toInt();
+
+ SolarMutexGuard g;
+ aFunc(nRet);
+
+ xRunAsyncDialogController.reset();
+ xRunAsyncDialog.reset();
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */