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 <QPushButton>
#include <QSettings> #include <QSettings>
#include <QStyle> #include <QStyle>
#include <QTextEdit>
/*! /*!
\class Utils::CheckableMessageBox \class Utils::CheckableMessageBox
@@ -73,15 +74,23 @@ public:
messageLabel->setOpenExternalLinks(true); messageLabel->setOpenExternalLinks(true);
messageLabel->setTextInteractionFlags(Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse); messageLabel->setTextInteractionFlags(Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse);
messageLabel->setFocusPolicy(Qt::NoFocus); messageLabel->setFocusPolicy(Qt::NoFocus);
messageLabel->setAlignment(Qt::AlignLeft | Qt::AlignTop);
auto checkBoxRightSpacer =
new QSpacerItem(1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum);
auto buttonSpacer =
new QSpacerItem(0, 1, QSizePolicy::Minimum, QSizePolicy::Minimum);
checkBox = new QCheckBox(q); checkBox = new QCheckBox(q);
checkBox->setText(CheckableMessageBox::tr("Do not ask again")); 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 = new QDialogButtonBox(q);
buttonBox->setOrientation(Qt::Horizontal); buttonBox->setOrientation(Qt::Horizontal);
buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok); buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Ok);
@@ -92,16 +101,22 @@ public:
auto horizontalLayout_2 = new QHBoxLayout(); auto horizontalLayout_2 = new QHBoxLayout();
horizontalLayout_2->addLayout(verticalLayout); horizontalLayout_2->addLayout(verticalLayout);
horizontalLayout_2->addWidget(messageLabel); horizontalLayout_2->addWidget(messageLabel, 10);
auto horizontalLayout = new QHBoxLayout(); auto horizontalLayout = new QHBoxLayout();
horizontalLayout->addWidget(checkBox); 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); auto verticalLayout_2 = new QVBoxLayout(q);
verticalLayout_2->addLayout(horizontalLayout_2); verticalLayout_2->addLayout(horizontalLayout_2);
verticalLayout_2->addLayout(horizontalLayout); 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); verticalLayout_2->addWidget(buttonBox);
} }
@@ -110,6 +125,8 @@ public:
QCheckBox *checkBox = nullptr; QCheckBox *checkBox = nullptr;
QDialogButtonBox *buttonBox = nullptr; QDialogButtonBox *buttonBox = nullptr;
QAbstractButton *clickedButton = nullptr; QAbstractButton *clickedButton = nullptr;
QPushButton *detailsButton = nullptr;
QTextEdit *detailsText = nullptr;
QMessageBox::Icon icon = QMessageBox::NoIcon; QMessageBox::Icon icon = QMessageBox::NoIcon;
}; };
@@ -230,6 +247,18 @@ void CheckableMessageBox::setCheckBoxVisible(bool v)
d->checkBox->setVisible(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 QDialogButtonBox::StandardButtons CheckableMessageBox::standardButtons() const
{ {
return d->buttonBox->standardButtons(); return d->buttonBox->standardButtons();

View File

@@ -101,6 +101,9 @@ public:
bool isCheckBoxVisible() const; bool isCheckBoxVisible() const;
void setCheckBoxVisible(bool); void setCheckBoxVisible(bool);
QString detailedText() const;
void setDetailedText(const QString &text);
QDialogButtonBox::StandardButtons standardButtons() const; QDialogButtonBox::StandardButtons standardButtons() const;
void setStandardButtons(QDialogButtonBox::StandardButtons s); void setStandardButtons(QDialogButtonBox::StandardButtons s);
QPushButton *button(QDialogButtonBox::StandardButton b) const; QPushButton *button(QDialogButtonBox::StandardButton b) const;

View File

@@ -38,6 +38,7 @@
#include <extensionsystem/pluginview.h> #include <extensionsystem/pluginview.h>
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/checkablemessagebox.h>
#include <utils/environment.h> #include <utils/environment.h>
#include <utils/fancylineedit.h> #include <utils/fancylineedit.h>
#include <utils/infolabel.h> #include <utils/infolabel.h>
@@ -372,13 +373,14 @@ static bool unzip(const FilePath &src, const FilePath &dest)
QTC_ASSERT(tool, return false); QTC_ASSERT(tool, return false);
const QString workingDirectory = dest.toFileInfo().absoluteFilePath(); const QString workingDirectory = dest.toFileInfo().absoluteFilePath();
QDir(workingDirectory).mkpath("."); QDir(workingDirectory).mkpath(".");
QMessageBox box(QMessageBox::Information, CheckableMessageBox box(ICore::dialogParent());
PluginDialog::tr("Unzipping File"), box.setIcon(QMessageBox::Information);
PluginDialog::tr("Unzipping \"%1\" to \"%2\".") box.setWindowTitle(PluginDialog::tr("Unzipping File"));
.arg(src.toUserOutput(), dest.toUserOutput()), box.setText(PluginDialog::tr("Unzipping \"%1\" to \"%2\".")
QMessageBox::Ok | QMessageBox::Cancel, .arg(src.toUserOutput(), dest.toUserOutput()));
ICore::dialogParent()); box.setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
box.button(QMessageBox::Ok)->setEnabled(false); box.button(QDialogButtonBox::Ok)->setEnabled(false);
box.setCheckBoxVisible(false);
box.setDetailedText( box.setDetailedText(
PluginDialog::tr("Running %1\nin \"%2\".\n\n", "Running <cmd> in <workingdirectory>") PluginDialog::tr("Running %1\nin \"%2\".\n\n", "Running <cmd> in <workingdirectory>")
.arg(CommandLine(tool->executable, tool->arguments).toUserOutput(), 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, QObject::connect(&process,
QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
[&box](int, QProcess::ExitStatus) { [&box](int, QProcess::ExitStatus) {
box.button(QMessageBox::Ok)->setEnabled(true); box.button(QDialogButtonBox::Ok)->setEnabled(true);
box.button(QMessageBox::Cancel)->setEnabled(false); box.button(QDialogButtonBox::Cancel)->setEnabled(false);
}); });
QObject::connect(&box, &QMessageBox::rejected, &process, [&process] { QObject::connect(&box, &QMessageBox::rejected, &process, [&process] {
SynchronousProcess::stopProcess(process); SynchronousProcess::stopProcess(process);