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/qquickdefaultbusyindicator.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/qquickdefaultbusyindicator.cpp')
-rw-r--r-- | src/imports/controls/qquickdefaultbusyindicator.cpp | 50 |
1 files changed, 15 insertions, 35 deletions
diff --git a/src/imports/controls/qquickdefaultbusyindicator.cpp b/src/imports/controls/qquickdefaultbusyindicator.cpp index 5b952476..90ef5ff7 100644 --- a/src/imports/controls/qquickdefaultbusyindicator.cpp +++ b/src/imports/controls/qquickdefaultbusyindicator.cpp @@ -36,12 +36,9 @@ #include "qquickdefaultbusyindicator_p.h" -#include <QtCore/qset.h> -#include <QtCore/qelapsedtimer.h> -#include <QtGui/qpainter.h> #include <QtQuick/private/qquickitem_p.h> -#include <QtQuick/qquickwindow.h> -#include <QtQuick/qsgnode.h> +#include <QtQuick/private/qsgadaptationlayer_p.h> +#include <QtQuickControls2/private/qquickanimatednode_p.h> QT_BEGIN_NAMESPACE @@ -55,27 +52,21 @@ static QPointF moveCircle(const QPointF &pos, qreal rotation, qreal distance) return pos - QTransform().rotate(rotation).map(QPointF(0, distance)); } -class QQuickDefaultBusyIndicatorNode : public QObject, public QSGNode +class QQuickDefaultBusyIndicatorNode : public QQuickAnimatedNode { public: QQuickDefaultBusyIndicatorNode(QQuickDefaultBusyIndicator *item); - int elapsed() const; - - void animate(); - void sync(QQuickDefaultBusyIndicator *item); - -private: - int m_offset; - QElapsedTimer m_timer; + void updateCurrentTime(int time) override; + void sync(QQuickItem *item) override; }; QQuickDefaultBusyIndicatorNode::QQuickDefaultBusyIndicatorNode(QQuickDefaultBusyIndicator *item) - : m_offset(item->elapsed()) + : QQuickAnimatedNode(item) { - QQuickWindow *window = item->window(); - connect(window, &QQuickWindow::frameSwapped, window, &QQuickWindow::update); - connect(window, &QQuickWindow::beforeRendering, this, &QQuickDefaultBusyIndicatorNode::animate); + setLoopCount(Infinite); + setDuration(TotalDuration); + setCurrentTime(item->elapsed()); for (int i = 0; i < CircleCount; ++i) { QSGTransformNode *transformNode = new QSGTransformNode; @@ -86,23 +77,10 @@ QQuickDefaultBusyIndicatorNode::QQuickDefaultBusyIndicatorNode(QQuickDefaultBusy rectNode->setAntialiasing(true); transformNode->appendChildNode(rectNode); } - - m_timer.restart(); -} - -int QQuickDefaultBusyIndicatorNode::elapsed() const -{ - return m_timer.elapsed() + m_offset; } -void QQuickDefaultBusyIndicatorNode::animate() +void QQuickDefaultBusyIndicatorNode::updateCurrentTime(int time) { - qint64 time = m_timer.elapsed() + m_offset; - if (time >= TotalDuration) { - m_timer.restart(); - m_offset = 0; - } - const qreal percentageComplete = time / qreal(TotalDuration); const qreal firstPhaseProgress = percentageComplete <= 0.5 ? percentageComplete * 2 : 0; const qreal secondPhaseProgress = percentageComplete > 0.5 ? (percentageComplete - 0.5) * 2 : 0; @@ -122,7 +100,7 @@ void QQuickDefaultBusyIndicatorNode::animate() } } -void QQuickDefaultBusyIndicatorNode::sync(QQuickDefaultBusyIndicator *item) +void QQuickDefaultBusyIndicatorNode::sync(QQuickItem *item) { const qreal w = item->width(); const qreal h = item->height(); @@ -174,11 +152,13 @@ QSGNode *QQuickDefaultBusyIndicator::updatePaintNode(QSGNode *oldNode, QQuickIte { QQuickDefaultBusyIndicatorNode *node = static_cast<QQuickDefaultBusyIndicatorNode *>(oldNode); if (isVisible() && width() > 0 && height() > 0) { - if (!node) + if (!node) { node = new QQuickDefaultBusyIndicatorNode(this); + node->start(); + } node->sync(this); } else { - m_elapsed = node ? node->elapsed() : 0; + m_elapsed = node ? node->currentTime() : 0; delete node; node = nullptr; } |