aboutsummaryrefslogtreecommitdiffstats
path: root/src/imports/controls/qquickdefaultprogressbar.cpp
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@qt.io>2016-10-20 00:31:41 +0200
committerJ-P Nurmi <jpnurmi@qt.io>2016-10-20 09:12:30 +0000
commit2466612283d06f2fc8365e82f492ca1da55f68d1 (patch)
tree8493676110c5059090bc80ec7d5fcd21bf77f04c /src/imports/controls/qquickdefaultprogressbar.cpp
parenta451c1a4ad20320a096e997c7173a3c61e8051d4 (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/qquickdefaultprogressbar.cpp')
-rw-r--r--src/imports/controls/qquickdefaultprogressbar.cpp47
1 files changed, 21 insertions, 26 deletions
diff --git a/src/imports/controls/qquickdefaultprogressbar.cpp b/src/imports/controls/qquickdefaultprogressbar.cpp
index a626bb32..a91b7d3b 100644
--- a/src/imports/controls/qquickdefaultprogressbar.cpp
+++ b/src/imports/controls/qquickdefaultprogressbar.cpp
@@ -37,9 +37,9 @@
#include "qquickdefaultprogressbar_p.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
@@ -69,32 +69,30 @@ static inline qreal blockEndX(int blockIndex, qreal availableWidth)
return availableWidth - blockStartX(Blocks - 1 - blockIndex) - BlockWidth;
}
-class QQuickDefaultProgressBarNode : public QObject, public QSGTransformNode
+class QQuickDefaultProgressBarNode : public QQuickAnimatedNode
{
public:
QQuickDefaultProgressBarNode(QQuickDefaultProgressBar *item);
- void animate();
- void sync(QQuickDefaultProgressBar *item);
+ void updateCurrentTime(int time) override;
+ void sync(QQuickItem *item) override;
private:
bool m_indeterminate;
qreal m_pixelsPerSecond;
- QElapsedTimer m_timer;
};
QQuickDefaultProgressBarNode::QQuickDefaultProgressBarNode(QQuickDefaultProgressBar *item)
- : m_indeterminate(false), m_pixelsPerSecond(item->width())
+ : QQuickAnimatedNode(item),
+ m_indeterminate(false),
+ m_pixelsPerSecond(item->width())
{
- m_timer.start();
+ setLoopCount(Infinite);
+ setDuration(TotalDuration);
}
-void QQuickDefaultProgressBarNode::animate()
+void QQuickDefaultProgressBarNode::updateCurrentTime(int time)
{
- qint64 time = m_timer.elapsed();
- if (time >= TotalDuration)
- m_timer.restart();
-
QSGTransformNode *transformNode = static_cast<QSGTransformNode*>(firstChild());
for (int i = 0; i < Blocks; ++i) {
Q_ASSERT(transformNode->type() == QSGNode::TransformNodeType);
@@ -146,20 +144,17 @@ void QQuickDefaultProgressBarNode::animate()
}
}
-void QQuickDefaultProgressBarNode::sync(QQuickDefaultProgressBar *item)
+void QQuickDefaultProgressBarNode::sync(QQuickItem *item)
{
- m_pixelsPerSecond = item->width();
- if (m_indeterminate != item->isIndeterminate()) {
- m_indeterminate = item->isIndeterminate();
- QQuickWindow *window = item->window();
- if (m_indeterminate) {
- connect(window, &QQuickWindow::frameSwapped, window, &QQuickWindow::update);
- connect(window, &QQuickWindow::beforeRendering, this, &QQuickDefaultProgressBarNode::animate);
- } else {
- disconnect(window, &QQuickWindow::frameSwapped, window, &QQuickWindow::update);
- disconnect(window, &QQuickWindow::beforeRendering, this, &QQuickDefaultProgressBarNode::animate);
- }
+ QQuickDefaultProgressBar *bar = static_cast<QQuickDefaultProgressBar *>(item);
+ if (m_indeterminate != bar->isIndeterminate()) {
+ m_indeterminate = bar->isIndeterminate();
+ if (m_indeterminate)
+ start();
+ else
+ stop();
}
+ m_pixelsPerSecond = item->width();
QQuickItemPrivate *d = QQuickItemPrivate::get(item);
@@ -167,7 +162,7 @@ void QQuickDefaultProgressBarNode::sync(QQuickDefaultProgressBar *item)
m.translate(0, (item->height() - item->implicitHeight()) / 2);
setMatrix(m);
- if (item->isIndeterminate()) {
+ if (m_indeterminate) {
if (childCount() != Blocks) {
// This was previously a regular progress bar; remove the old nodes.
removeAllChildNodes();
@@ -209,7 +204,7 @@ void QQuickDefaultProgressBarNode::sync(QQuickDefaultProgressBar *item)
appendChildNode(rectNode);
}
- rectNode->setRect(QRectF(QPointF(0, 0), QSizeF(item->progress() * item->width(), item->implicitHeight())));
+ rectNode->setRect(QRectF(QPointF(0, 0), QSizeF(bar->progress() * item->width(), item->implicitHeight())));
rectNode->update();
}
}