libkdegames
kgameprogress.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00022 #include "kgameprogress.h"
00023
00024 #include <QPaintEvent>
00025 #include <QPainter>
00026 #include <QPixmap>
00027 #include <QRegExp>
00028 #include <QStyle>
00029 #include <QFrame>
00030 #include <QApplication>
00031 #include <QtGui/QAbstractSlider>
00032
00033 #include <kglobalsettings.h>
00034
00035 class KGameProgress::KGameProgressPrivate
00036 {
00037 public:
00038 KGameProgressPrivate(KGameProgress *qq)
00039 : q(qq)
00040 {
00041 }
00042
00043 KGameProgress *q;
00044
00045 void initialize();
00046 int recalcValue(int);
00047 void drawText(QPainter *);
00048 void adjustStyle();
00049
00050 QPixmap *bar_pixmap;
00051 bool use_supplied_bar_color;
00052 QColor bar_color;
00053 QColor bar_text_color;
00054 QColor text_color;
00055 QRect fr;
00056 BarStyle bar_style;
00057 bool text_enabled;
00058 QString format_;
00059 QAbstractSlider *slider;
00060 };
00061
00062
00063 KGameProgress::KGameProgress(QWidget *parent)
00064 : QFrame(parent), d(new KGameProgressPrivate(this))
00065 {
00066 d->initialize();
00067 d->slider->setOrientation(Qt::Horizontal);
00068 }
00069
00070 KGameProgress::KGameProgress(Qt::Orientation orientation, QWidget *parent)
00071 : QFrame(parent), d(new KGameProgressPrivate(this))
00072 {
00073 d->initialize();
00074 d->slider->setOrientation(orientation);
00075 }
00076
00077 KGameProgress::~KGameProgress()
00078 {
00079 delete d->bar_pixmap;
00080 delete d;
00081 }
00082
00083 void KGameProgress::advance(int offset)
00084 {
00085 setValue(value() + offset);
00086 }
00087
00088 void KGameProgress::KGameProgressPrivate::initialize()
00089 {
00090 slider = new QAbstractSlider(q);
00091
00092 slider->setMinimum(0);
00093 slider->setMaximum(100);
00094 slider->setValue(0);
00095
00096 format_ = "%p%";
00097 use_supplied_bar_color = false;
00098 bar_pixmap = 0;
00099 bar_style = Solid;
00100 text_enabled = true;
00101 connect(slider, SIGNAL(valueChanged(int)), q, SLOT(valueChange(int)));
00102 connect(KGlobalSettings::self(), SIGNAL(appearanceChanged()), q, SLOT(paletteChange()));
00103 q->paletteChange();
00104 }
00105
00106 void KGameProgress::paletteChange()
00107 {
00108 QPalette p = qApp->palette();
00109 if (!d->use_supplied_bar_color)
00110 d->bar_color = p.color( QPalette::Active, QPalette::Highlight );
00111 d->bar_text_color = p.color( QPalette::Active, QPalette::HighlightedText );
00112 d->text_color = p.color( QPalette::Active, QPalette::Text );
00113 setPalette(p);
00114
00115 d->adjustStyle();
00116 }
00117
00118
00119 void KGameProgress::setBarPixmap(const QPixmap &pixmap)
00120 {
00121 if (pixmap.isNull())
00122 return;
00123 if (d->bar_pixmap)
00124 delete d->bar_pixmap;
00125
00126 d->bar_pixmap = new QPixmap(pixmap);
00127 }
00128
00129 void KGameProgress::setBarColor(const QColor &color)
00130 {
00131 d->bar_color = color;
00132 d->use_supplied_bar_color = true;
00133 if (d->bar_pixmap) {
00134 delete d->bar_pixmap;
00135 d->bar_pixmap = 0;
00136 }
00137 }
00138
00139 void KGameProgress::setBarStyle(BarStyle style)
00140 {
00141 if (d->bar_style != style) {
00142 d->bar_style = style;
00143 update();
00144 }
00145 }
00146
00147 void KGameProgress::setOrientation(Qt::Orientation orientation)
00148 {
00149 if (this->orientation() != orientation) {
00150 setOrientation(orientation);
00151 update();
00152 }
00153 }
00154
00155 void KGameProgress::setValue(int value)
00156 {
00157 d->slider->setValue( value );
00158 }
00159
00160 void KGameProgress::setMinimum(int value)
00161 {
00162 d->slider->setMinimum( value );
00163 }
00164
00165 void KGameProgress::setMaximum(int value)
00166 {
00167 d->slider->setMaximum( value );
00168 }
00169
00170 void KGameProgress::setTextEnabled(bool enable)
00171 {
00172 d->text_enabled = enable;
00173 }
00174
00175 QColor KGameProgress::barColor() const
00176 {
00177 return d->bar_color;
00178 }
00179
00180 const QPixmap * KGameProgress::barPixmap() const
00181 {
00182 return d->bar_pixmap;
00183 }
00184
00185 int KGameProgress::value() const
00186 {
00187 return d->slider->value();
00188 }
00189
00190 int KGameProgress::minimum() const
00191 {
00192 return d->slider->minimum();
00193 }
00194
00195 int KGameProgress::maximum() const
00196 {
00197 return d->slider->maximum();
00198 }
00199
00200 bool KGameProgress::textEnabled() const
00201 {
00202 return d->text_enabled;
00203 }
00204
00205 QSize KGameProgress::sizeHint() const
00206 {
00207 QSize s( size() );
00208
00209 if(orientation() == Qt::Vertical) {
00210 s.setWidth(24);
00211 } else {
00212 s.setHeight(24);
00213 }
00214
00215 return s;
00216 }
00217
00218 QSize KGameProgress::minimumSizeHint() const
00219 {
00220 return sizeHint();
00221 }
00222
00223 QSizePolicy KGameProgress::sizePolicy() const
00224 {
00225 if ( orientation()==Qt::Vertical )
00226 return QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Expanding );
00227 else
00228 return QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed );
00229 }
00230
00231 Qt::Orientation KGameProgress::orientation() const
00232 {
00233 return d->slider->orientation();
00234 }
00235
00236 KGameProgress::BarStyle KGameProgress::barStyle() const
00237 {
00238 return d->bar_style;
00239 }
00240
00241 int KGameProgress::KGameProgressPrivate::recalcValue(int range)
00242 {
00243 int abs_value = q->value() - q->minimum();
00244 int abs_range = q->maximum() - q->minimum();
00245 return abs_range ? range * abs_value / abs_range : 0;
00246 }
00247
00248 void KGameProgress::valueChange(int newValue)
00249 {
00250 Q_UNUSED(newValue);
00251
00252 repaint(contentsRect());
00253 emit percentageChanged(d->recalcValue(100));
00254 }
00255
00256 void KGameProgress::styleChange(QStyle&)
00257 {
00258 d->adjustStyle();
00259 }
00260
00261 void KGameProgress::KGameProgressPrivate::adjustStyle()
00262 {
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274 q->update();
00275 }
00276
00277 void KGameProgress::paletteChange( const QPalette &p )
00278 {
00279
00280
00281 QFrame::paletteChange(p);
00282 }
00283
00284 void KGameProgress::KGameProgressPrivate::drawText(QPainter *p)
00285 {
00286 QRect r(q->contentsRect());
00287
00288
00289
00290
00291 QString s(format_);
00292
00293 s.replace(QRegExp(QString::fromLatin1("%p")), QString::number(recalcValue(100)));
00294 s.replace(QRegExp(QString::fromLatin1("%v")), QString::number(q->value()));
00295 s.replace(QRegExp(QString::fromLatin1("%m")), QString::number(q->maximum()));
00296
00297 p->setPen(text_color);
00298 QFont font = p->font();
00299 font.setBold(true);
00300 p->setFont(font);
00301
00302 p->drawText(r, Qt::AlignCenter, s);
00303 p->setClipRegion( fr );
00304 p->setPen(bar_text_color);
00305 p->drawText(r, Qt::AlignCenter, s);
00306 }
00307
00308 void KGameProgress::paintEvent( QPaintEvent *e )
00309 {
00310
00311 QFrame::paintEvent(e);
00312
00313
00314 QPainter p(this);
00315
00316 QRect cr = contentsRect(), er = cr;
00317 d->fr = cr;
00318 QBrush fb(d->bar_color), eb(palette().color(backgroundRole()));
00319
00320 if (d->bar_pixmap)
00321 fb.setTexture(*d->bar_pixmap);
00322
00323 QPixmap bkgnd_pix = palette().brush(backgroundRole()).texture();
00324 if (!bkgnd_pix.isNull())
00325 eb.setTexture(bkgnd_pix);
00326
00327 switch (d->bar_style) {
00328 case Solid:
00329 if (orientation() == Qt::Horizontal) {
00330 d->fr.setWidth(d->recalcValue(cr.width()));
00331 er.setLeft(d->fr.right() + 1);
00332 } else {
00333 d->fr.setTop(cr.bottom() - d->recalcValue(cr.height()));
00334 er.setBottom(d->fr.top() - 1);
00335 }
00336
00337 p.setBrushOrigin(cr.topLeft());
00338 p.fillRect(d->fr, fb);
00339
00340 p.fillRect(er, eb);
00341
00342 break;
00343
00344 case Blocked:
00345 const int margin = 2;
00346 int max, num, dx, dy;
00347 if (orientation() == Qt::Horizontal) {
00348 d->fr.setHeight(cr.height() - 2 * margin);
00349 d->fr.setWidth((int)(0.67 * d->fr.height()));
00350 d->fr.moveTopLeft(QPoint(cr.left() + margin, cr.top() + margin));
00351 dx = d->fr.width() + margin;
00352 dy = 0;
00353 max = (cr.width() - margin) / (d->fr.width() + margin) + 1;
00354 num = d->recalcValue(max);
00355 } else {
00356 d->fr.setWidth(cr.width() - 2 * margin);
00357 d->fr.setHeight((int)(0.67 * d->fr.width()));
00358 d->fr.moveBottomLeft(QPoint(cr.left() + margin, cr.bottom() - margin));
00359 dx = 0;
00360 dy = - (d->fr.height() + margin);
00361 max = (cr.height() - margin) / (d->fr.height() + margin) + 1;
00362 num = d->recalcValue(max);
00363 }
00364 p.setClipRect(cr.x() + margin, cr.y() + margin,
00365 cr.width() - margin, cr.height() - margin);
00366 for (int i = 0; i < num; i++) {
00367 p.setBrushOrigin(d->fr.topLeft());
00368 p.fillRect(d->fr, fb);
00369 d->fr.translate(dx, dy);
00370 }
00371
00372 if (num != max) {
00373 if (orientation() == Qt::Horizontal)
00374 er.setLeft(d->fr.right() + 1);
00375 else
00376 er.setBottom(d->fr.bottom() + 1);
00377 if (!er.isNull()) {
00378 p.setBrushOrigin(cr.topLeft());
00379 p.fillRect(er, eb);
00380 }
00381 }
00382
00383 break;
00384 }
00385
00386 if (d->text_enabled && d->bar_style != Blocked)
00387 d->drawText(&p);
00388 }
00389
00390 void KGameProgress::setFormat(const QString & format)
00391 {
00392 d->format_ = format;
00393 }
00394
00395 QString KGameProgress::format() const
00396 {
00397 return d->format_;
00398 }
00399
00400 #include "kgameprogress.moc"