From b924db72c5bc7e194d1b6a2b0e55f0427fa366b6 Mon Sep 17 00:00:00 2001 From: Stephan Witt Date: Sun, 16 Jul 2023 16:48:49 +0200 Subject: [PATCH] #12818 correct evaluation of message box result info MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The help page of int QMessageBox::exec() (​https://doc.qt.io/qt-6/qmessagebox.html#exec) says: When using a QMessageBox with standard buttons, this function returns a StandardButton value indicating the standard button that was clicked. When using QMessageBox with custom buttons, this function returns an opaque value; use clickedButton() to determine which button was clicked. --- src/frontends/alert.h | 6 ++++-- src/frontends/qt/GuiAlert.cpp | 36 ++++++++++++++++++++++++----------- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/src/frontends/alert.h b/src/frontends/alert.h index 20da43656a..a4556ca2d4 100644 --- a/src/frontends/alert.h +++ b/src/frontends/alert.h @@ -19,6 +19,8 @@ namespace lyx { namespace frontend { namespace Alert { +typedef unsigned short buttonid; + /** * Prompt for a question. Returns 0-3 for the chosen button. * Set default_button and cancel_button to reasonable values. b1-b3 @@ -30,8 +32,8 @@ namespace Alert { * "Yes" or "No", I will personally come around to your house and * slap you with fish, and not in an enjoyable way either. */ -int prompt(docstring const & title, docstring const & question, - int default_button, int cancel_button, +buttonid prompt(docstring const & title, docstring const & question, + buttonid default_button, buttonid cancel_button, docstring const & b0, docstring const & b1, docstring const & b2 = empty_docstring(), docstring const & b3 = empty_docstring()); diff --git a/src/frontends/qt/GuiAlert.cpp b/src/frontends/qt/GuiAlert.cpp index 93b8e1d4e6..85a5e22d6e 100644 --- a/src/frontends/qt/GuiAlert.cpp +++ b/src/frontends/qt/GuiAlert.cpp @@ -75,8 +75,8 @@ docstring toPlainText(docstring const & msg) } -int doPrompt(docstring const & title, docstring const & question, - int default_button, int cancel_button, +buttonid doPrompt(docstring const & title, docstring const & question, + buttonid default_button, buttonid cancel_button, docstring const & b1, docstring const & b2, docstring const & b3, docstring const & b4) { @@ -108,7 +108,7 @@ int doPrompt(docstring const & title, docstring const & question, // FIXME replace that with guiApp->currentView() //LYXERR0("FOCUS: " << qApp->focusWidget()); - QPushButton * b[4] = { 0, 0, 0, 0 }; + QPushButton * b[4] = { nullptr, nullptr, nullptr, nullptr }; QMessageBox msg_box(QMessageBox::Information, toqstr(title), toqstr(question), QMessageBox::NoButton, qApp->focusWidget()); @@ -120,23 +120,37 @@ int doPrompt(docstring const & title, docstring const & question, b[2] = msg_box.addButton(toqstr(b3), QMessageBox::ActionRole); if (!b4.empty()) b[3] = msg_box.addButton(toqstr(b4), QMessageBox::ActionRole); - msg_box.setDefaultButton(b[default_button]); - msg_box.setEscapeButton(static_cast(b[cancel_button])); - int res = msg_box.exec(); + if (default_button < size(b) && nullptr != b[default_button]) + msg_box.setDefaultButton(b[default_button]); + if (cancel_button < size(b) && nullptr != b[cancel_button]) + msg_box.setEscapeButton(static_cast(b[cancel_button])); + msg_box.exec(); + const QAbstractButton * button = msg_box.clickedButton(); qApp->restoreOverrideCursor(); if (long_op) theApp()->startLongOperation(); - // Qt bug: can return -1 on cancel or WM close, despite the docs. - if (res == -1) - res = cancel_button; + size_t res = cancel_button; + + if (button == nullptr) + return res; + else { + // Convert selection of the button into an integer + for (size_t i = 0; i < size(b); i++) { + if (button == b[i]) { + res = i; + break; + } + } + } + return res; } -int prompt(docstring const & title, docstring const & question, - int default_button, int cancel_button, +buttonid prompt(docstring const & title, docstring const & question, + buttonid default_button, buttonid cancel_button, docstring const & b0, docstring const & b1, docstring const & b2, docstring const & b3) { -- 2.39.5