123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 |
- #include "qtmaterialcircularprogress.h"
- #include "qtmaterialcircularprogress_p.h"
- #include <QPropertyAnimation>
- #include <QParallelAnimationGroup>
- #include <QPainter>
- #include <QPainterPath>
- #include "qtmaterialcircularprogress_internal.h"
- #include "lib/qtmaterialstyle.h"
- /*!
- * \class QtMaterialCircularProgressPrivate
- * \internal
- */
- QtMaterialCircularProgressPrivate::QtMaterialCircularProgressPrivate(QtMaterialCircularProgress *q)
- : q_ptr(q)
- {
- }
- QtMaterialCircularProgressPrivate::~QtMaterialCircularProgressPrivate()
- {
- }
- void QtMaterialCircularProgressPrivate::init()
- {
- Q_Q(QtMaterialCircularProgress);
- delegate = new QtMaterialCircularProgressDelegate(q);
- progressType = Material::IndeterminateProgress;
- penWidth = 6.25;
- size = 64;
- useThemeColors = true;
- q->setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding,
- QSizePolicy::MinimumExpanding));
- QParallelAnimationGroup *group = new QParallelAnimationGroup(q);
- group->setLoopCount(-1);
- QPropertyAnimation *animation;
- animation = new QPropertyAnimation(q);
- animation->setPropertyName("dashLength");
- animation->setTargetObject(delegate);
- animation->setEasingCurve(QEasingCurve::InOutQuad);
- animation->setStartValue(0.1);
- animation->setKeyValueAt(0.15, 0.2);
- animation->setKeyValueAt(0.6, 20);
- animation->setKeyValueAt(0.7, 20);
- animation->setEndValue(20);
- animation->setDuration(2050);
- group->addAnimation(animation);
- animation = new QPropertyAnimation(q);
- animation->setPropertyName("dashOffset");
- animation->setTargetObject(delegate);
- animation->setEasingCurve(QEasingCurve::InOutSine);
- animation->setStartValue(0);
- animation->setKeyValueAt(0.15, 0);
- animation->setKeyValueAt(0.6, -7);
- animation->setKeyValueAt(0.7, -7);
- animation->setEndValue(-25);
- animation->setDuration(2050);
- group->addAnimation(animation);
- animation = new QPropertyAnimation(q);
- animation->setPropertyName("angle");
- animation->setTargetObject(delegate);
- animation->setStartValue(0);
- animation->setEndValue(719);
- animation->setDuration(2050);
- group->addAnimation(animation);
- group->start();
- }
- /*!
- * \class QtMaterialCircularProgress
- */
- QtMaterialCircularProgress::QtMaterialCircularProgress(QWidget *parent)
- : QProgressBar(parent),
- d_ptr(new QtMaterialCircularProgressPrivate(this))
- {
- d_func()->init();
- }
- QtMaterialCircularProgress::~QtMaterialCircularProgress()
- {
- }
- void QtMaterialCircularProgress::setProgressType(Material::ProgressType type)
- {
- Q_D(QtMaterialCircularProgress);
- d->progressType = type;
- update();
- }
- Material::ProgressType QtMaterialCircularProgress::progressType() const
- {
- Q_D(const QtMaterialCircularProgress);
- return d->progressType;
- }
- void QtMaterialCircularProgress::setUseThemeColors(bool value)
- {
- Q_D(QtMaterialCircularProgress);
- if (d->useThemeColors == value) {
- return;
- }
- d->useThemeColors = value;
- update();
- }
- bool QtMaterialCircularProgress::useThemeColors() const
- {
- Q_D(const QtMaterialCircularProgress);
- return d->useThemeColors;
- }
- void QtMaterialCircularProgress::setLineWidth(qreal width)
- {
- Q_D(QtMaterialCircularProgress);
- d->penWidth = width;
- update();
- updateGeometry();
- }
- qreal QtMaterialCircularProgress::lineWidth() const
- {
- Q_D(const QtMaterialCircularProgress);
- return d->penWidth;
- }
- void QtMaterialCircularProgress::setSize(int size)
- {
- Q_D(QtMaterialCircularProgress);
- d->size = size;
- update();
- updateGeometry();
- }
- int QtMaterialCircularProgress::size() const
- {
- Q_D(const QtMaterialCircularProgress);
- return d->size;
- }
- void QtMaterialCircularProgress::setColor(const QColor &color)
- {
- Q_D(QtMaterialCircularProgress);
- d->color = color;
- MATERIAL_DISABLE_THEME_COLORS
- update();
- }
- QColor QtMaterialCircularProgress::color() const
- {
- Q_D(const QtMaterialCircularProgress);
- if (d->useThemeColors || !d->color.isValid()) {
- return QtMaterialStyle::instance().themeColor("primary1");
- } else {
- return d->color;
- }
- }
- /*!
- * \reimp
- */
- QSize QtMaterialCircularProgress::sizeHint() const
- {
- Q_D(const QtMaterialCircularProgress);
- const qreal s = d->size+d->penWidth+8;
- return QSize(s, s);
- }
- /*!
- * \reimp
- */
- void QtMaterialCircularProgress::paintEvent(QPaintEvent *event)
- {
- Q_UNUSED(event)
- Q_D(QtMaterialCircularProgress);
- QPainter painter(this);
- painter.setRenderHint(QPainter::Antialiasing);
- if (!isEnabled())
- {
- QPen pen;
- pen.setCapStyle(Qt::RoundCap);
- pen.setWidthF(d->penWidth);
- pen.setColor(QtMaterialStyle::instance().themeColor("border"));
- painter.setPen(pen);
- painter.drawLine(rect().center()-QPointF(20, 20), rect().center()+QPointF(20, 20));
- painter.drawLine(rect().center()+QPointF(20, -20), rect().center()-QPointF(20, -20));
- return;
- }
- if (Material::IndeterminateProgress == d->progressType)
- {
- painter.translate(width()/2, height()/2);
- painter.rotate(d->delegate->angle());
- }
- QPen pen;
- pen.setCapStyle(Qt::RoundCap);
- pen.setWidthF(d->penWidth);
- pen.setColor(color());
- if (Material::IndeterminateProgress == d->progressType)
- {
- QVector<qreal> pattern;
- pattern << d->delegate->dashLength()*d->size/50 << 30*d->size/50;
- pen.setDashOffset(d->delegate->dashOffset()*d->size/50);
- pen.setDashPattern(pattern);
- painter.setPen(pen);
- painter.drawEllipse(QPoint(0, 0), d->size/2, d->size/2);
- }
- else
- {
- painter.setPen(pen);
- const qreal x = (width()-d->size)/2;
- const qreal y = (height()-d->size)/2;
- const qreal a = 360*(value()-minimum())/(maximum()-minimum());
- QPainterPath path;
- path.arcMoveTo(x, y, d->size, d->size, 0);
- path.arcTo(x, y, d->size, d->size, 0, a);
- painter.drawPath(path);
- }
- }
|