diff --git a/src/libs/utils/checkablemessagebox.cpp b/src/libs/utils/checkablemessagebox.cpp index 0cded34acd7..b2109ccbb79 100644 --- a/src/libs/utils/checkablemessagebox.cpp +++ b/src/libs/utils/checkablemessagebox.cpp @@ -33,6 +33,7 @@ #include #include #include +#include /*! \class Utils::CheckableMessageBox @@ -73,15 +74,23 @@ public: messageLabel->setOpenExternalLinks(true); messageLabel->setTextInteractionFlags(Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse); messageLabel->setFocusPolicy(Qt::NoFocus); - - auto checkBoxRightSpacer = - new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum); - auto buttonSpacer = - new QSpacerItem(0, 1, QSizePolicy::Minimum, QSizePolicy::Minimum); + messageLabel->setAlignment(Qt::AlignLeft | Qt::AlignTop); checkBox = new QCheckBox(q); checkBox->setText(CheckableMessageBox::tr("Do not ask again")); + const QString showText = CheckableMessageBox::tr("Show Details..."); + detailsButton = new QPushButton(showText, q); + detailsButton->setAutoDefault(false); + detailsButton->hide(); + detailsText = new QTextEdit(q); + detailsText->hide(); + QObject::connect(detailsButton, &QPushButton::clicked, detailsText, [this, showText] { + detailsText->setVisible(!detailsText->isVisible()); + detailsButton->setText( + detailsText->isVisible() ? CheckableMessageBox::tr("Hide Details...") : showText); + }); + buttonBox = new QDialogButtonBox(q); buttonBox->setOrientation(Qt::Horizontal); buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok); @@ -92,16 +101,22 @@ public: auto horizontalLayout_2 = new QHBoxLayout(); horizontalLayout_2->addLayout(verticalLayout); - horizontalLayout_2->addWidget(messageLabel); + horizontalLayout_2->addWidget(messageLabel, 10); auto horizontalLayout = new QHBoxLayout(); horizontalLayout->addWidget(checkBox); - horizontalLayout->addItem(checkBoxRightSpacer); + horizontalLayout->addStretch(10); + + auto detailsButtonLayout = new QHBoxLayout; + detailsButtonLayout->addWidget(detailsButton); + detailsButtonLayout->addStretch(10); auto verticalLayout_2 = new QVBoxLayout(q); verticalLayout_2->addLayout(horizontalLayout_2); verticalLayout_2->addLayout(horizontalLayout); - verticalLayout_2->addItem(buttonSpacer); + verticalLayout_2->addLayout(detailsButtonLayout); + verticalLayout_2->addWidget(detailsText, 10); + verticalLayout_2->addStretch(1); verticalLayout_2->addWidget(buttonBox); } @@ -110,6 +125,8 @@ public: QCheckBox *checkBox = nullptr; QDialogButtonBox *buttonBox = nullptr; QAbstractButton *clickedButton = nullptr; + QPushButton *detailsButton = nullptr; + QTextEdit *detailsText = nullptr; QMessageBox::Icon icon = QMessageBox::NoIcon; }; @@ -230,6 +247,18 @@ void CheckableMessageBox::setCheckBoxVisible(bool v) d->checkBox->setVisible(v); } +QString CheckableMessageBox::detailedText() const +{ + return d->detailsText->toPlainText(); +} + +void CheckableMessageBox::setDetailedText(const QString &text) +{ + d->detailsText->setText(text); + if (!text.isEmpty()) + d->detailsButton->setVisible(true); +} + QDialogButtonBox::StandardButtons CheckableMessageBox::standardButtons() const { return d->buttonBox->standardButtons(); diff --git a/src/libs/utils/checkablemessagebox.h b/src/libs/utils/checkablemessagebox.h index 042e88aa960..7f16449da7c 100644 --- a/src/libs/utils/checkablemessagebox.h +++ b/src/libs/utils/checkablemessagebox.h @@ -101,6 +101,9 @@ public: bool isCheckBoxVisible() const; void setCheckBoxVisible(bool); + QString detailedText() const; + void setDetailedText(const QString &text); + QDialogButtonBox::StandardButtons standardButtons() const; void setStandardButtons(QDialogButtonBox::StandardButtons s); QPushButton *button(QDialogButtonBox::StandardButton b) const; diff --git a/src/plugins/coreplugin/plugindialog.cpp b/src/plugins/coreplugin/plugindialog.cpp index 2f22401102a..7bca53412ca 100644 --- a/src/plugins/coreplugin/plugindialog.cpp +++ b/src/plugins/coreplugin/plugindialog.cpp @@ -38,6 +38,7 @@ #include #include +#include #include #include #include @@ -372,13 +373,14 @@ static bool unzip(const FilePath &src, const FilePath &dest) QTC_ASSERT(tool, return false); const QString workingDirectory = dest.toFileInfo().absoluteFilePath(); QDir(workingDirectory).mkpath("."); - QMessageBox box(QMessageBox::Information, - PluginDialog::tr("Unzipping File"), - PluginDialog::tr("Unzipping \"%1\" to \"%2\".") - .arg(src.toUserOutput(), dest.toUserOutput()), - QMessageBox::Ok | QMessageBox::Cancel, - ICore::dialogParent()); - box.button(QMessageBox::Ok)->setEnabled(false); + CheckableMessageBox box(ICore::dialogParent()); + box.setIcon(QMessageBox::Information); + box.setWindowTitle(PluginDialog::tr("Unzipping File")); + box.setText(PluginDialog::tr("Unzipping \"%1\" to \"%2\".") + .arg(src.toUserOutput(), dest.toUserOutput())); + box.setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); + box.button(QDialogButtonBox::Ok)->setEnabled(false); + box.setCheckBoxVisible(false); box.setDetailedText( PluginDialog::tr("Running %1\nin \"%2\".\n\n", "Running in ") .arg(CommandLine(tool->executable, tool->arguments).toUserOutput(), workingDirectory)); @@ -390,8 +392,8 @@ static bool unzip(const FilePath &src, const FilePath &dest) QObject::connect(&process, QOverload::of(&QProcess::finished), [&box](int, QProcess::ExitStatus) { - box.button(QMessageBox::Ok)->setEnabled(true); - box.button(QMessageBox::Cancel)->setEnabled(false); + box.button(QDialogButtonBox::Ok)->setEnabled(true); + box.button(QDialogButtonBox::Cancel)->setEnabled(false); }); QObject::connect(&box, &QMessageBox::rejected, &process, [&process] { SynchronousProcess::stopProcess(process);