diff options
author | J-P Nurmi <jpnurmi@theqtcompany.com> | 2016-03-21 12:25:07 +0100 |
---|---|---|
committer | J-P Nurmi <jpnurmi@theqtcompany.com> | 2016-03-21 14:22:08 +0000 |
commit | e33b80dbc2dc696610e8ceee5d63e13c6f8edeb8 (patch) | |
tree | f55d047336cb5de510a59d2cebc7d1847ea36f93 /src/imports/controls/universal | |
parent | 17df1dd90e3f3afc653cf29fcd2c1a568c1d626a (diff) |
Universal: eliminate the extra Rectangle from ProgressBar indicator
Make ProgressStrip capable of presenting non-indeterminate state the
same way the Default and Material styles do. This makes the next step,
which is to transition to contentItem, easier.
Change-Id: I1a7e48cfba963f11764675b6e9a38ff2898b1212
Reviewed-by: Mitch Curtis <mitch.curtis@theqtcompany.com>
Diffstat (limited to 'src/imports/controls/universal')
3 files changed, 66 insertions, 27 deletions
diff --git a/src/imports/controls/universal/ProgressBar.qml b/src/imports/controls/universal/ProgressBar.qml index 3d88fc67..308b83f7 100644 --- a/src/imports/controls/universal/ProgressBar.qml +++ b/src/imports/controls/universal/ProgressBar.qml @@ -48,29 +48,22 @@ T.ProgressBar { indicator ? indicator.implicitHeight : 0) + topPadding + bottomPadding //! [indicator] - indicator: Rectangle { + indicator: ProgressStrip { + id: strip x: control.leftPadding y: control.topPadding + (control.availableHeight - height) / 2 - width: control.indeterminate ? 0 : control.position * control.availableWidth + width: control.availableWidth height: 10 scale: control.mirrored ? -1 : 1 + indeterminate: control.indeterminate color: control.Universal.accent + progress: control.position + clip: control.indeterminate - ProgressStrip { - id: strip - - width: control.availableWidth - height: control.availableHeight - - clip: control.indeterminate - visible: control.indeterminate - color: control.Universal.accent - - ProgressStripAnimator { - target: strip - running: strip.visible - } + ProgressStripAnimator { + target: strip + running: control.visible && control.indeterminate } } //! [indicator] diff --git a/src/imports/controls/universal/qquickuniversalprogressstrip.cpp b/src/imports/controls/universal/qquickuniversalprogressstrip.cpp index 1ae5b371..750970da 100644 --- a/src/imports/controls/universal/qquickuniversalprogressstrip.cpp +++ b/src/imports/controls/universal/qquickuniversalprogressstrip.cpp @@ -229,7 +229,7 @@ QQuickAnimatorJob *QQuickUniversalProgressStripAnimator::createJob() const } QQuickUniversalProgressStrip::QQuickUniversalProgressStrip(QQuickItem *parent) - : QQuickItem(parent), m_color(Qt::black) + : QQuickItem(parent), m_color(Qt::black), m_progress(0.0), m_indeterminate(false) { setFlag(ItemHasContents); } @@ -246,21 +246,60 @@ void QQuickUniversalProgressStrip::setColor(const QColor &color) m_color = color; update(); - emit colorChanged(); +} + +qreal QQuickUniversalProgressStrip::progress() const +{ + return m_progress; +} + +void QQuickUniversalProgressStrip::setProgress(qreal progress) +{ + if (progress == m_progress) + return; + + m_progress = progress; + update(); +} + +bool QQuickUniversalProgressStrip::isIndeterminate() const +{ + return m_indeterminate; +} + +void QQuickUniversalProgressStrip::setIndeterminate(bool indeterminate) +{ + if (indeterminate == m_indeterminate) + return; + + m_indeterminate = indeterminate; + update(); } QSGNode *QQuickUniversalProgressStrip::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *) { QQuickItemPrivate *d = QQuickItemPrivate::get(this); - if (!oldNode) - oldNode = new QSGSimpleRectNode(boundingRect(), Qt::transparent); - static_cast<QSGSimpleRectNode *>(oldNode)->setRect(boundingRect()); + QRectF bounds = boundingRect(); + if (!m_indeterminate) + bounds.setWidth(m_progress * bounds.width()); - QSGTransformNode *gridNode = static_cast<QSGTransformNode *>(oldNode->firstChild()); + QSGSimpleRectNode *geometryNode = static_cast<QSGSimpleRectNode *>(oldNode); + if (!geometryNode) + geometryNode = new QSGSimpleRectNode(bounds, Qt::transparent); + geometryNode->setRect(bounds); + geometryNode->setColor(m_indeterminate ? Qt::transparent : m_color); + + if (!m_indeterminate) { + while (QSGNode *node = geometryNode->firstChild()) + delete node; + return geometryNode; + } + + QSGTransformNode *gridNode = static_cast<QSGTransformNode *>(geometryNode->firstChild()); if (!gridNode) { gridNode = new QSGTransformNode; - oldNode->appendChildNode(gridNode); + geometryNode->appendChildNode(gridNode); } Q_ASSERT(gridNode->type() == QSGNode::TransformNodeType); @@ -299,7 +338,7 @@ QSGNode *QQuickUniversalProgressStrip::updatePaintNode(QSGNode *oldNode, UpdateP borderNode = borderNode->nextSibling(); } - return oldNode; + return geometryNode; } QT_END_NAMESPACE diff --git a/src/imports/controls/universal/qquickuniversalprogressstrip_p.h b/src/imports/controls/universal/qquickuniversalprogressstrip_p.h index 1b2c729d..3de856db 100644 --- a/src/imports/controls/universal/qquickuniversalprogressstrip_p.h +++ b/src/imports/controls/universal/qquickuniversalprogressstrip_p.h @@ -56,7 +56,9 @@ QT_BEGIN_NAMESPACE class QQuickUniversalProgressStrip : public QQuickItem { Q_OBJECT - Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged FINAL) + Q_PROPERTY(QColor color READ color WRITE setColor FINAL) + Q_PROPERTY(qreal progress READ progress WRITE setProgress FINAL) + Q_PROPERTY(bool indeterminate READ isIndeterminate WRITE setIndeterminate FINAL) public: QQuickUniversalProgressStrip(QQuickItem *parent = nullptr); @@ -64,14 +66,19 @@ public: QColor color() const; void setColor(const QColor &color); -Q_SIGNALS: - void colorChanged(); + qreal progress() const; + void setProgress(qreal progress); + + bool isIndeterminate() const; + void setIndeterminate(bool indeterminate); protected: QSGNode *updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *) override; private: QColor m_color; + qreal m_progress; + bool m_indeterminate; }; class QQuickUniversalProgressStripAnimator : public QQuickAnimator |