diff options
author | Frerich Raabe <raabe@kde.org> | 2014-09-16 03:14:25 +0200 |
---|---|---|
committer | Slávek Banko <slavek.banko@axis.cz> | 2015-12-15 19:54:01 +0100 |
commit | a356a05c01adbb76af956f1dc33dd7a8a80de5d2 (patch) | |
tree | 1a16f52dc7d1e857fe9d051e3bb611dab5cf91f8 /src | |
parent | b5cb163e01b2b2306e20d41d61163b06881fd089 (diff) | |
download | qt3-a356a05c01adbb76af956f1dc33dd7a8a80de5d2.tar.gz qt3-a356a05c01adbb76af956f1dc33dd7a8a80de5d2.zip |
Add repaint optimization to TQProgressBar
This optimization makes TQProgressBar::setProgress() only repaint itself
if stepping to the new progress would cause a graphical change. This means
that for a width W and a total number of steps S, it will repaint itself
'W' times (every 'S/W' steps) instead of 'S' times (every step) as it is
right now.
(cherry picked from commit 9f882f9de741d76b8f45b0dc23d4fe65d6e09d78)
Diffstat (limited to 'src')
-rw-r--r-- | src/widgets/qprogressbar.cpp | 55 | ||||
-rw-r--r-- | src/widgets/qprogressbar.h | 2 |
2 files changed, 54 insertions, 3 deletions
diff --git a/src/widgets/qprogressbar.cpp b/src/widgets/qprogressbar.cpp index a64ea8c..57bb332 100644 --- a/src/widgets/qprogressbar.cpp +++ b/src/widgets/qprogressbar.cpp @@ -50,6 +50,14 @@ #endif #include <limits.h> +class QProgressBarPrivate +{ + public: + QProgressBarPrivate() : last_painted_progress( 0 ) { } + + int last_painted_progress; +}; + /*! \class QProgressBar qprogressbar.h \brief The QProgressBar widget provides a horizontal progress bar. @@ -102,7 +110,7 @@ QProgressBar::QProgressBar( QWidget *parent, const char *name, WFlags f ) center_indicator( TRUE ), auto_indicator( TRUE ), percentage_visible( TRUE ), - d( 0 ) + d( new QProgressBarPrivate ) { setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); initFrame(); @@ -133,7 +141,7 @@ QProgressBar::QProgressBar( int totalSteps, center_indicator( TRUE ), auto_indicator( TRUE ), percentage_visible( TRUE ), - d( 0 ) + d( new QProgressBarPrivate ) { setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); initFrame(); @@ -141,6 +149,16 @@ QProgressBar::QProgressBar( int totalSteps, /*! + Destroys the object and frees any allocated ressources. +*/ + +QProgressBar::~QProgressBar() +{ + delete d; +} + + +/*! Reset the progress bar. The progress bar "rewinds" and shows no progress. */ @@ -191,11 +209,16 @@ void QProgressBar::setProgress( int progress ) progress < 0 || ( ( progress > total_steps ) && total_steps ) ) return; + const bool needRepaint = isVisible() && requireRepaint( progress ); + progress_val = progress; setIndicator( progress_str, progress_val, total_steps ); - repaint( FALSE ); + if ( needRepaint ) { + repaint( FALSE ); + d->last_painted_progress = progress; + } #if defined(QT_ACCESSIBILITY_SUPPORT) QAccessible::updateAccessibility( this, 0, QAccessible::ValueChanged ); @@ -321,6 +344,32 @@ void QProgressBar::styleChange( QStyle& old ) QFrame::styleChange( old ); } +/*! + This method returns whether changing the progress to the \a newValue + would require a repaint of the progress bar. This allows efficient + repainting. +*/ +bool QProgressBar::requireRepaint( int newProgress ) const +{ + if ( newProgress == progress_val || + newProgress == d->last_painted_progress ) { + return false; + } + + const int width = contentsRect().width(); + if ( width == 0 ) { + return false; + } + + float progressPerPixel = 1.0; + if ( total_steps > width ) { + progressPerPixel = float( total_steps ) / float( width ); + } + + const int delta = d->last_painted_progress - newProgress; + return QABS( delta ) >= progressPerPixel; +} + /*! This method is called to generate the text displayed in the center diff --git a/src/widgets/qprogressbar.h b/src/widgets/qprogressbar.h index 2c4f039..69afd94 100644 --- a/src/widgets/qprogressbar.h +++ b/src/widgets/qprogressbar.h @@ -64,6 +64,7 @@ class Q_EXPORT QProgressBar : public QFrame public: QProgressBar( QWidget* parent=0, const char* name=0, WFlags f=0 ); QProgressBar( int totalSteps, QWidget* parent=0, const char* name=0, WFlags f=0 ); + virtual ~QProgressBar(); int totalSteps() const; int progress() const; @@ -94,6 +95,7 @@ protected: virtual bool setIndicator( QString & progress_str, int progress, int totalSteps ); void styleChange( QStyle& ); + bool requireRepaint( int newProgress ) const; private: int total_steps; |