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 {Delay button with progress indicator filling on long press}
25
26 DelayButton is a checkable button that incorporates a delay before the
27 button becomes \l {AbstractButton::}{checked} and the \l activated()
28 signal is emitted. This delay prevents accidental presses.
29
30 The current progress is expressed as a decimal value between \c 0.0
31 and \c 1.0. The time it takes for \l activated() to be emitted is
32 measured in milliseconds, and can be set with the \l delay property.
33
34 The progress is indicated by a progress indicator on the button.
35
36 \sa {Customizing DelayButton}, {Button Controls}
37*/
38
39/*!
40 \qmlsignal QtQuick.Controls::DelayButton::activated()
41
42 This signal is emitted when \l progress reaches \c 1.0.
43*/
44
46
48{
49 Q_DECLARE_PUBLIC(QQuickDelayButton)
50
51public:
55
56 QPalette defaultPalette() const override { return QQuickTheme::palette(QQuickTheme::Button); }
57
58 int delay = 300;
60 QQuickTransition *transition = nullptr;
62};
63
65{
66public:
67 QQuickDelayTransitionManager(QQuickDelayButton *button) : m_button(button) { }
68
69 void transition(QQuickTransition *transition, qreal progress);
70
71protected:
73
74private:
75 QQuickDelayButton *m_button = nullptr;
76};
77
78void QQuickDelayTransitionManager::transition(QQuickTransition *transition, qreal progress)
79{
80 qmlExecuteDeferred(transition);
81
82 QQmlProperty defaultTarget(m_button, QLatin1String("progress"));
83 QQmlListProperty<QQuickAbstractAnimation> animations = transition->animations();
84 const int count = animations.count(&animations);
85 for (int i = 0; i < count; ++i) {
86 QQuickAbstractAnimation *anim = animations.at(&animations, i);
87 anim->setDefaultTarget(defaultTarget);
88 }
89
90 QList<QQuickStateAction> actions;
91 actions << QQuickStateAction(m_button, QLatin1String("progress"), progress);
92 QQuickTransitionManager::transition(actions, transition, m_button);
93}
94
96{
97 if (qFuzzyCompare(m_button->progress(), qreal(1.0)))
98 emit m_button->activated();
99}
100
101void QQuickDelayButtonPrivate::beginTransition(qreal to)
102{
103 Q_Q(QQuickDelayButton);
104 if (!transition) {
105 q->setProgress(to);
107 return;
108 }
109
110 if (!transitionManager)
111 transitionManager.reset(new QQuickDelayTransitionManager(q));
112
113 transitionManager->transition(transition, to);
114}
115
117{
118 Q_Q(QQuickDelayButton);
119 if (qFuzzyCompare(progress, qreal(1.0)))
120 emit q->activated();
121}
122
124{
125 if (transitionManager)
126 transitionManager->cancel();
127}
128
129QQuickDelayButton::QQuickDelayButton(QQuickItem *parent)
130 : QQuickAbstractButton(*(new QQuickDelayButtonPrivate), parent)
131{
132 setCheckable(true);
133}
134
135/*!
136 \qmlproperty int QtQuick.Controls::DelayButton::delay
137
138 This property holds the time it takes (in milliseconds) for \l progress
139 to reach \c 1.0 and emit \l activated().
140
141 The default value is \c 3000 ms.
142*/
143int QQuickDelayButton::delay() const
144{
145 Q_D(const QQuickDelayButton);
146 return d->delay;
147}
148
149void QQuickDelayButton::setDelay(int delay)
150{
151 Q_D(QQuickDelayButton);
152 if (d->delay == delay)
153 return;
154
155 d->delay = delay;
156 emit delayChanged();
157}
158
159/*!
160 \qmlproperty real QtQuick.Controls::DelayButton::progress
161
162 This property holds the current progress as displayed by the progress
163 indicator, in the range \c 0.0 - \c 1.0.
164*/
165qreal QQuickDelayButton::progress() const
166{
167 Q_D(const QQuickDelayButton);
168 return d->progress;
169}
170
171void QQuickDelayButton::setProgress(qreal progress)
172{
173 Q_D(QQuickDelayButton);
174 if (qFuzzyCompare(d->progress, progress))
175 return;
176
177 d->progress = progress;
178 emit progressChanged();
179}
180
181/*!
182 \qmlproperty Transition QtQuick.Controls::DelayButton::transition
183
184 This property holds the transition that is applied on the \l progress
185 property when the button is pressed or released.
186*/
187QQuickTransition *QQuickDelayButton::transition() const
188{
189 Q_D(const QQuickDelayButton);
190 return d->transition;
191}
192
193void QQuickDelayButton::setTransition(QQuickTransition *transition)
194{
195 Q_D(QQuickDelayButton);
196 if (d->transition == transition)
197 return;
198
199 d->transition = transition;
200 emit transitionChanged();
201}
202
203void QQuickDelayButton::buttonChange(ButtonChange change)
204{
205 Q_D(QQuickDelayButton);
206 switch (change) {
207 case ButtonCheckedChange:
208 d->cancelTransition();
209 setProgress(d->checked ? 1.0 : 0.0);
210 break;
211 case ButtonPressedChanged:
212 if (!d->checked)
213 d->beginTransition(d->pressed ? 1.0 : 0.0);
214 break;
215 default:
216 QQuickAbstractButton::buttonChange(change);
217 break;
218 }
219}
220
221void QQuickDelayButton::nextCheckState()
222{
223 Q_D(QQuickDelayButton);
224 setChecked(!d->checked && qFuzzyCompare(d->progress, qreal(1.0)));
225}
226
227QFont QQuickDelayButton::defaultFont() const
228{
229 return QQuickTheme::font(QQuickTheme::Button);
230}
231
232QT_END_NAMESPACE
233
234#include "moc_qquickdelaybutton_p.cpp"
QScopedPointer< QQuickDelayTransitionManager > transitionManager
QPalette defaultPalette() const override
QQuickTransition * transition
void transition(QQuickTransition *transition, qreal progress)
QQuickDelayTransitionManager(QQuickDelayButton *button)
Combined button and popup list for selecting options.