-rw-r--r-- | noncore/styles/liquid/liquid.cpp | 88 |
1 files changed, 82 insertions, 6 deletions
diff --git a/noncore/styles/liquid/liquid.cpp b/noncore/styles/liquid/liquid.cpp index 259f6af..4013981 100644 --- a/noncore/styles/liquid/liquid.cpp +++ b/noncore/styles/liquid/liquid.cpp @@ -29,9 +29,9 @@ #include <qtoolbutton.h> #include <qheader.h> #include <unistd.h> #include <qmenubar.h> - +#include <qprogressbar.h> #include <stdio.h> #include "htmlmasks.h" @@ -852,12 +852,9 @@ void LiquidStyle::polish(QWidget *w) if(w->isTopLevel()){ return; } - - - - if(w->inherits("QComboBox") || + if(w->inherits("QComboBox") || w->inherits("QProgressBar") || w->inherits("QLineEdit") || w->inherits("QRadioButton") || w->inherits("QCheckBox") || w->inherits("QScrollBar")) { w->installEventFilter(this); } @@ -1034,8 +1031,70 @@ void LiquidStyle::unPolish(QApplication *app) // QApplication::qwsSetDecoration ( new QPEDecoration ( )); } + +/* !! 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, const QColorGroup &g, QPixmap *pix ) + { + 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 bw = w * prog / total; + if ( bw > w ) + bw = w; + + p.setPen(g.button().dark(130)); + p.drawRect(x, y, bw, h); + p.setPen(g.button().light(120)); + p.drawRect(x+1, y+1, bw-2, h-2); + + if(bw >= 4 && h >= 4 && pix) + p.drawTiledPixmap(x+2, y+2, bw-4, h-4, *pix); + + if ( progress ( )>= 0 && totalSteps ( ) > 0 ) { + QString pstr; + pstr. sprintf ( "%d%%", 100 * progress()/totalSteps ()); + p. setPen ( g.text());//g.highlightedText ( )); + p. drawText (x,y,w-1,h-1,AlignCenter,pstr); + } + } + } +}; + + + /* * This is a fun method ;-) Here's an overview. KToolBar grabs resize to * force everything to erase and repaint on resize. This is going away, I'm * trying to get shaped widgets to work right without masking. QPushButton, @@ -1239,9 +1298,26 @@ bool LiquidStyle::eventFilter(QObject *obj, QEvent *ev) } } } } - return(false); + else if (obj-> inherits( "QProgressBar" )) { + if ( ev->type() == QEvent::Paint ) { + HackProgressBar *p = (HackProgressBar *) obj; + const QColorGroup &g = p-> colorGroup ( ); + + QPixmap *pix = bevelFillDict.find(g.button().dark(120).rgb()); + if(!pix){ + int h, s, v; + g.button().dark(120).hsv(&h, &s, &v); + pix = new QPixmap(*bevelFillPix); + adjustHSV(*pix, h, s, v); + bevelFillDict.insert(g.button().dark(120).rgb(), pix); + } + p-> paint ((QPaintEvent *) ev, g, pix ); + return true; + } + } + return false ; } void LiquidStyle::drawButton(QPainter *p, int x, int y, int w, int h, const QColorGroup &g, bool sunken, |