@ -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,13 +141,23 @@ 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 ( ) ;
}
/*!
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