diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2016-10-20 00:31:41 +0200 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2016-10-20 09:12:30 +0000 |
commit | 2466612283d06f2fc8365e82f492ca1da55f68d1 (patch) | |
tree | 8493676110c5059090bc80ec7d5fcd21bf77f04c /src/imports/controls/material/qquickmaterialbusyindicator.cpp | |
parent | a451c1a4ad20320a096e997c7173a3c61e8051d4 (diff) |
Add internal QQuickAnimatedNode helper
This handles the timers, signals, updates etc. so that the animated
node implementations for busy indicators and indeterminate progress
bars become a bit simpler. The implementation is based on
qtdeclarative/examples/quick/scenegraph/threadedanimation.
Task-number: QTBUG-56601
Change-Id: Ibd82060aa103e6447ee16814c3e0d6ff2c14d608
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'src/imports/controls/material/qquickmaterialbusyindicator.cpp')
-rw-r--r-- | src/imports/controls/material/qquickmaterialbusyindicator.cpp | 73 |
1 files changed, 29 insertions, 44 deletions
diff --git a/src/imports/controls/material/qquickmaterialbusyindicator.cpp b/src/imports/controls/material/qquickmaterialbusyindicator.cpp index d55b131b..2c02e2ba 100644 --- a/src/imports/controls/material/qquickmaterialbusyindicator.cpp +++ b/src/imports/controls/material/qquickmaterialbusyindicator.cpp @@ -37,11 +37,10 @@ #include "qquickmaterialbusyindicator_p.h" #include <QtCore/qeasingcurve.h> -#include <QtCore/qelapsedtimer.h> #include <QtGui/qpainter.h> -#include <QtQuick/private/qquickitem_p.h> #include <QtQuick/qsgimagenode.h> #include <QtQuick/qquickwindow.h> +#include <QtQuickControls2/private/qquickanimatednode_p.h> QT_BEGIN_NAMESPACE @@ -66,42 +65,38 @@ static const int OneDegree = 16; static const qreal MinSweepSpan = 10 * OneDegree; static const qreal MaxSweepSpan = 300 * OneDegree; -class QQuickMaterialBusyIndicatorNode : public QObject, public QSGNode +class QQuickMaterialBusyIndicatorNode : public QQuickAnimatedNode { public: QQuickMaterialBusyIndicatorNode(QQuickMaterialBusyIndicator *item); - int elapsed() const; + void sync(QQuickItem *item) override; - void animate(); - void sync(QQuickMaterialBusyIndicator *item); +protected: + void updateCurrentTime(int time) override; private: - int m_offset; int m_lastStartAngle; int m_lastEndAngle; qreal m_width; qreal m_height; qreal m_devicePixelRatio; - QSGNode *m_containerNode; - QQuickWindow *m_window; - QElapsedTimer m_timer; QColor m_color; }; -QQuickMaterialBusyIndicatorNode::QQuickMaterialBusyIndicatorNode(QQuickMaterialBusyIndicator *item) : - m_offset(item->elapsed()), - m_lastStartAngle(0), - m_lastEndAngle(0), - m_width(0), - m_height(0), - m_devicePixelRatio(1), - m_window(item->window()) +QQuickMaterialBusyIndicatorNode::QQuickMaterialBusyIndicatorNode(QQuickMaterialBusyIndicator *item) + : QQuickAnimatedNode(item), + m_lastStartAngle(0), + m_lastEndAngle(0), + m_width(0), + m_height(0), + m_devicePixelRatio(1) { - connect(m_window, &QQuickWindow::frameSwapped, m_window, &QQuickWindow::update); - connect(m_window, &QQuickWindow::beforeRendering, this, &QQuickMaterialBusyIndicatorNode::animate); + setLoopCount(Infinite); + setCurrentTime(item->elapsed()); + setDuration(RotationAnimationDuration); - QSGImageNode *textureNode = m_window->createImageNode(); + QSGImageNode *textureNode = item->window()->createImageNode(); textureNode->setOwnsTexture(true); appendChildNode(textureNode); @@ -109,24 +104,11 @@ QQuickMaterialBusyIndicatorNode::QQuickMaterialBusyIndicatorNode(QQuickMaterialB // so just use a blank image. QImage blankImage(item->width(), item->height(), QImage::Format_ARGB32_Premultiplied); blankImage.fill(Qt::transparent); - textureNode->setTexture(m_window->createTextureFromImage(blankImage)); - - m_timer.restart(); -} - -int QQuickMaterialBusyIndicatorNode::elapsed() const -{ - return m_timer.elapsed() + m_offset; + textureNode->setTexture(item->window()->createTextureFromImage(blankImage)); } -void QQuickMaterialBusyIndicatorNode::animate() +void QQuickMaterialBusyIndicatorNode::updateCurrentTime(int time) { - qint64 time = m_timer.elapsed() + m_offset; - if (time >= RotationAnimationDuration) { - m_timer.restart(); - m_offset = 0; - } - const qreal w = m_width; const qreal h = m_height; const qreal size = qMin(w, h); @@ -183,15 +165,16 @@ void QQuickMaterialBusyIndicatorNode::animate() painter.end(); textureNode->setRect(QRectF(dx, dy, size, size)); - textureNode->setTexture(m_window->createTextureFromImage(image)); + textureNode->setTexture(window()->createTextureFromImage(image)); } -void QQuickMaterialBusyIndicatorNode::sync(QQuickMaterialBusyIndicator *item) +void QQuickMaterialBusyIndicatorNode::sync(QQuickItem *item) { - m_color = item->color(); - m_width = item->width(); - m_height = item->height(); - m_devicePixelRatio = m_window->effectiveDevicePixelRatio(); + QQuickMaterialBusyIndicator *indicator = static_cast<QQuickMaterialBusyIndicator *>(item); + m_color = indicator->color(); + m_width = indicator->width(); + m_height = indicator->height(); + m_devicePixelRatio = indicator->window()->effectiveDevicePixelRatio(); } QQuickMaterialBusyIndicator::QQuickMaterialBusyIndicator(QQuickItem *parent) : @@ -230,11 +213,13 @@ QSGNode *QQuickMaterialBusyIndicator::updatePaintNode(QSGNode *oldNode, UpdatePa { QQuickMaterialBusyIndicatorNode *node = static_cast<QQuickMaterialBusyIndicatorNode *>(oldNode); if (isVisible() && width() > 0 && height() > 0) { - if (!node) + if (!node) { node = new QQuickMaterialBusyIndicatorNode(this); + node->start(); + } node->sync(this); } else { - m_elapsed = node ? node->elapsed() : 0; + m_elapsed = node ? node->currentTime() : 0; delete node; node = nullptr; } |