forked from qt-creator/qt-creator
LanguageClient: Fix showMessageBox
ClientPrivate::showMessageBox did not create new buttons for each possible action. Clicking "Close" would result in a crash as the box had WA_DeleteOnClose set and we tried to call box->clickedButton() after exec(). Fixes: QTCREATORBUG-29253 Change-Id: Icc5fff99686fbef928b8ef14449de646ff773b17 Reviewed-by: David Schulz <david.schulz@qt.io> Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
@@ -1698,27 +1698,35 @@ void ClientPrivate::log(const ShowMessageParams &message)
|
|||||||
LanguageClientValue<MessageActionItem> ClientPrivate::showMessageBox(
|
LanguageClientValue<MessageActionItem> ClientPrivate::showMessageBox(
|
||||||
const ShowMessageRequestParams &message)
|
const ShowMessageRequestParams &message)
|
||||||
{
|
{
|
||||||
auto box = new QMessageBox();
|
QMessageBox box;
|
||||||
box->setText(message.toString());
|
box.setText(message.toString());
|
||||||
box->setAttribute(Qt::WA_DeleteOnClose);
|
|
||||||
switch (message.type()) {
|
switch (message.type()) {
|
||||||
case Error: box->setIcon(QMessageBox::Critical); break;
|
case Error:
|
||||||
case Warning: box->setIcon(QMessageBox::Warning); break;
|
box.setIcon(QMessageBox::Critical);
|
||||||
case Info: box->setIcon(QMessageBox::Information); break;
|
break;
|
||||||
case Log: box->setIcon(QMessageBox::NoIcon); break;
|
case Warning:
|
||||||
|
box.setIcon(QMessageBox::Warning);
|
||||||
|
break;
|
||||||
|
case Info:
|
||||||
|
box.setIcon(QMessageBox::Information);
|
||||||
|
break;
|
||||||
|
case Log:
|
||||||
|
box.setIcon(QMessageBox::NoIcon);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
QHash<QAbstractButton *, MessageActionItem> itemForButton;
|
QHash<QAbstractButton *, MessageActionItem> itemForButton;
|
||||||
if (const std::optional<QList<MessageActionItem>> actions = message.actions()) {
|
if (const std::optional<QList<MessageActionItem>> actions = message.actions()) {
|
||||||
auto button = box->addButton(QMessageBox::Close);
|
|
||||||
connect(button, &QPushButton::clicked, box, &QMessageBox::reject);
|
|
||||||
for (const MessageActionItem &action : *actions) {
|
for (const MessageActionItem &action : *actions) {
|
||||||
connect(button, &QPushButton::clicked, box, &QMessageBox::accept);
|
auto button = box.addButton(action.title(), QMessageBox::ActionRole);
|
||||||
|
connect(button, &QPushButton::clicked, &box, &QMessageBox::accept);
|
||||||
itemForButton.insert(button, action);
|
itemForButton.insert(button, action);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (box->exec() == QDialog::Rejected)
|
|
||||||
|
if (box.exec() == QDialog::Rejected || itemForButton.isEmpty())
|
||||||
return {};
|
return {};
|
||||||
const MessageActionItem &item = itemForButton.value(box->clickedButton());
|
const MessageActionItem &item = itemForButton.value(box.clickedButton());
|
||||||
return item.isValid() ? LanguageClientValue<MessageActionItem>(item)
|
return item.isValid() ? LanguageClientValue<MessageActionItem>(item)
|
||||||
: LanguageClientValue<MessageActionItem>();
|
: LanguageClientValue<MessageActionItem>();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user