1// Copyright (C) 2020 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#include "qquickindicatorbutton_p.h"
4#include "qquickdeferredexecute_p_p.h"
5#include "qquickcontrol_p_p.h"
6
7QT_BEGIN_NAMESPACE
8
9class QQuickIndicatorButton;
10
11void QQuickIndicatorButtonPrivate::cancelIndicator()
12{
13 Q_Q(QQuickIndicatorButton);
14 quickCancelDeferred(object: q, property: indicatorName());
15}
16
17void QQuickIndicatorButtonPrivate::executeIndicator(bool complete)
18{
19 Q_Q(QQuickIndicatorButton);
20 if (indicator.wasExecuted())
21 return;
22
23 if (!indicator || complete)
24 quickBeginDeferred(object: q, property: indicatorName(), delegate&: indicator);
25 if (complete)
26 quickCompleteDeferred(object: q, property: indicatorName(), delegate&: indicator);
27}
28
29QQuickIndicatorButton::QQuickIndicatorButton(QObject *parent)
30 : QObject(*(new QQuickIndicatorButtonPrivate), parent)
31{
32}
33
34QQuickIndicatorButton::~QQuickIndicatorButton()
35{
36 Q_D(QQuickIndicatorButton);
37 QQuickControl *parentControl = static_cast<QQuickControl *>(parent());
38 if (parentControl)
39 QQuickControlPrivate::get(control: parentControl)->removeImplicitSizeListener(item: d->indicator);
40}
41
42bool QQuickIndicatorButton::isPressed() const
43{
44 Q_D(const QQuickIndicatorButton);
45 return d->pressed;
46}
47
48void QQuickIndicatorButton::setPressed(bool pressed)
49{
50 Q_D(QQuickIndicatorButton);
51 if (d->pressed == pressed)
52 return;
53
54 d->pressed = pressed;
55 emit pressedChanged();
56}
57
58QQuickItem *QQuickIndicatorButton::indicator() const
59{
60 QQuickIndicatorButtonPrivate *d = const_cast<QQuickIndicatorButtonPrivate *>(d_func());
61 if (!d->indicator)
62 d->executeIndicator();
63 return d->indicator;
64}
65
66void QQuickIndicatorButton::setIndicator(QQuickItem *indicator)
67{
68 Q_D(QQuickIndicatorButton);
69 if (d->indicator == indicator)
70 return;
71
72 if (!d->indicator.isExecuting())
73 d->cancelIndicator();
74
75 const qreal oldImplicitIndicatorWidth = implicitIndicatorWidth();
76 const qreal oldImplicitIndicatorHeight = implicitIndicatorHeight();
77
78 QQuickControl *par = static_cast<QQuickControl *>(parent());
79 QQuickControlPrivate::warnIfCustomizationNotSupported(control: par, item: indicator, QStringLiteral("indicator"));
80
81 QQuickControlPrivate::get(control: par)->removeImplicitSizeListener(item: d->indicator);
82 QQuickControlPrivate::hideOldItem(item: d->indicator);
83 d->indicator = indicator;
84
85 if (indicator) {
86 if (!indicator->parentItem())
87 indicator->setParentItem(par);
88 QQuickControlPrivate::get(control: par)->addImplicitSizeListener(item: indicator);
89 }
90
91 if (!qFuzzyCompare(p1: oldImplicitIndicatorWidth, p2: implicitIndicatorWidth()))
92 emit implicitIndicatorWidthChanged();
93 if (!qFuzzyCompare(p1: oldImplicitIndicatorHeight, p2: implicitIndicatorHeight()))
94 emit implicitIndicatorHeightChanged();
95 if (!d->indicator.isExecuting())
96 emit indicatorChanged();
97}
98
99bool QQuickIndicatorButton::isHovered() const
100{
101 Q_D(const QQuickIndicatorButton);
102 return d->hovered;
103}
104
105void QQuickIndicatorButton::setHovered(bool hovered)
106{
107 Q_D(QQuickIndicatorButton);
108 if (d->hovered == hovered)
109 return;
110
111 d->hovered = hovered;
112 emit hoveredChanged();
113}
114
115qreal QQuickIndicatorButton::implicitIndicatorWidth() const
116{
117 Q_D(const QQuickIndicatorButton);
118 if (!d->indicator)
119 return 0;
120 return d->indicator->implicitWidth();
121}
122
123qreal QQuickIndicatorButton::implicitIndicatorHeight() const
124{
125 Q_D(const QQuickIndicatorButton);
126 if (!d->indicator)
127 return 0;
128 return d->indicator->implicitHeight();
129}
130
131QT_END_NAMESPACE
132
133#include "moc_qquickindicatorbutton_p.cpp"
134

source code of qtdeclarative/src/quicktemplates/qquickindicatorbutton_p.cpp