diff --git a/components/circularprogress.cpp b/components/circularprogress.cpp index 3f1cf79..a32be1e 100644 --- a/components/circularprogress.cpp +++ b/components/circularprogress.cpp @@ -9,6 +9,8 @@ CircularProgressPrivate::CircularProgressPrivate(CircularProgress *q) : q_ptr(q), + delegate(0), + progressType(Material::IndeterminateProgress), size(64), angle(0), penWidth(6.25), @@ -107,7 +109,6 @@ bool CircularProgress::useThemeColors() const return d->useThemeColors; } - void CircularProgress::setLineWidth(qreal width) { Q_D(CircularProgress); @@ -155,7 +156,6 @@ QColor CircularProgress::color() const } else { return d->color; } - return d->color; } QSize CircularProgress::sizeHint() const @@ -185,15 +185,22 @@ void CircularProgress::paintEvent(QPaintEvent *event) pen.setWidthF(d->penWidth); pen.setColor(color()); - QVector pattern; - pattern << d->delegate->dashLength()*d->size/50 << 30*d->size/50; + if (Material::IndeterminateProgress == d->progressType) + { + QVector pattern; + pattern << d->delegate->dashLength()*d->size/50 << 30*d->size/50; - pen.setDashOffset(d->delegate->dashOffset()*d->size/50); - pen.setDashPattern(pattern); + pen.setDashOffset(d->delegate->dashOffset()*d->size/50); + pen.setDashPattern(pattern); - painter.setPen(pen); + painter.setPen(pen); - painter.drawEllipse(QPoint(0, 0), d->size/2, d->size/2); + painter.drawEllipse(QPoint(0, 0), d->size/2, d->size/2); + } + else + { + + } } void CircularProgress::timerEvent(QTimerEvent *event) diff --git a/components/circularprogress_internal.cpp b/components/circularprogress_internal.cpp index 263f8e4..1077172 100644 --- a/components/circularprogress_internal.cpp +++ b/components/circularprogress_internal.cpp @@ -2,7 +2,8 @@ #include "circularprogress.h" CircularProgressDelegate::CircularProgressDelegate(CircularProgress *parent) - : progress(parent), + : QObject(parent), + progress(parent), _dashOffset(0), _dashLength(89) { diff --git a/components/circularprogress_internal.h b/components/circularprogress_internal.h index 363019e..e17627e 100644 --- a/components/circularprogress_internal.h +++ b/components/circularprogress_internal.h @@ -13,7 +13,7 @@ class CircularProgressDelegate : public QObject Q_PROPERTY(qreal dashLength WRITE setDashLength READ dashLength) public: - CircularProgressDelegate(CircularProgress *parent = 0); + CircularProgressDelegate(CircularProgress *parent); ~CircularProgressDelegate(); void setDashOffset(qreal offset); diff --git a/components/progress.cpp b/components/progress.cpp index 456bb13..5c77e7f 100644 --- a/components/progress.cpp +++ b/components/progress.cpp @@ -1,9 +1,15 @@ #include "progress.h" #include +#include #include "progress_p.h" +#include "progress_internal.h" +#include "lib/style.h" ProgressPrivate::ProgressPrivate(Progress *q) - : q_ptr(q) + : q_ptr(q), + delegate(0), + progressType(Material::IndeterminateProgress), + useThemeColors(true) { } @@ -13,6 +19,22 @@ ProgressPrivate::~ProgressPrivate() void ProgressPrivate::init() { + Q_Q(Progress); + + delegate = new ProgressDelegate(q); + + QPropertyAnimation *animation; + + animation = new QPropertyAnimation(q); + animation->setPropertyName("offset"); + animation->setTargetObject(delegate); + animation->setStartValue(0); + animation->setEndValue(1); + animation->setDuration(1000); + + animation->setLoopCount(-1); + + animation->start(); } Progress::Progress(QWidget *parent) @@ -41,34 +63,86 @@ Material::ProgressType Progress::progressType() const return d->progressType; } +void Progress::setUseThemeColors(bool state) +{ + Q_D(Progress); + + d->useThemeColors = state; + update(); +} + +bool Progress::useThemeColors() const +{ + Q_D(const Progress); + + return d->useThemeColors; +} + +void Progress::setProgressColor(const QColor &color) +{ + Q_D(Progress); + + d->progressColor = color; + setUseThemeColors(false); +} + +QColor Progress::progressColor() const +{ + Q_D(const Progress); + + if (d->useThemeColors || !d->progressColor.isValid()) { + return Style::instance().themeColor("primary1"); + } else { + return d->progressColor; + } +} + +void Progress::setBackgroundColor(const QColor &color) +{ + Q_D(Progress); + + d->backgroundColor = color; + setUseThemeColors(false); +} + +QColor Progress::backgroundColor() const +{ + Q_D(const Progress); + + if (d->useThemeColors || !d->backgroundColor.isValid()) { + return Style::instance().themeColor("accent3"); + } else { + return d->backgroundColor; + } +} + void Progress::paintEvent(QPaintEvent *event) { Q_UNUSED(event) + Q_D(Progress); + QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); -// painter.drawRect(rect().adjusted(0, 0, -1, -1)); - QBrush brush; brush.setStyle(Qt::SolidPattern); - brush.setColor(Qt::black); + brush.setColor(backgroundColor()); painter.setBrush(brush); painter.setPen(Qt::NoPen); - //QRectF r(0, 0, width(), 8); - //r.moveCenter(rect().center()); - - //painter.drawRect(r); - QPainterPath path; - path.addRoundedRect(0, height()/2-4, width(), 8, 3, 3); + path.addRoundedRect(0, height()/2-3, width(), 6, 3, 3); painter.setClipPath(path); painter.drawRect(0, 0, width(), height()); - brush.setColor(Qt::blue); + brush.setColor(progressColor()); painter.setBrush(brush); - painter.drawRect(0, 0, width()/2, height()); + if (Material::IndeterminateProgress == d->progressType) { + painter.drawRect(d->delegate->offset()*width()*2-width(), 0, width(), height()); + } else { + + } } diff --git a/components/progress.h b/components/progress.h index 5466b74..cd3db2f 100644 --- a/components/progress.h +++ b/components/progress.h @@ -10,6 +10,9 @@ class Progress : public QProgressBar { Q_OBJECT + Q_PROPERTY(QColor progressColor WRITE setProgressColor READ progressColor) + Q_PROPERTY(QColor backgroundColor WRITE setProgressColor READ backgroundColor) + public: explicit Progress(QWidget *parent = 0); ~Progress(); @@ -17,6 +20,15 @@ public: void setProgressType(Material::ProgressType type); Material::ProgressType progressType() const; + void setUseThemeColors(bool state); + bool useThemeColors() const; + + void setProgressColor(const QColor &color); + QColor progressColor() const; + + void setBackgroundColor(const QColor &color); + QColor backgroundColor() const; + protected: void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE; diff --git a/components/progress_internal.cpp b/components/progress_internal.cpp new file mode 100644 index 0000000..d8f1d55 --- /dev/null +++ b/components/progress_internal.cpp @@ -0,0 +1,23 @@ +#include "progress_internal.h" +#include "progress.h" + +ProgressDelegate::ProgressDelegate(Progress *parent) + : QObject(parent), + progress(parent) +{ +} + +ProgressDelegate::~ProgressDelegate() +{ +} + +void ProgressDelegate::setOffset(qreal offset) +{ + _offset = offset; + progress->update(); +} + +qreal ProgressDelegate::offset() const +{ + return _offset; +} diff --git a/components/progress_internal.h b/components/progress_internal.h new file mode 100644 index 0000000..63996e7 --- /dev/null +++ b/components/progress_internal.h @@ -0,0 +1,28 @@ +#ifndef PROGRESS_INTERNAL_H +#define PROGRESS_INTERNAL_H + +#include + +class Progress; + +class ProgressDelegate : public QObject +{ + Q_OBJECT + + Q_PROPERTY(qreal offset WRITE setOffset READ offset) + +public: + ProgressDelegate(Progress *parent); + ~ProgressDelegate(); + + void setOffset(qreal offset); + qreal offset() const; + +private: + Q_DISABLE_COPY(ProgressDelegate) + + Progress *const progress; + qreal _offset; +}; + +#endif // PROGRESS_INTERNAL_H diff --git a/components/progress_p.h b/components/progress_p.h index 59a8158..c7307fa 100644 --- a/components/progress_p.h +++ b/components/progress_p.h @@ -5,6 +5,7 @@ #include "lib/theme.h" class Progress; +class ProgressDelegate; class ProgressPrivate { @@ -18,7 +19,11 @@ public: void init(); Progress *const q_ptr; + ProgressDelegate *delegate; Material::ProgressType progressType; + QColor progressColor; + QColor backgroundColor; + bool useThemeColors; }; #endif // PROGRESS_P_H diff --git a/qt-material-widgets.pro b/qt-material-widgets.pro index 4838734..d0ba175 100644 --- a/qt-material-widgets.pro +++ b/qt-material-widgets.pro @@ -67,7 +67,8 @@ SOURCES += main.cpp\ components/drawer.cpp \ components/snackbar_internal.cpp \ components/circularprogress.cpp \ - components/circularprogress_internal.cpp + components/circularprogress_internal.cpp \ + components/progress_internal.cpp HEADERS += mainwindow.h \ components/appbar.h \ @@ -145,7 +146,8 @@ HEADERS += mainwindow.h \ components/progress_p.h \ components/circularprogress.h \ components/circularprogress_p.h \ - components/circularprogress_internal.h + components/circularprogress_internal.h \ + components/progress_internal.h RESOURCES += \ resources.qrc