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 }