Windows: Fix modal dialogs for declarative.
Make it possible to show a modal dialog by just calling show(). Start an idle timer, which will start the dialog thread. This timer is stopped in exec(). Change-Id: I8f7352bf577b09a19be7df4484e0077bb1aa46ab Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
This commit is contained in:
parent
74c3a2f4f4
commit
779195343f
@ -450,7 +450,8 @@ protected:
|
||||
template <class BaseClass>
|
||||
QWindowsDialogHelperBase<BaseClass>::QWindowsDialogHelperBase() :
|
||||
m_nativeDialog(0),
|
||||
m_ownerWindow(0)
|
||||
m_ownerWindow(0),
|
||||
m_timerId(0)
|
||||
{
|
||||
}
|
||||
|
||||
@ -471,6 +472,12 @@ void QWindowsDialogHelperBase<BaseClass>::deleteNativeDialog()
|
||||
m_nativeDialog = 0;
|
||||
}
|
||||
|
||||
template <class BaseClass>
|
||||
void QWindowsDialogHelperBase<BaseClass>::timerEvent(QTimerEvent *)
|
||||
{
|
||||
startDialogThread();
|
||||
}
|
||||
|
||||
template <class BaseClass>
|
||||
QWindowsNativeDialogBase *QWindowsDialogHelperBase<BaseClass>::ensureNativeDialog()
|
||||
{
|
||||
@ -527,13 +534,35 @@ bool QWindowsDialogHelperBase<BaseClass>::show(Qt::WindowFlags,
|
||||
return false; // Was it changed in-between?
|
||||
if (!ensureNativeDialog())
|
||||
return false;
|
||||
if (!modal) { // Modal dialogs are shown in separate slot.
|
||||
QWindowsDialogThread *thread = new QWindowsDialogThread(this);
|
||||
thread->start();
|
||||
// Start a background thread to show the dialog. For modal dialogs,
|
||||
// a subsequent call to exec() may follow. So, start an idle timer
|
||||
// which will start the dialog thread. If exec() is then called, the
|
||||
// timer is stopped and dialog->exec() is called directly.
|
||||
if (modal) {
|
||||
m_timerId = this->startTimer(0);
|
||||
} else {
|
||||
startDialogThread();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
template <class BaseClass>
|
||||
void QWindowsDialogHelperBase<BaseClass>::startDialogThread()
|
||||
{
|
||||
QWindowsDialogThread *thread = new QWindowsDialogThread(this);
|
||||
thread->start();
|
||||
stopTimer();
|
||||
}
|
||||
|
||||
template <class BaseClass>
|
||||
void QWindowsDialogHelperBase<BaseClass>::stopTimer()
|
||||
{
|
||||
if (m_timerId) {
|
||||
this->killTimer(m_timerId);
|
||||
m_timerId = 0;
|
||||
}
|
||||
}
|
||||
|
||||
template <class BaseClass>
|
||||
void QWindowsDialogHelperBase<BaseClass>::hide()
|
||||
{
|
||||
@ -547,6 +576,7 @@ void QWindowsDialogHelperBase<BaseClass>::exec()
|
||||
{
|
||||
if (QWindowsContext::verboseDialogs)
|
||||
qDebug("%s" , __FUNCTION__);
|
||||
stopTimer();
|
||||
if (QWindowsNativeDialogBase *nd = nativeDialog()) {
|
||||
nd->exec(m_ownerWindow);
|
||||
deleteNativeDialog();
|
||||
|
@ -81,13 +81,17 @@ protected:
|
||||
QWindowsNativeDialogBase *nativeDialog() const;
|
||||
inline bool hasNativeDialog() const { return m_nativeDialog; }
|
||||
void deleteNativeDialog();
|
||||
void timerEvent(QTimerEvent *);
|
||||
|
||||
private:
|
||||
virtual QWindowsNativeDialogBase *createNativeDialog() = 0;
|
||||
inline QWindowsNativeDialogBase *ensureNativeDialog();
|
||||
inline void startDialogThread();
|
||||
inline void stopTimer();
|
||||
|
||||
QWindowsNativeDialogBase *m_nativeDialog;
|
||||
HWND m_ownerWindow;
|
||||
int m_timerId;
|
||||
};
|
||||
|
||||
QT_END_NAMESPACE
|
||||
|
Loading…
Reference in New Issue
Block a user