53 setLoopCount(Infinite);
56 m_borderPhases[0] = Phase( 500, -50, 0);
57 m_borderPhases[1] = Phase(1500, 0, 0);
58 m_borderPhases[2] = Phase(1000, 0, 100);
59 m_borderPhases[3] = Phase( 917, 100, 100);
61 m_ellipsePhases[0] = Phase(1000, 0, EllipseAnimationWellPosition);
62 m_ellipsePhases[1] = Phase(1000, EllipseAnimationWellPosition, EllipseAnimationWellPosition);
63 m_ellipsePhases[2] = Phase(1000, EllipseAnimationWellPosition, EllipseAnimationEndPosition);
64 m_ellipsePhases[3] = Phase(1000, EllipseAnimationWellPosition, EllipseAnimationEndPosition);
69 QSGRectangleNode *geometryNode =
static_cast<QSGRectangleNode *>(firstChild());
70 Q_ASSERT(!geometryNode || geometryNode->type() == QSGNode::GeometryNodeType);
74 QSGTransformNode *gridNode =
static_cast<QSGTransformNode *>(geometryNode->firstChild());
75 Q_ASSERT(!gridNode || gridNode->type() == QSGNode::TransformNodeType);
79 qreal width = geometryNode->rect().width();
81 qreal from = ContainerAnimationStartPosition;
82 qreal to = from + ContainerAnimationEndPosition * width;
84 qreal dx = from + (to - from) * progress;
87 matrix.translate(dx, 0);
88 gridNode->setMatrix(matrix);
92 QSGTransformNode *borderNode =
static_cast<QSGTransformNode *>(gridNode->firstChild());
94 Q_ASSERT(borderNode->type() == QSGNode::TransformNodeType);
96 QSGTransformNode *ellipseNode =
static_cast<QSGTransformNode *>(borderNode->firstChild());
97 Q_ASSERT(ellipseNode->type() == QSGNode::TransformNodeType);
99 QSGOpacityNode *opacityNode =
static_cast<QSGOpacityNode *>(ellipseNode->firstChild());
100 Q_ASSERT(opacityNode->type() == QSGNode::OpacityNodeType);
105 bool visible = time >= begin && time <= end;
106 opacityNode->setOpacity(visible ? 1.0 : 0.0);
110 int phaseIndex, remain = time, elapsed = 0;
111 for (phaseIndex = 0; phaseIndex <
QupbPhaseCount - 1; ++phaseIndex) {
112 if (remain <= m_borderPhases[phaseIndex].duration + begin)
114 remain -= m_borderPhases[phaseIndex].duration;
115 elapsed += m_borderPhases[phaseIndex].duration;
118 const Phase &phase = m_borderPhases[phaseIndex];
120 qreal pos = time - elapsed - begin;
121 qreal progress = pos / phase.duration;
122 qreal dx = phase.from + (phase.to - phase.from) * progress;
125 matrix.translate(dx, 0);
126 borderNode->setMatrix(matrix);
130 QEasingCurve curve(QEasingCurve::BezierSpline);
131 curve.addCubicBezierSegment(QPointF(0.4, 0.0), QPointF(0.6, 1.0), QPointF(1.0, 1.0));
133 int phaseIndex, remain = time, elapsed = 0;
134 for (phaseIndex = 0; phaseIndex <
QupbPhaseCount - 1; ++phaseIndex) {
135 if (remain <= m_ellipsePhases[phaseIndex].duration + begin)
137 remain -= m_ellipsePhases[phaseIndex].duration;
138 elapsed += m_ellipsePhases[phaseIndex].duration;
141 const Phase &phase = m_ellipsePhases[phaseIndex];
143 qreal from = phase.from * width;
144 qreal to = phase.to * width;
145 qreal pos = time - elapsed - begin;
146 qreal progress = curve.valueForProgress(pos / phase.duration);
147 qreal dx = from + (to - from) * progress;
150 matrix.translate(dx, 0);
151 ellipseNode->setMatrix(matrix);
155 borderNode =
static_cast<QSGTransformNode *>(borderNode->nextSibling());
162 QQuickUniversalProgressBar *bar =
static_cast<QQuickUniversalProgressBar *>(item);
163 if (m_indeterminate != bar->isIndeterminate()) {
164 m_indeterminate = bar->isIndeterminate();
171 QQuickItemPrivate *d = QQuickItemPrivate::get(item);
173 QRectF bounds = item->boundingRect();
174 bounds.setHeight(item->implicitHeight());
175 bounds.moveTop((item->height() - bounds.height()) / 2.0);
176 if (!m_indeterminate)
177 bounds.setWidth(bar->progress() * bounds.width());
179 QSGRectangleNode *geometryNode =
static_cast<QSGRectangleNode *>(firstChild());
181 geometryNode = item->window()->createRectangleNode();
182 appendChildNode(geometryNode);
184 geometryNode->setRect(bounds);
185 geometryNode->setColor(m_indeterminate ? Qt::transparent : bar->color());
187 if (!m_indeterminate) {
188 while (QSGNode *node = geometryNode->firstChild())
193 QSGTransformNode *gridNode =
static_cast<QSGTransformNode *>(geometryNode->firstChild());
195 gridNode =
new QSGTransformNode;
196 geometryNode->appendChildNode(gridNode);
198 Q_ASSERT(gridNode->type() == QSGNode::TransformNodeType);
200 QSGNode *borderNode = gridNode->firstChild();
203 borderNode =
new QSGTransformNode;
204 gridNode->appendChildNode(borderNode);
206 QSGTransformNode *ellipseNode =
new QSGTransformNode;
207 borderNode->appendChildNode(ellipseNode);
209 QSGOpacityNode *opacityNode =
new QSGOpacityNode;
210 ellipseNode->appendChildNode(opacityNode);
212 QSGInternalRectangleNode *rectNode = d->sceneGraphContext()->createInternalRectangleNode();
213 rectNode->setAntialiasing(
true);
214 rectNode->setRadius(EllipseDiameter / 2);
215 opacityNode->appendChildNode(rectNode);
217 Q_ASSERT(borderNode->type() == QSGNode::TransformNodeType);
219 QSGNode *ellipseNode = borderNode->firstChild();
220 Q_ASSERT(ellipseNode->type() == QSGNode::TransformNodeType);
222 QSGNode *opacityNode = ellipseNode->firstChild();
223 Q_ASSERT(opacityNode->type() == QSGNode::OpacityNodeType);
225 QSGInternalRectangleNode *rectNode =
static_cast<QSGInternalRectangleNode *>(opacityNode->firstChild());
226 Q_ASSERT(rectNode->type() == QSGNode::GeometryNodeType);
228 rectNode->setRect(QRectF((
EllipseCount - i - 1) * (
EllipseDiameter + EllipseOffset), (item->height() - EllipseDiameter) / 2, EllipseDiameter, EllipseDiameter));
229 rectNode->setColor(bar->color());
232 borderNode = borderNode->nextSibling();