File indexing completed on 2024-05-19 05:35:21

0001 //////////////////////////////////////////////////////////////////////////////
0002 // oxygenprogressbar.cpp
0003 // data container for progressbar animations
0004 // -------------------
0005 //
0006 // SPDX-FileCopyrightText: 2009 Hugo Pereira Da Costa <hugo.pereira@free.fr>
0007 //
0008 // SPDX-License-Identifier: MIT
0009 //////////////////////////////////////////////////////////////////////////////
0010 
0011 #include "oxygenprogressbardata.h"
0012 
0013 #include <QProgressBar>
0014 
0015 namespace Oxygen
0016 {
0017 //______________________________________________
0018 ProgressBarData::ProgressBarData(QObject *parent, QWidget *target, int duration)
0019     : GenericData(parent, target, duration)
0020     , _startValue(0)
0021     , _endValue(0)
0022 {
0023     target->installEventFilter(this);
0024 
0025     // set animation curve shape
0026     animation().data()->setEasingCurve(QEasingCurve::InOutQuad);
0027 
0028     // make sure target is a progressbar and store relevant values
0029     QProgressBar *progress = qobject_cast<QProgressBar *>(target);
0030     Q_CHECK_PTR(progress);
0031     _startValue = progress->value();
0032     _endValue = progress->value();
0033 
0034     // setup connections
0035     connect(target, SIGNAL(valueChanged(int)), SLOT(valueChanged(int)));
0036 }
0037 
0038 //______________________________________________
0039 bool ProgressBarData::eventFilter(QObject *object, QEvent *event)
0040 {
0041     if (!(enabled() && object && object == target().data()))
0042         return AnimationData::eventFilter(object, event);
0043     switch (event->type()) {
0044     case QEvent::Show: {
0045         // reset start and end value
0046         QProgressBar *progress = static_cast<QProgressBar *>(target().data());
0047         _startValue = progress->value();
0048         _endValue = progress->value();
0049         break;
0050     }
0051 
0052     case QEvent::Hide: {
0053         if (animation().data()->isRunning()) {
0054             animation().data()->stop();
0055         }
0056         break;
0057     }
0058 
0059     default:
0060         break;
0061     }
0062 
0063     return AnimationData::eventFilter(object, event);
0064 }
0065 
0066 //______________________________________________
0067 void ProgressBarData::valueChanged(int value)
0068 {
0069     // do nothing if not enabled
0070     if (!enabled())
0071         return;
0072 
0073     // do nothing if progress is invalid
0074     QProgressBar *progress = static_cast<QProgressBar *>(target().data());
0075     if (!(progress && progress->maximum() != progress->minimum()))
0076         return;
0077 
0078     // update start and end values
0079     bool isRunning(animation().data()->isRunning());
0080     if (isRunning) {
0081         // in case next value arrives while animation is running,
0082         // end animation, set value immediately
0083         // and trigger target update. This increases responsiveness of progressbars
0084         _startValue = value;
0085         _endValue = value;
0086         animation().data()->stop();
0087         setOpacity(0);
0088 
0089         if (target())
0090             target().data()->update();
0091 
0092         return;
0093     }
0094 
0095     _startValue = _endValue;
0096     _endValue = value;
0097 
0098     // start animation only if target is enabled, visible, not running,
0099     // and if end and start values are different enough
0100     // (with end value being larger than start value)
0101     if (!(target() && target().data()->isEnabled() && target().data()->isVisible()))
0102         return;
0103     if (isRunning || _endValue - _startValue < 2)
0104         return;
0105 
0106     animation().data()->start();
0107 }
0108 }