diff options
Diffstat (limited to 'src/libs/installer/messageboxhandler.cpp')
-rw-r--r-- | src/libs/installer/messageboxhandler.cpp | 87 |
1 files changed, 67 insertions, 20 deletions
diff --git a/src/libs/installer/messageboxhandler.cpp b/src/libs/installer/messageboxhandler.cpp index acc1b3137..c2cc492f1 100644 --- a/src/libs/installer/messageboxhandler.cpp +++ b/src/libs/installer/messageboxhandler.cpp @@ -1,6 +1,6 @@ /************************************************************************** ** -** Copyright (C) 2017 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Installer Framework. @@ -35,6 +35,7 @@ #include <QApplication> #include <QDialogButtonBox> #include <QPushButton> +#include <QMetaEnum> /*! \inmodule QtInstallerFramework @@ -282,7 +283,7 @@ QMessageBox::StandardButton MessageBoxHandler::warning(QWidget *parent, const QS returns the escape button. */ int MessageBoxHandler::critical(const QString &identifier, const QString &title, - const QString &text, int buttons, int button) const + const QString &text, int buttons, int button) { return showMessageBox(criticalType, currentBestSuitParent(), identifier, title, text, QMessageBox::StandardButtons(buttons), QMessageBox::StandardButton(button)); @@ -301,7 +302,7 @@ int MessageBoxHandler::critical(const QString &identifier, const QString &title, returns the escape button. */ int MessageBoxHandler::information(const QString &identifier, const QString &title, - const QString &text, int buttons, int button) const + const QString &text, int buttons, int button) { return showMessageBox(informationType, currentBestSuitParent(), identifier, title, text, QMessageBox::StandardButtons(buttons), QMessageBox::StandardButton(button)); @@ -320,7 +321,7 @@ int MessageBoxHandler::information(const QString &identifier, const QString &tit returns the escape button. */ int MessageBoxHandler::question(const QString &identifier, const QString &title, - const QString &text, int buttons, int button) const + const QString &text, int buttons, int button) { return showMessageBox(questionType, currentBestSuitParent(), identifier, title, text, QMessageBox::StandardButtons(buttons), QMessageBox::StandardButton(button)); @@ -338,7 +339,7 @@ int MessageBoxHandler::question(const QString &identifier, const QString &title, returns the escape button. */ int MessageBoxHandler::warning(const QString &identifier, const QString &title, const QString &text, - int buttons, int button) const + int buttons, int button) { return showMessageBox(warningType, currentBestSuitParent(), identifier, title, text, QMessageBox::StandardButtons(buttons), QMessageBox::StandardButton(button)); @@ -393,27 +394,33 @@ static QMessageBox::StandardButton showNewMessageBox(QWidget *parent, QMessageBo QMessageBox::StandardButton MessageBoxHandler::showMessageBox(MessageType messageType, QWidget *parent, const QString &identifier, const QString &title, const QString &text, QMessageBox::StandardButtons buttons, - QMessageBox::StandardButton defaultButton) const + const QMessageBox::StandardButton defaultButton) { - static QHash<MessageType, QString> messageTypeHash; - if (messageTypeHash.isEmpty()) { - messageTypeHash.insert(criticalType, QLatin1String("critical")); - messageTypeHash.insert(informationType, QLatin1String("information")); - messageTypeHash.insert(questionType, QLatin1String("question")); - messageTypeHash.insert(warningType, QLatin1String("warning")); - }; - - qCDebug(QInstaller::lcInstallerInstallLog).nospace() << "Created " << messageTypeHash.value(messageType).toUtf8().constData() - << " message box " << identifier << ": " << title << ", " << text; + QString availableAnswers = availableAnswerOptions(buttons); + qCDebug(QInstaller::lcInstallerInstallLog).noquote() << identifier << ":" << title << ":" << text + << availableAnswers; if (m_automaticAnswers.contains(identifier)) return m_automaticAnswers.value(identifier); if (qobject_cast<QApplication*> (qApp) == nullptr) { - if (m_defaultAction != AskUser) - return autoReply(buttons); - else - return defaultButton; + QMessageBox::StandardButton button = defaultButton; + bool showAnswerInLog = true; + if (m_defaultAction == AskUser) { + if (!availableAnswers.isEmpty()) { + while (!askAnswerFromUser(button, buttons)) { + qCDebug(QInstaller::lcInstallerInstallLog) << "Invalid answer, please retry"; + } + } + showAnswerInLog = false; + } else if (m_defaultAction != Default) { + button = autoReply(buttons); + } + if (showAnswerInLog) { + qCDebug(QInstaller::lcInstallerInstallLog) << "Answer:" + << enumToString(QMessageBox::staticMetaObject, "StandardButton", button); + } + return button; } if (m_defaultAction == AskUser) { @@ -434,3 +441,43 @@ QMessageBox::StandardButton MessageBoxHandler::showMessageBox(MessageType messag Q_ASSERT_X(false, Q_FUNC_INFO, "Something went really wrong."); return defaultButton; } + +bool MessageBoxHandler::askAnswerFromUser(QMessageBox::StandardButton &selectedButton, + QMessageBox::StandardButtons &availableButtons) const +{ + QTextStream stream(stdin); + + QString answer; + stream.readLineInto(&answer); + + const QMetaObject metaObject = QMessageBox::staticMetaObject; + int enumIndex = metaObject.indexOfEnumerator("StandardButton"); + if (enumIndex != -1) { + QMetaEnum en = metaObject.enumerator(enumIndex); + answer.prepend(QLatin1String("QMessageBox::")); + + bool ok = false; + int button = en.keyToValue(answer.toLocal8Bit().data(), &ok); + if (ok) { + selectedButton = static_cast<QMessageBox::Button>(button); + if (availableButtons & selectedButton) + return true; + } + } + return false; +} + +QString MessageBoxHandler::availableAnswerOptions(const QFlags<QMessageBox::StandardButton> &flags) const +{ + QString answers = QString(); + QMetaObject metaObject = QMessageBox::staticMetaObject; + int enumIndex = metaObject.indexOfEnumerator("StandardButton"); + if (enumIndex != -1) { + QMetaEnum en = metaObject.enumerator(enumIndex); + // If valueToKey returned a value, we don't have a question + // as there was only one value in the flags. + if (QLatin1String(en.valueToKey(quint64(flags))).isEmpty()) + answers = QLatin1String(en.valueToKeys(quint64(flags))); + } + return answers; +} |