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 Q_D(QQuickDelayButton);
133 setCheckable(true);
134 // DelayButton is designed to be pressed and held, not clicked, so a
135 // keyboard mnemonic shortcut doesn't make sense for it.
136 d->setMnemonicEnabled(false);
137}
138
139/*!
140 \qmlproperty int QtQuick.Controls::DelayButton::delay
141
142 This property holds the time it takes (in milliseconds) for \l progress
143 to reach \c 1.0 and emit \l activated().
144
145 The default value is \c 3000 ms.
146*/
147int QQuickDelayButton::delay() const
148{
149 Q_D(const QQuickDelayButton);
150 return d->delay;
151}
152
153void QQuickDelayButton::setDelay(int delay)
154{
155 Q_D(QQuickDelayButton);
156 if (d->delay == delay)
157 return;
158
159 d->delay = delay;
160 emit delayChanged();
161}
162
163/*!
164 \qmlproperty real QtQuick.Controls::DelayButton::progress
165
166 This property holds the current progress as displayed by the progress
167 indicator, in the range \c 0.0 - \c 1.0.
168*/
169qreal QQuickDelayButton::progress() const
170{
171 Q_D(const QQuickDelayButton);
172 return d->progress;
173}
174
175void QQuickDelayButton::setProgress(qreal progress)
176{
177 Q_D(QQuickDelayButton);
178 if (qFuzzyCompare(d->progress, progress))
179 return;
180
181 d->progress = progress;
182 emit progressChanged();
183}
184
185/*!
186 \qmlproperty Transition QtQuick.Controls::DelayButton::transition
187
188 This property holds the transition that is applied on the \l progress
189 property when the button is pressed or released.
190*/
191QQuickTransition *QQuickDelayButton::transition() const
192{
193 Q_D(const QQuickDelayButton);
194 return d->transition;
195}
196
197void QQuickDelayButton::setTransition(QQuickTransition *transition)
198{
199 Q_D(QQuickDelayButton);
200 if (d->transition == transition)
201 return;
202
203 d->transition = transition;
204 emit transitionChanged();
205}
206
207void QQuickDelayButton::buttonChange(ButtonChange change)
208{
209 Q_D(QQuickDelayButton);
210 switch (change) {
211 case ButtonCheckedChange:
212 d->cancelTransition();
213 setProgress(d->checked ? 1.0 : 0.0);
214 break;
215 case ButtonPressedChanged:
216 if (!d->checked)
217 d->beginTransition(d->pressed ? 1.0 : 0.0);
218 break;
219 default:
220 QQuickAbstractButton::buttonChange(change);
221 break;
222 }
223}
224
225void QQuickDelayButton::nextCheckState()
226{
227 Q_D(QQuickDelayButton);
228 setChecked(!d->checked && qFuzzyCompare(d->progress, qreal(1.0)));
229}
230
231QFont QQuickDelayButton::defaultFont() const
232{
233 return QQuickTheme::font(QQuickTheme::Button);
234}
235
236QT_END_NAMESPACE
237
238#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.