aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@theqtcompany.com>2016-03-21 12:25:07 +0100
committerJ-P Nurmi <jpnurmi@theqtcompany.com>2016-03-21 14:22:08 +0000
commite33b80dbc2dc696610e8ceee5d63e13c6f8edeb8 (patch)
treef55d047336cb5de510a59d2cebc7d1847ea36f93 /src
parent17df1dd90e3f3afc653cf29fcd2c1a568c1d626a (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')
-rw-r--r--src/imports/controls/universal/ProgressBar.qml25
-rw-r--r--src/imports/controls/universal/qquickuniversalprogressstrip.cpp55
-rw-r--r--src/imports/controls/universal/qquickuniversalprogressstrip_p.h13
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