aboutsummaryrefslogtreecommitdiffstats
path: root/src/quicktemplates2/qquickabstractbutton.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/quicktemplates2/qquickabstractbutton.cpp')
-rw-r--r--src/quicktemplates2/qquickabstractbutton.cpp218
1 files changed, 214 insertions, 4 deletions
diff --git a/src/quicktemplates2/qquickabstractbutton.cpp b/src/quicktemplates2/qquickabstractbutton.cpp
index 0207d2f9..350a196e 100644
--- a/src/quicktemplates2/qquickabstractbutton.cpp
+++ b/src/quicktemplates2/qquickabstractbutton.cpp
@@ -37,6 +37,8 @@
#include "qquickabstractbutton_p.h"
#include "qquickabstractbutton_p_p.h"
#include "qquickbuttongroup_p.h"
+#include "qquickaction_p.h"
+#include "qquickaction_p_p.h"
#include <QtGui/qstylehints.h>
#include <QtGui/qguiapplication.h>
@@ -63,6 +65,56 @@ static const int AUTO_REPEAT_INTERVAL = 100;
radio buttons and check boxes. As an abstract control, it has no delegate
implementations, leaving them to the types that derive from it.
+ \section2 Button Icons
+
+ AbstractButton provides the following properties through which icons can
+ be set:
+
+ \list
+ \li \l icon.name
+ \li \l icon.source
+ \li \l icon.width
+ \li \l icon.height
+ \li \l icon.color
+ \endlist
+
+ For applications that target platforms that support both
+ \l {QIcon::fromTheme()}{theme icons} and regular icons,
+ both \l icon.name and \l icon.source can be set to ensure that an icon will
+ always be found. If the icon is found in the theme, it will always be used;
+ even if \l icon.source is also set. If the icon is not found,
+ \l icon.source will be used instead.
+
+ \code
+ Button {
+ icon.name: "edit-cut"
+ icon.source: "qrc:/icons/edit-cut.png"
+ }
+ \endcode
+
+ Each \l {Styling Qt Quick Controls 2}{style} sets a default icon size and
+ color according to their guidelines, but it is possible to override these
+ by setting the \l icon.width, \l icon.height, and \l icon.color properties.
+
+ The image that is loaded by an icon whose \c width and \c height are not set
+ depends on the type of icon in use. For theme icons, the closest available
+ size will be chosen. For regular icons, the behavior is the same as the
+ \l {Image::}{sourceSize} property of \l Image.
+
+ The icon color is specified by default so that it matches the text color in
+ different states. In order to use an icon with the original colors, set the
+ color to \c "transparent".
+
+ \code
+ Button {
+ icon.color: "transparent"
+ icon.source: "qrc:/icons/logo.png"
+ }
+ \endcode
+
+ The \l display property can be used to control how the icon and text are
+ displayed within the button.
+
\sa ButtonGroup, {Button Controls}
*/
@@ -126,7 +178,9 @@ QQuickAbstractButtonPrivate::QQuickAbstractButtonPrivate()
repeatTimer(0),
pressButtons(Qt::NoButton),
indicator(nullptr),
- group(nullptr)
+ group(nullptr),
+ display(QQuickAbstractButton::TextBesideIcon),
+ action(nullptr)
{
}
@@ -173,7 +227,7 @@ void QQuickAbstractButtonPrivate::handleRelease(const QPointF &point)
if (wasPressed) {
emit q->released();
if (!wasHeld)
- emit q->clicked();
+ trigger();
} else {
emit q->canceled();
}
@@ -249,6 +303,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);
@@ -453,6 +523,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();
@@ -486,6 +558,8 @@ void QQuickAbstractButton::setCheckable(bool checkable)
return;
d->checkable = checkable;
+ if (d->action)
+ d->action->setCheckable(checkable);
setAccessibleProperty("checkable", checkable);
buttonChange(ButtonCheckableChange);
emit checkableChanged();
@@ -566,6 +640,142 @@ void QQuickAbstractButton::setIndicator(QQuickItem *indicator)
}
/*!
+ \qmlpropertygroup QtQuick.Controls::AbstractButton::icon
+ \qmlproperty string QtQuick.Controls::AbstractButton::icon.name
+ \qmlproperty url QtQuick.Controls::AbstractButton::icon.source
+ \qmlproperty int QtQuick.Controls::AbstractButton::icon.width
+ \qmlproperty int QtQuick.Controls::AbstractButton::icon.height
+ \qmlproperty color QtQuick.Controls::AbstractButton::icon.color
+
+ This property group was added in QtQuick.Controls 2.3.
+
+ \include qquickicon.qdocinc grouped-properties
+
+ \sa {Button Icons}
+*/
+
+QQuickIcon QQuickAbstractButton::icon() const
+{
+ Q_D(const QQuickAbstractButton);
+ return d->icon;
+}
+
+void QQuickAbstractButton::setIcon(const QQuickIcon &icon)
+{
+ Q_D(QQuickAbstractButton);
+ if (d->icon == icon)
+ return;
+
+ d->icon = icon;
+ emit iconChanged();
+}
+
+/*!
+ \since QtQuick.Controls 2.3
+ \qmlproperty enumeration QtQuick.Controls::AbstractButton::display
+
+ This property determines how the \l icon and \l text are displayed within
+ the button.
+
+ \table
+ \header \li Display \li Result
+ \row \li \c AbstractButton.IconOnly \li \image qtquickcontrols2-button-icononly.png
+ \row \li \c AbstractButton.TextOnly \li \image qtquickcontrols2-button-textonly.png
+ \row \li \c AbstractButton.TextBesideIcon \li \image qtquickcontrols2-button-textbesideicon.png
+ \endtable
+
+ \sa {Control::}{spacing}, {Control::}{padding}
+*/
+QQuickAbstractButton::Display QQuickAbstractButton::display() const
+{
+ Q_D(const QQuickAbstractButton);
+ return d->display;
+}
+
+void QQuickAbstractButton::setDisplay(Display display)
+{
+ Q_D(QQuickAbstractButton);
+ if (display == d->display)
+ return;
+
+ d->display = display;
+ emit displayChanged();
+}
+
+/*!
+ \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::iconChanged, this, &QQuickAbstractButton::setIcon);
+ disconnect(oldAction, &QQuickAction::checkedChanged, this, &QQuickAbstractButton::setChecked);
+ disconnect(oldAction, &QQuickAction::checkableChanged, this, &QQuickAbstractButton::setCheckable);
+ disconnect(oldAction, &QQuickAction::enabledChanged, this, &QQuickItem::setEnabled);
+ }
+
+ 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::iconChanged, this, &QQuickAbstractButton::setIcon);
+ connect(action, &QQuickAction::checkedChanged, this, &QQuickAbstractButton::setChecked);
+ connect(action, &QQuickAction::checkableChanged, this, &QQuickAbstractButton::setCheckable);
+ connect(action, &QQuickAction::enabledChanged, this, &QQuickItem::setEnabled);
+
+ QQuickIcon actionIcon = action->icon();
+
+ QString name = actionIcon.name();
+ if (!name.isEmpty())
+ d->icon.setName(name);
+
+ QUrl source = actionIcon.source();
+ if (!source.isEmpty())
+ d->icon.setSource(source);
+
+ int width = actionIcon.width();
+ if (width > 0)
+ d->icon.setWidth(width);
+
+ int height = actionIcon.height();
+ if (height)
+ d->icon.setHeight(height);
+
+ QColor color = actionIcon.color();
+ if (color != Qt::transparent)
+ d->icon.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.
@@ -609,7 +819,7 @@ void QQuickAbstractButton::keyReleaseEvent(QKeyEvent *event)
nextCheckState();
emit released();
- emit clicked();
+ d->trigger();
if (d->autoRepeat)
d->stopPressRepeat();
@@ -642,7 +852,7 @@ void QQuickAbstractButton::timerEvent(QTimerEvent *event)
d->startPressRepeat();
} else if (event->timerId() == d->repeatTimer) {
emit released();
- emit clicked();
+ d->trigger();
emit pressed();
}
}