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/universal/qquickuniversalbusyindicator.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/universal/qquickuniversalbusyindicator.cpp')
-rw-r--r-- | src/imports/controls/universal/qquickuniversalbusyindicator.cpp | 48 |
1 files changed, 17 insertions, 31 deletions
diff --git a/src/imports/controls/universal/qquickuniversalbusyindicator.cpp b/src/imports/controls/universal/qquickuniversalbusyindicator.cpp index acefc5e3..ef08cdec 100644 --- a/src/imports/controls/universal/qquickuniversalbusyindicator.cpp +++ b/src/imports/controls/universal/qquickuniversalbusyindicator.cpp @@ -38,9 +38,9 @@ #include <QtCore/qmath.h> #include <QtCore/qeasingcurve.h> -#include <QtCore/qelapsedtimer.h> #include <QtQuick/private/qquickitem_p.h> #include <QtQuick/private/qsgadaptationlayer_p.h> +#include <QtQuickControls2/private/qquickanimatednode_p.h> QT_BEGIN_NAMESPACE @@ -48,15 +48,13 @@ static const int PhaseCount = 6; static const int Interval = 167; static const int TotalDuration = 4052; -class QQuickUniversalBusyIndicatorNode : public QObject, public QSGTransformNode +class QQuickUniversalBusyIndicatorNode : public QQuickAnimatedNode { public: QQuickUniversalBusyIndicatorNode(QQuickUniversalBusyIndicator *item); - int elapsed() const; - - void animate(); - void sync(QQuickUniversalBusyIndicator *item); + void updateCurrentTime(int time) override; + void sync(QQuickItem *item) override; private: struct Phase { @@ -68,17 +66,15 @@ private: QEasingCurve curve; }; - int m_offset; - QElapsedTimer m_timer; Phase m_phases[PhaseCount]; }; QQuickUniversalBusyIndicatorNode::QQuickUniversalBusyIndicatorNode(QQuickUniversalBusyIndicator *item) - : m_offset(item->elapsed()) + : QQuickAnimatedNode(item) { - QQuickWindow *window = item->window(); - connect(window, &QQuickWindow::frameSwapped, window, &QQuickWindow::update); - connect(window, &QQuickWindow::beforeRendering, this, &QQuickUniversalBusyIndicatorNode::animate); + setLoopCount(Infinite); + setDuration(TotalDuration); + setCurrentTime(item->elapsed()); m_phases[0] = Phase(433, -110, 10, QEasingCurve::BezierSpline); m_phases[1] = Phase(767, 10, 93, QEasingCurve::Linear ); @@ -91,23 +87,10 @@ QQuickUniversalBusyIndicatorNode::QQuickUniversalBusyIndicatorNode(QQuickUnivers m_phases[2].curve.addCubicBezierSegment(QPointF(0.57, 0.17), QPointF(0.95, 0.75), QPointF(1.00, 1.00)); m_phases[3].curve.addCubicBezierSegment(QPointF(0.00, 0.19), QPointF(0.07, 0.72), QPointF(1.00, 1.00)); m_phases[5].curve.addCubicBezierSegment(QPointF(0.00, 0.00), QPointF(0.95, 0.37), QPointF(1.00, 1.00)); - - m_timer.restart(); -} - -int QQuickUniversalBusyIndicatorNode::elapsed() const -{ - return m_timer.elapsed() + m_offset; } -void QQuickUniversalBusyIndicatorNode::animate() +void QQuickUniversalBusyIndicatorNode::updateCurrentTime(int time) { - qint64 time = m_timer.elapsed() + m_offset; - if (time >= TotalDuration) { - m_timer.restart(); - m_offset = 0; - } - int nodeIndex = 0; int count = childCount(); QSGTransformNode *transformNode = static_cast<QSGTransformNode *>(firstChild()); @@ -151,8 +134,9 @@ void QQuickUniversalBusyIndicatorNode::animate() } } -void QQuickUniversalBusyIndicatorNode::sync(QQuickUniversalBusyIndicator *item) +void QQuickUniversalBusyIndicatorNode::sync(QQuickItem *item) { + QQuickUniversalBusyIndicator *indicator = static_cast<QQuickUniversalBusyIndicator *>(item); QQuickItemPrivate *d = QQuickItemPrivate::get(item); QMatrix4x4 matrix; @@ -165,7 +149,7 @@ void QQuickUniversalBusyIndicatorNode::sync(QQuickUniversalBusyIndicator *item) qreal offset = (size - diameter * 2) / M_PI; const QRectF rect(offset, offset, diameter, diameter); - int count = item->count(); + int count = indicator->count(); QSGNode *transformNode = firstChild(); for (int i = 0; i < count; ++i) { if (!transformNode) { @@ -187,7 +171,7 @@ void QQuickUniversalBusyIndicatorNode::sync(QQuickUniversalBusyIndicator *item) Q_ASSERT(rectNode->type() == QSGNode::GeometryNodeType); rectNode->setRect(rect); - rectNode->setColor(item->color()); + rectNode->setColor(indicator->color()); rectNode->setRadius(radius); rectNode->update(); @@ -251,11 +235,13 @@ QSGNode *QQuickUniversalBusyIndicator::updatePaintNode(QSGNode *oldNode, UpdateP { QQuickUniversalBusyIndicatorNode *node = static_cast<QQuickUniversalBusyIndicatorNode *>(oldNode); if (isVisible() && width() > 0 && height() > 0) { - if (!node) + if (!node) { node = new QQuickUniversalBusyIndicatorNode(this); + node->start(); + } node->sync(this); } else { - m_elapsed = node ? node->elapsed() : 0; + m_elapsed = node ? node->currentTime() : 0; delete node; node = nullptr; } |