summaryrefslogtreecommitdiffstats
path: root/src/gui/widgets/qdialogbuttonbox.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/widgets/qdialogbuttonbox.cpp')
-rw-r--r--src/gui/widgets/qdialogbuttonbox.cpp1285
1 files changed, 0 insertions, 1285 deletions
diff --git a/src/gui/widgets/qdialogbuttonbox.cpp b/src/gui/widgets/qdialogbuttonbox.cpp
deleted file mode 100644
index 6c29141d66..0000000000
--- a/src/gui/widgets/qdialogbuttonbox.cpp
+++ /dev/null
@@ -1,1285 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include <QtCore/qhash.h>
-#include <QtGui/qpushbutton.h>
-#include <QtGui/qstyle.h>
-#include <QtGui/qlayout.h>
-#include <QtGui/qdialog.h>
-#include <QtGui/qapplication.h>
-#include <QtGui/private/qwidget_p.h>
-#include <QtGui/qaction.h>
-
-#include "qdialogbuttonbox.h"
-
-#ifdef QT_SOFTKEYS_ENABLED
-#include <QtGui/qaction.h>
-#endif
-
-
-QT_BEGIN_NAMESPACE
-
-/*!
- \class QDialogButtonBox
- \since 4.2
- \brief The QDialogButtonBox class is a widget that presents buttons in a
- layout that is appropriate to the current widget style.
-
- \ingroup dialog-classes
-
-
- Dialogs and message boxes typically present buttons in a layout that
- conforms to the interface guidelines for that platform. Invariably,
- different platforms have different layouts for their dialogs.
- QDialogButtonBox allows a developer to add buttons to it and will
- automatically use the appropriate layout for the user's desktop
- environment.
-
- Most buttons for a dialog follow certain roles. Such roles include:
-
- \list
- \o Accepting or rejecting the dialog.
- \o Asking for help.
- \o Performing actions on the dialog itself (such as resetting fields or
- applying changes).
- \endlist
-
- There can also be alternate ways of dismissing the dialog which may cause
- destructive results.
-
- Most dialogs have buttons that can almost be considered standard (e.g.
- \gui OK and \gui Cancel buttons). It is sometimes convenient to create these
- buttons in a standard way.
-
- There are a couple ways of using QDialogButtonBox. One ways is to create
- the buttons (or button texts) yourself and add them to the button box,
- specifying their role.
-
- \snippet examples/dialogs/extension/finddialog.cpp 1
-
- Alternatively, QDialogButtonBox provides several standard buttons (e.g. OK, Cancel, Save)
- that you can use. They exist as flags so you can OR them together in the constructor.
-
- \snippet examples/dialogs/tabdialog/tabdialog.cpp 2
-
- You can mix and match normal buttons and standard buttons.
-
- Currently the buttons are laid out in the following way if the button box is horizontal:
- \table
- \row \o \inlineimage buttonbox-gnomelayout-horizontal.png GnomeLayout Horizontal
- \o Button box laid out in horizontal GnomeLayout
- \row \o \inlineimage buttonbox-kdelayout-horizontal.png KdeLayout Horizontal
- \o Button box laid out in horizontal KdeLayout
- \row \o \inlineimage buttonbox-maclayout-horizontal.png MacLayout Horizontal
- \o Button box laid out in horizontal MacLayout
- \row \o \inlineimage buttonbox-winlayout-horizontal.png WinLayout Horizontal
- \o Button box laid out in horizontal WinLayout
- \endtable
-
- The buttons are laid out the following way if the button box is vertical:
-
- \table
- \row \o GnomeLayout
- \o KdeLayout
- \o MacLayout
- \o WinLayout
- \row \o \inlineimage buttonbox-gnomelayout-vertical.png GnomeLayout Vertical
- \o \inlineimage buttonbox-kdelayout-vertical.png KdeLayout Vertical
- \o \inlineimage buttonbox-maclayout-vertical.png MacLayout Vertical
- \o \inlineimage buttonbox-winlayout-vertical.png WinLayout Vertical
- \endtable
-
- Additionally, button boxes that contain only buttons with ActionRole or
- HelpRole can be considered modeless and have an alternate look on Mac OS X:
-
- \table
- \row \o modeless horizontal MacLayout
- \o \inlineimage buttonbox-mac-modeless-horizontal.png Screenshot of modeless horizontal MacLayout
- \endtable
-
- When a button is clicked in the button box, the clicked() signal is emitted
- for the actual button is that is pressed. For convenience, if the button
- has an AcceptRole, RejectRole, or HelpRole, the accepted(), rejected(), or
- helpRequested() signals are emitted respectively.
-
- If you want a specific button to be default you need to call
- QPushButton::setDefault() on it yourself. However, if there is no default
- button set and to preserve which button is the default button across
- platforms when using the QPushButton::autoDefault property, the first push
- button with the accept role is made the default button when the
- QDialogButtonBox is shown,
-
- \sa QMessageBox, QPushButton, QDialog
-*/
-
-enum {
- AcceptRole = QDialogButtonBox::AcceptRole,
- RejectRole = QDialogButtonBox::RejectRole,
- DestructiveRole = QDialogButtonBox::DestructiveRole,
- ActionRole = QDialogButtonBox::ActionRole,
- HelpRole = QDialogButtonBox::HelpRole,
- YesRole = QDialogButtonBox::YesRole,
- NoRole = QDialogButtonBox::NoRole,
- ApplyRole = QDialogButtonBox::ApplyRole,
- ResetRole = QDialogButtonBox::ResetRole,
-
- AlternateRole = 0x10000000,
- Stretch = 0x20000000,
- EOL = 0x40000000,
- Reverse = 0x80000000
-};
-
-static QDialogButtonBox::ButtonRole roleFor(QDialogButtonBox::StandardButton button)
-{
- switch (button) {
- case QDialogButtonBox::Ok:
- case QDialogButtonBox::Save:
- case QDialogButtonBox::Open:
- case QDialogButtonBox::SaveAll:
- case QDialogButtonBox::Retry:
- case QDialogButtonBox::Ignore:
- return QDialogButtonBox::AcceptRole;
-
- case QDialogButtonBox::Cancel:
- case QDialogButtonBox::Close:
- case QDialogButtonBox::Abort:
- return QDialogButtonBox::RejectRole;
-
- case QDialogButtonBox::Discard:
- return QDialogButtonBox::DestructiveRole;
-
- case QDialogButtonBox::Help:
- return QDialogButtonBox::HelpRole;
-
- case QDialogButtonBox::Apply:
- return QDialogButtonBox::ApplyRole;
-
- case QDialogButtonBox::Yes:
- case QDialogButtonBox::YesToAll:
- return QDialogButtonBox::YesRole;
-
- case QDialogButtonBox::No:
- case QDialogButtonBox::NoToAll:
- return QDialogButtonBox::NoRole;
-
- case QDialogButtonBox::RestoreDefaults:
- case QDialogButtonBox::Reset:
- return QDialogButtonBox::ResetRole;
-
- case QDialogButtonBox::NoButton: // NoButton means zero buttons, not "No" button
- ;
- }
-
- return QDialogButtonBox::InvalidRole;
-}
-
-static const int layouts[2][5][14] =
-{
- // Qt::Horizontal
- {
- // WinLayout
- { ResetRole, Stretch, YesRole, AcceptRole, AlternateRole, DestructiveRole, NoRole, ActionRole, RejectRole, ApplyRole,
- HelpRole, EOL, EOL, EOL },
-
- // MacLayout
- { HelpRole, ResetRole, ApplyRole, ActionRole, Stretch, DestructiveRole | Reverse,
- AlternateRole | Reverse, RejectRole | Reverse, AcceptRole | Reverse, NoRole | Reverse, YesRole | Reverse, EOL, EOL },
-
- // KdeLayout
- { HelpRole, ResetRole, Stretch, YesRole, NoRole, ActionRole, AcceptRole, AlternateRole,
- ApplyRole, DestructiveRole, RejectRole, EOL },
-
- // GnomeLayout
- { HelpRole, ResetRole, Stretch, ActionRole, ApplyRole | Reverse, DestructiveRole | Reverse,
- AlternateRole | Reverse, RejectRole | Reverse, AcceptRole | Reverse, NoRole | Reverse, YesRole | Reverse, EOL },
-
- // Mac modeless
- { ResetRole, ApplyRole, ActionRole, Stretch, HelpRole, EOL, EOL, EOL, EOL, EOL, EOL, EOL, EOL, EOL }
- },
-
- // Qt::Vertical
- {
- // WinLayout
- { ActionRole, YesRole, AcceptRole, AlternateRole, DestructiveRole, NoRole, RejectRole, ApplyRole, ResetRole,
- HelpRole, Stretch, EOL, EOL, EOL },
-
- // MacLayout
- { YesRole, NoRole, AcceptRole, RejectRole, AlternateRole, DestructiveRole, Stretch, ActionRole, ApplyRole,
- ResetRole, HelpRole, EOL, EOL },
-
- // KdeLayout
- { AcceptRole, AlternateRole, ApplyRole, ActionRole, YesRole, NoRole, Stretch, ResetRole,
- DestructiveRole, RejectRole, HelpRole, EOL },
-
- // GnomeLayout
- { YesRole, NoRole, AcceptRole, RejectRole, AlternateRole, DestructiveRole, ApplyRole, ActionRole, Stretch,
- ResetRole, HelpRole, EOL, EOL, EOL },
-
- // Mac modeless
- { ActionRole, ApplyRole, ResetRole, Stretch, HelpRole, EOL, EOL, EOL, EOL, EOL, EOL, EOL, EOL, EOL }
- }
-};
-
-#if defined(QT_SOFTKEYS_ENABLED) && !defined(QT_NO_ACTION)
-class QDialogButtonEnabledProxy : public QObject
-{
-public:
- QDialogButtonEnabledProxy(QObject *parent, QWidget *src, QAction *trg) : QObject(parent), source(src), target(trg)
- {
- source->installEventFilter(this);
- target->setEnabled(source->isEnabled());
- }
- ~QDialogButtonEnabledProxy()
- {
- source->removeEventFilter(this);
- }
- bool eventFilter(QObject *object, QEvent *event)
- {
- if (object == source && event->type() == QEvent::EnabledChange) {
- target->setEnabled(source->isEnabled());
- }
- return false;
- };
-private:
- QWidget *source;
- QAction *target;
-};
-#endif
-
-class QDialogButtonBoxPrivate : public QWidgetPrivate
-{
- Q_DECLARE_PUBLIC(QDialogButtonBox)
-
-public:
- QDialogButtonBoxPrivate(Qt::Orientation orient);
-
- QList<QAbstractButton *> buttonLists[QDialogButtonBox::NRoles];
- QHash<QPushButton *, QDialogButtonBox::StandardButton> standardButtonHash;
-#ifdef QT_SOFTKEYS_ENABLED
- QHash<QAbstractButton *, QAction *> softKeyActions;
-#endif
-
- Qt::Orientation orientation;
- QDialogButtonBox::ButtonLayout layoutPolicy;
- QBoxLayout *buttonLayout;
- bool internalRemove;
- bool center;
-
- void createStandardButtons(QDialogButtonBox::StandardButtons buttons);
-
- void layoutButtons();
- void initLayout();
- void resetLayout();
- QPushButton *createButton(QDialogButtonBox::StandardButton button, bool doLayout = true);
- void addButton(QAbstractButton *button, QDialogButtonBox::ButtonRole role, bool doLayout = true);
- void _q_handleButtonDestroyed();
- void _q_handleButtonClicked();
- void addButtonsToLayout(const QList<QAbstractButton *> &buttonList, bool reverse);
- void retranslateStrings();
- const char *standardButtonText(QDialogButtonBox::StandardButton sbutton) const;
-#if defined(QT_SOFTKEYS_ENABLED) && !defined(QT_NO_ACTION)
- QAction *createSoftKey(QAbstractButton *button, QDialogButtonBox::ButtonRole role);
-#endif
-};
-
-QDialogButtonBoxPrivate::QDialogButtonBoxPrivate(Qt::Orientation orient)
- : orientation(orient), buttonLayout(0), internalRemove(false), center(false)
-{
-}
-
-void QDialogButtonBoxPrivate::initLayout()
-{
- Q_Q(QDialogButtonBox);
- layoutPolicy = QDialogButtonBox::ButtonLayout(q->style()->styleHint(QStyle::SH_DialogButtonLayout, 0, q));
- bool createNewLayout = buttonLayout == 0
- || (orientation == Qt::Horizontal && qobject_cast<QVBoxLayout *>(buttonLayout) != 0)
- || (orientation == Qt::Vertical && qobject_cast<QHBoxLayout *>(buttonLayout) != 0);
- if (createNewLayout) {
- delete buttonLayout;
- if (orientation == Qt::Horizontal)
- buttonLayout = new QHBoxLayout(q);
- else
- buttonLayout = new QVBoxLayout(q);
- }
-
- int left, top, right, bottom;
- setLayoutItemMargins(QStyle::SE_PushButtonLayoutItem);
- getLayoutItemMargins(&left, &top, &right, &bottom);
- buttonLayout->setContentsMargins(-left, -top, -right, -bottom);
-
- if (!q->testAttribute(Qt::WA_WState_OwnSizePolicy)) {
- QSizePolicy sp(QSizePolicy::Expanding, QSizePolicy::Fixed, QSizePolicy::ButtonBox);
- if (orientation == Qt::Vertical)
- sp.transpose();
- q->setSizePolicy(sp);
- q->setAttribute(Qt::WA_WState_OwnSizePolicy, false);
- }
-
- // ### move to a real init() function
- q->setFocusPolicy(Qt::TabFocus);
-}
-
-void QDialogButtonBoxPrivate::resetLayout()
-{
- //delete buttonLayout;
- initLayout();
- layoutButtons();
-}
-
-void QDialogButtonBoxPrivate::addButtonsToLayout(const QList<QAbstractButton *> &buttonList,
- bool reverse)
-{
- int start = reverse ? buttonList.count() - 1 : 0;
- int end = reverse ? -1 : buttonList.count();
- int step = reverse ? -1 : 1;
-
- for (int i = start; i != end; i += step) {
- QAbstractButton *button = buttonList.at(i);
- buttonLayout->addWidget(button);
- button->show();
- }
-}
-
-void QDialogButtonBoxPrivate::layoutButtons()
-{
- Q_Q(QDialogButtonBox);
- const int MacGap = 36 - 8; // 8 is the default gap between a widget and a spacer item
-
- for (int i = buttonLayout->count() - 1; i >= 0; --i) {
- QLayoutItem *item = buttonLayout->takeAt(i);
- if (QWidget *widget = item->widget())
- widget->hide();
- delete item;
- }
-
- int tmpPolicy = layoutPolicy;
-
- static const int M = 5;
- static const int ModalRoles[M] = { AcceptRole, RejectRole, DestructiveRole, YesRole, NoRole };
- if (tmpPolicy == QDialogButtonBox::MacLayout) {
- bool hasModalButton = false;
- for (int i = 0; i < M; ++i) {
- if (!buttonLists[ModalRoles[i]].isEmpty()) {
- hasModalButton = true;
- break;
- }
- }
- if (!hasModalButton)
- tmpPolicy = 4; // Mac modeless
- }
-
- const int *currentLayout = layouts[orientation == Qt::Vertical][tmpPolicy];
-
- if (center)
- buttonLayout->addStretch();
-
- QList<QAbstractButton *> acceptRoleList = buttonLists[AcceptRole];
-
- while (*currentLayout != EOL) {
- int role = (*currentLayout & ~Reverse);
- bool reverse = (*currentLayout & Reverse);
-
- switch (role) {
- case Stretch:
- if (!center)
- buttonLayout->addStretch();
- break;
- case AcceptRole: {
- if (acceptRoleList.isEmpty())
- break;
- // Only the first one
- QAbstractButton *button = acceptRoleList.first();
- buttonLayout->addWidget(button);
- button->show();
- }
- break;
- case AlternateRole:
- {
- if (acceptRoleList.size() < 2)
- break;
- QList<QAbstractButton *> list = acceptRoleList;
- list.removeFirst();
- addButtonsToLayout(list, reverse);
- }
- break;
- case DestructiveRole:
- {
- const QList<QAbstractButton *> &list = buttonLists[role];
-
- /*
- Mac: Insert a gap on the left of the destructive
- buttons to ensure that they don't get too close to
- the help and action buttons (but only if there are
- some buttons to the left of the destructive buttons
- (and the stretch, whence buttonLayout->count() > 1
- and not 0)).
- */
- if (tmpPolicy == QDialogButtonBox::MacLayout
- && !list.isEmpty() && buttonLayout->count() > 1)
- buttonLayout->addSpacing(MacGap);
-
- addButtonsToLayout(list, reverse);
-
- /*
- Insert a gap between the destructive buttons and the
- accept and reject buttons.
- */
- if (tmpPolicy == QDialogButtonBox::MacLayout && !list.isEmpty())
- buttonLayout->addSpacing(MacGap);
- }
- break;
- case RejectRole:
- case ActionRole:
- case HelpRole:
- case YesRole:
- case NoRole:
- case ApplyRole:
- case ResetRole:
- addButtonsToLayout(buttonLists[role], reverse);
- }
- ++currentLayout;
- }
-
- QWidget *lastWidget = 0;
- q->setFocusProxy(0);
- for (int i = 0; i < buttonLayout->count(); ++i) {
- QLayoutItem *item = buttonLayout->itemAt(i);
- if (QWidget *widget = item->widget()) {
- if (lastWidget)
- QWidget::setTabOrder(lastWidget, widget);
- else
- q->setFocusProxy(widget);
- lastWidget = widget;
- }
- }
-
- if (center)
- buttonLayout->addStretch();
-}
-
-QPushButton *QDialogButtonBoxPrivate::createButton(QDialogButtonBox::StandardButton sbutton,
- bool doLayout)
-{
- Q_Q(QDialogButtonBox);
- const char *buttonText = 0;
- int icon = 0;
-
- switch (sbutton) {
- case QDialogButtonBox::Ok:
- icon = QStyle::SP_DialogOkButton;
- break;
- case QDialogButtonBox::Save:
- icon = QStyle::SP_DialogSaveButton;
- break;
- case QDialogButtonBox::Open:
- icon = QStyle::SP_DialogOpenButton;
- break;
- case QDialogButtonBox::Cancel:
- icon = QStyle::SP_DialogCancelButton;
- break;
- case QDialogButtonBox::Close:
- icon = QStyle::SP_DialogCloseButton;
- break;
- case QDialogButtonBox::Apply:
- icon = QStyle::SP_DialogApplyButton;
- break;
- case QDialogButtonBox::Reset:
- icon = QStyle::SP_DialogResetButton;
- break;
- case QDialogButtonBox::Help:
- icon = QStyle::SP_DialogHelpButton;
- break;
- case QDialogButtonBox::Discard:
- icon = QStyle::SP_DialogDiscardButton;
- break;
- case QDialogButtonBox::Yes:
- icon = QStyle::SP_DialogYesButton;
- break;
- case QDialogButtonBox::No:
- icon = QStyle::SP_DialogNoButton;
- break;
- case QDialogButtonBox::YesToAll:
- case QDialogButtonBox::NoToAll:
- case QDialogButtonBox::SaveAll:
- case QDialogButtonBox::Abort:
- case QDialogButtonBox::Retry:
- case QDialogButtonBox::Ignore:
- case QDialogButtonBox::RestoreDefaults:
- break;
- case QDialogButtonBox::NoButton:
- return 0;
- ;
- }
- buttonText = standardButtonText(sbutton);
-
- QPushButton *button = new QPushButton(QDialogButtonBox::tr(buttonText), q);
- QStyle *style = q->style();
- if (style->styleHint(QStyle::SH_DialogButtonBox_ButtonsHaveIcons, 0, q) && icon != 0)
- button->setIcon(style->standardIcon(QStyle::StandardPixmap(icon), 0, q));
- if (style != QApplication::style()) // Propagate style
- button->setStyle(style);
- standardButtonHash.insert(button, sbutton);
- if (roleFor(sbutton) != QDialogButtonBox::InvalidRole) {
- addButton(button, roleFor(sbutton), doLayout);
- } else {
- qWarning("QDialogButtonBox::createButton: Invalid ButtonRole, button not added");
- }
-
-#ifdef Q_WS_MAC
- // Since mnemonics is off by default on Mac, we add a Cmd-D
- // shortcut here to e.g. make the "Don't Save" button work nativly:
- if (sbutton == QDialogButtonBox::Discard)
- button->setShortcut(QKeySequence(QLatin1String("Ctrl+D")));
-#endif
-
- return button;
-}
-
-void QDialogButtonBoxPrivate::addButton(QAbstractButton *button, QDialogButtonBox::ButtonRole role,
- bool doLayout)
-{
- Q_Q(QDialogButtonBox);
- QObject::connect(button, SIGNAL(clicked()), q, SLOT(_q_handleButtonClicked()));
- QObject::connect(button, SIGNAL(destroyed()), q, SLOT(_q_handleButtonDestroyed()));
- buttonLists[role].append(button);
-#if defined(QT_SOFTKEYS_ENABLED) && !defined(QT_NO_ACTION)
- QAction *action = createSoftKey(button, role);
- softKeyActions.insert(button, action);
- new QDialogButtonEnabledProxy(action, button, action);
-#endif
- if (doLayout)
- layoutButtons();
-}
-
-#if defined(QT_SOFTKEYS_ENABLED) && !defined(QT_NO_ACTION)
-QAction* QDialogButtonBoxPrivate::createSoftKey(QAbstractButton *button, QDialogButtonBox::ButtonRole role)
-{
- Q_Q(QDialogButtonBox);
- QAction::SoftKeyRole softkeyRole;
-
- QAction *action = new QAction(button->text(), button);
-
- switch (role) {
- case ApplyRole:
- case AcceptRole:
- case YesRole:
- case ActionRole:
- case HelpRole:
- softkeyRole = QAction::PositiveSoftKey;
- break;
- case RejectRole:
- case DestructiveRole:
- case NoRole:
- case ResetRole:
- softkeyRole = QAction::NegativeSoftKey;
- break;
- default:
- break;
- }
- QObject::connect(action, SIGNAL(triggered()), button, SIGNAL(clicked()));
- action->setSoftKeyRole(softkeyRole);
-
-
- QWidget *dialog = 0;
- QWidget *p = q;
- while (p && !p->isWindow()) {
- p = p->parentWidget();
- if ((dialog = qobject_cast<QDialog *>(p)))
- break;
- }
-
- if (dialog) {
- dialog->addAction(action);
- } else {
- q->addAction(action);
- }
-
- return action;
-}
-#endif
-
-void QDialogButtonBoxPrivate::createStandardButtons(QDialogButtonBox::StandardButtons buttons)
-{
- uint i = QDialogButtonBox::FirstButton;
- while (i <= QDialogButtonBox::LastButton) {
- if (i & buttons) {
- createButton(QDialogButtonBox::StandardButton(i), false);
- }
- i = i << 1;
- }
- layoutButtons();
-}
-
-const char *QDialogButtonBoxPrivate::standardButtonText(QDialogButtonBox::StandardButton sbutton) const
-{
- const char *buttonText = 0;
- bool gnomeLayout = (layoutPolicy == QDialogButtonBox::GnomeLayout);
- switch (sbutton) {
- case QDialogButtonBox::Ok:
- buttonText = gnomeLayout ? QT_TRANSLATE_NOOP("QDialogButtonBox", "&OK") : QT_TRANSLATE_NOOP("QDialogButtonBox", "OK");
- break;
- case QDialogButtonBox::Save:
- buttonText = gnomeLayout ? QT_TRANSLATE_NOOP("QDialogButtonBox", "&Save") : QT_TRANSLATE_NOOP("QDialogButtonBox", "Save");
- break;
- case QDialogButtonBox::Open:
- buttonText = QT_TRANSLATE_NOOP("QDialogButtonBox", "Open");
- break;
- case QDialogButtonBox::Cancel:
- buttonText = gnomeLayout ? QT_TRANSLATE_NOOP("QDialogButtonBox", "&Cancel") : QT_TRANSLATE_NOOP("QDialogButtonBox", "Cancel");
- break;
- case QDialogButtonBox::Close:
- buttonText = gnomeLayout ? QT_TRANSLATE_NOOP("QDialogButtonBox", "&Close") : QT_TRANSLATE_NOOP("QDialogButtonBox", "Close");
- break;
- case QDialogButtonBox::Apply:
- buttonText = QT_TRANSLATE_NOOP("QDialogButtonBox", "Apply");
- break;
- case QDialogButtonBox::Reset:
- buttonText = QT_TRANSLATE_NOOP("QDialogButtonBox", "Reset");
- break;
- case QDialogButtonBox::Help:
- buttonText = QT_TRANSLATE_NOOP("QDialogButtonBox", "Help");
- break;
- case QDialogButtonBox::Discard:
- if (layoutPolicy == QDialogButtonBox::MacLayout)
- buttonText = QT_TRANSLATE_NOOP("QDialogButtonBox", "Don't Save");
- else if (layoutPolicy == QDialogButtonBox::GnomeLayout)
- buttonText = QT_TRANSLATE_NOOP("QDialogButtonBox", "Close without Saving");
- else
- buttonText = QT_TRANSLATE_NOOP("QDialogButtonBox", "Discard");
- break;
- case QDialogButtonBox::Yes:
- buttonText = QT_TRANSLATE_NOOP("QDialogButtonBox", "&Yes");
- break;
- case QDialogButtonBox::YesToAll:
- buttonText = QT_TRANSLATE_NOOP("QDialogButtonBox", "Yes to &All");
- break;
- case QDialogButtonBox::No:
- buttonText = QT_TRANSLATE_NOOP("QDialogButtonBox", "&No");
- break;
- case QDialogButtonBox::NoToAll:
- buttonText = QT_TRANSLATE_NOOP("QDialogButtonBox", "N&o to All");
- break;
- case QDialogButtonBox::SaveAll:
- buttonText = QT_TRANSLATE_NOOP("QDialogButtonBox", "Save All");
- break;
- case QDialogButtonBox::Abort:
- buttonText = QT_TRANSLATE_NOOP("QDialogButtonBox", "Abort");
- break;
- case QDialogButtonBox::Retry:
- buttonText = QT_TRANSLATE_NOOP("QDialogButtonBox", "Retry");
- break;
- case QDialogButtonBox::Ignore:
- buttonText = QT_TRANSLATE_NOOP("QDialogButtonBox", "Ignore");
- break;
- case QDialogButtonBox::RestoreDefaults:
- buttonText = QT_TRANSLATE_NOOP("QDialogButtonBox", "Restore Defaults");
- break;
- case QDialogButtonBox::NoButton:
- ;
- } // switch
- return buttonText;
-}
-
-void QDialogButtonBoxPrivate::retranslateStrings()
-{
- const char *buttonText = 0;
- QHash<QPushButton *, QDialogButtonBox::StandardButton>::iterator it = standardButtonHash.begin();
- while (it != standardButtonHash.end()) {
- buttonText = standardButtonText(it.value());
- if (buttonText) {
- QPushButton *button = it.key();
- button->setText(QDialogButtonBox::tr(buttonText));
-#if defined(QT_SOFTKEYS_ENABLED) && !defined(QT_NO_ACTION)
- QAction *action = softKeyActions.value(button, 0);
- if (action)
- action->setText(button->text());
-#endif
- }
- ++it;
- }
-}
-
-/*!
- Constructs an empty, horizontal button box with the given \a parent.
-
- \sa orientation, addButton()
-*/
-QDialogButtonBox::QDialogButtonBox(QWidget *parent)
- : QWidget(*new QDialogButtonBoxPrivate(Qt::Horizontal), parent, 0)
-{
- d_func()->initLayout();
-}
-
-/*!
- Constructs an empty button box with the given \a orientation and \a parent.
-
- \sa orientation, addButton()
-*/
-QDialogButtonBox::QDialogButtonBox(Qt::Orientation orientation, QWidget *parent)
- : QWidget(*new QDialogButtonBoxPrivate(orientation), parent, 0)
-{
- d_func()->initLayout();
-}
-
-/*!
- Constructs a button box with the given \a orientation and \a parent, containing
- the standard buttons specified by \a buttons.
-
- \sa orientation, addButton()
-*/
-QDialogButtonBox::QDialogButtonBox(StandardButtons buttons, Qt::Orientation orientation,
- QWidget *parent)
- : QWidget(*new QDialogButtonBoxPrivate(orientation), parent, 0)
-{
- d_func()->initLayout();
- d_func()->createStandardButtons(buttons);
-}
-
-/*!
- Destroys the button box.
-*/
-QDialogButtonBox::~QDialogButtonBox()
-{
-}
-
-/*!
- \enum QDialogButtonBox::ButtonRole
- \enum QMessageBox::ButtonRole
-
- This enum describes the roles that can be used to describe buttons in
- the button box. Combinations of these roles are as flags used to
- describe different aspects of their behavior.
-
- \value InvalidRole The button is invalid.
- \value AcceptRole Clicking the button causes the dialog to be accepted
- (e.g. OK).
- \value RejectRole Clicking the button causes the dialog to be rejected
- (e.g. Cancel).
- \value DestructiveRole Clicking the button causes a destructive change
- (e.g. for Discarding Changes) and closes the dialog.
- \value ActionRole Clicking the button causes changes to the elements within
- the dialog.
- \value HelpRole The button can be clicked to request help.
- \value YesRole The button is a "Yes"-like button.
- \value NoRole The button is a "No"-like button.
- \value ApplyRole The button applies current changes.
- \value ResetRole The button resets the dialog's fields to default values.
-
- \omitvalue NRoles
-
- \sa StandardButton
-*/
-
-/*!
- \enum QDialogButtonBox::StandardButton
-
- These enums describe flags for standard buttons. Each button has a
- defined \l ButtonRole.
-
- \value Ok An "OK" button defined with the \l AcceptRole.
- \value Open A "Open" button defined with the \l AcceptRole.
- \value Save A "Save" button defined with the \l AcceptRole.
- \value Cancel A "Cancel" button defined with the \l RejectRole.
- \value Close A "Close" button defined with the \l RejectRole.
- \value Discard A "Discard" or "Don't Save" button, depending on the platform,
- defined with the \l DestructiveRole.
- \value Apply An "Apply" button defined with the \l ApplyRole.
- \value Reset A "Reset" button defined with the \l ResetRole.
- \value RestoreDefaults A "Restore Defaults" button defined with the \l ResetRole.
- \value Help A "Help" button defined with the \l HelpRole.
- \value SaveAll A "Save All" button defined with the \l AcceptRole.
- \value Yes A "Yes" button defined with the \l YesRole.
- \value YesToAll A "Yes to All" button defined with the \l YesRole.
- \value No A "No" button defined with the \l NoRole.
- \value NoToAll A "No to All" button defined with the \l NoRole.
- \value Abort An "Abort" button defined with the \l RejectRole.
- \value Retry A "Retry" button defined with the \l AcceptRole.
- \value Ignore An "Ignore" button defined with the \l AcceptRole.
-
- \value NoButton An invalid button.
-
- \omitvalue FirstButton
- \omitvalue LastButton
-
- \sa ButtonRole, standardButtons
-*/
-
-/*!
- \enum QDialogButtonBox::ButtonLayout
-
- This enum describes the layout policy to be used when arranging the buttons
- contained in the button box.
-
- \value WinLayout Use a policy appropriate for applications on Windows.
- \value MacLayout Use a policy appropriate for applications on Mac OS X.
- \value KdeLayout Use a policy appropriate for applications on KDE.
- \value GnomeLayout Use a policy appropriate for applications on GNOME.
-
- The button layout is specified by the \l{style()}{current style}. However,
- on the X11 platform, it may be influenced by the desktop environment.
-*/
-
-/*!
- \fn void QDialogButtonBox::clicked(QAbstractButton *button)
-
- This signal is emitted when a button inside the button box is clicked. The
- specific button that was pressed is specified by \a button.
-
- \sa accepted(), rejected(), helpRequested()
-*/
-
-/*!
- \fn void QDialogButtonBox::accepted()
-
- This signal is emitted when a button inside the button box is clicked, as long
- as it was defined with the \l AcceptRole or \l YesRole.
-
- \sa rejected(), clicked() helpRequested()
-*/
-
-/*!
- \fn void QDialogButtonBox::rejected()
-
- This signal is emitted when a button inside the button box is clicked, as long
- as it was defined with the \l RejectRole or \l NoRole.
-
- \sa accepted() helpRequested() clicked()
-*/
-
-/*!
- \fn void QDialogButtonBox::helpRequested()
-
- This signal is emitted when a button inside the button box is clicked, as long
- as it was defined with the \l HelpRole.
-
- \sa accepted() rejected() clicked()
-*/
-
-/*!
- \property QDialogButtonBox::orientation
- \brief the orientation of the button box
-
- By default, the orientation is horizontal (i.e. the buttons are laid out
- side by side). The possible orientations are Qt::Horizontal and
- Qt::Vertical.
-*/
-Qt::Orientation QDialogButtonBox::orientation() const
-{
- return d_func()->orientation;
-}
-
-void QDialogButtonBox::setOrientation(Qt::Orientation orientation)
-{
- Q_D(QDialogButtonBox);
- if (orientation == d->orientation)
- return;
-
- d->orientation = orientation;
- d->resetLayout();
-}
-
-/*!
- Clears the button box, deleting all buttons within it.
-
- \sa removeButton(), addButton()
-*/
-void QDialogButtonBox::clear()
-{
- Q_D(QDialogButtonBox);
-#ifdef QT_SOFTKEYS_ENABLED
- // Delete softkey actions as they have the buttons as parents
- qDeleteAll(d->softKeyActions.values());
- d->softKeyActions.clear();
-#endif
- // Remove the created standard buttons, they should be in the other lists, which will
- // do the deletion
- d->standardButtonHash.clear();
- for (int i = 0; i < NRoles; ++i) {
- QList<QAbstractButton *> &list = d->buttonLists[i];
- while (list.count()) {
- QAbstractButton *button = list.takeAt(0);
- QObject::disconnect(button, SIGNAL(destroyed()), this, SLOT(_q_handleButtonDestroyed()));
- delete button;
- }
- }
-}
-
-/*!
- Returns a list of all the buttons that have been added to the button box.
-
- \sa buttonRole(), addButton(), removeButton()
-*/
-QList<QAbstractButton *> QDialogButtonBox::buttons() const
-{
- Q_D(const QDialogButtonBox);
- QList<QAbstractButton *> finalList;
- for (int i = 0; i < NRoles; ++i) {
- const QList<QAbstractButton *> &list = d->buttonLists[i];
- for (int j = 0; j < list.count(); ++j)
- finalList.append(list.at(j));
- }
- return finalList;
-}
-
-/*!
- Returns the button role for the specified \a button. This function returns
- \l InvalidRole if \a button is 0 or has not been added to the button box.
-
- \sa buttons(), addButton()
-*/
-QDialogButtonBox::ButtonRole QDialogButtonBox::buttonRole(QAbstractButton *button) const
-{
- Q_D(const QDialogButtonBox);
- for (int i = 0; i < NRoles; ++i) {
- const QList<QAbstractButton *> &list = d->buttonLists[i];
- for (int j = 0; j < list.count(); ++j) {
- if (list.at(j) == button)
- return ButtonRole(i);
- }
- }
- return InvalidRole;
-}
-
-/*!
- Removes \a button from the button box without deleting it and sets its parent to zero.
-
- \sa clear(), buttons(), addButton()
-*/
-void QDialogButtonBox::removeButton(QAbstractButton *button)
-{
- Q_D(QDialogButtonBox);
-
- if (!button)
- return;
-
- // Remove it from the standard button hash first and then from the roles
- if (QPushButton *pushButton = qobject_cast<QPushButton *>(button))
- d->standardButtonHash.remove(pushButton);
- for (int i = 0; i < NRoles; ++i) {
- QList<QAbstractButton *> &list = d->buttonLists[i];
- for (int j = 0; j < list.count(); ++j) {
- if (list.at(j) == button) {
- list.takeAt(j);
- if (!d->internalRemove) {
- disconnect(button, SIGNAL(clicked()), this, SLOT(_q_handleButtonClicked()));
- disconnect(button, SIGNAL(destroyed()), this, SLOT(_q_handleButtonDestroyed()));
- }
- break;
- }
- }
- }
-#if defined(QT_SOFTKEYS_ENABLED) && !defined(QT_NO_ACTION)
- QAction *action = d->softKeyActions.value(button, 0);
- if (action) {
- d->softKeyActions.remove(button);
- delete action;
- }
-#endif
- if (!d->internalRemove)
- button->setParent(0);
-}
-
-/*!
- Adds the given \a button to the button box with the specified \a role.
- If the role is invalid, the button is not added.
-
- If the button has already been added, it is removed and added again with the
- new role.
-
- \note The button box takes ownership of the button.
-
- \sa removeButton(), clear()
-*/
-void QDialogButtonBox::addButton(QAbstractButton *button, ButtonRole role)
-{
- Q_D(QDialogButtonBox);
- if (role <= InvalidRole || role >= NRoles) {
- qWarning("QDialogButtonBox::addButton: Invalid ButtonRole, button not added");
- return;
- }
- removeButton(button);
- button->setParent(this);
- d->addButton(button, role);
-}
-
-/*!
- Creates a push button with the given \a text, adds it to the button box for the
- specified \a role, and returns the corresponding push button. If \a role is
- invalid, no button is created, and zero is returned.
-
- \sa removeButton(), clear()
-*/
-QPushButton *QDialogButtonBox::addButton(const QString &text, ButtonRole role)
-{
- Q_D(QDialogButtonBox);
- if (role <= InvalidRole || role >= NRoles) {
- qWarning("QDialogButtonBox::addButton: Invalid ButtonRole, button not added");
- return 0;
- }
- QPushButton *button = new QPushButton(text, this);
- d->addButton(button, role);
- return button;
-}
-
-/*!
- Adds a standard \a button to the button box if it is valid to do so, and returns
- a push button. If \a button is invalid, it is not added to the button box, and
- zero is returned.
-
- \sa removeButton(), clear()
-*/
-QPushButton *QDialogButtonBox::addButton(StandardButton button)
-{
- Q_D(QDialogButtonBox);
- return d->createButton(button);
-}
-
-/*!
- \property QDialogButtonBox::standardButtons
- \brief collection of standard buttons in the button box
-
- This property controls which standard buttons are used by the button box.
-
- \sa addButton()
-*/
-void QDialogButtonBox::setStandardButtons(StandardButtons buttons)
-{
- Q_D(QDialogButtonBox);
-#ifdef QT_SOFTKEYS_ENABLED
- // Delete softkey actions since they have the buttons as parents
- qDeleteAll(d->softKeyActions.values());
- d->softKeyActions.clear();
-#endif
- // Clear out all the old standard buttons, then recreate them.
- qDeleteAll(d->standardButtonHash.keys());
- d->standardButtonHash.clear();
-
- d->createStandardButtons(buttons);
-}
-
-QDialogButtonBox::StandardButtons QDialogButtonBox::standardButtons() const
-{
- Q_D(const QDialogButtonBox);
- StandardButtons standardButtons = NoButton;
- QHash<QPushButton *, StandardButton>::const_iterator it = d->standardButtonHash.constBegin();
- while (it != d->standardButtonHash.constEnd()) {
- standardButtons |= it.value();
- ++it;
- }
- return standardButtons;
-}
-
-/*!
- Returns the QPushButton corresponding to the standard button \a which,
- or 0 if the standard button doesn't exist in this button box.
-
- \sa standardButton(), standardButtons(), buttons()
-*/
-QPushButton *QDialogButtonBox::button(StandardButton which) const
-{
- Q_D(const QDialogButtonBox);
- return d->standardButtonHash.key(which);
-}
-
-/*!
- Returns the standard button enum value corresponding to the given \a button,
- or NoButton if the given \a button isn't a standard button.
-
- \sa button(), buttons(), standardButtons()
-*/
-QDialogButtonBox::StandardButton QDialogButtonBox::standardButton(QAbstractButton *button) const
-{
- Q_D(const QDialogButtonBox);
- return d->standardButtonHash.value(static_cast<QPushButton *>(button));
-}
-
-void QDialogButtonBoxPrivate::_q_handleButtonClicked()
-{
- Q_Q(QDialogButtonBox);
- if (QAbstractButton *button = qobject_cast<QAbstractButton *>(q->sender())) {
- emit q->clicked(button);
-
- switch (q->buttonRole(button)) {
- case AcceptRole:
- case YesRole:
- emit q->accepted();
- break;
- case RejectRole:
- case NoRole:
- emit q->rejected();
- break;
- case HelpRole:
- emit q->helpRequested();
- break;
- default:
- break;
- }
- }
-}
-
-void QDialogButtonBoxPrivate::_q_handleButtonDestroyed()
-{
- Q_Q(QDialogButtonBox);
- if (QObject *object = q->sender()) {
- QBoolBlocker skippy(internalRemove);
- q->removeButton(static_cast<QAbstractButton *>(object));
- }
-}
-
-/*!
- \property QDialogButtonBox::centerButtons
- \brief whether the buttons in the button box are centered
-
- By default, this property is false. This behavior is appopriate
- for most types of dialogs. A notable exception is message boxes
- on most platforms (e.g. Windows), where the button box is
- centered horizontally.
-
- \sa QMessageBox
-*/
-void QDialogButtonBox::setCenterButtons(bool center)
-{
- Q_D(QDialogButtonBox);
- if (d->center != center) {
- d->center = center;
- d->resetLayout();
- }
-}
-
-bool QDialogButtonBox::centerButtons() const
-{
- Q_D(const QDialogButtonBox);
- return d->center;
-}
-
-/*!
- \reimp
-*/
-void QDialogButtonBox::changeEvent(QEvent *event)
-{
- typedef QHash<QPushButton *, QDialogButtonBox::StandardButton> StandardButtonHash;
-
- Q_D(QDialogButtonBox);
- switch (event->type()) {
- case QEvent::StyleChange: // Propagate style
- if (!d->standardButtonHash.empty()) {
- QStyle *newStyle = style();
- const StandardButtonHash::iterator end = d->standardButtonHash.end();
- for (StandardButtonHash::iterator it = d->standardButtonHash.begin(); it != end; ++it)
- it.key()->setStyle(newStyle);
- }
- // fallthrough intended
-#ifdef Q_WS_MAC
- case QEvent::MacSizeChange:
-#endif
- d->resetLayout();
- QWidget::changeEvent(event);
- break;
- default:
- QWidget::changeEvent(event);
- break;
- }
-}
-
-/*!
- \reimp
-*/
-bool QDialogButtonBox::event(QEvent *event)
-{
- Q_D(QDialogButtonBox);
- if (event->type() == QEvent::Show) {
- QList<QAbstractButton *> acceptRoleList = d->buttonLists[AcceptRole];
- QPushButton *firstAcceptButton = acceptRoleList.isEmpty() ? 0 : qobject_cast<QPushButton *>(acceptRoleList.at(0));
- bool hasDefault = false;
- QWidget *dialog = 0;
- QWidget *p = this;
- while (p && !p->isWindow()) {
- p = p->parentWidget();
- if ((dialog = qobject_cast<QDialog *>(p)))
- break;
- }
-
- foreach (QPushButton *pb, (dialog ? dialog : this)->findChildren<QPushButton *>()) {
- if (pb->isDefault() && pb != firstAcceptButton) {
- hasDefault = true;
- break;
- }
- }
- if (!hasDefault && firstAcceptButton)
- firstAcceptButton->setDefault(true);
-#ifdef QT_SOFTKEYS_ENABLED
- if (dialog)
- setFixedSize(0,0);
-#endif
- }else if (event->type() == QEvent::LanguageChange) {
- d->retranslateStrings();
- }
-#if defined(QT_SOFTKEYS_ENABLED) && !defined(QT_NO_ACTION)
- else if (event->type() == QEvent::ParentChange) {
- QWidget *dialog = 0;
- QWidget *p = this;
- while (p && !p->isWindow()) {
- p = p->parentWidget();
- if ((dialog = qobject_cast<QDialog *>(p)))
- break;
- }
-
- // If the parent changes, then move the softkeys
- for (QHash<QAbstractButton *, QAction *>::const_iterator it = d->softKeyActions.constBegin();
- it != d->softKeyActions.constEnd(); ++it) {
- QAction *current = it.value();
- QList<QWidget *> widgets = current->associatedWidgets();
- foreach (QWidget *w, widgets)
- w->removeAction(current);
- if (dialog)
- dialog->addAction(current);
- else
- addAction(current);
- }
- }
-#endif
-
- return QWidget::event(event);
-}
-
-QT_END_NAMESPACE
-
-#include "moc_qdialogbuttonbox.cpp"