Add detailedText to CheckableMessageBox

QMessageBox creates dialogs that are not resizable, so extend our own
message box implementation with that feature and use it for the Plugin
install wizard.

Change-Id: I0e8a2d525894f8c2897b1e4d8ab546a856030c57
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Eike Ziller
2020-03-23 10:16:53 +01:00
parent cc02d8dd0d
commit a6ece1976b
3 changed files with 51 additions and 17 deletions

View File

@@ -33,6 +33,7 @@
#include <QPushButton>
#include <QSettings>
#include <QStyle>
#include <QTextEdit>
/*!
\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();

View File

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

View File

@@ -38,6 +38,7 @@
#include <extensionsystem/pluginview.h>
#include <utils/algorithm.h>
#include <utils/checkablemessagebox.h>
#include <utils/environment.h>
#include <utils/fancylineedit.h>
#include <utils/infolabel.h>
@@ -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 <cmd> in <workingdirectory>")
.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<int, QProcess::ExitStatus>::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);