diff options
Diffstat (limited to 'vcl/qt5/QtInstanceMessageDialog.cxx')
-rw-r--r-- | vcl/qt5/QtInstanceMessageDialog.cxx | 63 |
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: */ |