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:
Friedemann Kleint 2013-01-22 10:58:25 +01:00 committed by The Qt Project
parent 74c3a2f4f4
commit 779195343f
2 changed files with 38 additions and 4 deletions

View File

@ -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();

View File

@ -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