diff options
author | Liang Qi <liang.qi@qt.io> | 2018-01-09 21:52:12 +0100 |
---|---|---|
committer | Liang Qi <liang.qi@qt.io> | 2018-01-09 21:54:50 +0100 |
commit | ef5e426bed3b1362394c7cc0c97522bb20cacff0 (patch) | |
tree | 0450da77b661d2e97eb7628b4c667ee22c6dc443 /src/quicktemplates2/qquickabstractbutton.cpp | |
parent | 2cdec3eadc7ac1d1e5c4cd505b60196e44df1a7d (diff) | |
parent | 10b8f6af42a1cd80273d0a2d36e75b79078b5994 (diff) |
Merge remote-tracking branch 'origin/5.10' into dev
Conflicts:
.qmake.conf
src/quicktemplates2/qquickabstractbutton_p.h
Change-Id: I265cbd2ce51beaf2afef99292c2e2798dadb4ba3
Diffstat (limited to 'src/quicktemplates2/qquickabstractbutton.cpp')
-rw-r--r-- | src/quicktemplates2/qquickabstractbutton.cpp | 97 |
1 files changed, 77 insertions, 20 deletions
diff --git a/src/quicktemplates2/qquickabstractbutton.cpp b/src/quicktemplates2/qquickabstractbutton.cpp index 9e1a2502..b8c6eb84 100644 --- a/src/quicktemplates2/qquickabstractbutton.cpp +++ b/src/quicktemplates2/qquickabstractbutton.cpp @@ -40,6 +40,7 @@ #include "qquickaction_p.h" #include "qquickaction_p_p.h" #include "qquickshortcutcontext_p_p.h" +#include "qquickdeferredexecute_p_p.h" #include <QtGui/qstylehints.h> #include <QtGui/qguiapplication.h> @@ -117,7 +118,8 @@ static const int AUTO_REPEAT_INTERVAL = 100; */ QQuickAbstractButtonPrivate::QQuickAbstractButtonPrivate() - : down(false), + : explicitText(false), + down(false), explicitDown(false), pressed(false), keepPressed(false), @@ -305,6 +307,27 @@ void QQuickAbstractButtonPrivate::ungrabShortcut() } #endif +void QQuickAbstractButtonPrivate::actionTextChange() +{ + Q_Q(QQuickAbstractButton); + if (explicitText) + return; + + q->buttonChange(QQuickAbstractButton::ButtonTextChange); +} + +void QQuickAbstractButtonPrivate::setText(const QString &newText, bool isExplicit) +{ + Q_Q(QQuickAbstractButton); + const QString oldText = q->text(); + explicitText = isExplicit; + text = newText; + if (oldText == q->text()) + return; + + q->buttonChange(QQuickAbstractButton::ButtonTextChange); +} + void QQuickAbstractButtonPrivate::click() { Q_Q(QQuickAbstractButton); @@ -316,7 +339,7 @@ void QQuickAbstractButtonPrivate::trigger() { Q_Q(QQuickAbstractButton); if (action && action->isEnabled()) - action->trigger(q); // -> click() + QQuickActionPrivate::get(action)->trigger(q, false); else if (effectiveEnable) emit q->clicked(); } @@ -330,6 +353,20 @@ void QQuickAbstractButtonPrivate::toggle(bool value) emit q->toggled(); } +static inline QString indicatorName() { return QStringLiteral("indicator"); } + +void QQuickAbstractButtonPrivate::executeIndicator(bool complete) +{ + Q_Q(QQuickControl); + if (indicator.wasExecuted()) + return; + + if (!indicator) + quickBeginDeferred(q, indicatorName(), indicator); + if (complete) + quickCompleteDeferred(q, indicatorName(), indicator); +} + QQuickAbstractButton *QQuickAbstractButtonPrivate::findCheckedButton() const { Q_Q(const QQuickAbstractButton); @@ -418,23 +455,19 @@ QQuickAbstractButton::~QQuickAbstractButton() QString QQuickAbstractButton::text() const { Q_D(const QQuickAbstractButton); - return d->text; + return d->explicitText || !d->action ? d->text : d->action->text(); } void QQuickAbstractButton::setText(const QString &text) { Q_D(QQuickAbstractButton); - if (d->text == text) - return; - -#if QT_CONFIG(shortcut) - setShortcut(QKeySequence::mnemonic(text)); -#endif + d->setText(text, true); +} - d->text = text; - setAccessibleName(d->text); - buttonChange(ButtonTextChange); - emit textChanged(); +void QQuickAbstractButton::resetText() +{ + Q_D(QQuickAbstractButton); + d->setText(QString(), false); } /*! @@ -637,7 +670,9 @@ void QQuickAbstractButton::setAutoRepeat(bool repeat) */ QQuickItem *QQuickAbstractButton::indicator() const { - Q_D(const QQuickAbstractButton); + QQuickAbstractButtonPrivate *d = const_cast<QQuickAbstractButtonPrivate *>(d_func()); + if (!d->indicator) + d->executeIndicator(); return d->indicator; } @@ -647,14 +682,15 @@ void QQuickAbstractButton::setIndicator(QQuickItem *indicator) if (d->indicator == indicator) return; - QQuickControlPrivate::destroyDelegate(d->indicator, this); + delete d->indicator; d->indicator = indicator; if (indicator) { if (!indicator->parentItem()) indicator->setParentItem(this); indicator->setAcceptedMouseButtons(Qt::LeftButton); } - emit indicatorChanged(); + if (!d->indicator.isExecuting()) + emit indicatorChanged(); } /*! @@ -740,11 +776,13 @@ void QQuickAbstractButton::setAction(QQuickAction *action) if (d->action == action) return; + const QString oldText = text(); + if (QQuickAction *oldAction = d->action.data()) { QQuickActionPrivate::get(oldAction)->unregisterItem(this); QObjectPrivate::disconnect(oldAction, &QQuickAction::triggered, d, &QQuickAbstractButtonPrivate::click); + QObjectPrivate::disconnect(oldAction, &QQuickAction::textChanged, d, &QQuickAbstractButtonPrivate::actionTextChange); - disconnect(oldAction, &QQuickAction::textChanged, this, &QQuickAbstractButton::setText); disconnect(oldAction, &QQuickAction::iconChanged, this, &QQuickAbstractButton::setIcon); disconnect(oldAction, &QQuickAction::checkedChanged, this, &QQuickAbstractButton::setChecked); disconnect(oldAction, &QQuickAction::checkableChanged, this, &QQuickAbstractButton::setCheckable); @@ -754,8 +792,8 @@ void QQuickAbstractButton::setAction(QQuickAction *action) if (action) { QQuickActionPrivate::get(action)->registerItem(this); QObjectPrivate::connect(action, &QQuickAction::triggered, d, &QQuickAbstractButtonPrivate::click); + QObjectPrivate::connect(action, &QQuickAction::textChanged, d, &QQuickAbstractButtonPrivate::actionTextChange); - connect(action, &QQuickAction::textChanged, this, &QQuickAbstractButton::setText); connect(action, &QQuickAction::iconChanged, this, &QQuickAbstractButton::setIcon); connect(action, &QQuickAction::checkedChanged, this, &QQuickAbstractButton::setChecked); connect(action, &QQuickAction::checkableChanged, this, &QQuickAbstractButton::setCheckable); @@ -783,13 +821,16 @@ void QQuickAbstractButton::setAction(QQuickAction *action) if (color != Qt::transparent) d->icon.setColor(color); - setText(action->text()); setChecked(action->isChecked()); setCheckable(action->isCheckable()); setEnabled(action->isEnabled()); } d->action = action; + + if (oldText != text()) + buttonChange(ButtonTextChange); + emit actionChanged(); } @@ -908,6 +949,13 @@ void QQuickAbstractButton::toggle() setChecked(!d->checked); } +void QQuickAbstractButton::componentComplete() +{ + Q_D(QQuickAbstractButton); + d->executeIndicator(true); + QQuickControl::componentComplete(); +} + bool QQuickAbstractButton::event(QEvent *event) { Q_D(QQuickAbstractButton); @@ -1019,6 +1067,15 @@ void QQuickAbstractButton::buttonChange(ButtonChange change) button->setChecked(false); } break; + case ButtonTextChange: { + const QString txt = text(); + setAccessibleName(txt); +#if QT_CONFIG(shortcut) + setShortcut(QKeySequence::mnemonic(txt)); +#endif + emit textChanged(); + break; + } default: break; } @@ -1038,7 +1095,7 @@ void QQuickAbstractButton::accessibilityActiveChanged(bool active) Q_D(QQuickAbstractButton); if (active) { - setAccessibleName(d->text); + setAccessibleName(text()); setAccessibleProperty("pressed", d->pressed); setAccessibleProperty("checked", d->checked); setAccessibleProperty("checkable", d->checkable); |