summaryrefslogtreecommitdiffstats
path: root/src/libs/installer/messageboxhandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/installer/messageboxhandler.cpp')
-rw-r--r--src/libs/installer/messageboxhandler.cpp87
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;
+}