Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
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
5
#
include
"qquickdelaybutton_p.h"
6
#
include
"qquickabstractbutton_p_p.h"
7
8
#
include
<
QtQuick
/
private
/
qquickanimation_p
.
h
>
9
#
include
<
QtQuick
/
private
/
qquicktransition_p
.
h
>
10
#
include
<
QtQuick
/
private
/
qquicktransitionmanager_p_p
.
h
>
11
12
QT_BEGIN_NAMESPACE
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
45
class
QQuickDelayTransitionManager
;
46
47
class
QQuickDelayButtonPrivate
:
public
QQuickAbstractButtonPrivate
48
{
49
Q_DECLARE_PUBLIC(QQuickDelayButton)
50
51
public
:
52
void
beginTransition
(
qreal
to
);
53
void
finishTransition
();
54
void
cancelTransition
();
55
56
QPalette
defaultPalette
()
const
override
{
return
QQuickTheme::palette(QQuickTheme::Button); }
57
58
int
delay
= 300;
59
qreal
progress
= 0.0;
60
QQuickTransition *
transition
=
nullptr
;
61
QScopedPointer
<
QQuickDelayTransitionManager
>
transitionManager
;
62
};
63
64
class
QQuickDelayTransitionManager
:
public
QQuickTransitionManager
65
{
66
public
:
67
QQuickDelayTransitionManager
(QQuickDelayButton *button) :
m_button
(
button
) { }
68
69
void
transition
(QQuickTransition *transition, qreal progress);
70
71
protected
:
72
void
finished
()
override
;
73
74
private
:
75
QQuickDelayButton *m_button =
nullptr
;
76
};
77
78
void
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
95
void
QQuickDelayTransitionManager
::
finished
()
96
{
97
if
(qFuzzyCompare(m_button->progress(), qreal(1.0)))
98
emit m_button->activated();
99
}
100
101
void
QQuickDelayButtonPrivate
::beginTransition(qreal to)
102
{
103
Q_Q(QQuickDelayButton);
104
if
(!
transition
) {
105
q->setProgress(to);
106
finishTransition
(
)
;
107
return
;
108
}
109
110
if
(!transitionManager)
111
transitionManager.reset(
new
QQuickDelayTransitionManager(q));
112
113
transitionManager->transition(transition, to);
114
}
115
116
void
QQuickDelayButtonPrivate
::
finishTransition
()
117
{
118
Q_Q(QQuickDelayButton);
119
if
(qFuzzyCompare(progress, qreal(1.0)))
120
emit q->activated();
121
}
122
123
void
QQuickDelayButtonPrivate
::
cancelTransition
()
124
{
125
if
(transitionManager)
126
transitionManager->cancel();
127
}
128
129
QQuickDelayButton::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
*/
147
int
QQuickDelayButton::delay()
const
148
{
149
Q_D(
const
QQuickDelayButton);
150
return
d->delay;
151
}
152
153
void
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
*/
169
qreal QQuickDelayButton::progress()
const
170
{
171
Q_D(
const
QQuickDelayButton);
172
return
d->progress;
173
}
174
175
void
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
*/
191
QQuickTransition *QQuickDelayButton::transition()
const
192
{
193
Q_D(
const
QQuickDelayButton);
194
return
d->transition;
195
}
196
197
void
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
207
void
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
225
void
QQuickDelayButton::nextCheckState()
226
{
227
Q_D(QQuickDelayButton);
228
setChecked(!d->checked && qFuzzyCompare(d->progress, qreal(1.0)));
229
}
230
231
QFont QQuickDelayButton::defaultFont()
const
232
{
233
return
QQuickTheme::font(QQuickTheme::Button);
234
}
235
236
QT_END_NAMESPACE
237
238
#
include
"moc_qquickdelaybutton_p.cpp"
QQuickDelayButtonPrivate
Definition
qquickdelaybutton.cpp:48
QQuickDelayButtonPrivate::transitionManager
QScopedPointer< QQuickDelayTransitionManager > transitionManager
Definition
qquickdelaybutton.cpp:61
QQuickDelayButtonPrivate::delay
int delay
Definition
qquickdelaybutton.cpp:58
QQuickDelayButtonPrivate::progress
qreal progress
Definition
qquickdelaybutton.cpp:59
QQuickDelayButtonPrivate::defaultPalette
QPalette defaultPalette() const override
Definition
qquickdelaybutton.cpp:56
QQuickDelayButtonPrivate::cancelTransition
void cancelTransition()
Definition
qquickdelaybutton.cpp:123
QQuickDelayButtonPrivate::transition
QQuickTransition * transition
Definition
qquickdelaybutton.cpp:60
QQuickDelayButtonPrivate::finishTransition
void finishTransition()
Definition
qquickdelaybutton.cpp:116
QQuickDelayTransitionManager
Definition
qquickdelaybutton.cpp:65
QQuickDelayTransitionManager::finished
void finished() override
Definition
qquickdelaybutton.cpp:95
QQuickDelayTransitionManager::transition
void transition(QQuickTransition *transition, qreal progress)
Definition
qquickdelaybutton.cpp:78
QQuickDelayTransitionManager::QQuickDelayTransitionManager
QQuickDelayTransitionManager(QQuickDelayButton *button)
Definition
qquickdelaybutton.cpp:67
QT_BEGIN_NAMESPACE
Combined button and popup list for selecting options.
Definition
qsequentialanimationgroup.cpp:47
qtdeclarative
src
quicktemplates
qquickdelaybutton.cpp
Generated on
for Qt by
1.18.0