diff options
Diffstat (limited to 'src/quicktemplates2/qquickdialogbuttonbox.cpp')
-rw-r--r-- | src/quicktemplates2/qquickdialogbuttonbox.cpp | 853 |
1 files changed, 0 insertions, 853 deletions
diff --git a/src/quicktemplates2/qquickdialogbuttonbox.cpp b/src/quicktemplates2/qquickdialogbuttonbox.cpp deleted file mode 100644 index a4b3313b..00000000 --- a/src/quicktemplates2/qquickdialogbuttonbox.cpp +++ /dev/null @@ -1,853 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2017 The Qt Company Ltd. -** Contact: http://www.qt.io/licensing/ -** -** This file is part of the Qt Quick Templates 2 module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL3$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see http://www.qt.io/terms-conditions. For further -** information use the contact form at http://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPLv3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or later 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 2.0 requirements will be -** met: http://www.gnu.org/licenses/gpl-2.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qquickdialogbuttonbox_p.h" -#include "qquickdialogbuttonbox_p_p.h" -#include "qquickabstractbutton_p.h" -#include "qquickbutton_p.h" -#include "qquickdialog_p_p.h" - -#include <QtCore/qpointer.h> -#include <QtGui/private/qguiapplication_p.h> -#include <QtGui/qpa/qplatformtheme.h> -#include <QtQml/qqmlengine.h> -#include <QtQml/qqmlcontext.h> -#include <QtQml/qqmlcomponent.h> - -#include <algorithm> - -QT_BEGIN_NAMESPACE - -/*! - \qmltype DialogButtonBox - \inherits Container -//! \instantiates QQuickDialogButtonBox - \inqmlmodule QtQuick.Controls - \ingroup qtquickcontrols2-dialogs - \brief A button box used in dialogs. - \since 5.8 - - Dialogs and message boxes typically present buttons in an order that - conforms to the interface guidelines for that platform. Invariably, - different platforms have their dialog buttons in different orders. - DialogButtonBox allows a developer to add buttons to it and will - automatically use the appropriate order for the user's platform. - - Most buttons for a dialog follow certain roles. Such roles include: - - \list - \li Accepting or rejecting the dialog. - \li Asking for help. - \li 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. - \uicontrol OK and \uicontrol Cancel buttons). It is sometimes convenient - to create these buttons in a standard way. - - There are a couple ways of using DialogButtonBox. One way is to specify - the standard buttons (e.g. \uicontrol OK, \uicontrol Cancel, \uicontrol Save) - and let the button box setup the buttons. - - \image qtquickcontrols2-dialogbuttonbox.png - - \snippet qtquickcontrols2-dialogbuttonbox.qml 1 - - Alternatively, buttons and their roles can be specified by hand: - - \snippet qtquickcontrols2-dialogbuttonbox-attached.qml 1 - - You can also mix and match normal buttons and standard buttons. - - When a button is clicked in the button box, the \l clicked() signal is - emitted for the actual button that is pressed. In addition, the - following signals are automatically emitted when a button with the - respective role(s) is pressed: - - \table - \header - \li Role - \li Signal - \row - \li \c AcceptRole, \c YesRole - \li \l accepted() - \row - \li \c ApplyRole - \li \l applied() - \row - \li \c DiscardRole - \li \l discarded() - \row - \li \c HelpRole - \li \l helpRequested() - \row - \li \c RejectRole, \c NoRole - \li \l rejected() - \row - \li \c ResetRole - \li \l reset() - \endtable - - \sa Dialog -*/ - -/*! - \qmlsignal QtQuick.Controls::DialogButtonBox::accepted() - - This signal is emitted when a button defined with the \c AcceptRole or - \c YesRole is clicked. - - \sa rejected(), clicked(), helpRequested() -*/ - -/*! - \qmlsignal QtQuick.Controls::DialogButtonBox::rejected() - - This signal is emitted when a button defined with the \c RejectRole or - \c NoRole is clicked. - - \sa accepted(), helpRequested(), clicked() -*/ - -/*! - \since QtQuick.Controls 2.3 (Qt 5.10) - \qmlsignal QtQuick.Controls::DialogButtonBox::applied() - - This signal is emitted when a button defined with the \c ApplyRole is - clicked. - - \sa discarded(), reset() -*/ - -/*! - \since QtQuick.Controls 2.3 (Qt 5.10) - \qmlsignal QtQuick.Controls::DialogButtonBox::reset() - - This signal is emitted when a button defined with the \c ResetRole is - clicked. - - \sa discarded(), applied() -*/ - -/*! - \since QtQuick.Controls 2.3 (Qt 5.10) - \qmlsignal QtQuick.Controls::DialogButtonBox::discarded() - - This signal is emitted when a button defined with the \c DiscardRole is - clicked. - - \sa reset(), applied() -*/ - -/*! - \qmlsignal QtQuick.Controls::DialogButtonBox::helpRequested() - - This signal is emitted when a button defined with the \c HelpRole is clicked. - - \sa accepted(), rejected(), clicked() -*/ - -/*! - \qmlsignal QtQuick.Controls::DialogButtonBox::clicked(AbstractButton button) - - This signal is emitted when a \a button inside the button box is clicked. - - \sa accepted(), rejected(), helpRequested() -*/ - -static QPlatformDialogHelper::ButtonLayout platformButtonLayout() -{ - return QGuiApplicationPrivate::platformTheme()->themeHint(QPlatformTheme::DialogButtonBoxLayout).value<QPlatformDialogHelper::ButtonLayout>(); -} - -void QQuickDialogButtonBoxPrivate::itemImplicitWidthChanged(QQuickItem *item) -{ - QQuickContainerPrivate::itemImplicitWidthChanged(item); - if (item == contentItem) - resizeContent(); - else - updateImplicitContentWidth(); -} - -void QQuickDialogButtonBoxPrivate::itemImplicitHeightChanged(QQuickItem *item) -{ - QQuickContainerPrivate::itemImplicitHeightChanged(item); - if (item == contentItem) - resizeContent(); - else - updateImplicitContentHeight(); -} - -// adapted from QStyle::alignedRect() -static QRectF alignedRect(Qt::LayoutDirection direction, Qt::Alignment alignment, const QSizeF &size, const QRectF &rectangle) -{ - alignment = QGuiApplicationPrivate::visualAlignment(direction, alignment); - qreal x = rectangle.x(); - qreal y = rectangle.y(); - qreal w = size.width(); - qreal h = size.height(); - if ((alignment & Qt::AlignVCenter) == Qt::AlignVCenter || (alignment & Qt::AlignVertical_Mask) == 0) - y += (rectangle.size().height() - h) / 2; - else if ((alignment & Qt::AlignBottom) == Qt::AlignBottom) - y += rectangle.size().height() - h; - if ((alignment & Qt::AlignRight) == Qt::AlignRight) - x += rectangle.size().width() - w; - else if ((alignment & Qt::AlignHCenter) == Qt::AlignHCenter) - x += (rectangle.size().width() - w) / 2; - return QRectF(x, y, w, h); -} - -void QQuickDialogButtonBoxPrivate::resizeContent() -{ - Q_Q(QQuickDialogButtonBox); - if (!contentItem) - return; - - QRectF geometry = q->boundingRect().adjusted(q->leftPadding(), q->topPadding(), -q->rightPadding(), -q->bottomPadding()); - if (alignment != 0) - geometry = alignedRect(q->isMirrored() ? Qt::RightToLeft : Qt::LeftToRight, alignment, QSizeF(contentWidth, contentHeight), geometry); - - contentItem->setPosition(geometry.topLeft()); - contentItem->setSize(geometry.size()); -} - -void QQuickDialogButtonBoxPrivate::updateLayout() -{ - Q_Q(QQuickDialogButtonBox); - const int count = contentModel->count(); - if (count <= 0) - return; - - const int halign = alignment & Qt::AlignHorizontal_Mask; - const int valign = alignment & Qt::AlignVertical_Mask; - - QList<QQuickAbstractButton *> buttons; - const qreal cw = (alignment & Qt::AlignHorizontal_Mask) == 0 ? q->availableWidth() : contentWidth; - const qreal itemWidth = (cw - qMax(0, count - 1) * spacing) / count; - - for (int i = 0; i < count; ++i) { - QQuickItem *item = q->itemAt(i); - if (item) { - QQuickItemPrivate *p = QQuickItemPrivate::get(item); - if (!p->widthValid()) { - if (!halign) - item->setWidth(itemWidth); - else - item->resetWidth(); - if (!valign) - item->setHeight(contentHeight); - else - item->resetHeight(); - p->widthValidFlag = false; - } - } - buttons += static_cast<QQuickAbstractButton *>(item); - } - - struct ButtonLayout { - ButtonLayout(QPlatformDialogHelper::ButtonLayout layout) - : m_layout(QPlatformDialogHelper::buttonLayout(Qt::Horizontal, layout)) - { - } - - bool operator()(QQuickAbstractButton *first, QQuickAbstractButton *second) - { - const QPlatformDialogHelper::ButtonRole firstRole = QQuickDialogPrivate::buttonRole(first); - const QPlatformDialogHelper::ButtonRole secondRole = QQuickDialogPrivate::buttonRole(second); - - if (firstRole != secondRole && firstRole != QPlatformDialogHelper::InvalidRole && secondRole != QPlatformDialogHelper::InvalidRole) { - const int *l = m_layout; - while (*l != QPlatformDialogHelper::EOL) { - // Unset the Reverse flag. - const int role = (*l & ~QPlatformDialogHelper::Reverse); - if (role == firstRole) - return true; - if (role == secondRole) - return false; - ++l; - } - } - - if (firstRole == secondRole) - return false; - - return firstRole != QPlatformDialogHelper::InvalidRole; - } - const int *m_layout; - }; - - std::stable_sort(buttons.begin(), buttons.end(), ButtonLayout(static_cast<QPlatformDialogHelper::ButtonLayout>(buttonLayout))); - - for (int i = 0; i < buttons.count() - 1; ++i) - q->insertItem(i, buttons.at(i)); -} - -qreal QQuickDialogButtonBoxPrivate::getContentWidth() const -{ - Q_Q(const QQuickDialogButtonBox); - const int count = contentModel->count(); - const qreal totalSpacing = qMax(0, count - 1) * spacing; - qreal totalWidth = totalSpacing; - qreal maxWidth = 0; - for (int i = 0; i < count; ++i) { - QQuickItem *item = q->itemAt(i); - if (item) { - totalWidth += item->implicitWidth(); - maxWidth = qMax(maxWidth, item->implicitWidth()); - } - } - if ((alignment & Qt::AlignHorizontal_Mask) == 0) - totalWidth = qMax(totalWidth, count * maxWidth + totalSpacing); - return totalWidth; -} - -qreal QQuickDialogButtonBoxPrivate::getContentHeight() const -{ - Q_Q(const QQuickDialogButtonBox); - const int count = contentModel->count(); - qreal maxHeight = 0; - for (int i = 0; i < count; ++i) { - QQuickItem *item = q->itemAt(i); - if (item) - maxHeight = qMax(maxHeight, item->implicitHeight()); - } - return maxHeight; -} - -void QQuickDialogButtonBoxPrivate::handleClick() -{ - Q_Q(QQuickDialogButtonBox); - QQuickAbstractButton *button = qobject_cast<QQuickAbstractButton *>(q->sender()); - if (!button) - return; - - // Can't fetch this *after* emitting clicked, as clicked may destroy the button - // or change its role. Now changing the role is not possible yet, but arguably - // both clicked and accepted/rejected/etc. should be emitted "atomically" - // depending on whatever role the button had at the time of the click. - const QPlatformDialogHelper::ButtonRole role = QQuickDialogPrivate::buttonRole(button); - QPointer<QQuickDialogButtonBox> guard(q); - - emit q->clicked(button); - - if (!guard) - return; - - switch (role) { - case QPlatformDialogHelper::AcceptRole: - case QPlatformDialogHelper::YesRole: - emit q->accepted(); - break; - case QPlatformDialogHelper::RejectRole: - case QPlatformDialogHelper::NoRole: - emit q->rejected(); - break; - case QPlatformDialogHelper::ApplyRole: - emit q->applied(); - break; - case QPlatformDialogHelper::ResetRole: - emit q->reset(); - break; - case QPlatformDialogHelper::DestructiveRole: - emit q->discarded(); - break; - case QPlatformDialogHelper::HelpRole: - emit q->helpRequested(); - break; - default: - break; - } -} - -QString QQuickDialogButtonBoxPrivate::buttonText(QPlatformDialogHelper::StandardButton standardButton) -{ - return QPlatformTheme::removeMnemonics(QGuiApplicationPrivate::platformTheme()->standardButtonText(standardButton)); -} - -QQuickAbstractButton *QQuickDialogButtonBoxPrivate::createStandardButton(QPlatformDialogHelper::StandardButton standardButton) -{ - Q_Q(QQuickDialogButtonBox); - if (!delegate) - return nullptr; - - QQmlContext *creationContext = delegate->creationContext(); - if (!creationContext) - creationContext = qmlContext(q); - QQmlContext *context = new QQmlContext(creationContext, q); - context->setContextObject(q); - - QObject *object = delegate->beginCreate(context); - QQuickAbstractButton *button = qobject_cast<QQuickAbstractButton*>(object); - if (button) { - QQuickDialogButtonBoxAttached *attached = qobject_cast<QQuickDialogButtonBoxAttached *>(qmlAttachedPropertiesObject<QQuickDialogButtonBox>(button, true)); - QQuickDialogButtonBoxAttachedPrivate::get(attached)->standardButton = standardButton; - attached->setButtonRole(QPlatformDialogHelper::buttonRole(standardButton)); - button->setText(buttonText(standardButton)); - delegate->completeCreate(); - button->setParent(q); - return button; - } - - delete object; - return nullptr; -} - -void QQuickDialogButtonBoxPrivate::removeStandardButtons() -{ - Q_Q(QQuickDialogButtonBox); - int i = q->count() - 1; - while (i >= 0) { - QQuickAbstractButton *button = qobject_cast<QQuickAbstractButton *>(q->itemAt(i)); - if (button) { - QQuickDialogButtonBoxAttached *attached = qobject_cast<QQuickDialogButtonBoxAttached *>( - qmlAttachedPropertiesObject<QQuickDialogButtonBox>(button, false)); - if (attached) { - QQuickDialogButtonBoxAttachedPrivate *p = QQuickDialogButtonBoxAttachedPrivate::get(attached); - if (p->standardButton != QPlatformDialogHelper::NoButton) { - q->removeItem(button); - button->deleteLater(); - } - } - } - --i; - } -} - -void QQuickDialogButtonBoxPrivate::updateLanguage() -{ - Q_Q(QQuickDialogButtonBox); - int i = q->count() - 1; - while (i >= 0) { - QQuickAbstractButton *button = qobject_cast<QQuickAbstractButton *>(itemAt(i)); - if (button) { - QQuickDialogButtonBoxAttached *attached = qobject_cast<QQuickDialogButtonBoxAttached *>( - qmlAttachedPropertiesObject<QQuickDialogButtonBox>(button, true)); - const auto boxAttachedPrivate = QQuickDialogButtonBoxAttachedPrivate::get(attached); - const QPlatformDialogHelper::StandardButton standardButton = boxAttachedPrivate->standardButton; - // The button might be a custom one with explicitly specified text, so we shouldn't change it in that case. - if (standardButton != QPlatformDialogHelper::NoButton) { - button->setText(buttonText(standardButton)); - } - } - --i; - } -} - -QQuickDialogButtonBox::QQuickDialogButtonBox(QQuickItem *parent) - : QQuickContainer(*(new QQuickDialogButtonBoxPrivate), parent) -{ - Q_D(QQuickDialogButtonBox); - d->changeTypes |= QQuickItemPrivate::ImplicitWidth | QQuickItemPrivate::ImplicitHeight; - d->buttonLayout = platformButtonLayout(); -} - -QQuickDialogButtonBox::~QQuickDialogButtonBox() -{ -} - -/*! - \qmlproperty enumeration QtQuick.Controls::DialogButtonBox::position - - This property holds the position of the button box. - - \note If the button box is assigned as a header or footer of ApplicationWindow - or Page, the appropriate position is set automatically. - - Possible values: - \value DialogButtonBox.Header The button box is at the top, as a window or page header. - \value DialogButtonBox.Footer The button box is at the bottom, as a window or page header. - - The default value is \c Footer. - - \sa Dialog::header, Dialog::footer -*/ -QQuickDialogButtonBox::Position QQuickDialogButtonBox::position() const -{ - Q_D(const QQuickDialogButtonBox); - return d->position; -} - -void QQuickDialogButtonBox::setPosition(Position position) -{ - Q_D(QQuickDialogButtonBox); - if (d->position == position) - return; - - d->position = position; - emit positionChanged(); -} - -/*! - \qmlproperty flags QtQuick.Controls::DialogButtonBox::alignment - - This property holds the alignment of the buttons. - - Possible values: - \value undefined The buttons are resized to fill the available space. - \value Qt.AlignLeft The buttons are aligned to the left. - \value Qt.AlignHCenter The buttons are horizontally centered. - \value Qt.AlignRight The buttons are aligned to the right. - \value Qt.AlignTop The buttons are aligned to the top. - \value Qt.AlignVCenter The buttons are vertically centered. - \value Qt.AlignBottom The buttons are aligned to the bottom. -*/ -Qt::Alignment QQuickDialogButtonBox::alignment() const -{ - Q_D(const QQuickDialogButtonBox); - return d->alignment; -} - -void QQuickDialogButtonBox::setAlignment(Qt::Alignment alignment) -{ - Q_D(QQuickDialogButtonBox); - if (d->alignment == alignment) - return; - - d->alignment = alignment; - if (isComponentComplete()) { - d->resizeContent(); - polish(); - } - emit alignmentChanged(); -} - -void QQuickDialogButtonBox::resetAlignment() -{ - setAlignment({}); -} - -/*! - \qmlproperty enumeration QtQuick.Controls::DialogButtonBox::standardButtons - - This property holds a combination of standard buttons that are used by the button box. - - \snippet qtquickcontrols2-dialogbuttonbox.qml 1 - - The buttons will be positioned in the appropriate order for the user's platform. - - Possible flags: - \value DialogButtonBox.Ok An "OK" button defined with the \c AcceptRole. - \value DialogButtonBox.Open An "Open" button defined with the \c AcceptRole. - \value DialogButtonBox.Save A "Save" button defined with the \c AcceptRole. - \value DialogButtonBox.Cancel A "Cancel" button defined with the \c RejectRole. - \value DialogButtonBox.Close A "Close" button defined with the \c RejectRole. - \value DialogButtonBox.Discard A "Discard" or "Don't Save" button, depending on the platform, defined with the \c DestructiveRole. - \value DialogButtonBox.Apply An "Apply" button defined with the \c ApplyRole. - \value DialogButtonBox.Reset A "Reset" button defined with the \c ResetRole. - \value DialogButtonBox.RestoreDefaults A "Restore Defaults" button defined with the \c ResetRole. - \value DialogButtonBox.Help A "Help" button defined with the \c HelpRole. - \value DialogButtonBox.SaveAll A "Save All" button defined with the \c AcceptRole. - \value DialogButtonBox.Yes A "Yes" button defined with the \c YesRole. - \value DialogButtonBox.YesToAll A "Yes to All" button defined with the \c YesRole. - \value DialogButtonBox.No A "No" button defined with the \c NoRole. - \value DialogButtonBox.NoToAll A "No to All" button defined with the \c NoRole. - \value DialogButtonBox.Abort An "Abort" button defined with the \c RejectRole. - \value DialogButtonBox.Retry A "Retry" button defined with the \c AcceptRole. - \value DialogButtonBox.Ignore An "Ignore" button defined with the \c AcceptRole. - \value DialogButtonBox.NoButton An invalid button. - - \sa standardButton() -*/ -QPlatformDialogHelper::StandardButtons QQuickDialogButtonBox::standardButtons() const -{ - Q_D(const QQuickDialogButtonBox); - return d->standardButtons; -} - -void QQuickDialogButtonBox::setStandardButtons(QPlatformDialogHelper::StandardButtons buttons) -{ - Q_D(QQuickDialogButtonBox); - if (d->standardButtons == buttons) - return; - - d->removeStandardButtons(); - - for (int i = QPlatformDialogHelper::FirstButton; i <= QPlatformDialogHelper::LastButton; i<<=1) { - QPlatformDialogHelper::StandardButton standardButton = static_cast<QPlatformDialogHelper::StandardButton>(i); - if (standardButton & buttons) { - QQuickAbstractButton *button = d->createStandardButton(standardButton); - if (button) - addItem(button); - } - } - - if (isComponentComplete()) - polish(); - - d->standardButtons = buttons; - emit standardButtonsChanged(); -} - -/*! - \qmlmethod AbstractButton QtQuick.Controls::DialogButtonBox::standardButton(StandardButton button) - - Returns the specified standard \a button, or \c null if it does not exist. - - \sa standardButtons -*/ -QQuickAbstractButton *QQuickDialogButtonBox::standardButton(QPlatformDialogHelper::StandardButton button) const -{ - Q_D(const QQuickDialogButtonBox); - if (Q_UNLIKELY(!(d->standardButtons & button))) - return nullptr; - for (int i = 0, n = count(); i < n; ++i) { - QQuickAbstractButton *btn = qobject_cast<QQuickAbstractButton *>(d->itemAt(i)); - if (Q_LIKELY(btn)) { - QQuickDialogButtonBoxAttached *attached = qobject_cast<QQuickDialogButtonBoxAttached *>(qmlAttachedPropertiesObject<QQuickDialogButtonBox>(btn, false)); - if (attached && QQuickDialogButtonBoxAttachedPrivate::get(attached)->standardButton == button) - return btn; - } - } - return nullptr; -} - -/*! - \qmlproperty Component QtQuick.Controls::DialogButtonBox::delegate - - This property holds a delegate for creating standard buttons. - - \sa standardButtons -*/ -QQmlComponent *QQuickDialogButtonBox::delegate() const -{ - Q_D(const QQuickDialogButtonBox); - return d->delegate; -} - -void QQuickDialogButtonBox::setDelegate(QQmlComponent* delegate) -{ - Q_D(QQuickDialogButtonBox); - if (d->delegate == delegate) - return; - - delete d->delegate; - d->delegate = delegate; - emit delegateChanged(); -} - -QQuickDialogButtonBoxAttached *QQuickDialogButtonBox::qmlAttachedProperties(QObject *object) -{ - return new QQuickDialogButtonBoxAttached(object); -} - -/*! - \since QtQuick.Controls 2.5 (Qt 5.12) - \qmlproperty enumeration QtQuick.Controls::DialogButtonBox::buttonLayout - - This property holds the button layout policy to be used when arranging the buttons contained in the button box. - The default value is platform-specific. - - Available values: - \value DialogButtonBox.WinLayout Use a policy appropriate for applications on Windows. - \value DialogButtonBox.MacLayout Use a policy appropriate for applications on macOS. - \value DialogButtonBox.KdeLayout Use a policy appropriate for applications on KDE. - \value DialogButtonBox.GnomeLayout Use a policy appropriate for applications on GNOME. - \value DialogButtonBox.AndroidLayout Use a policy appropriate for applications on Android. -*/ -QPlatformDialogHelper::ButtonLayout QQuickDialogButtonBox::buttonLayout() const -{ - Q_D(const QQuickDialogButtonBox); - return d->buttonLayout; -} - -void QQuickDialogButtonBox::setButtonLayout(QPlatformDialogHelper::ButtonLayout layout) -{ - Q_D(QQuickDialogButtonBox); - if (d->buttonLayout == layout) - return; - - d->buttonLayout = layout; - if (isComponentComplete()) - d->updateLayout(); - emit buttonLayoutChanged(); -} - -void QQuickDialogButtonBox::resetButtonLayout() -{ - setButtonLayout(platformButtonLayout()); -} - -void QQuickDialogButtonBox::updatePolish() -{ - Q_D(QQuickDialogButtonBox); - QQuickContainer::updatePolish(); - d->updateLayout(); -} - -bool QQuickDialogButtonBox::event(QEvent *e) -{ - Q_D(QQuickDialogButtonBox); - if (e->type() == QEvent::LanguageChange) - d->updateLanguage(); - return QQuickContainer::event(e); -} - -void QQuickDialogButtonBox::componentComplete() -{ - Q_D(QQuickDialogButtonBox); - QQuickContainer::componentComplete(); - d->updateLayout(); -} - -void QQuickDialogButtonBox::geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) -{ - Q_D(QQuickDialogButtonBox); - QQuickContainer::geometryChange(newGeometry, oldGeometry); - d->updateLayout(); -} - -void QQuickDialogButtonBox::contentItemChange(QQuickItem *newItem, QQuickItem *oldItem) -{ - Q_D(QQuickDialogButtonBox); - QQuickContainer::contentItemChange(newItem, oldItem); - if (oldItem) - QQuickItemPrivate::get(oldItem)->removeItemChangeListener(d, QQuickItemPrivate::ImplicitWidth | QQuickItemPrivate::ImplicitHeight); - if (newItem) - QQuickItemPrivate::get(newItem)->addItemChangeListener(d, QQuickItemPrivate::ImplicitWidth | QQuickItemPrivate::ImplicitHeight); -} - -bool QQuickDialogButtonBox::isContent(QQuickItem *item) const -{ - return qobject_cast<QQuickAbstractButton *>(item); -} - -void QQuickDialogButtonBox::itemAdded(int index, QQuickItem *item) -{ - Q_D(QQuickDialogButtonBox); - Q_UNUSED(index); - if (QQuickAbstractButton *button = qobject_cast<QQuickAbstractButton *>(item)) - QObjectPrivate::connect(button, &QQuickAbstractButton::clicked, d, &QQuickDialogButtonBoxPrivate::handleClick); - if (QQuickDialogButtonBoxAttached *attached = qobject_cast<QQuickDialogButtonBoxAttached *>(qmlAttachedPropertiesObject<QQuickDialogButtonBox>(item, false))) - QQuickDialogButtonBoxAttachedPrivate::get(attached)->setButtonBox(this); - d->updateImplicitContentSize(); - if (isComponentComplete()) - polish(); -} - -void QQuickDialogButtonBox::itemRemoved(int index, QQuickItem *item) -{ - Q_D(QQuickDialogButtonBox); - Q_UNUSED(index); - if (QQuickAbstractButton *button = qobject_cast<QQuickAbstractButton *>(item)) - QObjectPrivate::disconnect(button, &QQuickAbstractButton::clicked, d, &QQuickDialogButtonBoxPrivate::handleClick); - if (QQuickDialogButtonBoxAttached *attached = qobject_cast<QQuickDialogButtonBoxAttached *>(qmlAttachedPropertiesObject<QQuickDialogButtonBox>(item, false))) - QQuickDialogButtonBoxAttachedPrivate::get(attached)->setButtonBox(nullptr); - d->updateImplicitContentSize(); - if (isComponentComplete()) - polish(); -} - -#if QT_CONFIG(accessibility) -QAccessible::Role QQuickDialogButtonBox::accessibleRole() const -{ - return QAccessible::PageTabList; -} -#endif - -void QQuickDialogButtonBoxAttachedPrivate::setButtonBox(QQuickDialogButtonBox *box) -{ - Q_Q(QQuickDialogButtonBoxAttached); - if (buttonBox == box) - return; - - buttonBox = box; - emit q->buttonBoxChanged(); -} - -QQuickDialogButtonBoxAttached::QQuickDialogButtonBoxAttached(QObject *parent) - : QObject(*(new QQuickDialogButtonBoxAttachedPrivate), parent) -{ - Q_D(QQuickDialogButtonBoxAttached); - QQuickItem *parentItem = qobject_cast<QQuickItem *>(parent); - while (parentItem && !d->buttonBox) { - d->buttonBox = qobject_cast<QQuickDialogButtonBox *>(parentItem); - parentItem = parentItem->parentItem(); - } -} - -/*! - \qmlattachedproperty DialogButtonBox QtQuick.Controls::DialogButtonBox::buttonBox - \readonly - - This attached property holds the button box that manages this button, or - \c null if the button is not in a button box. -*/ -QQuickDialogButtonBox *QQuickDialogButtonBoxAttached::buttonBox() const -{ - Q_D(const QQuickDialogButtonBoxAttached); - return d->buttonBox; -} - -/*! - \qmlattachedproperty enumeration QtQuick.Controls::DialogButtonBox::buttonRole - - This attached property holds the role of each button in a button box. - - \snippet qtquickcontrols2-dialogbuttonbox-attached.qml 1 - - Available values: - \value DialogButtonBox.InvalidRole The button is invalid. - \value DialogButtonBox.AcceptRole Clicking the button causes the dialog to be accepted (e.g. \uicontrol OK). - \value DialogButtonBox.RejectRole Clicking the button causes the dialog to be rejected (e.g. \uicontrol Cancel). - \value DialogButtonBox.DestructiveRole Clicking the button causes a destructive change (e.g. for discarding changes) and closes the dialog. - \value DialogButtonBox.ActionRole Clicking the button causes changes to the elements within the dialog. - \value DialogButtonBox.HelpRole The button can be clicked to request help. - \value DialogButtonBox.YesRole The button is a "Yes"-like button. - \value DialogButtonBox.NoRole The button is a "No"-like button. - \value DialogButtonBox.ResetRole The button resets the dialog's fields to default values. - \value DialogButtonBox.ApplyRole The button applies current changes. -*/ -QPlatformDialogHelper::ButtonRole QQuickDialogButtonBoxAttached::buttonRole() const -{ - Q_D(const QQuickDialogButtonBoxAttached); - return d->buttonRole; -} - -void QQuickDialogButtonBoxAttached::setButtonRole(QPlatformDialogHelper::ButtonRole role) -{ - Q_D(QQuickDialogButtonBoxAttached); - if (d->buttonRole == role) - return; - - d->buttonRole = role; - emit buttonRoleChanged(); -} - -QT_END_NAMESPACE |