diff options
author | Frerich Raabe <raabe@kde.org> | 2014-09-16 03:15:39 +0200 |
---|---|---|
committer | Slávek Banko <slavek.banko@axis.cz> | 2014-09-16 03:41:40 +0200 |
commit | 0c5a2640a6ab97b1ba97eb2399bd58fb1e890f0c (patch) | |
tree | a25e6f2cdec89e052e1ffc5bb631030d4d07a653 /src/widgets/qprogressbar.cpp | |
parent | b47847259808cc29f6bf98b8c788603d0d21a038 (diff) | |
download | tqt3-0c5a2640a6ab97b1ba97eb2399bd58fb1e890f0c.tar.gz tqt3-0c5a2640a6ab97b1ba97eb2399bd58fb1e890f0c.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.
Diffstat (limited to 'src/widgets/qprogressbar.cpp')
-rw-r--r-- | src/widgets/qprogressbar.cpp | 55 |
1 files changed, 52 insertions, 3 deletions
diff --git a/src/widgets/qprogressbar.cpp b/src/widgets/qprogressbar.cpp index d1300d3e2..3eb0db0dc 100644 --- a/src/widgets/qprogressbar.cpp +++ b/src/widgets/qprogressbar.cpp @@ -51,6 +51,14 @@ #endif #include <limits.h> +class TQProgressBarPrivate +{ + public: + TQProgressBarPrivate() : last_painted_progress( 0 ) { } + + int last_painted_progress; +}; + /*! \class TQProgressBar ntqprogressbar.h \brief The TQProgressBar widget provides a horizontal progress bar. @@ -103,7 +111,7 @@ TQProgressBar::TQProgressBar( TQWidget *parent, const char *name, WFlags f ) center_indicator( TRUE ), auto_indicator( TRUE ), percentage_visible( TRUE ), - d( 0 ), + d( new TQProgressBarPrivate ), m_orientation( Horizontal ) { setSizePolicy( TQSizePolicy( TQSizePolicy::Expanding, TQSizePolicy::Fixed ) ); @@ -135,7 +143,7 @@ TQProgressBar::TQProgressBar( int totalSteps, center_indicator( TRUE ), auto_indicator( TRUE ), percentage_visible( TRUE ), - d( 0 ), + d( new TQProgressBarPrivate ), m_orientation( Horizontal ) { setSizePolicy( TQSizePolicy( TQSizePolicy::Expanding, TQSizePolicy::Fixed ) ); @@ -144,6 +152,16 @@ TQProgressBar::TQProgressBar( int totalSteps, /*! + Destroys the object and frees any allocated ressources. +*/ + +TQProgressBar::~TQProgressBar() +{ + delete d; +} + + +/*! Reset the progress bar. The progress bar "rewinds" and shows no progress. */ @@ -194,11 +212,16 @@ void TQProgressBar::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) TQAccessible::updateAccessibility( this, 0, TQAccessible::ValueChanged ); @@ -330,6 +353,32 @@ void TQProgressBar::styleChange( TQStyle& old ) TQFrame::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 TQProgressBar::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 TQABS( delta ) >= progressPerPixel; +} + TQt::Orientation TQProgressBar::orientation() const { return m_orientation; |