implement basic indeterminate progress animations

This commit is contained in:
laserpants 2016-06-19 12:49:55 +03:00
parent e756328547
commit fff7078542
9 changed files with 176 additions and 24 deletions

View File

@ -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<qreal> pattern;
pattern << d->delegate->dashLength()*d->size/50 << 30*d->size/50;
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);
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)

View File

@ -2,7 +2,8 @@
#include "circularprogress.h"
CircularProgressDelegate::CircularProgressDelegate(CircularProgress *parent)
: progress(parent),
: QObject(parent),
progress(parent),
_dashOffset(0),
_dashLength(89)
{

View File

@ -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);

View File

@ -1,9 +1,15 @@
#include "progress.h"
#include <QPainter>
#include <QPropertyAnimation>
#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 {
}
}

View File

@ -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;

View File

@ -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;
}

View File

@ -0,0 +1,28 @@
#ifndef PROGRESS_INTERNAL_H
#define PROGRESS_INTERNAL_H
#include <QObject>
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

View File

@ -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

View File

@ -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