author | sandman <sandman> | 2002-11-21 19:54:25 (UTC) |
---|---|---|
committer | sandman <sandman> | 2002-11-21 19:54:25 (UTC) |
commit | 6d302b82aab909da59852d99a31bcc7726ba9f34 (patch) (side-by-side diff) | |
tree | e090ba7fcd96afe5fd74e7451f2c59b64f0eb369 | |
parent | 440f1d4d439c83368a855355cdceda43660137f2 (diff) | |
download | opie-6d302b82aab909da59852d99a31bcc7726ba9f34.zip opie-6d302b82aab909da59852d99a31bcc7726ba9f34.tar.gz opie-6d302b82aab909da59852d99a31bcc7726ba9f34.tar.bz2 |
- progress bars are now also themed (same hack/workaround, that is used in
liquid)
- some speed optimizations
-rw-r--r-- | noncore/styles/theme/othemestyle.cpp | 126 | ||||
-rw-r--r-- | noncore/styles/theme/othemestyle.h | 16 |
2 files changed, 124 insertions, 18 deletions
diff --git a/noncore/styles/theme/othemestyle.cpp b/noncore/styles/theme/othemestyle.cpp index 8c7a71b..a820efb 100644 --- a/noncore/styles/theme/othemestyle.cpp +++ b/noncore/styles/theme/othemestyle.cpp @@ -26,8 +26,67 @@ #include <qtabbar.h> #include <qglobal.h> +#include <qprogressbar.h> #include <limits.h> #include <stdio.h> +typedef void (QStyle::*QDrawMenuBarItemImpl) (QPainter *, int, int, int, int, QMenuItem *, + QColorGroup &, bool, bool); + +QDrawMenuBarItemImpl qt_set_draw_menu_bar_impl(QDrawMenuBarItemImpl impl); + + +/* !! HACK !! Beware + * + * TT forgot to make the QProgressBar widget styleable in Qt 2.x + * So the only way to customize the drawing, is to intercept the + * paint event - since we have to use protected functions, we need + * to derive a "hack" class from QProgressBar and do the painting + * in there. + * + * - sandman + */ + +class HackProgressBar : public QProgressBar { +public: + HackProgressBar ( ); + + void paint ( QPaintEvent *event, OThemeStyle *style ) + { + QPainter p( this ); + + if ( !contentsRect().contains( event->rect() ) ) { + p.save(); + p.setClipRegion( event->region().intersect(frameRect()) ); + drawFrame( &p); + p.restore(); + } + if ( event->rect().intersects( contentsRect() )) { + p.setClipRegion( event->region().intersect( contentsRect() ) ); + + int x, y, w, h; + contentsRect ( ). rect ( &x, &y, &w, &h ); + + int prog = progress ( ); + int total = totalSteps ( ); + if ( prog < 0 ) + prog = 0; + if ( total <= 0 ) + total = 1; + int perc = prog * 100 / total; + + style-> drawProgressBar ( &p, x, y, w, h, colorGroup ( ), perc ); + + if ( progress ( ) >= 0 && totalSteps ( ) > 0 ) { + QString pstr; + pstr. sprintf ( "%d%%", 100 * progress()/totalSteps ()); + p. setPen ( colorGroup().text());//g.highlightedText ( )); + p. drawText (x,y,w-1,h-1,AlignCenter,pstr); + } + } + } +}; + + #define QCOORDARRLEN(x) sizeof(x)/(sizeof(QCOORD)*2) @@ -43,5 +102,8 @@ OThemeStyle::~OThemeStyle() void OThemeStyle::polish( QApplication * /*app*/ ) -{} +{ + qt_set_draw_menu_bar_impl((QDrawMenuBarItemImpl) &OThemeStyle::drawMenuBarItem); +} + void OThemeStyle::polish( QPalette &p ) @@ -80,4 +142,5 @@ void OThemeStyle::polish( QPalette &p ) void OThemeStyle::unPolish( QApplication *app ) { + qt_set_draw_menu_bar_impl ( 0 ); app->setPalette( oldPalette, true ); } @@ -113,5 +176,5 @@ void OThemeStyle::polish( QWidget *w ) } } - if ( w->inherits( "QCheckBox" ) ) { + else if ( w->inherits( "QCheckBox" ) ) { if ( isColor( IndicatorOff ) || isColor( IndicatorOn ) ) { QPalette newPal( w->palette() ); @@ -126,5 +189,5 @@ void OThemeStyle::polish( QWidget *w ) } } - if ( w->inherits( "QRadioButton" ) ) { + else if ( w->inherits( "QRadioButton" ) ) { if ( isColor( ExIndicatorOff ) || isColor( ExIndicatorOn ) ) { QPalette newPal( w->palette() ); @@ -140,4 +203,7 @@ void OThemeStyle::polish( QWidget *w ) } } + else if ( w-> inherits ( "QProgressBar" ) ) { + w-> installEventFilter ( this ); + } } @@ -160,8 +226,22 @@ void OThemeStyle::unPolish( QWidget* w ) if ( w->inherits( "QPopupMenu" ) ) w->unsetPalette(); - if ( w->inherits( "QCheckBox" ) ) + else if ( w->inherits( "QCheckBox" ) ) w->unsetPalette(); - if ( w->inherits( "QRadioButton" ) ) + else if ( w->inherits( "QRadioButton" ) ) w->unsetPalette(); + else if ( w-> inherits ( "QProgressBar" ) ) + w-> removeEventFilter ( this ); +} + +bool OThemeStyle::eventFilter ( QObject *obj, QEvent *ev ) +{ + // only QProgressBar so far + + if ( ev-> type ( ) == QEvent::Paint ) { + HackProgressBar *pb = (HackProgressBar *) obj; + pb-> paint ((QPaintEvent *) ev, this ); + return true; + } + return false; } @@ -1348,9 +1428,17 @@ void OThemeStyle::drawKMenuBar( QPainter *p, int x, int y, int w, int h, MenuBar ); } +#endif -void OThemeStyle::drawKMenuItem( QPainter *p, int x, int y, int w, int h, - const QColorGroup &g, bool active, - QMenuItem *mi, QBrush * ) +void OThemeStyle::drawMenuBarItem( QPainter *p, int x, int y, int w, int h, + QMenuItem *mi, const QColorGroup &g, + bool /*enabled*/, bool active ) { + if(active){ + x -= 2; // Bug in Qt/E + y -= 2; + w += 2; + h += 2; + } + const QColorGroup * cg = colorGroup( g, active ? MenuBarItem : MenuBar ); QColor btext = cg->buttonText(); @@ -1360,9 +1448,27 @@ void OThemeStyle::drawKMenuItem( QPainter *p, int x, int y, int w, int h, drawItem( p, x, y, w, h, AlignCenter | ShowPrefix | DontClip | SingleLine, - *cg, mi->isEnabled(), mi->pixmap(), mi->text(), + *cg, mi-> isEnabled ( ), mi->pixmap(), mi->text(), -1, &btext ); - ; } + + +void OThemeStyle::drawProgressBar ( QPainter *p, int x, int y, int w, int h, const QColorGroup &g, int percent ) +{ + const QColorGroup * cg = colorGroup( g, ProgressBg ); + QBrush bg; + bg.setColor( cg->color( QColorGroup::Background ) ); + if ( isPixmap( ProgressBg ) ) + bg.setPixmap( *uncached( ProgressBg ) ); + + int pw = w * percent / 100; + + p-> fillRect ( x + pw, y, w - pw, h, bg ); // ### TODO + + drawBaseButton( p, x, y, pw, h, *cg, false, false, ProgressBar ); +} + +#if 0 + void OThemeStyle::drawKProgressBlock( QPainter *p, int x, int y, int w, int h, const QColorGroup &g, QBrush * ) diff --git a/noncore/styles/theme/othemestyle.h b/noncore/styles/theme/othemestyle.h index 52445c4..406b35b 100644 --- a/noncore/styles/theme/othemestyle.h +++ b/noncore/styles/theme/othemestyle.h @@ -27,4 +27,6 @@ #include <qstring.h> +class QProgressBar; + /** @@ -64,4 +66,6 @@ public: virtual void polish( QPalette& pal ); + virtual bool eventFilter ( QObject *obj, QEvent *ev ); + /** * This is a convenience method for drawing widgets with @@ -313,10 +317,7 @@ public: * Draw a menubar item. */ -#if 0 - - virtual void drawKMenuItem( QPainter *p, int x, int y, int w, int h, - const QColorGroup &g, bool active, - QMenuItem *item, QBrush *fill = NULL ); -#endif + virtual void drawMenuBarItem( QPainter *p, int x, int y, int w, int h, + QMenuItem *item, const QColorGroup &g, + bool enabled, bool active ); /** * Return the width of the splitter as specified in the config file. @@ -353,6 +354,5 @@ public: * Draw a @ref KProgess bar. */ - // virtual void drawKProgressBlock(QPainter *p, int x, int y, int w, int h, - // const QColorGroup &g, QBrush *fill); + virtual void drawProgressBar (QPainter *, int , int , int , int , const QColorGroup &, int ); /** * Return the background for @ref KProgress. |