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:
Marcus Tillmanns
2023-06-20 09:33:29 +02:00
parent deaef7da33
commit 3b6da21eec

View File

@@ -1698,27 +1698,35 @@ void ClientPrivate::log(const ShowMessageParams &message)
LanguageClientValue<MessageActionItem> ClientPrivate::showMessageBox(
const ShowMessageRequestParams &message)
{
auto box = new QMessageBox();
box->setText(message.toString());
box->setAttribute(Qt::WA_DeleteOnClose);
QMessageBox box;
box.setText(message.toString());
switch (message.type()) {
case Error: box->setIcon(QMessageBox::Critical); break;
case Warning: box->setIcon(QMessageBox::Warning); break;
case Info: box->setIcon(QMessageBox::Information); break;
case Log: box->setIcon(QMessageBox::NoIcon); break;
case Error:
box.setIcon(QMessageBox::Critical);
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;
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) {
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);
}
}
if (box->exec() == QDialog::Rejected)
if (box.exec() == QDialog::Rejected || itemForButton.isEmpty())
return {};
const MessageActionItem &item = itemForButton.value(box->clickedButton());
const MessageActionItem &item = itemForButton.value(box.clickedButton());
return item.isValid() ? LanguageClientValue<MessageActionItem>(item)
: LanguageClientValue<MessageActionItem>();
}