File indexing completed on 2024-04-28 15:32:05

0001 /*
0002     This file is part of the KDE libraries
0003     SPDX-FileCopyrightText: 1999 Waldo Bastian <bastian@kde.org>
0004     SPDX-FileCopyrightText: 2012 David Faure <faure+bluesystems@kde.org>
0005 
0006     SPDX-License-Identifier: LGPL-2.0-only
0007 */
0008 
0009 #include "kmessagebox.h"
0010 #include "kmessagebox_p.h"
0011 
0012 #include <QCheckBox>
0013 #include <QDialog>
0014 #include <QLabel>
0015 #include <QLayout>
0016 #include <QListWidget>
0017 #include <QPointer>
0018 #include <QPushButton>
0019 #include <QScreen>
0020 #include <QScrollArea>
0021 #include <QScrollBar>
0022 #include <QTextBrowser>
0023 #include <QWindow>
0024 
0025 #include <qapplication.h>
0026 #if 0
0027 // NOTE waiting for the notification framework plan
0028 #include <knotification.h>
0029 #endif
0030 #include <ksqueezedtextlabel.h>
0031 
0032 #include <KCollapsibleGroupBox>
0033 
0034 namespace KMessageBox
0035 {
0036 /**
0037  * @private Prevent kapidox's doxygen config to pick up this namespace variable
0038  * this static is used by the createKMessageBox function to enqueue dialogs
0039  * FIXME what should we do about this static?
0040  */
0041 QDialogButtonBox::StandardButton KWIDGETSADDONS_EXPORT (*KMessageBox_exec_hook)(QDialog *) = nullptr;
0042 
0043 /// @private Prevent kapidox's doxygen config pick up this namespace method
0044 static void applyOptions(QDialog *dialog, KMessageBox::Options options)
0045 {
0046     if (options & KMessageBox::WindowModal) {
0047         dialog->setWindowModality(Qt::WindowModal);
0048     }
0049     dialog->setModal(true);
0050 }
0051 
0052 /// @private Prevent kapidox's doxygen config pick up this namespace method
0053 // This method has been copied from KWindowSystem to avoid depending on it
0054 static void setMainWindow(QWidget *subWidget, WId mainWindowId)
0055 {
0056 #ifdef Q_OS_OSX
0057     if (!QWidget::find(mainWindowId)) {
0058         return;
0059     }
0060 #endif
0061     // Set the WA_NativeWindow attribute to force the creation of the QWindow.
0062     // Without this QWidget::windowHandle() returns 0.
0063     subWidget->setAttribute(Qt::WA_NativeWindow, true);
0064     QWindow *subWindow = subWidget->windowHandle();
0065     Q_ASSERT(subWindow);
0066 
0067     QWindow *mainWindow = QWindow::fromWinId(mainWindowId);
0068     if (!mainWindow) {
0069         // foreign windows not supported on all platforms
0070         return;
0071     }
0072     // mainWindow is not the child of any object, so make sure it gets deleted at some point
0073     QObject::connect(subWidget, &QObject::destroyed, mainWindow, &QObject::deleteLater);
0074     subWindow->setTransientParent(mainWindow);
0075 }
0076 
0077 /**
0078  * @private Prevent kapidox's doxygen config pick up this namespace method
0079  * Create a QDialog whose parent is a foreign window
0080  */
0081 static QDialog *createWIdDialog(WId parent_id)
0082 {
0083     QWidget *parent = QWidget::find(parent_id);
0084     QDialog *dialog = new QDialog(parent, Qt::Dialog);
0085     if (!parent && parent_id) {
0086         setMainWindow(dialog, parent_id);
0087     }
0088     return dialog;
0089 }
0090 
0091 class DialogButtonsHelper : public QObject
0092 {
0093     Q_OBJECT
0094 public:
0095     DialogButtonsHelper(QDialog *dialog, QDialogButtonBox *buttons)
0096         : QObject(dialog)
0097         , m_dialog(dialog)
0098         , m_buttons(buttons)
0099         , m_details(nullptr)
0100     {
0101         connect(m_buttons, &QDialogButtonBox::clicked, this, &DialogButtonsHelper::onButtonClicked);
0102     }
0103 
0104     void setDetailsWidget(QWidget *widget)
0105     {
0106         m_details = widget;
0107     }
0108 
0109 public Q_SLOTS:
0110     void onButtonClicked(QAbstractButton *button)
0111     {
0112         QDialogButtonBox::StandardButton code = m_buttons->standardButton(button);
0113         if (code != QDialogButtonBox::NoButton) {
0114             m_dialog->done(code);
0115         }
0116     }
0117 
0118 private:
0119     QDialog *const m_dialog;
0120     QDialogButtonBox *const m_buttons;
0121     QWidget *m_details;
0122 };
0123 
0124 QDialogButtonBox::StandardButton createKMessageBox(QDialog *dialog,
0125                                                    QDialogButtonBox *buttons,
0126                                                    QMessageBox::Icon icon,
0127                                                    const QString &text,
0128                                                    const QStringList &strlist,
0129                                                    const QString &ask,
0130                                                    bool *checkboxReturn,
0131                                                    Options options,
0132                                                    const QString &details)
0133 {
0134     QIcon tmpIcon;
0135     QStyle *style = dialog ? dialog->style() : QApplication::style();
0136     switch (icon) {
0137     case QMessageBox::Information:
0138         tmpIcon = style->standardIcon(QStyle::SP_MessageBoxInformation, nullptr, dialog);
0139         break;
0140     case QMessageBox::Warning:
0141         tmpIcon = style->standardIcon(QStyle::SP_MessageBoxWarning, nullptr, dialog);
0142         break;
0143     case QMessageBox::Critical:
0144         tmpIcon = style->standardIcon(QStyle::SP_MessageBoxCritical, nullptr, dialog);
0145         break;
0146     case QMessageBox::Question:
0147         tmpIcon = style->standardIcon(QStyle::SP_MessageBoxQuestion, nullptr, dialog);
0148         break;
0149     default:
0150         break;
0151     }
0152 
0153     return createKMessageBox(dialog, buttons, tmpIcon, text, strlist, ask, checkboxReturn, options, details, icon);
0154 }
0155 
0156 QDialogButtonBox::StandardButton createKMessageBox(QDialog *dialog,
0157                                                    QDialogButtonBox *buttons,
0158                                                    const QIcon &icon,
0159                                                    const QString &text,
0160                                                    const QStringList &strlist,
0161                                                    const QString &ask,
0162                                                    bool *checkboxReturn,
0163                                                    Options options,
0164                                                    const QString &details,
0165                                                    QMessageBox::Icon notifyType)
0166 {
0167     if (!isNotifyInterfaceLoaded()) {
0168         // This is annoying. Loading the interface later (or at any point) will
0169         // install the qm translation of the knotifications library which will cause a LanguageChange event to be sent
0170         // Which will end up in QDialogButtonBoxPrivate::retranslateStrings and will overwrite the texts
0171         // we have just set. So here we save our texts, force load the interface and reset the texts
0172         // For people wondering if they can remove this bit of code later, this seems to only be an issue
0173         // in non Plasma desktops, emulate by running something like XDG_CURRENT_DESKTOP=X-Cinnamon okular
0174         // on plasma desktops the platform plugin already uses knotifications so it's qm has been loaded on startup
0175         QMap<QPointer<QAbstractButton>, QString> buttonTexts;
0176         for (QAbstractButton *b : buttons->buttons()) {
0177             buttonTexts[b] = b->text();
0178         }
0179         notifyInterface();
0180         QApplication::processEvents(); // We need to force the LanguageChange to be processed
0181         for (auto it = buttonTexts.constBegin(); it != buttonTexts.constEnd(); ++it) {
0182             if (it.key()) {
0183                 it.key()->setText(it.value());
0184             }
0185         }
0186     }
0187 
0188     DialogButtonsHelper *buttonsHelper = new DialogButtonsHelper(dialog, buttons);
0189 
0190     QWidget *mainWidget = new QWidget(dialog);
0191     QVBoxLayout *mainLayout = new QVBoxLayout(mainWidget);
0192     const int verticalSpacing = mainWidget->style()->pixelMetric(QStyle::PM_LayoutVerticalSpacing);
0193     const int horizontalSpacing = mainWidget->style()->pixelMetric(QStyle::PM_LayoutHorizontalSpacing);
0194     mainLayout->setSpacing(verticalSpacing * 2); // provide extra spacing
0195     mainLayout->setContentsMargins(0, 0, 0, 0);
0196     buttons->setParent(dialog);
0197 
0198     QHBoxLayout *hLayout = new QHBoxLayout();
0199     hLayout->setContentsMargins(0, 0, 0, 0);
0200     hLayout->setSpacing(-1); // use default spacing
0201     mainLayout->addLayout(hLayout, 5);
0202 
0203     QLabel *iconLabel = new QLabel(mainWidget);
0204 
0205     if (!icon.isNull()) {
0206         QStyleOption option;
0207         option.initFrom(mainWidget);
0208         iconLabel->setPixmap(icon.pixmap(mainWidget->style()->pixelMetric(QStyle::PM_MessageBoxIconSize, &option, mainWidget)));
0209     }
0210 
0211     QVBoxLayout *iconLayout = new QVBoxLayout();
0212     iconLayout->addStretch(1);
0213     iconLayout->addWidget(iconLabel);
0214     iconLayout->addStretch(5);
0215 
0216     hLayout->addLayout(iconLayout, 0);
0217     hLayout->addSpacing(horizontalSpacing);
0218 
0219     QLabel *messageLabel = new QLabel(text, mainWidget);
0220     messageLabel->setOpenExternalLinks(options & KMessageBox::AllowLink);
0221     Qt::TextInteractionFlags flags = Qt::TextSelectableByMouse;
0222     if (options & KMessageBox::AllowLink) {
0223         flags |= Qt::LinksAccessibleByMouse | Qt::LinksAccessibleByKeyboard;
0224     }
0225     messageLabel->setTextInteractionFlags(flags);
0226 
0227     QRect desktop = dialog->screen()->geometry();
0228     bool usingSqueezedTextLabel = false;
0229     if (messageLabel->sizeHint().width() > desktop.width() * 0.5) {
0230         // enable automatic wrapping of messages which are longer than 50% of screen width
0231         messageLabel->setWordWrap(true);
0232         // use a squeezed label if text is still too wide
0233         usingSqueezedTextLabel = messageLabel->sizeHint().width() > desktop.width() * 0.85;
0234         if (usingSqueezedTextLabel) {
0235             delete messageLabel;
0236             messageLabel = new KSqueezedTextLabel(text, mainWidget);
0237             messageLabel->setOpenExternalLinks(options & KMessageBox::AllowLink);
0238             messageLabel->setTextInteractionFlags(flags);
0239         }
0240     }
0241 
0242     QPalette messagePal(messageLabel->palette());
0243     messagePal.setColor(QPalette::Window, Qt::transparent);
0244     messageLabel->setPalette(messagePal);
0245 
0246     bool usingScrollArea = desktop.height() / 3 < messageLabel->sizeHint().height();
0247     if (usingScrollArea) {
0248         QScrollArea *messageScrollArea = new QScrollArea(mainWidget);
0249         messageScrollArea->setWidget(messageLabel);
0250         messageScrollArea->setFrameShape(QFrame::NoFrame);
0251         messageScrollArea->setWidgetResizable(true);
0252         QPalette scrollPal(messageScrollArea->palette());
0253         scrollPal.setColor(QPalette::Window, Qt::transparent);
0254         messageScrollArea->viewport()->setPalette(scrollPal);
0255         hLayout->addWidget(messageScrollArea, 5);
0256     } else {
0257         hLayout->addWidget(messageLabel, 5);
0258     }
0259 
0260     const bool usingListWidget = !strlist.isEmpty();
0261     if (usingListWidget) {
0262         // enable automatic wrapping since the listwidget has already a good initial width
0263         messageLabel->setWordWrap(true);
0264         QListWidget *listWidget = new QListWidget(mainWidget);
0265         listWidget->addItems(strlist);
0266 
0267         QStyleOptionViewItem styleOption;
0268         styleOption.initFrom(listWidget);
0269         QFontMetrics fm(styleOption.font);
0270         int w = listWidget->width();
0271         for (const QString &str : strlist) {
0272             w = qMax(w, fm.boundingRect(str).width());
0273         }
0274         const int borderWidth = listWidget->width() - listWidget->viewport()->width() + listWidget->verticalScrollBar()->height();
0275         w += borderWidth;
0276         if (w > desktop.width() * 0.85) { // limit listWidget size to 85% of screen width
0277             w = qRound(desktop.width() * 0.85);
0278         }
0279         listWidget->setMinimumWidth(w);
0280 
0281         mainLayout->addWidget(listWidget, usingScrollArea ? 10 : 50);
0282         listWidget->setSelectionMode(QListWidget::NoSelection);
0283         messageLabel->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum);
0284     } else if (!usingScrollArea) {
0285         mainLayout->addStretch(15);
0286     }
0287 
0288     QPointer<QCheckBox> checkbox = nullptr;
0289     if (!ask.isEmpty()) {
0290         checkbox = new QCheckBox(ask, mainWidget);
0291         mainLayout->addWidget(checkbox);
0292         if (checkboxReturn) {
0293             checkbox->setChecked(*checkboxReturn);
0294         }
0295     }
0296 
0297     QVBoxLayout *topLayout = new QVBoxLayout(dialog);
0298     topLayout->addWidget(mainWidget);
0299 
0300     if (!details.isEmpty()) {
0301         QHBoxLayout *detailsHLayout = new QHBoxLayout();
0302         detailsHLayout->addSpacing(2 * horizontalSpacing + iconLayout->sizeHint().width());
0303         KCollapsibleGroupBox *detailsGroup = new KCollapsibleGroupBox();
0304         detailsGroup->setTitle(QApplication::translate("KMessageBox", "Details"));
0305         QVBoxLayout *detailsLayout = new QVBoxLayout(detailsGroup);
0306         if (details.length() < 512) {
0307             QLabel *detailsLabel = new QLabel(details);
0308             detailsLabel->setOpenExternalLinks(options & KMessageBox::AllowLink);
0309             Qt::TextInteractionFlags flags = Qt::TextSelectableByMouse;
0310             if (options & KMessageBox::AllowLink) {
0311                 flags |= Qt::LinksAccessibleByMouse | Qt::LinksAccessibleByKeyboard;
0312             };
0313             detailsLabel->setTextInteractionFlags(flags);
0314             detailsLabel->setWordWrap(true);
0315             detailsLabel->setMinimumSize(detailsLabel->sizeHint());
0316             detailsLayout->addWidget(detailsLabel, 50);
0317         } else {
0318             QTextBrowser *detailTextEdit = new QTextBrowser();
0319             detailTextEdit->setText(details);
0320             detailTextEdit->setReadOnly(true);
0321             detailTextEdit->setMinimumHeight(detailTextEdit->fontMetrics().lineSpacing() * 11);
0322             detailsLayout->addWidget(detailTextEdit, 50);
0323         }
0324         if (!usingListWidget) {
0325             mainLayout->setStretchFactor(hLayout, 10);
0326         }
0327         detailsHLayout->addWidget(detailsGroup);
0328         topLayout->addLayout(detailsHLayout);
0329         buttonsHelper->setDetailsWidget(detailsGroup);
0330     }
0331 
0332     topLayout->addWidget(buttons);
0333     topLayout->setSizeConstraint(QLayout::SetFixedSize);
0334 
0335     if (!usingListWidget && !usingScrollArea && !usingSqueezedTextLabel && details.isEmpty()) {
0336         dialog->setFixedSize(dialog->sizeHint() + QSize(10, 10));
0337     }
0338 
0339     if ((options & KMessageBox::Dangerous)) {
0340         QPushButton *cancelButton = buttons->button(QDialogButtonBox::Cancel);
0341         QPushButton *noButton = buttons->button(QDialogButtonBox::No);
0342 
0343         if (cancelButton && cancelButton->isEnabled()) {
0344             cancelButton->setDefault(true);
0345             cancelButton->setFocus();
0346         } else if (noButton && noButton->isEnabled()) {
0347             noButton->setDefault(true);
0348             noButton->setFocus();
0349         }
0350     }
0351 
0352 #ifndef Q_OS_WIN // FIXME problems with KNotify on Windows
0353     if ((options & KMessageBox::Notify)) {
0354         QString message = text;
0355         if (!strlist.isEmpty()) {
0356             message += QLatin1Char('\n') + strlist.join(QLatin1Char('\n'));
0357         }
0358         notifyInterface()->sendNotification(notifyType, message, dialog->topLevelWidget());
0359     }
0360 #endif
0361 
0362     if (KMessageBox_exec_hook) {
0363         return KMessageBox_exec_hook(dialog);
0364     }
0365 
0366     if ((options & KMessageBox::NoExec)) {
0367         return QDialogButtonBox::NoButton; // We have to return something.
0368     }
0369 
0370     // We use a QPointer because the dialog may get deleted
0371     // during exec() if the parent of the dialog gets deleted.
0372     // In that case the QPointer will reset to 0.
0373     QPointer<QDialog> guardedDialog = dialog;
0374 
0375     const QDialogButtonBox::StandardButton result = QDialogButtonBox::StandardButton(guardedDialog->exec());
0376     if (checkbox && checkboxReturn) {
0377         *checkboxReturn = checkbox->isChecked();
0378     }
0379 
0380     delete guardedDialog;
0381     return result;
0382 }
0383 
0384 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 100)
0385 ButtonCode questionYesNo(QWidget *parent,
0386                          const QString &text,
0387                          const QString &title,
0388                          const KGuiItem &buttonYes,
0389                          const KGuiItem &buttonNo,
0390                          const QString &dontAskAgainName,
0391                          Options options)
0392 {
0393     return questionYesNoList(parent, text, QStringList(), title, buttonYes, buttonNo, dontAskAgainName, options);
0394 }
0395 #endif
0396 
0397 ButtonCode questionTwoActions(QWidget *parent,
0398                               const QString &text,
0399                               const QString &title,
0400                               const KGuiItem &primaryAction,
0401                               const KGuiItem &secondaryAction,
0402                               const QString &dontAskAgainName,
0403                               Options options)
0404 {
0405     return questionTwoActionsList(parent, text, QStringList(), title, primaryAction, secondaryAction, dontAskAgainName, options);
0406 }
0407 
0408 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 100)
0409 bool shouldBeShownYesNo(const QString &dontShowAgainName, ButtonCode &result)
0410 {
0411     if (dontShowAgainName.isEmpty()) {
0412         return true;
0413     }
0414     return dontAskAgainInterface()->shouldBeShownYesNo(dontShowAgainName, result);
0415 }
0416 #endif
0417 
0418 bool shouldBeShownTwoActions(const QString &dontShowAgainName, ButtonCode &result)
0419 {
0420     if (dontShowAgainName.isEmpty()) {
0421         return true;
0422     }
0423 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 100)
0424     return dontAskAgainInterface()->shouldBeShownYesNo(dontShowAgainName, result);
0425 #else
0426     return dontAskAgainInterface()->shouldBeShownTwoActions(dontShowAgainName, result);
0427 #endif
0428 }
0429 
0430 bool shouldBeShownContinue(const QString &dontShowAgainName)
0431 {
0432     if (dontShowAgainName.isEmpty()) {
0433         return true;
0434     }
0435     return dontAskAgainInterface()->shouldBeShownContinue(dontShowAgainName);
0436 }
0437 
0438 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 100)
0439 void saveDontShowAgainYesNo(const QString &dontShowAgainName, ButtonCode result)
0440 {
0441     if (dontShowAgainName.isEmpty()) {
0442         return;
0443     }
0444     dontAskAgainInterface()->saveDontShowAgainYesNo(dontShowAgainName, result);
0445 }
0446 #endif
0447 
0448 void saveDontShowAgainTwoActions(const QString &dontShowAgainName, ButtonCode result)
0449 {
0450     if (dontShowAgainName.isEmpty()) {
0451         return;
0452     }
0453 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 100)
0454     dontAskAgainInterface()->saveDontShowAgainYesNo(dontShowAgainName, result);
0455 #else
0456     dontAskAgainInterface()->saveDontShowAgainTwoActions(dontShowAgainName, result);
0457 #endif
0458 }
0459 
0460 void saveDontShowAgainContinue(const QString &dontShowAgainName)
0461 {
0462     if (dontShowAgainName.isEmpty()) {
0463         return;
0464     }
0465     dontAskAgainInterface()->saveDontShowAgainContinue(dontShowAgainName);
0466 }
0467 
0468 void enableAllMessages()
0469 {
0470     dontAskAgainInterface()->enableAllMessages();
0471 }
0472 
0473 void enableMessage(const QString &dontShowAgainName)
0474 {
0475     dontAskAgainInterface()->enableMessage(dontShowAgainName);
0476 }
0477 
0478 void setDontShowAgainConfig(KConfig *cfg)
0479 {
0480     dontAskAgainInterface()->setConfig(cfg);
0481 }
0482 
0483 /// @private Prevent kapidox's doxygen config pick up this namespace method
0484 static ButtonCode questionTwoActionsListInternal(QDialog *dialog,
0485                                                  const QString &text,
0486                                                  const QStringList &strlist,
0487                                                  const QString &title,
0488                                                  const KGuiItem &primaryAction,
0489                                                  const KGuiItem &secondaryAction,
0490                                                  const QString &dontAskAgainName,
0491                                                  Options options)
0492 {
0493     ButtonCode res;
0494     if (!shouldBeShownTwoActions(dontAskAgainName, res)) {
0495         delete dialog;
0496         return res;
0497     }
0498 
0499     dialog->setWindowTitle(title.isEmpty() ? QApplication::translate("KMessageBox", "Question") : title);
0500     dialog->setObjectName(QStringLiteral("questionTwoActions"));
0501 
0502     QDialogButtonBox *buttonBox = new QDialogButtonBox(dialog);
0503     buttonBox->setStandardButtons(QDialogButtonBox::Yes | QDialogButtonBox::No);
0504     KGuiItem::assign(buttonBox->button(QDialogButtonBox::Yes), primaryAction);
0505     KGuiItem::assign(buttonBox->button(QDialogButtonBox::No), secondaryAction);
0506 
0507     applyOptions(dialog, options);
0508 
0509     bool checkboxResult = false;
0510     const int result = createKMessageBox(dialog,
0511                                          buttonBox,
0512                                          QMessageBox::Question,
0513                                          text,
0514                                          strlist,
0515                                          dontAskAgainName.isEmpty() ? QString() : QApplication::translate("KMessageBox", "Do not ask again"),
0516                                          &checkboxResult,
0517                                          options);
0518     res = (result == QDialogButtonBox::Yes ? PrimaryAction : SecondaryAction);
0519 
0520     if (checkboxResult) {
0521         saveDontShowAgainTwoActions(dontAskAgainName, res);
0522     }
0523     return res;
0524 }
0525 
0526 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 100)
0527 ButtonCode questionYesNoList(QWidget *parent,
0528                              const QString &text,
0529                              const QStringList &strlist,
0530                              const QString &title,
0531                              const KGuiItem &buttonYes,
0532                              const KGuiItem &buttonNo,
0533                              const QString &dontAskAgainName,
0534                              Options options)
0535 {
0536     return questionTwoActionsListInternal(new QDialog(parent), text, strlist, title, buttonYes, buttonNo, dontAskAgainName, options);
0537 }
0538 #endif
0539 
0540 ButtonCode questionTwoActionsList(QWidget *parent,
0541                                   const QString &text,
0542                                   const QStringList &strlist,
0543                                   const QString &title,
0544                                   const KGuiItem &primaryAction,
0545                                   const KGuiItem &secondaryAction,
0546                                   const QString &dontAskAgainName,
0547                                   Options options)
0548 {
0549     return questionTwoActionsListInternal(new QDialog(parent), text, strlist, title, primaryAction, secondaryAction, dontAskAgainName, options);
0550 }
0551 
0552 /// @private Prevent kapidox's doxygen config pick up this namespace method
0553 static ButtonCode questionTwoActionsCancelInternal(QDialog *dialog,
0554                                                    const QString &text,
0555                                                    const QString &title,
0556                                                    const KGuiItem &primaryAction,
0557                                                    const KGuiItem &secondaryAction,
0558                                                    const KGuiItem &cancelAction,
0559                                                    const QString &dontAskAgainName,
0560                                                    Options options)
0561 {
0562     ButtonCode res;
0563     if (!shouldBeShownTwoActions(dontAskAgainName, res)) {
0564         delete dialog;
0565         return res;
0566     }
0567 
0568     dialog->setWindowTitle(title.isEmpty() ? QApplication::translate("KMessageBox", "Question") : title);
0569     dialog->setObjectName(QStringLiteral("QuestionTwoActionsCancel"));
0570 
0571     QDialogButtonBox *buttonBox = new QDialogButtonBox(dialog);
0572     buttonBox->setStandardButtons(QDialogButtonBox::Yes | QDialogButtonBox::No | QDialogButtonBox::Cancel);
0573     KGuiItem::assign(buttonBox->button(QDialogButtonBox::Yes), primaryAction);
0574     KGuiItem::assign(buttonBox->button(QDialogButtonBox::No), secondaryAction);
0575     KGuiItem::assign(buttonBox->button(QDialogButtonBox::Cancel), cancelAction);
0576 
0577     applyOptions(dialog, options);
0578 
0579     bool checkboxResult = false;
0580     const int result = createKMessageBox(dialog,
0581                                          buttonBox,
0582                                          QMessageBox::Question,
0583                                          text,
0584                                          QStringList(),
0585                                          dontAskAgainName.isEmpty() ? QString() : QApplication::translate("KMessageBox", "Do not ask again"),
0586                                          &checkboxResult,
0587                                          options);
0588 
0589     if (result == QDialogButtonBox::Yes) {
0590         res = PrimaryAction;
0591     } else if (result == QDialogButtonBox::No) {
0592         res = SecondaryAction;
0593     } else {
0594         return Cancel;
0595     }
0596 
0597     if (checkboxResult) {
0598         saveDontShowAgainTwoActions(dontAskAgainName, res);
0599     }
0600     return res;
0601 }
0602 
0603 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 100)
0604 ButtonCode questionYesNoCancel(QWidget *parent,
0605                                const QString &text,
0606                                const QString &title,
0607                                const KGuiItem &buttonYes,
0608                                const KGuiItem &buttonNo,
0609                                const KGuiItem &buttonCancel,
0610                                const QString &dontAskAgainName,
0611                                Options options)
0612 {
0613     return questionTwoActionsCancelInternal(new QDialog(parent), text, title, buttonYes, buttonNo, buttonCancel, dontAskAgainName, options);
0614 }
0615 #endif
0616 
0617 ButtonCode questionTwoActionsCancel(QWidget *parent,
0618                                     const QString &text,
0619                                     const QString &title,
0620                                     const KGuiItem &primaryAction,
0621                                     const KGuiItem &secondaryAction,
0622                                     const KGuiItem &cancelAction,
0623                                     const QString &dontAskAgainName,
0624                                     Options options)
0625 {
0626     return questionTwoActionsCancelInternal(new QDialog(parent), text, title, primaryAction, secondaryAction, cancelAction, dontAskAgainName, options);
0627 }
0628 
0629 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 100)
0630 ButtonCode warningYesNo(QWidget *parent,
0631                         const QString &text,
0632                         const QString &title,
0633                         const KGuiItem &buttonYes,
0634                         const KGuiItem &buttonNo,
0635                         const QString &dontAskAgainName,
0636                         Options options)
0637 {
0638     return warningYesNoList(parent, text, QStringList(), title, buttonYes, buttonNo, dontAskAgainName, options);
0639 }
0640 #endif
0641 
0642 ButtonCode warningTwoActions(QWidget *parent,
0643                              const QString &text,
0644                              const QString &title,
0645                              const KGuiItem &primaryAction,
0646                              const KGuiItem &secondaryAction,
0647                              const QString &dontAskAgainName,
0648                              Options options)
0649 {
0650     return warningTwoActionsList(parent, text, QStringList(), title, primaryAction, secondaryAction, dontAskAgainName, options);
0651 }
0652 
0653 /// @private Prevent kapidox's doxygen config pick up this namespace method
0654 static ButtonCode warningTwoActionsListInternal(QDialog *dialog,
0655                                                 const QString &text,
0656                                                 const QStringList &strlist,
0657                                                 const QString &title,
0658                                                 const KGuiItem &primaryAction,
0659                                                 const KGuiItem &secondaryAction,
0660                                                 const QString &dontAskAgainName,
0661                                                 Options options)
0662 {
0663     ButtonCode res;
0664     if (!shouldBeShownTwoActions(dontAskAgainName, res)) {
0665         delete dialog;
0666         return res;
0667     }
0668 
0669     dialog->setWindowTitle(title.isEmpty() ? QApplication::translate("KMessageBox", "Warning") : title);
0670     dialog->setObjectName(QStringLiteral("warningTwoActionsList"));
0671 
0672     QDialogButtonBox *buttonBox = new QDialogButtonBox(dialog);
0673     buttonBox->setStandardButtons(QDialogButtonBox::Yes | QDialogButtonBox::No);
0674     KGuiItem::assign(buttonBox->button(QDialogButtonBox::Yes), primaryAction);
0675     KGuiItem::assign(buttonBox->button(QDialogButtonBox::No), secondaryAction);
0676 
0677     applyOptions(dialog, options);
0678 
0679     bool checkboxResult = false;
0680     const int result = createKMessageBox(dialog,
0681                                          buttonBox,
0682                                          QMessageBox::Warning,
0683                                          text,
0684                                          strlist,
0685                                          dontAskAgainName.isEmpty() ? QString() : QApplication::translate("KMessageBox", "Do not ask again"),
0686                                          &checkboxResult,
0687                                          options);
0688     res = (result == QDialogButtonBox::Yes ? PrimaryAction : SecondaryAction);
0689 
0690     if (checkboxResult) {
0691         saveDontShowAgainTwoActions(dontAskAgainName, res);
0692     }
0693     return res;
0694 }
0695 
0696 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 100)
0697 ButtonCode warningYesNoList(QWidget *parent,
0698                             const QString &text,
0699                             const QStringList &strlist,
0700                             const QString &title,
0701                             const KGuiItem &buttonYes,
0702                             const KGuiItem &buttonNo,
0703                             const QString &dontAskAgainName,
0704                             Options options)
0705 {
0706     return warningTwoActionsListInternal(new QDialog(parent), text, strlist, title, buttonYes, buttonNo, dontAskAgainName, options);
0707 }
0708 #endif
0709 
0710 ButtonCode warningTwoActionsList(QWidget *parent,
0711                                  const QString &text,
0712                                  const QStringList &strlist,
0713                                  const QString &title,
0714                                  const KGuiItem &primaryAction,
0715                                  const KGuiItem &secondaryAction,
0716                                  const QString &dontAskAgainName,
0717                                  Options options)
0718 {
0719     return warningTwoActionsListInternal(new QDialog(parent), text, strlist, title, primaryAction, secondaryAction, dontAskAgainName, options);
0720 }
0721 
0722 ButtonCode warningContinueCancel(QWidget *parent,
0723                                  const QString &text,
0724                                  const QString &title,
0725                                  const KGuiItem &buttonContinue,
0726                                  const KGuiItem &buttonCancel,
0727                                  const QString &dontAskAgainName,
0728                                  Options options)
0729 {
0730     return warningContinueCancelList(parent, text, QStringList(), title, buttonContinue, buttonCancel, dontAskAgainName, options);
0731 }
0732 
0733 /// @private Prevent kapidox's doxygen config pick up this namespace method
0734 static ButtonCode warningContinueCancelListInternal(QDialog *dialog,
0735                                                     const QString &text,
0736                                                     const QStringList &strlist,
0737                                                     const QString &title,
0738                                                     const KGuiItem &buttonContinue,
0739                                                     const KGuiItem &buttonCancel,
0740                                                     const QString &dontAskAgainName,
0741                                                     Options options,
0742                                                     const QString &details)
0743 {
0744     if (!shouldBeShownContinue(dontAskAgainName)) {
0745         delete dialog;
0746         return Continue;
0747     }
0748 
0749     dialog->setWindowTitle(title.isEmpty() ? QApplication::translate("KMessageBox", "Warning") : title);
0750     dialog->setObjectName(QStringLiteral("warningYesNo"));
0751 
0752     QDialogButtonBox *buttonBox = new QDialogButtonBox(dialog);
0753     buttonBox->setStandardButtons(QDialogButtonBox::Yes | QDialogButtonBox::No);
0754     KGuiItem::assign(buttonBox->button(QDialogButtonBox::Yes), buttonContinue);
0755     KGuiItem::assign(buttonBox->button(QDialogButtonBox::No), buttonCancel);
0756 
0757     applyOptions(dialog, options);
0758 
0759     bool checkboxResult = false;
0760     const int result = createKMessageBox(dialog,
0761                                          buttonBox,
0762                                          QMessageBox::Warning,
0763                                          text,
0764                                          strlist,
0765                                          dontAskAgainName.isEmpty() ? QString() : QApplication::translate("KMessageBox", "Do not ask again"),
0766                                          &checkboxResult,
0767                                          options,
0768                                          details);
0769 
0770     if (result != QDialogButtonBox::Yes) {
0771         return Cancel;
0772     }
0773     if (checkboxResult) {
0774         saveDontShowAgainContinue(dontAskAgainName);
0775     }
0776     return Continue;
0777 }
0778 
0779 ButtonCode warningContinueCancelList(QWidget *parent,
0780                                      const QString &text,
0781                                      const QStringList &strlist,
0782                                      const QString &title,
0783                                      const KGuiItem &buttonContinue,
0784                                      const KGuiItem &buttonCancel,
0785                                      const QString &dontAskAgainName,
0786                                      Options options)
0787 {
0788     return warningContinueCancelListInternal(new QDialog(parent), text, strlist, title, buttonContinue, buttonCancel, dontAskAgainName, options, QString());
0789 }
0790 
0791 ButtonCode warningContinueCancelDetailed(QWidget *parent,
0792                                          const QString &text,
0793                                          const QString &title,
0794                                          const KGuiItem &buttonContinue,
0795                                          const KGuiItem &buttonCancel,
0796                                          const QString &dontAskAgainName,
0797                                          Options options,
0798                                          const QString &details)
0799 {
0800     return warningContinueCancelListInternal(new QDialog(parent), text, QStringList(), title, buttonContinue, buttonCancel, dontAskAgainName, options, details);
0801 }
0802 
0803 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 100)
0804 ButtonCode warningYesNoCancel(QWidget *parent,
0805                               const QString &text,
0806                               const QString &title,
0807                               const KGuiItem &buttonYes,
0808                               const KGuiItem &buttonNo,
0809                               const KGuiItem &buttonCancel,
0810                               const QString &dontAskAgainName,
0811                               Options options)
0812 {
0813     return warningYesNoCancelList(parent, text, QStringList(), title, buttonYes, buttonNo, buttonCancel, dontAskAgainName, options);
0814 }
0815 #endif
0816 
0817 ButtonCode warningTwoActionsCancel(QWidget *parent,
0818                                    const QString &text,
0819                                    const QString &title,
0820                                    const KGuiItem &primaryAction,
0821                                    const KGuiItem &secondaryAction,
0822                                    const KGuiItem &cancelAction,
0823                                    const QString &dontAskAgainName,
0824                                    Options options)
0825 {
0826     return warningTwoActionsCancelList(parent, text, QStringList(), title, primaryAction, secondaryAction, cancelAction, dontAskAgainName, options);
0827 }
0828 
0829 /// @private Prevent kapidox's doxygen config pick up this namespace method
0830 static ButtonCode warningTwoActionsCancelListInternal(QDialog *dialog,
0831                                                       const QString &text,
0832                                                       const QStringList &strlist,
0833                                                       const QString &title,
0834                                                       const KGuiItem &primaryAction,
0835                                                       const KGuiItem &secondaryAction,
0836                                                       const KGuiItem &cancelAction,
0837                                                       const QString &dontAskAgainName,
0838                                                       Options options)
0839 {
0840     ButtonCode res;
0841     if (!shouldBeShownTwoActions(dontAskAgainName, res)) {
0842         delete dialog;
0843         return res;
0844     }
0845 
0846     dialog->setWindowTitle(title.isEmpty() ? QApplication::translate("KMessageBox", "Warning") : title);
0847     dialog->setObjectName(QStringLiteral("warningTwoActionsCancel"));
0848 
0849     QDialogButtonBox *buttonBox = new QDialogButtonBox(dialog);
0850     buttonBox->setStandardButtons(QDialogButtonBox::Yes | QDialogButtonBox::No | QDialogButtonBox::Cancel);
0851     KGuiItem::assign(buttonBox->button(QDialogButtonBox::Yes), primaryAction);
0852     KGuiItem::assign(buttonBox->button(QDialogButtonBox::No), secondaryAction);
0853     KGuiItem::assign(buttonBox->button(QDialogButtonBox::Cancel), cancelAction);
0854 
0855     applyOptions(dialog, options);
0856 
0857     bool checkboxResult = false;
0858     const int result = createKMessageBox(dialog,
0859                                          buttonBox,
0860                                          QMessageBox::Warning,
0861                                          text,
0862                                          strlist,
0863                                          dontAskAgainName.isEmpty() ? QString() : QApplication::translate("KMessageBox", "Do not ask again"),
0864                                          &checkboxResult,
0865                                          options);
0866 
0867     if (result == QDialogButtonBox::Yes) {
0868         res = PrimaryAction;
0869     } else if (result == QDialogButtonBox::No) {
0870         res = SecondaryAction;
0871     } else {
0872         return Cancel;
0873     }
0874 
0875     if (checkboxResult) {
0876         saveDontShowAgainTwoActions(dontAskAgainName, res);
0877     }
0878     return res;
0879 }
0880 
0881 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 100)
0882 ButtonCode warningYesNoCancelList(QWidget *parent,
0883                                   const QString &text,
0884                                   const QStringList &strlist,
0885                                   const QString &title,
0886                                   const KGuiItem &buttonYes,
0887                                   const KGuiItem &buttonNo,
0888                                   const KGuiItem &buttonCancel,
0889                                   const QString &dontAskAgainName,
0890                                   Options options)
0891 {
0892     return warningTwoActionsCancelListInternal(new QDialog(parent), text, strlist, title, buttonYes, buttonNo, buttonCancel, dontAskAgainName, options);
0893 }
0894 #endif
0895 
0896 ButtonCode warningTwoActionsCancelList(QWidget *parent,
0897                                        const QString &text,
0898                                        const QStringList &strlist,
0899                                        const QString &title,
0900                                        const KGuiItem &primaryAction,
0901                                        const KGuiItem &secondaryAction,
0902                                        const KGuiItem &cancelAction,
0903                                        const QString &dontAskAgainName,
0904                                        Options options)
0905 {
0906     return warningTwoActionsCancelListInternal(new QDialog(parent),
0907                                                text,
0908                                                strlist,
0909                                                title,
0910                                                primaryAction,
0911                                                secondaryAction,
0912                                                cancelAction,
0913                                                dontAskAgainName,
0914                                                options);
0915 }
0916 
0917 /// @private Prevent kapidox's doxygen config pick up this namespace method
0918 static void errorInternal(QDialog *dialog, const QString &text, const QString &title, const KGuiItem &buttonOk, Options options)
0919 {
0920     dialog->setWindowTitle(title.isEmpty() ? QApplication::translate("KMessageBox", "Error") : title);
0921     dialog->setObjectName(QStringLiteral("error"));
0922 
0923     QDialogButtonBox *buttonBox = new QDialogButtonBox(dialog);
0924     buttonBox->setStandardButtons(QDialogButtonBox::Ok);
0925     KGuiItem::assign(buttonBox->button(QDialogButtonBox::Ok), buttonOk);
0926 
0927     applyOptions(dialog, options);
0928 
0929     createKMessageBox(dialog, buttonBox, QMessageBox::Critical, text, QStringList(), QString(), nullptr, options);
0930 }
0931 
0932 void error(QWidget *parent, const QString &text, const QString &title, Options options)
0933 {
0934     errorInternal(new QDialog(parent), text, title, KStandardGuiItem::ok(), options);
0935 }
0936 
0937 void error(QWidget *parent, const QString &text, const QString &title, const KGuiItem &buttonOk, Options options)
0938 {
0939     errorInternal(new QDialog(parent), text, title, buttonOk, options);
0940 }
0941 
0942 /// @private Prevent kapidox's doxygen config pick up this namespace method
0943 static void errorListInternal(QDialog *dialog, const QString &text, const QStringList &strlist, const QString &title, Options options)
0944 {
0945     dialog->setWindowTitle(title.isEmpty() ? QApplication::translate("KMessageBox", "Error") : title);
0946     dialog->setObjectName(QStringLiteral("error"));
0947 
0948     QDialogButtonBox *buttonBox = new QDialogButtonBox(dialog);
0949     buttonBox->setStandardButtons(QDialogButtonBox::Ok);
0950 
0951     applyOptions(dialog, options);
0952 
0953     createKMessageBox(dialog, buttonBox, QMessageBox::Critical, text, strlist, QString(), nullptr, options);
0954 }
0955 
0956 void errorList(QWidget *parent, const QString &text, const QStringList &strlist, const QString &title, Options options)
0957 {
0958     errorListInternal(new QDialog(parent), text, strlist, title, options);
0959 }
0960 
0961 /// @private Prevent kapidox's doxygen config pick up this namespace method
0962 static void detailedErrorInternal(QDialog *dialog, const QString &text, const QString &details, const QString &title, const KGuiItem &buttonOk, Options options)
0963 {
0964     dialog->setWindowTitle(title.isEmpty() ? QApplication::translate("KMessageBox", "Error") : title);
0965     dialog->setObjectName(QStringLiteral("error"));
0966 
0967     QDialogButtonBox *buttonBox = new QDialogButtonBox(dialog);
0968     buttonBox->addButton(QDialogButtonBox::Ok);
0969     KGuiItem::assign(buttonBox->button(QDialogButtonBox::Ok), buttonOk);
0970     buttonBox->button(QDialogButtonBox::Ok)->setFocus();
0971 
0972     applyOptions(dialog, options);
0973 
0974     createKMessageBox(dialog, buttonBox, QMessageBox::Critical, text, QStringList(), QString(), nullptr, options, details);
0975 }
0976 
0977 void detailedError(QWidget *parent, const QString &text, const QString &details, const QString &title, Options options)
0978 {
0979     detailedErrorInternal(new QDialog(parent), text, details, title, KStandardGuiItem::ok(), options);
0980 }
0981 
0982 void detailedError(QWidget *parent, const QString &text, const QString &details, const QString &title, const KGuiItem &buttonOk, Options options)
0983 {
0984     detailedErrorInternal(new QDialog(parent), text, details, title, buttonOk, options);
0985 }
0986 
0987 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 97)
0988 /// @private Prevent kapidox's doxygen config pick up this namespace method
0989 static void sorryInternal(QDialog *dialog, const QString &text, const QString &title, const KGuiItem &buttonOk, Options options)
0990 {
0991     dialog->setWindowTitle(title.isEmpty() ? QApplication::translate("KMessageBox", "Sorry") : title);
0992     dialog->setObjectName(QStringLiteral("sorry"));
0993 
0994     QDialogButtonBox *buttonBox = new QDialogButtonBox(dialog);
0995     buttonBox->setStandardButtons(QDialogButtonBox::Ok);
0996     KGuiItem::assign(buttonBox->button(QDialogButtonBox::Ok), buttonOk);
0997 
0998     applyOptions(dialog, options);
0999 
1000     createKMessageBox(dialog, buttonBox, QMessageBox::Warning, text, QStringList(), QString(), nullptr, options);
1001 }
1002 #endif
1003 
1004 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 97)
1005 void sorry(QWidget *parent, const QString &text, const QString &title, Options options)
1006 {
1007     sorryInternal(new QDialog(parent), text, title, KStandardGuiItem::ok(), options);
1008 }
1009 #endif
1010 
1011 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 97)
1012 void sorry(QWidget *parent, const QString &text, const QString &title, const KGuiItem &item, Options options)
1013 {
1014     sorryInternal(new QDialog(parent), text, title, item, options);
1015 }
1016 #endif
1017 
1018 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 97)
1019 /// @private Prevent kapidox's doxygen config pick up this namespace method
1020 static void detailedSorryInternal(QDialog *dialog, const QString &text, const QString &details, const QString &title, const KGuiItem &buttonOk, Options options)
1021 {
1022     dialog->setWindowTitle(title.isEmpty() ? QApplication::translate("KMessageBox", "Sorry") : title);
1023     dialog->setObjectName(QStringLiteral("sorry"));
1024 
1025     QDialogButtonBox *buttonBox = new QDialogButtonBox(dialog);
1026     buttonBox->addButton(QDialogButtonBox::Ok);
1027     buttonBox->button(QDialogButtonBox::Ok)->setFocus();
1028     KGuiItem::assign(buttonBox->button(QDialogButtonBox::Ok), buttonOk);
1029 
1030     applyOptions(dialog, options);
1031 
1032     createKMessageBox(dialog, buttonBox, QMessageBox::Warning, text, QStringList(), QString(), nullptr, options, details);
1033 }
1034 #endif
1035 
1036 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 97)
1037 void detailedSorry(QWidget *parent, const QString &text, const QString &details, const QString &title, Options options)
1038 {
1039     detailedSorryInternal(new QDialog(parent), text, details, title, KStandardGuiItem::ok(), options);
1040 }
1041 #endif
1042 
1043 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 97)
1044 void detailedSorry(QWidget *parent, const QString &text, const QString &details, const QString &title, const KGuiItem &buttonOk, Options options)
1045 {
1046     detailedSorryInternal(new QDialog(parent), text, details, title, buttonOk, options);
1047 }
1048 #endif
1049 
1050 void information(QWidget *parent, const QString &text, const QString &title, const QString &dontShowAgainName, Options options)
1051 {
1052     informationList(parent, text, QStringList(), title, dontShowAgainName, options);
1053 }
1054 
1055 /// @private Prevent kapidox's doxygen config pick up this namespace method
1056 static void informationListInternal(QDialog *dialog,
1057                                     const QString &text,
1058                                     const QStringList &strlist,
1059                                     const QString &title,
1060                                     const QString &dontShowAgainName,
1061                                     Options options)
1062 {
1063     if (!shouldBeShownContinue(dontShowAgainName)) {
1064         delete dialog;
1065         return;
1066     }
1067 
1068     dialog->setWindowTitle(title.isEmpty() ? QApplication::translate("KMessageBox", "Information") : title);
1069     dialog->setObjectName(QStringLiteral("information"));
1070 
1071     QDialogButtonBox *buttonBox = new QDialogButtonBox(dialog);
1072     buttonBox->setStandardButtons(QDialogButtonBox::Ok);
1073 
1074     applyOptions(dialog, options);
1075 
1076     bool checkboxResult = false;
1077 
1078     createKMessageBox(dialog,
1079                       buttonBox,
1080                       QMessageBox::Information,
1081                       text,
1082                       strlist,
1083                       dontShowAgainName.isEmpty() ? QString() : QApplication::translate("KMessageBox", "Do not show this message again"),
1084                       &checkboxResult,
1085                       options);
1086 
1087     if (checkboxResult) {
1088         saveDontShowAgainContinue(dontShowAgainName);
1089     }
1090 }
1091 
1092 void informationList(QWidget *parent, const QString &text, const QStringList &strlist, const QString &title, const QString &dontShowAgainName, Options options)
1093 {
1094     informationListInternal(new QDialog(parent), text, strlist, title, dontShowAgainName, options);
1095 }
1096 
1097 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 97)
1098 void about(QWidget *parent, const QString &text, const QString &title, Options options)
1099 {
1100     QDialog *dialog = new QDialog(parent, Qt::Dialog);
1101     if (!title.isEmpty()) {
1102         dialog->setWindowTitle(title);
1103     }
1104     dialog->setObjectName(QStringLiteral("about"));
1105 
1106     QDialogButtonBox *buttonBox = new QDialogButtonBox(dialog);
1107     buttonBox->setStandardButtons(QDialogButtonBox::Ok);
1108 
1109     applyOptions(dialog, options);
1110 
1111     if (qApp->windowIcon().isNull()) {
1112         QPixmap ret = QMessageBox::standardIcon(QMessageBox::Information);
1113         dialog->setWindowIcon(ret);
1114     }
1115 
1116     createKMessageBox(dialog, buttonBox, qApp->windowIcon(), text, QStringList(), QString(), nullptr, options);
1117 }
1118 #endif
1119 
1120 /// @private Prevent kapidox's doxygen config pick up this namespace method
1121 static ButtonCode messageBoxInternal(QDialog *dialog,
1122                                      DialogType type,
1123                                      const QString &text,
1124                                      const QString &title,
1125                                      const KGuiItem &primaryAction,
1126                                      const KGuiItem &secondaryAction,
1127                                      const KGuiItem &cancelAction,
1128                                      const QString &dontShow,
1129                                      Options options)
1130 {
1131     switch (type) {
1132     case QuestionTwoActions:
1133         return questionTwoActionsListInternal(dialog, text, QStringList(), title, primaryAction, secondaryAction, dontShow, options);
1134     case QuestionTwoActionsCancel:
1135         return questionTwoActionsCancelInternal(dialog, text, title, primaryAction, secondaryAction, cancelAction, dontShow, options);
1136     case WarningTwoActions:
1137         return warningTwoActionsListInternal(dialog, text, QStringList(), title, primaryAction, secondaryAction, dontShow, options);
1138     case WarningContinueCancel:
1139         return warningContinueCancelListInternal(dialog,
1140                                                  text,
1141                                                  QStringList(),
1142                                                  title,
1143                                                  KGuiItem(primaryAction.text()),
1144                                                  cancelAction,
1145                                                  dontShow,
1146                                                  options,
1147                                                  QString());
1148     case WarningTwoActionsCancel:
1149         return warningTwoActionsCancelListInternal(dialog, text, QStringList(), title, primaryAction, secondaryAction, cancelAction, dontShow, options);
1150     case Information:
1151         informationListInternal(dialog, text, QStringList(), title, dontShow, options);
1152         return KMessageBox::Ok;
1153 
1154     case Error:
1155         errorListInternal(dialog, text, QStringList(), title, options);
1156         return KMessageBox::Ok;
1157 
1158 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 97)
1159     case Sorry:
1160         sorryInternal(dialog, text, title, KStandardGuiItem::ok(), options);
1161         return KMessageBox::Ok;
1162 #endif
1163     }
1164     return KMessageBox::Cancel;
1165 }
1166 
1167 ButtonCode messageBox(QWidget *parent,
1168                       DialogType type,
1169                       const QString &text,
1170                       const QString &title,
1171                       const KGuiItem &primaryAction,
1172                       const KGuiItem &secondaryAction,
1173                       const KGuiItem &buttonCancel,
1174                       const QString &dontShow,
1175                       Options options)
1176 {
1177     return messageBoxInternal(new QDialog(parent), type, text, title, primaryAction, secondaryAction, buttonCancel, dontShow, options);
1178 }
1179 
1180 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 100)
1181 ButtonCode questionYesNoWId(WId parent_id,
1182                             const QString &text,
1183                             const QString &title,
1184                             const KGuiItem &buttonYes,
1185                             const KGuiItem &buttonNo,
1186                             const QString &dontAskAgainName,
1187                             Options options)
1188 {
1189     return questionYesNoListWId(parent_id, text, QStringList(), title, buttonYes, buttonNo, dontAskAgainName, options);
1190 }
1191 #endif
1192 
1193 ButtonCode questionTwoActionsWId(WId parent_id,
1194                                  const QString &text,
1195                                  const QString &title,
1196                                  const KGuiItem &primaryAction,
1197                                  const KGuiItem &secondaryAction,
1198                                  const QString &dontAskAgainName,
1199                                  Options options)
1200 {
1201     return questionTwoActionsListWId(parent_id, text, QStringList(), title, primaryAction, secondaryAction, dontAskAgainName, options);
1202 }
1203 
1204 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 100)
1205 ButtonCode questionYesNoListWId(WId parent_id,
1206                                 const QString &text,
1207                                 const QStringList &strlist,
1208                                 const QString &title,
1209                                 const KGuiItem &buttonYes,
1210                                 const KGuiItem &buttonNo,
1211                                 const QString &dontAskAgainName,
1212                                 Options options)
1213 {
1214     return questionTwoActionsListInternal(createWIdDialog(parent_id), text, strlist, title, buttonYes, buttonNo, dontAskAgainName, options);
1215 }
1216 #endif
1217 
1218 ButtonCode questionTwoActionsListWId(WId parent_id,
1219                                      const QString &text,
1220                                      const QStringList &strlist,
1221                                      const QString &title,
1222                                      const KGuiItem &primaryAction,
1223                                      const KGuiItem &secondaryAction,
1224                                      const QString &dontAskAgainName,
1225                                      Options options)
1226 {
1227     return questionTwoActionsListInternal(createWIdDialog(parent_id), text, strlist, title, primaryAction, secondaryAction, dontAskAgainName, options);
1228 }
1229 
1230 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 100)
1231 ButtonCode questionYesNoCancelWId(WId parent_id,
1232                                   const QString &text,
1233                                   const QString &title,
1234                                   const KGuiItem &buttonYes,
1235                                   const KGuiItem &buttonNo,
1236                                   const KGuiItem &buttonCancel,
1237                                   const QString &dontAskAgainName,
1238                                   Options options)
1239 {
1240     return questionTwoActionsCancelInternal(createWIdDialog(parent_id), text, title, buttonYes, buttonNo, buttonCancel, dontAskAgainName, options);
1241 }
1242 #endif
1243 
1244 ButtonCode questionTwoActionsCancelWId(WId parent_id,
1245                                        const QString &text,
1246                                        const QString &title,
1247                                        const KGuiItem &primaryAction,
1248                                        const KGuiItem &secondaryAction,
1249                                        const KGuiItem &cancelAction,
1250                                        const QString &dontAskAgainName,
1251                                        Options options)
1252 {
1253     return questionTwoActionsCancelInternal(createWIdDialog(parent_id), text, title, primaryAction, secondaryAction, cancelAction, dontAskAgainName, options);
1254 }
1255 
1256 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 100)
1257 ButtonCode warningYesNoWId(WId parent_id,
1258                            const QString &text,
1259                            const QString &title,
1260                            const KGuiItem &buttonYes,
1261                            const KGuiItem &buttonNo,
1262                            const QString &dontAskAgainName,
1263                            Options options)
1264 {
1265     return warningYesNoListWId(parent_id, text, QStringList(), title, buttonYes, buttonNo, dontAskAgainName, options);
1266 }
1267 #endif
1268 
1269 ButtonCode warningTwoActionsWId(WId parent_id,
1270                                 const QString &text,
1271                                 const QString &title,
1272                                 const KGuiItem &primaryAction,
1273                                 const KGuiItem &secondaryAction,
1274                                 const QString &dontAskAgainName,
1275                                 Options options)
1276 {
1277     return warningTwoActionsListWId(parent_id, text, QStringList(), title, primaryAction, secondaryAction, dontAskAgainName, options);
1278 }
1279 
1280 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 100)
1281 ButtonCode warningYesNoListWId(WId parent_id,
1282                                const QString &text,
1283                                const QStringList &strlist,
1284                                const QString &title,
1285                                const KGuiItem &buttonYes,
1286                                const KGuiItem &buttonNo,
1287                                const QString &dontAskAgainName,
1288                                Options options)
1289 {
1290     return warningTwoActionsListInternal(createWIdDialog(parent_id), text, strlist, title, buttonYes, buttonNo, dontAskAgainName, options);
1291 }
1292 #endif
1293 
1294 ButtonCode warningTwoActionsListWId(WId parent_id,
1295                                     const QString &text,
1296                                     const QStringList &strlist,
1297                                     const QString &title,
1298                                     const KGuiItem &primaryAction,
1299                                     const KGuiItem &secondaryAction,
1300                                     const QString &dontAskAgainName,
1301                                     Options options)
1302 {
1303     return warningTwoActionsListInternal(createWIdDialog(parent_id), text, strlist, title, primaryAction, secondaryAction, dontAskAgainName, options);
1304 }
1305 
1306 ButtonCode warningContinueCancelWId(WId parent_id,
1307                                     const QString &text,
1308                                     const QString &title,
1309                                     const KGuiItem &buttonContinue,
1310                                     const KGuiItem &buttonCancel,
1311                                     const QString &dontAskAgainName,
1312                                     Options options)
1313 {
1314     return warningContinueCancelListWId(parent_id, text, QStringList(), title, buttonContinue, buttonCancel, dontAskAgainName, options);
1315 }
1316 
1317 ButtonCode warningContinueCancelListWId(WId parent_id,
1318                                         const QString &text,
1319                                         const QStringList &strlist,
1320                                         const QString &title,
1321                                         const KGuiItem &buttonContinue,
1322                                         const KGuiItem &buttonCancel,
1323                                         const QString &dontAskAgainName,
1324                                         Options options)
1325 {
1326     return warningContinueCancelListInternal(createWIdDialog(parent_id),
1327                                              text,
1328                                              strlist,
1329                                              title,
1330                                              buttonContinue,
1331                                              buttonCancel,
1332                                              dontAskAgainName,
1333                                              options,
1334                                              QString());
1335 }
1336 
1337 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 100)
1338 ButtonCode warningYesNoCancelWId(WId parent_id,
1339                                  const QString &text,
1340                                  const QString &title,
1341                                  const KGuiItem &buttonYes,
1342                                  const KGuiItem &buttonNo,
1343                                  const KGuiItem &buttonCancel,
1344                                  const QString &dontAskAgainName,
1345                                  Options options)
1346 {
1347     return warningYesNoCancelListWId(parent_id, text, QStringList(), title, buttonYes, buttonNo, buttonCancel, dontAskAgainName, options);
1348 }
1349 #endif
1350 
1351 ButtonCode warningTwoActionsCancelWId(WId parent_id,
1352                                       const QString &text,
1353                                       const QString &title,
1354                                       const KGuiItem &primaryAction,
1355                                       const KGuiItem &secondaryAction,
1356                                       const KGuiItem &buttonCancel,
1357                                       const QString &dontAskAgainName,
1358                                       Options options)
1359 {
1360     return warningTwoActionsCancelListWId(parent_id, text, QStringList(), title, primaryAction, secondaryAction, buttonCancel, dontAskAgainName, options);
1361 }
1362 
1363 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 100)
1364 ButtonCode warningYesNoCancelListWId(WId parent_id,
1365                                      const QString &text,
1366                                      const QStringList &strlist,
1367                                      const QString &title,
1368                                      const KGuiItem &buttonYes,
1369                                      const KGuiItem &buttonNo,
1370                                      const KGuiItem &buttonCancel,
1371                                      const QString &dontAskAgainName,
1372                                      Options options)
1373 {
1374     return warningYesNoCancelList(createWIdDialog(parent_id), text, strlist, title, buttonYes, buttonNo, buttonCancel, dontAskAgainName, options);
1375 }
1376 #endif
1377 
1378 ButtonCode warningTwoActionsCancelListWId(WId parent_id,
1379                                           const QString &text,
1380                                           const QStringList &strlist,
1381                                           const QString &title,
1382                                           const KGuiItem &primaryAction,
1383                                           const KGuiItem &secondaryAction,
1384                                           const KGuiItem &buttonCancel,
1385                                           const QString &dontAskAgainName,
1386                                           Options options)
1387 {
1388     return warningTwoActionsCancelList(createWIdDialog(parent_id),
1389                                        text,
1390                                        strlist,
1391                                        title,
1392                                        primaryAction,
1393                                        secondaryAction,
1394                                        buttonCancel,
1395                                        dontAskAgainName,
1396                                        options);
1397 }
1398 
1399 void errorWId(WId parent_id, const QString &text, const QString &title, Options options)
1400 {
1401     errorListWId(parent_id, text, QStringList(), title, options);
1402 }
1403 
1404 void errorListWId(WId parent_id, const QString &text, const QStringList &strlist, const QString &title, Options options)
1405 {
1406     errorListInternal(createWIdDialog(parent_id), text, strlist, title, options);
1407 }
1408 
1409 void detailedErrorWId(WId parent_id, const QString &text, const QString &details, const QString &title, Options options)
1410 {
1411     detailedErrorInternal(createWIdDialog(parent_id), text, details, title, KStandardGuiItem::ok(), options);
1412 }
1413 
1414 void detailedErrorWId(WId parent_id, const QString &text, const QString &details, const QString &title, const KGuiItem &buttonOk, Options options)
1415 {
1416     detailedErrorInternal(createWIdDialog(parent_id), text, details, title, buttonOk, options);
1417 }
1418 
1419 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 97)
1420 void sorryWId(WId parent_id, const QString &text, const QString &title, Options options)
1421 {
1422     QWidget *parent = QWidget::find(parent_id);
1423     QDialog *dialog = new QDialog(parent, Qt::Dialog);
1424     dialog->setWindowTitle(title.isEmpty() ? QApplication::translate("KMessageBox", "Sorry") : title);
1425     dialog->setObjectName(QStringLiteral("sorry"));
1426 
1427     QDialogButtonBox *buttonBox = new QDialogButtonBox(dialog);
1428     buttonBox->setStandardButtons(QDialogButtonBox::Ok);
1429 
1430     applyOptions(dialog, options);
1431     if (parent == nullptr && parent_id) {
1432         setMainWindow(dialog, parent_id);
1433     }
1434 
1435     createKMessageBox(dialog, buttonBox, QMessageBox::Warning, text, QStringList(), QString(), nullptr, options);
1436 }
1437 #endif
1438 
1439 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 97)
1440 void detailedSorryWId(WId parent_id, const QString &text, const QString &details, const QString &title, Options options)
1441 {
1442     detailedSorryInternal(createWIdDialog(parent_id), text, details, title, KStandardGuiItem::ok(), options);
1443 }
1444 #endif
1445 
1446 #if KWIDGETSADDONS_BUILD_DEPRECATED_SINCE(5, 97)
1447 void detailedSorryWId(WId parent_id, const QString &text, const QString &details, const QString &title, const KGuiItem &buttonOk, Options options)
1448 {
1449     detailedSorryInternal(createWIdDialog(parent_id), text, details, title, buttonOk, options);
1450 }
1451 #endif
1452 
1453 void informationWId(WId parent_id, const QString &text, const QString &title, const QString &dontShowAgainName, Options options)
1454 {
1455     informationListWId(parent_id, text, QStringList(), title, dontShowAgainName, options);
1456 }
1457 
1458 void informationListWId(WId parent_id, const QString &text, const QStringList &strlist, const QString &title, const QString &dontShowAgainName, Options options)
1459 {
1460     informationListInternal(createWIdDialog(parent_id), text, strlist, title, dontShowAgainName, options);
1461 }
1462 
1463 ButtonCode messageBoxWId(WId parent_id,
1464                          DialogType type,
1465                          const QString &text,
1466                          const QString &title,
1467                          const KGuiItem &primaryAction,
1468                          const KGuiItem &secondaryAction,
1469                          const KGuiItem &cancelAction,
1470                          const QString &dontShow,
1471                          Options options)
1472 {
1473     return messageBoxInternal(createWIdDialog(parent_id), type, text, title, primaryAction, secondaryAction, cancelAction, dontShow, options);
1474 }
1475 
1476 } // namespace
1477 
1478 #include "kmessagebox.moc"