Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qquickdelaybutton.cpp
Go to the documentation of this file.
1// Copyright (C) 2017 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
7
8#include <QtQuick/private/qquickanimation_p.h>
9#include <QtQuick/private/qquicktransition_p.h>
10#include <QtQuick/private/qquicktransitionmanager_p_p.h>
11
13
14/*!
15 \qmltype DelayButton
16 \inherits AbstractButton
17//! \nativetype QQuickDelayButton
18 \inqmlmodule QtQuick.Controls
19 \since 5.9
20 \ingroup qtquickcontrols-buttons
21 \brief Check button that triggers when held down long enough.
22
23 \image qtquickcontrols-delaybutton.gif
24
25 DelayButton is a checkable button that incorporates a delay before the
26 button becomes \l {AbstractButton::}{checked} and the \l activated()
27 signal is emitted. This delay prevents accidental presses.
28
29 The current progress is expressed as a decimal value between \c 0.0
30 and \c 1.0. The time it takes for \l activated() to be emitted is
31 measured in milliseconds, and can be set with the \l delay property.
32
33 The progress is indicated by a progress indicator on the button.
34
35 \sa {Customizing DelayButton}, {Button Controls}
36*/
37
38/*!
39 \qmlsignal QtQuick.Controls::DelayButton::activated()
40
41 This signal is emitted when \l progress reaches \c 1.0.
42*/
43
45
47{
48 Q_DECLARE_PUBLIC(QQuickDelayButton)
49
50public:
54
55 QPalette defaultPalette() const override { return QQuickTheme::palette(QQuickTheme::Button); }
56
57 int delay = 300;
59 QQuickTransition *transition = nullptr;
61};
62
64{
65public:
66 QQuickDelayTransitionManager(QQuickDelayButton *button) : m_button(button) { }
67
68 void transition(QQuickTransition *transition, qreal progress);
69
70protected:
72
73private:
74 QQuickDelayButton *m_button = nullptr;
75};
76
77void QQuickDelayTransitionManager::transition(QQuickTransition *transition, qreal progress)
78{
79 qmlExecuteDeferred(transition);
80
81 QQmlProperty defaultTarget(m_button, QLatin1String("progress"));
82 QQmlListProperty<QQuickAbstractAnimation> animations = transition->animations();
83 const int count = animations.count(&animations);
84 for (int i = 0; i < count; ++i) {
85 QQuickAbstractAnimation *anim = animations.at(&animations, i);
86 anim->setDefaultTarget(defaultTarget);
87 }
88
89 QList<QQuickStateAction> actions;
90 actions << QQuickStateAction(m_button, QLatin1String("progress"), progress);
91 QQuickTransitionManager::transition(actions, transition, m_button);
92}
93
95{
96 if (qFuzzyCompare(m_button->progress(), qreal(1.0)))
97 emit m_button->activated();
98}
99
100void QQuickDelayButtonPrivate::beginTransition(qreal to)
101{
102 Q_Q(QQuickDelayButton);
103 if (!transition) {
104 q->setProgress(to);
106 return;
107 }
108
109 if (!transitionManager)
110 transitionManager.reset(new QQuickDelayTransitionManager(q));
111
112 transitionManager->transition(transition, to);
113}
114
116{
117 Q_Q(QQuickDelayButton);
118 if (qFuzzyCompare(progress, qreal(1.0)))
119 emit q->activated();
120}
121
123{
124 if (transitionManager)
125 transitionManager->cancel();
126}
127
128QQuickDelayButton::QQuickDelayButton(QQuickItem *parent)
129 : QQuickAbstractButton(*(new QQuickDelayButtonPrivate), parent)
130{
131 setCheckable(true);
132}
133
134/*!
135 \qmlproperty int QtQuick.Controls::DelayButton::delay
136
137 This property holds the time it takes (in milliseconds) for \l progress
138 to reach \c 1.0 and emit \l activated().
139
140 The default value is \c 3000 ms.
141*/
142int QQuickDelayButton::delay() const
143{
144 Q_D(const QQuickDelayButton);
145 return d->delay;
146}
147
148void QQuickDelayButton::setDelay(int delay)
149{
150 Q_D(QQuickDelayButton);
151 if (d->delay == delay)
152 return;
153
154 d->delay = delay;
155 emit delayChanged();
156}
157
158/*!
159 \qmlproperty real QtQuick.Controls::DelayButton::progress
160
161 This property holds the current progress as displayed by the progress
162 indicator, in the range \c 0.0 - \c 1.0.
163*/
164qreal QQuickDelayButton::progress() const
165{
166 Q_D(const QQuickDelayButton);
167 return d->progress;
168}
169
170void QQuickDelayButton::setProgress(qreal progress)
171{
172 Q_D(QQuickDelayButton);
173 if (qFuzzyCompare(d->progress, progress))
174 return;
175
176 d->progress = progress;
177 emit progressChanged();
178}
179
180/*!
181 \qmlproperty Transition QtQuick.Controls::DelayButton::transition
182
183 This property holds the transition that is applied on the \l progress
184 property when the button is pressed or released.
185*/
186QQuickTransition *QQuickDelayButton::transition() const
187{
188 Q_D(const QQuickDelayButton);
189 return d->transition;
190}
191
192void QQuickDelayButton::setTransition(QQuickTransition *transition)
193{
194 Q_D(QQuickDelayButton);
195 if (d->transition == transition)
196 return;
197
198 d->transition = transition;
199 emit transitionChanged();
200}
201
202void QQuickDelayButton::buttonChange(ButtonChange change)
203{
204 Q_D(QQuickDelayButton);
205 switch (change) {
206 case ButtonCheckedChange:
207 d->cancelTransition();
208 setProgress(d->checked ? 1.0 : 0.0);
209 break;
210 case ButtonPressedChanged:
211 if (!d->checked)
212 d->beginTransition(d->pressed ? 1.0 : 0.0);
213 break;
214 default:
215 QQuickAbstractButton::buttonChange(change);
216 break;
217 }
218}
219
220void QQuickDelayButton::nextCheckState()
221{
222 Q_D(QQuickDelayButton);
223 setChecked(!d->checked && qFuzzyCompare(d->progress, qreal(1.0)));
224}
225
226QFont QQuickDelayButton::defaultFont() const
227{
228 return QQuickTheme::font(QQuickTheme::Button);
229}
230
231QT_END_NAMESPACE
232
233#include "moc_qquickdelaybutton_p.cpp"
QScopedPointer< QQuickDelayTransitionManager > transitionManager
QPalette defaultPalette() const override
QQuickTransition * transition
void transition(QQuickTransition *transition, qreal progress)
QQuickDelayTransitionManager(QQuickDelayButton *button)