diff options
author | BogDan Vatra <bogdan@kde.org> | 2013-11-09 09:21:02 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-11-09 10:41:25 +0100 |
commit | ef6544ee27aeab20a64b4df4bd50401cefa405ef (patch) | |
tree | dfd888a0585d4d52951619ac1af1bb9aad0f06e5 /src/widgets | |
parent | 315ba388f32ad7943c226f2faba4e9b35e899dc9 (diff) |
Android native message dialog
Change-Id: Ief8c3ce3b8683c6960f046245844c1835a327d51
Reviewed-by: Shawn Rutledge <shawn.rutledge@digia.com>
Diffstat (limited to 'src/widgets')
-rw-r--r-- | src/widgets/dialogs/qdialog.cpp | 24 | ||||
-rw-r--r-- | src/widgets/dialogs/qdialog_p.h | 3 | ||||
-rw-r--r-- | src/widgets/dialogs/qfiledialog.cpp | 4 | ||||
-rw-r--r-- | src/widgets/dialogs/qfiledialog_p.h | 2 | ||||
-rw-r--r-- | src/widgets/dialogs/qmessagebox.cpp | 66 | ||||
-rw-r--r-- | src/widgets/dialogs/qmessagebox.h | 1 |
6 files changed, 93 insertions, 7 deletions
diff --git a/src/widgets/dialogs/qdialog.cpp b/src/widgets/dialogs/qdialog.cpp index af352e45c6..d498b077fc 100644 --- a/src/widgets/dialogs/qdialog.cpp +++ b/src/widgets/dialogs/qdialog.cpp @@ -52,6 +52,8 @@ #include "qwhatsthis.h" #include "qmenu.h" #include "qcursor.h" +#include "qmessagebox.h" +#include "qerrormessage.h" #include <qpa/qplatformtheme.h> #include "private/qdialog_p.h" #include "private/qguiapplication_p.h" @@ -75,6 +77,14 @@ static inline int themeDialogType(const QDialog *dialog) if (qobject_cast<const QFontDialog *>(dialog)) return QPlatformTheme::FontDialog; #endif +#ifndef QT_NO_MESSAGEBOX + if (qobject_cast<const QMessageBox *>(dialog)) + return QPlatformTheme::MessageDialog; +#endif +#ifndef QT_NO_ERRORMESSAGE + if (qobject_cast<const QErrorMessage *>(dialog)) + return QPlatformTheme::MessageDialog; +#endif return -1; } @@ -100,6 +110,17 @@ QPlatformDialogHelper *QDialogPrivate::platformHelper() const return m_platformHelper; } +bool QDialogPrivate::canBeNativeDialog() const +{ + QDialogPrivate *ncThis = const_cast<QDialogPrivate *>(this); + QDialog *dialog = ncThis->q_func(); + const int type = themeDialogType(dialog); + if (type >= 0) + return QGuiApplicationPrivate::platformTheme() + ->usePlatformNativeDialog(static_cast<QPlatformTheme::DialogType>(type)); + return false; +} + QWindow *QDialogPrivate::parentWindow() const { if (const QWidget *parent = q_func()->nativeParentWidget()) @@ -697,6 +718,9 @@ void QDialog::closeEvent(QCloseEvent *e) void QDialog::setVisible(bool visible) { Q_D(QDialog); + if (!testAttribute(Qt::WA_DontShowOnScreen) && d->canBeNativeDialog() && d->setNativeDialogVisible(visible)) + return; + if (visible) { if (testAttribute(Qt::WA_WState_ExplicitShowHide) && !testAttribute(Qt::WA_WState_Hidden)) return; diff --git a/src/widgets/dialogs/qdialog_p.h b/src/widgets/dialogs/qdialog_p.h index 5064efa35d..8db1b2a27c 100644 --- a/src/widgets/dialogs/qdialog_p.h +++ b/src/widgets/dialogs/qdialog_p.h @@ -64,7 +64,7 @@ QT_BEGIN_NAMESPACE class QSizeGrip; -class QDialogPrivate : public QWidgetPrivate +class Q_WIDGETS_EXPORT QDialogPrivate : public QWidgetPrivate { Q_DECLARE_PUBLIC(QDialog) public: @@ -113,6 +113,7 @@ public: bool nativeDialogInUse; QPlatformDialogHelper *platformHelper() const; + virtual bool canBeNativeDialog() const; private: virtual void initHelper(QPlatformDialogHelper *) {} diff --git a/src/widgets/dialogs/qfiledialog.cpp b/src/widgets/dialogs/qfiledialog.cpp index cfdc303f21..da026d23a6 100644 --- a/src/widgets/dialogs/qfiledialog.cpp +++ b/src/widgets/dialogs/qfiledialog.cpp @@ -764,9 +764,9 @@ void QFileDialogPrivate::emitFilesSelected(const QStringList &files) emit q->fileSelected(files.first()); } -bool QFileDialogPrivate::canBeNativeDialog() +bool QFileDialogPrivate::canBeNativeDialog() const { - Q_Q(QFileDialog); + Q_Q(const QFileDialog); if (nativeDialogInUse) return true; if (q->testAttribute(Qt::WA_DontShowOnScreen)) diff --git a/src/widgets/dialogs/qfiledialog_p.h b/src/widgets/dialogs/qfiledialog_p.h index 36336bdbf6..faa721572c 100644 --- a/src/widgets/dialogs/qfiledialog_p.h +++ b/src/widgets/dialogs/qfiledialog_p.h @@ -251,7 +251,7 @@ public: // setVisible_sys returns true if it ends up showing a native // dialog. Returning false means that a non-native dialog must be // used instead. - bool canBeNativeDialog(); + bool canBeNativeDialog() const; inline bool usingWidgets() const; void setDirectory_sys(const QUrl &directory); diff --git a/src/widgets/dialogs/qmessagebox.cpp b/src/widgets/dialogs/qmessagebox.cpp index 9101c568e0..ee2ef409d8 100644 --- a/src/widgets/dialogs/qmessagebox.cpp +++ b/src/widgets/dialogs/qmessagebox.cpp @@ -193,7 +193,6 @@ public: } }; - class QMessageBoxPrivate : public QDialogPrivate { Q_DECLARE_PUBLIC(QMessageBox) @@ -204,11 +203,13 @@ public: detailsText(0), #endif compatMode(false), autoAddOkButton(true), - detectedEscapeButton(0), informativeLabel(0) { } + detectedEscapeButton(0), informativeLabel(0), + options(new QMessageDialogOptions) { } void init(const QString &title = QString(), const QString &text = QString()); void setupLayout(); void _q_buttonClicked(QAbstractButton *); + void _q_clicked(QMessageDialogOptions::StandardButton button, QMessageDialogOptions::ButtonRole role); QAbstractButton *findButton(int button0, int button1, int button2, int flags); void addOldButtons(int button0, int button1, int button2); @@ -224,7 +225,6 @@ public: #ifdef Q_OS_WINCE void hideSpecial(); #endif - static int showOldMessageBox(QWidget *parent, QMessageBox::Icon icon, const QString &title, const QString &text, int button0, int button1, int button2); @@ -262,6 +262,11 @@ public: QPointer<QObject> receiverToDisconnectOnClose; QByteArray memberToDisconnectOnClose; QByteArray signalToDisconnectOnClose; + QSharedPointer<QMessageDialogOptions> options; +private: + void initHelper(QPlatformDialogHelper *); + void helperPrepareShow(QPlatformDialogHelper *); + void helperDone(QDialog::DialogCode, QPlatformDialogHelper *); }; void QMessageBoxPrivate::init(const QString &title, const QString &text) @@ -519,6 +524,13 @@ void QMessageBoxPrivate::_q_buttonClicked(QAbstractButton *button) } } +void QMessageBoxPrivate::_q_clicked(QMessageDialogOptions::StandardButton button, QMessageDialogOptions::ButtonRole role) +{ + Q_UNUSED(role); + Q_Q(QMessageBox); + q->done(button); +} + /*! \class QMessageBox @@ -2682,6 +2694,54 @@ QPixmap QMessageBoxPrivate::standardIcon(QMessageBox::Icon icon, QMessageBox *mb return QPixmap(); } +void QMessageBoxPrivate::initHelper(QPlatformDialogHelper *h) +{ + Q_Q(QMessageBox); + QObject::connect(h, SIGNAL(clicked(QMessageDialogOptions::StandardButton, QMessageDialogOptions::ButtonRole)), + q, SLOT(_q_clicked(QMessageDialogOptions::StandardButton, QMessageDialogOptions::ButtonRole))); + static_cast<QPlatformMessageDialogHelper *>(h)->setOptions(options); +} + +static QMessageDialogOptions::Icon helperIcon(QMessageBox::Icon i) +{ + switch (i) { + case QMessageBox::NoIcon: + return QMessageDialogOptions::NoIcon; + case QMessageBox::Information: + return QMessageDialogOptions::Information; + case QMessageBox::Warning: + return QMessageDialogOptions::Warning; + case QMessageBox::Critical: + return QMessageDialogOptions::Critical; + case QMessageBox::Question: + return QMessageDialogOptions::Question; + } + return QMessageDialogOptions::NoIcon; +} + +static QMessageDialogOptions::StandardButtons helperStandardButtons(QMessageBox * q) +{ + QMessageDialogOptions::StandardButtons buttons(int(q->standardButtons())); + return buttons; +} + +void QMessageBoxPrivate::helperPrepareShow(QPlatformDialogHelper *) +{ + Q_Q(QMessageBox); + options->setWindowTitle(q->windowTitle()); + options->setText(q->text()); + options->setInformativeText(q->informativeText()); + options->setDetailedText(q->detailedText()); + options->setIcon(helperIcon(q->icon())); + options->setStandardButtons(helperStandardButtons(q)); +} + +void QMessageBoxPrivate::helperDone(QDialog::DialogCode code, QPlatformDialogHelper *) +{ + Q_Q(QMessageBox); + clickedButton = q->button(QMessageBox::StandardButton(code)); +} + /*! \obsolete diff --git a/src/widgets/dialogs/qmessagebox.h b/src/widgets/dialogs/qmessagebox.h index 58be13426c..c5598a8f1d 100644 --- a/src/widgets/dialogs/qmessagebox.h +++ b/src/widgets/dialogs/qmessagebox.h @@ -309,6 +309,7 @@ protected: private: Q_PRIVATE_SLOT(d_func(), void _q_buttonClicked(QAbstractButton *)) + Q_PRIVATE_SLOT(d_func(), void _q_clicked(QMessageDialogOptions::StandardButton, QMessageDialogOptions::ButtonRole)) Q_DISABLE_COPY(QMessageBox) Q_DECLARE_PRIVATE(QMessageBox) |