X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcontrib%2Flibqxt-2007-10-24%2Fsrc%2Fgui%2Fqxtconfirmationmessage.cpp;fp=src%2Fcontrib%2Flibqxt-2007-10-24%2Fsrc%2Fgui%2Fqxtconfirmationmessage.cpp;h=e02b856f6b9081b242245cc47b52fc9f95eb0ef7;hp=0000000000000000000000000000000000000000;hb=a634acadbcf6017474f68a3eaf7cb632660e9e49;hpb=cd122ca8e0d2c0ffc5397e0a813c75d791a7e6e3 diff --git a/src/contrib/libqxt-2007-10-24/src/gui/qxtconfirmationmessage.cpp b/src/contrib/libqxt-2007-10-24/src/gui/qxtconfirmationmessage.cpp new file mode 100644 index 00000000..e02b856f --- /dev/null +++ b/src/contrib/libqxt-2007-10-24/src/gui/qxtconfirmationmessage.cpp @@ -0,0 +1,336 @@ +/**************************************************************************** +** +** Copyright (C) Qxt Foundation. Some rights reserved. +** +** This file is part of the QxtGui module of the Qt eXTension library +** +** This library is free software; you can redistribute it and/or modify it +** under the terms of th Common Public License, version 1.0, as published by +** IBM. +** +** This file is provided "AS IS", without WARRANTIES OR CONDITIONS OF ANY +** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY +** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR +** FITNESS FOR A PARTICULAR PURPOSE. +** +** You should have received a copy of the CPL along with this file. +** See the LICENSE file and the cpl1.0.txt file included with the source +** distribution for more information. If you did not receive a copy of the +** license, contact the Qxt Foundation. +** +** +** +****************************************************************************/ +#include "qxtconfirmationmessage.h" + +#include +#if QT_VERSION >= 0x040200 +#include +#endif // QT_VERSION +#include +#include +#include + +static const QLatin1String DEFAULT_ORGANIZATION("QxtGui"); +static const QLatin1String DEFAULT_APPLICATION("QxtConfirmationMessage"); + +class QxtConfirmationMessagePrivate : public QxtPrivate +{ +public: + QXT_DECLARE_PUBLIC(QxtConfirmationMessage); + void init(const QString& message = QString()); + QString key() const; + static QString key(const QString& title, const QString& text, const QString& informativeText = QString()); + int showAgain(); + void doNotShowAgain(int result); + static void reset(const QString& title, const QString& text, const QString& informativeText); + + QCheckBox* confirm; + static QString path; + static QSettings::Scope scope; +}; + +QString QxtConfirmationMessagePrivate::path; +QSettings::Scope QxtConfirmationMessagePrivate::scope = QSettings::UserScope; + +void QxtConfirmationMessagePrivate::init(const QString& message) +{ +#if QT_VERSION >= 0x040200 + confirm = new QCheckBox(&qxt_p()); + if (!message.isNull()) + confirm->setText(message); + else + confirm->setText(QxtConfirmationMessage::tr("Do not show again.")); + + QGridLayout* grid = qobject_cast(qxt_p().layout()); + QDialogButtonBox* buttons = qFindChild(&qxt_p()); + if (grid && buttons) + { + const int idx = grid->indexOf(buttons); + int row, column, rowSpan, columnSpan = 0; + grid->getItemPosition(idx, &row, &column, &rowSpan, &columnSpan); + QLayoutItem* buttonsItem = grid->takeAt(idx); + grid->addWidget(confirm, row, column, rowSpan, columnSpan, Qt::AlignLeft | Qt::AlignTop); + grid->addItem(buttonsItem, ++row, column, rowSpan, columnSpan); + } +#endif // QT_VERSION +} + +QString QxtConfirmationMessagePrivate::key() const +{ +#if QT_VERSION >= 0x040200 + return key(qxt_p().windowTitle(), qxt_p().text(), qxt_p().informativeText()); +#else + return key(qxt_p().windowTitle(), qxt_p().text()); +#endif // QT_VERSION +} + +QString QxtConfirmationMessagePrivate::key(const QString& title, const QString& text, const QString& informativeText) +{ + const QString all = title + text + informativeText; + const QByteArray data = all.toLocal8Bit(); + return QString::number(qChecksum(data.constData(), data.length())); +} + +int QxtConfirmationMessagePrivate::showAgain() +{ + QString organization = QCoreApplication::organizationName(); + QString application = QCoreApplication::applicationName(); + if (organization.isEmpty()) + organization = DEFAULT_ORGANIZATION; + if (application.isEmpty()) + application = DEFAULT_APPLICATION; + QSettings settings(scope, organization, application); + if (!path.isEmpty()) + settings.beginGroup(path); + return settings.value(key(), -1).toInt(); +} + +void QxtConfirmationMessagePrivate::doNotShowAgain(int result) +{ + QString organization = QCoreApplication::organizationName(); + QString application = QCoreApplication::applicationName(); + if (organization.isEmpty()) + organization = DEFAULT_ORGANIZATION; + if (application.isEmpty()) + application = DEFAULT_APPLICATION; + QSettings settings(scope, organization, application); + if (!path.isEmpty()) + settings.beginGroup(path); + settings.setValue(key(), result); +} + +void QxtConfirmationMessagePrivate::reset(const QString& title, const QString& text, const QString& informativeText) +{ + QString organization = QCoreApplication::organizationName(); + QString application = QCoreApplication::applicationName(); + if (organization.isEmpty()) + organization = DEFAULT_ORGANIZATION; + if (application.isEmpty()) + application = DEFAULT_APPLICATION; + QSettings settings(scope, organization, application); + if (!path.isEmpty()) + settings.beginGroup(path); + settings.remove(key(title, text, informativeText)); +} + +/*! + \class QxtConfirmationMessage QxtConfirmationMessage + \ingroup QxtGui + \brief A confirmation message. + + QxtConfirmationMessage is a confirmation message with checkable + "Do not show again." option. A checked and accepted confirmation + message is no more shown until reseted. + + Example usage: + \code + void MainWindow::closeEvent(QCloseEvent* event) + { + static const QString text(tr("Are you sure you want to quit?")); + if (QxtConfirmationMessage::confirm(this, tr("Confirm"), text) == QMessageBox::No) + event->ignore(); + } + \endcode + + \image html qxtconfirmationmessage.png "QxtConfirmationMessage in action." + + \note \b QCoreApplication::organizationName and \b QCoreApplication::applicationName + are used for storing settings. In case these properties are empty, \b "QxtGui" and + \b "QxtConfirmationMessage" are used, respectively. + + \note Requires Qt 4.2 or newer. + */ + +/*! + Constructs a new QxtConfirmationMessage with \a parent. + */ +QxtConfirmationMessage::QxtConfirmationMessage(QWidget* parent) + : QMessageBox(parent) +{ + QXT_INIT_PRIVATE(QxtConfirmationMessage); + qxt_d().init(); +} + +/*! + Constructs a new QxtConfirmationMessage with \a icon, \a title, \a text, \a confirmation, \a buttons, \a parent and \a flags. + */ +#if QT_VERSION >= 0x040200 +QxtConfirmationMessage::QxtConfirmationMessage(QMessageBox::Icon icon, const QString& title, const QString& text, const QString& confirmation, + QMessageBox::StandardButtons buttons, QWidget* parent, Qt::WindowFlags flags) + : QMessageBox(icon, title, text, buttons, parent, flags) +{ + QXT_INIT_PRIVATE(QxtConfirmationMessage); + qxt_d().init(confirmation); +} +#endif // QT_VERSION + +/*! + Destructs the confirmation message. + */ +QxtConfirmationMessage::~QxtConfirmationMessage() +{} + +// QMessageBox::StandardButton showNewMessageBox() (qmessagebox.cpp) +#if QT_VERSION >= 0x040200 +QMessageBox::StandardButton QxtConfirmationMessage::confirm(QWidget* parent, + const QString& title, const QString& text, const QString& confirmation, + QMessageBox::StandardButtons buttons, QMessageBox::StandardButton defaultButton) +{ + QxtConfirmationMessage msgBox(QMessageBox::NoIcon, title, text, confirmation, QMessageBox::NoButton, parent); + QDialogButtonBox* buttonBox = qFindChild(&msgBox); + Q_ASSERT(buttonBox != 0); + + uint mask = QMessageBox::FirstButton; + while (mask <= QMessageBox::LastButton) + { + uint sb = buttons & mask; + mask <<= 1; + if (!sb) + continue; + QPushButton* button = msgBox.addButton((QMessageBox::StandardButton)sb); + // Choose the first accept role as the default + if (msgBox.defaultButton()) + continue; + if ((defaultButton == QMessageBox::NoButton && buttonBox->buttonRole(button) == QDialogButtonBox::AcceptRole) + || (defaultButton != QMessageBox::NoButton && sb == uint(defaultButton))) + msgBox.setDefaultButton(button); + } + if (msgBox.exec() == -1) + return QMessageBox::Cancel; + return msgBox.standardButton(msgBox.clickedButton()); +} +#endif // QT_VERSION + +/*! + \property QxtConfirmationMessage::confirmationText + \brief This property holds the confirmation text + + The default value is "Do not show again." + */ +QString QxtConfirmationMessage::confirmationText() const +{ + return qxt_d().confirm->text(); +} + +void QxtConfirmationMessage::setConfirmationText(const QString& confirmation) +{ + qxt_d().confirm->setText(confirmation); +} + +/*! + \return The scope used for storing settings. + + The default value is \b QSettings::UserScope. + */ +QSettings::Scope QxtConfirmationMessage::settingsScope() +{ + return QxtConfirmationMessagePrivate::scope; +} + +/*! + Sets the scope used for storing settings. + */ +void QxtConfirmationMessage::setSettingsScope(QSettings::Scope scope) +{ + QxtConfirmationMessagePrivate::scope = scope; +} + +/*! + \return The path used for storing settings. + + The default value is an empty string. + */ +QString QxtConfirmationMessage::settingsPath() +{ + return QxtConfirmationMessagePrivate::path; +} + +/*! + Sets the path used for storing settings. + */ +void QxtConfirmationMessage::setSettingsPath(const QString& path) +{ + QxtConfirmationMessagePrivate::path = path; +} + +/*! + Shows the confirmation message if necessary. The confirmation message is not + shown in case "Do not show again." has been checked while the same + confirmation message was earlierly accepted. + + A confirmation message is identified by the combination of title, + \b QMessageBox::text and optional \b QMessageBox::informativeText. + + A clicked button with role \b QDialogButtonBox::AcceptRole or + \b QDialogButtonBox::YesRole is considered as "accepted". + + \warning This function does not reimplement but shadows \b QMessageBox::exec(). + + \sa QWidget::windowTitle, QMessageBox::text, QMessageBox::informativeText + */ +int QxtConfirmationMessage::exec() +{ + int res = qxt_d().showAgain(); + if (res == -1) + res = QMessageBox::exec(); + return res; +} + +void QxtConfirmationMessage::done(int result) +{ +#if QT_VERSION >= 0x040200 + QDialogButtonBox* buttons = qFindChild(this); + Q_ASSERT(buttons != 0); + + int role = buttons->buttonRole(clickedButton()); + if (qxt_d().confirm->isChecked() && + (role == QDialogButtonBox::AcceptRole || role == QDialogButtonBox::YesRole)) + { + qxt_d().doNotShowAgain(result); + } +#endif // QT_VERSION + QMessageBox::done(result); +} + +/*! + Resets confirmation message with given \a title, \a text and optional + \a informativeText. A reseted confirmation message is shown again until + user checks "Do not show again." and accepts the confirmation message. + */ +void QxtConfirmationMessage::reset(const QString& title, const QString& text, const QString& informativeText) +{ + QxtConfirmationMessagePrivate::reset(title, text, informativeText); +} + +/*! + Resets this instance of QxtConfirmationMessage. A reseted confirmation + message is shown again until user checks "Do not show again." and + accepts the confirmation message. + */ +void QxtConfirmationMessage::reset() +{ +#if QT_VERSION >= 0x040200 + QxtConfirmationMessagePrivate::reset(windowTitle(), text(), informativeText()); +#endif // QT_VERSION +}