aboutsummaryrefslogtreecommitdiffstats
path: root/src/quicktemplates2/qquickabstractbutton.cpp
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@qt.io>2017-03-02 11:43:51 +0100
committerJ-P Nurmi <jpnurmi@qt.io>2017-04-10 10:59:23 +0000
commit06672a7a459bf887845aa2bee2b61486a0409de2 (patch)
treee295d26495e04008f49addf55fd02ae888479518 /src/quicktemplates2/qquickabstractbutton.cpp
parent27850633dcf20ca2f89ef1491253b2d966a7af09 (diff)
Add AbstractButton::action
[ChangeLog][Controls][AbstractButton] Added AbstractButton::action property. Task-number: QTBUG-50705 Change-Id: I773459df336a9e0cb9dbf980471485f81bbdab71 Reviewed-by: J-P Nurmi <jpnurmi@qt.io>
Diffstat (limited to 'src/quicktemplates2/qquickabstractbutton.cpp')
-rw-r--r--src/quicktemplates2/qquickabstractbutton.cpp119
1 files changed, 115 insertions, 4 deletions
diff --git a/src/quicktemplates2/qquickabstractbutton.cpp b/src/quicktemplates2/qquickabstractbutton.cpp
index 11b5b308..7551ead0 100644
--- a/src/quicktemplates2/qquickabstractbutton.cpp
+++ b/src/quicktemplates2/qquickabstractbutton.cpp
@@ -38,6 +38,8 @@
#include "qquickabstractbutton_p_p.h"
#include "qquickbuttongroup_p.h"
#include "qquickicon_p.h"
+#include "qquickaction_p.h"
+#include "qquickaction_p_p.h"
#include <QtGui/qstylehints.h>
#include <QtGui/qguiapplication.h>
@@ -161,7 +163,8 @@ QQuickAbstractButtonPrivate::QQuickAbstractButtonPrivate()
indicator(nullptr),
group(nullptr),
icon(nullptr),
- display(QQuickAbstractButton::TextBesideIcon)
+ display(QQuickAbstractButton::TextBesideIcon),
+ action(nullptr)
{
}
@@ -207,7 +210,7 @@ void QQuickAbstractButtonPrivate::handleRelease(const QPointF &point)
if (wasPressed) {
emit q->released();
if (!wasHeld)
- emit q->clicked();
+ trigger();
} else {
emit q->canceled();
}
@@ -282,6 +285,22 @@ void QQuickAbstractButtonPrivate::stopPressRepeat()
}
}
+void QQuickAbstractButtonPrivate::click()
+{
+ Q_Q(QQuickAbstractButton);
+ if (effectiveEnable)
+ emit q->clicked();
+}
+
+void QQuickAbstractButtonPrivate::trigger()
+{
+ Q_Q(QQuickAbstractButton);
+ if (action && action->isEnabled())
+ action->trigger(q); // -> click()
+ else if (effectiveEnable)
+ emit q->clicked();
+}
+
void QQuickAbstractButtonPrivate::toggle(bool value)
{
Q_Q(QQuickAbstractButton);
@@ -486,6 +505,8 @@ void QQuickAbstractButton::setChecked(bool checked)
setCheckable(true);
d->checked = checked;
+ if (d->action)
+ d->action->setChecked(checked);
setAccessibleProperty("checked", checked);
buttonChange(ButtonCheckedChange);
emit checkedChanged();
@@ -519,6 +540,8 @@ void QQuickAbstractButton::setCheckable(bool checkable)
return;
d->checkable = checkable;
+ if (d->action)
+ d->action->setCheckable(checkable);
setAccessibleProperty("checkable", checkable);
buttonChange(ButtonCheckableChange);
emit checkableChanged();
@@ -654,6 +677,94 @@ void QQuickAbstractButton::setDisplay(Display display)
}
/*!
+ \since QtQuick.Controls 2.3
+ \qmlproperty Action QtQuick.Controls::AbstractButton::action
+
+ This property holds the button action.
+
+ \sa Action
+*/
+QQuickAction *QQuickAbstractButton::action() const
+{
+ Q_D(const QQuickAbstractButton);
+ return d->action;
+}
+
+void QQuickAbstractButton::setAction(QQuickAction *action)
+{
+ Q_D(QQuickAbstractButton);
+ if (d->action == action)
+ return;
+
+ if (QQuickAction *oldAction = d->action.data()) {
+ QQuickActionPrivate::get(oldAction)->unregisterItem(this);
+ QObjectPrivate::disconnect(oldAction, &QQuickAction::triggered, d, &QQuickAbstractButtonPrivate::click);
+
+ disconnect(oldAction, &QQuickAction::textChanged, this, &QQuickAbstractButton::setText);
+ disconnect(oldAction, &QQuickAction::checkedChanged, this, &QQuickAbstractButton::setChecked);
+ disconnect(oldAction, &QQuickAction::checkableChanged, this, &QQuickAbstractButton::setCheckable);
+ disconnect(oldAction, &QQuickAction::enabledChanged, this, &QQuickItem::setEnabled);
+
+ QQuickIcon *actionIcon = QQuickActionPrivate::get(oldAction)->icon;
+ if (actionIcon && d->icon) {
+ disconnect(actionIcon, &QQuickIcon::nameChanged, d->icon, &QQuickIcon::setName);
+ disconnect(actionIcon, &QQuickIcon::sourceChanged, d->icon, &QQuickIcon::setSource);
+ disconnect(actionIcon, &QQuickIcon::widthChanged, d->icon, &QQuickIcon::setWidth);
+ disconnect(actionIcon, &QQuickIcon::heightChanged, d->icon, &QQuickIcon::setHeight);
+ disconnect(actionIcon, &QQuickIcon::colorChanged, d->icon, &QQuickIcon::setColor);
+ }
+ }
+
+ if (action) {
+ QQuickActionPrivate::get(action)->registerItem(this);
+ QObjectPrivate::connect(action, &QQuickAction::triggered, d, &QQuickAbstractButtonPrivate::click);
+
+ connect(action, &QQuickAction::textChanged, this, &QQuickAbstractButton::setText);
+ connect(action, &QQuickAction::checkedChanged, this, &QQuickAbstractButton::setChecked);
+ connect(action, &QQuickAction::checkableChanged, this, &QQuickAbstractButton::setCheckable);
+ connect(action, &QQuickAction::enabledChanged, this, &QQuickItem::setEnabled);
+
+ QQuickIcon *actionIcon = QQuickActionPrivate::get(action)->icon;
+ if (actionIcon) {
+ QQuickIcon *buttonIcon = icon();
+ connect(actionIcon, &QQuickIcon::nameChanged, buttonIcon, &QQuickIcon::setName);
+ connect(actionIcon, &QQuickIcon::sourceChanged, buttonIcon, &QQuickIcon::setSource);
+ connect(actionIcon, &QQuickIcon::widthChanged, buttonIcon, &QQuickIcon::setWidth);
+ connect(actionIcon, &QQuickIcon::heightChanged, buttonIcon, &QQuickIcon::setHeight);
+ connect(actionIcon, &QQuickIcon::colorChanged, buttonIcon, &QQuickIcon::setColor);
+
+ QString name = actionIcon->name();
+ if (!name.isEmpty())
+ buttonIcon->setName(name);
+
+ QString source = actionIcon->source();
+ if (!source.isEmpty())
+ buttonIcon->setSource(source);
+
+ int width = actionIcon->width();
+ if (width > 0)
+ buttonIcon->setWidth(width);
+
+ int height = actionIcon->height();
+ if (height)
+ buttonIcon->setHeight(height);
+
+ QColor color = actionIcon->color();
+ if (color != Qt::transparent)
+ buttonIcon->setColor(color);
+ }
+
+ setText(action->text());
+ setChecked(action->isChecked());
+ setCheckable(action->isCheckable());
+ setEnabled(action->isEnabled());
+ }
+
+ d->action = action;
+ emit actionChanged();
+}
+
+/*!
\qmlmethod void QtQuick.Controls::AbstractButton::toggle()
Toggles the checked state of the button.
@@ -698,7 +809,7 @@ void QQuickAbstractButton::keyReleaseEvent(QKeyEvent *event)
nextCheckState();
emit released();
- emit clicked();
+ d->trigger();
if (d->autoRepeat)
d->stopPressRepeat();
@@ -752,7 +863,7 @@ void QQuickAbstractButton::timerEvent(QTimerEvent *event)
d->startPressRepeat();
} else if (event->timerId() == d->repeatTimer) {
emit released();
- emit clicked();
+ d->trigger();
emit pressed();
}
}