59 setLoopCount(Infinite);
60 setCurrentTime(item->elapsed());
63 QSGImageNode *textureNode = item->window()->createImageNode();
64 textureNode->setOwnsTexture(
true);
65 appendChildNode(textureNode);
69 QImage blankImage(item->width(), item->height(), QImage::Format_ARGB32_Premultiplied);
70 blankImage.fill(Qt::transparent);
71 textureNode->setTexture(item->window()->createTextureFromImage(blankImage));
76 const qreal w = m_width;
77 const qreal h = m_height;
78 const qreal size = qMin(w, h);
79 const qreal dx = (w - size) / 2;
80 const qreal dy = (h - size) / 2;
82 QImage image(size * m_devicePixelRatio, size * m_devicePixelRatio, QImage::Format_ARGB32_Premultiplied);
83 image.fill(Qt::transparent);
85 QPainter painter(&image);
86 painter.setRenderHint(QPainter::Antialiasing);
89 QSGImageNode *textureNode =
static_cast<QSGImageNode *>(firstChild());
90 pen.setColor(m_color);
91 pen.setWidth(qCeil(size / 12) * m_devicePixelRatio);
100 if (iteration % 2 == 0) {
105 startAngle = m_lastStartAngle;
106 QEasingCurve angleCurve(QEasingCurve::OutQuad);
107 const qreal percentage = angleCurve.valueForProgress(spanPercentageComplete);
108 endAngle = m_lastStartAngle + MinSweepSpan + percentage * (
MaxSweepSpan - MinSweepSpan);
109 m_lastEndAngle = endAngle;
112 QEasingCurve angleCurve(QEasingCurve::InQuad);
113 const qreal percentage = angleCurve.valueForProgress(spanPercentageComplete);
114 startAngle = m_lastEndAngle - MaxSweepSpan + percentage * (
MaxSweepSpan - MinSweepSpan);
115 endAngle = m_lastEndAngle;
116 m_lastStartAngle = startAngle;
119 const int halfPen = pen.width() / 2;
120 const QRectF arcBounds = QRectF(halfPen, halfPen,
121 m_devicePixelRatio * size - pen.width(),
122 m_devicePixelRatio * size - pen.width());
125 startAngle -= rotation;
126 endAngle -= rotation;
127 const int angleSpan = endAngle - startAngle;
128 painter.drawArc(arcBounds, -startAngle, -angleSpan);
131 textureNode->setRect(QRectF(dx, dy, size, size));
132 textureNode->setTexture(window()->createTextureFromImage(image));
137 QQuickMaterialBusyIndicator *indicator =
static_cast<QQuickMaterialBusyIndicator *>(item);
138 m_color = indicator->color();
139 m_width = indicator->width();
140 m_height = indicator->height();
141 m_devicePixelRatio = indicator->window()->effectiveDevicePixelRatio();
183void QQuickMaterialBusyIndicator::itemChange(QQuickItem::ItemChange change,
const QQuickItem::ItemChangeData &data)
185 QQuickItem::itemChange(change, data);
187 case ItemOpacityHasChanged:
193 if (qFuzzyIsNull(data.realValue) && !m_running)
196 case ItemVisibleHasChanged: