Commit 36a421e7 authored by Eike Ziller's avatar Eike Ziller

ProgressManager: Use QGraphicsOpacityEffect instead of hack

Change-Id: Ic3bd8e7d8d33a14be0e49e2d4a22ea30384aebc5
Reviewed-by: default avatarEike Ziller <eike.ziller@digia.com>
parent 37e0b914
......@@ -30,55 +30,30 @@
#include "futureprogress.h"
#include "progressbar.h"
#include <QFutureWatcher>
#include <QTimer>
#include <QCoreApplication>
#include <QFutureWatcher>
#include <QGraphicsOpacityEffect>
#include <QPropertyAnimation>
#include <QSequentialAnimationGroup>
#include <QTimer>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QPainter>
#include <QMouseEvent>
#include <utils/stylehelper.h>
const int notificationTimeout = 8000;
const int shortNotificationTimeout = 1000;
namespace Core {
namespace Internal {
class FadeWidgetHack : public QWidget
class FutureProgressPrivate : public QObject
{
Q_OBJECT
Q_PROPERTY(float opacity READ opacity WRITE setOpacity)
public:
FadeWidgetHack(QWidget *parent):QWidget(parent), m_opacity(0){
setAttribute(Qt::WA_TransparentForMouseEvents);
}
void paintEvent(QPaintEvent *);
void setOpacity(float o) { m_opacity = o; update(); }
float opacity() const { return m_opacity; }
private:
float m_opacity;
};
void FadeWidgetHack::paintEvent(QPaintEvent *)
{
if (m_opacity == 0)
return;
QPainter p(this);
p.setOpacity(m_opacity);
if (m_opacity > 0)
Utils::StyleHelper::verticalGradient(&p, rect(), rect());
}
} // namespace Internal
public slots:
void fadeAway();
struct FutureProgressPrivate {
public:
explicit FutureProgressPrivate(FutureProgress *q);
void tryToFadeAway();
......@@ -90,7 +65,6 @@ struct FutureProgressPrivate {
QString m_type;
FutureProgress::KeepOnFinishType m_keep;
bool m_waitingForUserInteraction;
Internal::FadeWidgetHack *m_faderWidget;
FutureProgress *m_q;
bool m_isFading;
};
......@@ -98,7 +72,7 @@ struct FutureProgressPrivate {
FutureProgressPrivate::FutureProgressPrivate(FutureProgress *q) :
m_progress(new Internal::ProgressBar), m_widget(0), m_widgetLayout(new QHBoxLayout),
m_keep(FutureProgress::HideOnFinish), m_waitingForUserInteraction(false),
m_faderWidget(new Internal::FadeWidgetHack(q)), m_q(q), m_isFading(false)
m_q(q), m_isFading(false)
{
}
......@@ -231,9 +205,9 @@ void FutureProgress::setStarted()
bool FutureProgress::eventFilter(QObject *, QEvent *e)
{
if (d->m_keep != KeepOnFinish && d->m_waitingForUserInteraction
&& (e->type() == QEvent::MouseMove || e->type() == QEvent::KeyPress)) {
&& (e->type() == QEvent::MouseMove || e->type() == QEvent::KeyPress)) {
qApp->removeEventFilter(this);
QTimer::singleShot(notificationTimeout, this, SLOT(fadeAway()));
QTimer::singleShot(notificationTimeout, d, SLOT(fadeAway()));
}
return false;
}
......@@ -264,7 +238,7 @@ void FutureProgressPrivate::tryToFadeAway()
qApp->installEventFilter(m_q);
m_isFading = true;
} else if (m_keep == FutureProgress::HideOnFinish) {
QTimer::singleShot(shortNotificationTimeout, m_q, SLOT(fadeAway()));
QTimer::singleShot(shortNotificationTimeout, this, SLOT(fadeAway()));
m_isFading = true;
}
}
......@@ -314,11 +288,6 @@ void FutureProgress::mousePressEvent(QMouseEvent *event)
QWidget::mousePressEvent(event);
}
void FutureProgress::resizeEvent(QResizeEvent *)
{
d->m_faderWidget->setGeometry(rect());
}
/*!
\fn bool FutureProgress::hasError() const
Returns the error state of this progress indicator.
......@@ -328,25 +297,6 @@ bool FutureProgress::hasError() const
return d->m_progress->hasError();
}
void FutureProgress::fadeAway()
{
d->m_faderWidget->raise();
QSequentialAnimationGroup *group = new QSequentialAnimationGroup(this);
QPropertyAnimation *animation = new QPropertyAnimation(d->m_faderWidget, "opacity");
animation->setDuration(600);
animation->setEndValue(1.0);
group->addAnimation(animation);
animation = new QPropertyAnimation(this, "maximumHeight");
animation->setDuration(120);
animation->setEasingCurve(QEasingCurve::InCurve);
animation->setStartValue(sizeHint().height());
animation->setEndValue(0.0);
group->addAnimation(animation);
group->start(QAbstractAnimation::DeleteWhenStopped);
connect(group, SIGNAL(finished()), this, SIGNAL(removeMe()));
}
void FutureProgress::setType(const QString &type)
{
d->m_type = type;
......@@ -378,6 +328,28 @@ QWidget *FutureProgress::widget() const
return d->m_widget;
}
void FutureProgressPrivate::fadeAway()
{
QGraphicsOpacityEffect *opacityEffect = new QGraphicsOpacityEffect;
opacityEffect->setOpacity(1.);
m_q->setGraphicsEffect(opacityEffect);
QSequentialAnimationGroup *group = new QSequentialAnimationGroup(this);
QPropertyAnimation *animation = new QPropertyAnimation(opacityEffect, "opacity");
animation->setDuration(600);
animation->setEndValue(0.);
group->addAnimation(animation);
animation = new QPropertyAnimation(m_q, "maximumHeight");
animation->setDuration(120);
animation->setEasingCurve(QEasingCurve::InCurve);
animation->setStartValue(m_q->sizeHint().height());
animation->setEndValue(0.0);
group->addAnimation(animation);
group->start(QAbstractAnimation::DeleteWhenStopped);
connect(group, SIGNAL(finished()), m_q, SIGNAL(removeMe()));
}
} // namespace Core
#include "futureprogress.moc"
......@@ -37,7 +37,7 @@
#include <QWidget>
namespace Core {
struct FutureProgressPrivate;
class FutureProgressPrivate;
class CORE_EXPORT FutureProgress : public QWidget
{
......@@ -79,7 +79,6 @@ signals:
protected:
void mousePressEvent(QMouseEvent *event);
void resizeEvent(QResizeEvent *);
private slots:
void updateToolTip(const QString &);
......@@ -89,7 +88,6 @@ private slots:
void setProgressRange(int min, int max);
void setProgressValue(int val);
void setProgressText(const QString &text);
void fadeAway();
private:
FutureProgressPrivate *d;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment