00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
#include <qpainter.h>
00013
#include <qpicture.h>
00014
#include <qsimplerichtext.h>
00015
#include <qstylesheet.h>
00016
#include <qstyle.h>
00017
#include "qwt_text.h"
00018
#include "qwt_push_button.h"
00019
00020
#ifndef QT_NO_PICTURE
00021
00022
class QwtPBPaintFilter:
public QPicture
00023 {
00024
00025
00026
00027
public:
00028 QwtPBPaintFilter(
const QwtPushButton *);
00029
00030
protected:
00031
virtual bool cmd(
int, QPainter *, QPDevCmdParam *);
00032
00033
private:
00034
bool isLabel(
const QPixmap *) const;
00035 QRect indentRect(const QRect &) const;
00036
00037 const
QwtPushButton *d_button;
00038 QRect d_iconRect;
00039
bool d_inFilter;
00040 };
00041
00042 QwtPBPaintFilter::QwtPBPaintFilter(const
QwtPushButton *button):
00043 d_button(button),
00044 d_inFilter(FALSE)
00045 {
00046 }
00047
00048
bool QwtPBPaintFilter::cmd(
int c, QPainter *painter, QPDevCmdParam *param)
00049 {
00050
switch(c)
00051 {
00052
case PdcDrawTextFormatted:
00053
case PdcDrawText2Formatted:
00054 {
00055 Qt::TextFormat textFormat = d_button->usedTextFormat();
00056
if ( textFormat == Qt::PlainText )
00057 {
00058 param[1].ival = d_button->alignment();
00059
00060 QRect &r = *((QRect *)param[0].rect);
00061 r = indentRect(r);
00062
00063
return QPicture::cmd(c, painter, param);
00064 }
00065
if ( textFormat == Qt::RichText )
00066 {
00067
if ( !d_inFilter )
00068 {
00069 d_inFilter = TRUE;
00070
QwtRichText richText(*param[2].str, painter->font(),
00071 d_button->alignment(), painter->pen().color());
00072 richText.draw(painter, indentRect(*param[0].rect));
00073 d_inFilter = FALSE;
00074
return TRUE;
00075 }
00076 }
00077
break;
00078 }
00079
case PdcDrawPixmap:
00080 {
00081
if ( d_inFilter )
00082 {
00083
00084
00085
00086
break;
00087 }
00088
00089
if ( isLabel(param[1].pixmap) &&
00090 !(d_button->alignment() & Qt::AlignCenter))
00091 {
00092
const QRect contentsRect =
00093
#if QT_VERSION >= 300
00094
d_button->style().subRect(
00095 QStyle::SR_PushButtonContents, d_button);
00096
#else
00097
d_button->style().pushButtonContentsRect(
00098 (QPushButton *)d_button);
00099
#endif
00100
00101 QRect pixRect = contentsRect;
00102
if ( !d_iconRect.isEmpty() )
00103 pixRect.setX(d_iconRect.right());
00104
00105
00106
00107
00108
#if QT_VERSION >= 300
00109
const QRect &r = *((QRect *)param[0].rect);
00110
#else
00111
const QRect r(*param[0].point, param[1].pixmap->size());
00112
#endif
00113
const int offsetY = r.center().y() - pixRect.center().y();
00114
const int offsetX = d_iconRect.isEmpty() ? offsetY : 0;
00115 pixRect.moveBy(offsetX, offsetY);
00116
00117
if ( d_button->indent() > 0 )
00118 {
00119
const int indent = d_button->indent();
00120
const int align = d_button->alignment();
00121
00122
if ( align & Qt::AlignRight )
00123 pixRect.setRight(pixRect.right() - indent);
00124
else if ( align & Qt::AlignLeft )
00125 pixRect.setLeft(pixRect.left() + indent);
00126
00127
if ( align & Qt::AlignTop )
00128 pixRect.setTop(pixRect.top() + indent);
00129
else if ( align & Qt::AlignBottom )
00130 pixRect.setBottom(pixRect.bottom() - indent);
00131 }
00132
00133 pixRect &= contentsRect;
00134
00135 d_inFilter = TRUE;
00136
00137 d_button->style().drawItem(painter,
00138 #
if QT_VERSION >= 300
00139 pixRect,
00140 #
else
00141 pixRect.x(), pixRect.y(),
00142 pixRect.width(), pixRect.height(),
00143
#endif
00144
d_button->alignment(), d_button->colorGroup(),
00145 d_button->isEnabled(), param[1].pixmap, QString::null);
00146
00147 d_inFilter = FALSE;
00148
return TRUE;
00149 }
00150
else
00151 {
00152
00153
00154
00155
#if QT_VERSION < 300
00156
d_iconRect = QRect(*param[0].point, param[1].pixmap->size());
00157
#else
00158
d_iconRect = *param[0].rect;
00159
#endif
00160
}
00161
break;
00162 }
00163 }
00164
return QPicture::cmd(c, painter, param);
00165 }
00166
00167 QRect QwtPBPaintFilter::indentRect(
const QRect &rect)
const
00168
{
00169
const int indent = d_button->indent();
00170
if ( indent <= 0 )
00171
return rect;
00172
00173 QRect r = rect;
00174
if ( d_button->alignment() & Qt::AlignRight )
00175 r.setRight(r.right() - indent);
00176
else if ( d_button->alignment() & Qt::AlignLeft )
00177 r.setLeft(r.left() + indent);
00178
00179
if ( d_button->alignment() & Qt::AlignTop )
00180 r.setTop(r.top() + indent);
00181
else if ( d_button->alignment() & Qt::AlignBottom )
00182 r.setBottom(r.bottom() - indent);
00183
00184
return r;
00185 }
00186
00187
bool QwtPBPaintFilter::isLabel(
const QPixmap *pixmap)
const
00188
{
00189
if ( !d_button->pixmap() ||
00190 d_button->pixmap()->serialNumber() != pixmap->serialNumber() )
00191 {
00192
return FALSE;
00193 }
00194
00195
if ( d_button->iconSet() && !d_button->iconSet()->isNull() )
00196 {
00197
if ( d_button->iconSet()->pixmap().serialNumber() ==
00198 pixmap->serialNumber() )
00199 {
00200
00201
00202
00203
static bool firstPixmap = TRUE;
00204 firstPixmap = !firstPixmap;
00205
00206
return !firstPixmap;
00207 }
00208 }
00209
return TRUE;
00210 }
00211
00212
#endif // !QT_NO_PICTURE
00213
00217 QwtPushButton::QwtPushButton(QWidget *parent,
const char *name):
00218 QPushButton(parent, name)
00219 {
00220 init();
00221 }
00222
00227 QwtPushButton::QwtPushButton(
const QString &text,
00228 QWidget *parent,
const char *name):
00229 QPushButton(text, parent, name)
00230 {
00231 init();
00232 }
00233
00237 QwtPushButton::QwtPushButton(
const QIconSet &iconSet,
const QString &text,
00238 QWidget *parent,
const char *name):
00239 QPushButton(iconSet, text, parent, name)
00240 {
00241 init();
00242 }
00243
00245
void QwtPushButton::init()
00246 {
00247 d_textFormat = Qt::AutoText;
00248 d_alignment = Qt::AlignCenter | Qt::ExpandTabs | Qt::WordBreak;
00249 d_indent = 4;
00250 }
00251
00262 Qt::TextFormat
QwtPushButton::usedTextFormat()
const
00263
{
00264
#ifndef QT_NO_PICTURE
00265
if ( d_textFormat == Qt::AutoText && QStyleSheet::mightBeRichText(text()) )
00266
return Qt::RichText;
00267
#endif
00268
00269
return Qt::PlainText;
00270 }
00271
00277 Qt::TextFormat
QwtPushButton::textFormat()
const
00278
{
00279
return d_textFormat;
00280 }
00281
00291 void QwtPushButton::setTextFormat(TextFormat textFormat)
00292 {
00293 d_textFormat = textFormat;
00294 }
00295
00301 int QwtPushButton::alignment()
const
00302
{
00303
return d_alignment;
00304 }
00305
00315 void QwtPushButton::setAlignment(
int alignment)
00316 {
00317 d_alignment = alignment;
00318 }
00319
00325 int QwtPushButton::indent()
const
00326
{
00327
return d_indent;
00328 }
00329
00340 void QwtPushButton::setIndent(
int indent)
00341 {
00342 d_indent = indent;
00343 }
00344
00352 int QwtPushButton::heightForWidth(
int width)
const
00353
{
00354
if ( pixmap() )
00355
return QPushButton::heightForWidth(width);
00356
00357
QwtText *txt =
QwtText::makeText(text(),
usedTextFormat(),
00358 d_alignment, font());
00359
00360
int h =
sizeHint().height();
00361 h -= txt->
boundingRect().height();
00362 h += txt->
heightForWidth(width);
00363
00364
delete txt;
00365
00366
return h;
00367 }
00368
00370 QSize
QwtPushButton::sizeHint()
const
00371
{
00372 QSize hint = QPushButton::sizeHint();
00373
00374
if ( d_indent > 0 )
00375 {
00376
if ( (d_alignment & Qt::AlignLeft)
00377 || (d_alignment & Qt::AlignRight) )
00378 {
00379 hint.setWidth(hint.width() + d_indent);
00380 }
00381
if ( (d_alignment & Qt::AlignTop)
00382 || (d_alignment & Qt::AlignBottom) )
00383 {
00384 hint.setHeight(hint.height() + d_indent);
00385 }
00386 }
00387
00388
if ( pixmap() )
00389
return hint;
00390
00391
const Qt::TextFormat
textFormat =
usedTextFormat();
00392
if ( textFormat == Qt::RichText )
00393 {
00394
QwtRichText richText(text(), font(), d_alignment);
00395
00396
const QSize sizeText = fontMetrics().size(Qt::ShowPrefix, text());
00397
const QSize sizeRichText(richText.
boundingRect().size());
00398
00399
int iconHeight = 0;
00400
if ( iconSet() && !iconSet()->isNull() )
00401 {
00402 iconHeight = iconSet()->pixmap(QIconSet::Small,
00403 QIconSet::Normal).height();
00404 }
00405
00406
const int heightText = QMAX(iconHeight, sizeText.height());
00407
const int heightRichText = QMAX(iconHeight, sizeRichText.height());
00408
00409 hint.setWidth(hint.width() - sizeText.width() + sizeRichText.width());
00410 hint.setHeight(hint.height() - heightText + heightRichText);
00411 }
00412
00413
return hint;
00414 }
00415
00417 void QwtPushButton::drawButtonLabel(QPainter *painter)
00418 {
00419
#ifndef QT_NO_PICTURE
00420
00421
00422
00423
00424
00425
00426
00427
00428 QwtPBPaintFilter paintFilter(
this);
00429
00430 QPainter picPainter(&paintFilter);
00431 picPainter.setFont(painter->font());
00432
00433
#if QT_VERSION >= 300
00434
00435
00436
00437
00438
00439 QStyle::SFlags flags = QStyle::Style_Default;
00440
if (isEnabled())
00441 flags |= QStyle::Style_Enabled;
00442
if (isDown())
00443 flags |= QStyle::Style_Down;
00444
if (isOn())
00445 flags |= QStyle::Style_On;
00446
if (! isFlat() && ! isDown())
00447 flags |= QStyle::Style_Raised;
00448
if (isDefault())
00449 flags |= QStyle::Style_ButtonDefault;
00450
00451 style().drawControl(QStyle::CE_PushButtonLabel, &picPainter,
this,
00452 style().subRect(QStyle::SR_PushButtonContents,
this),
00453 colorGroup(), flags);
00454
#else
00455
00456
00457
00458 QPushButton::drawButtonLabel(&picPainter);
00459
#endif
00460
00461 picPainter.end();
00462
00463 paintFilter.play(painter);
00464
00465
#if QT_VERSION >= 300
00466
if (hasFocus())
00467 {
00468
00469
00470 flags |= QStyle::Style_HasFocus;
00471 style().drawPrimitive(QStyle::PE_FocusRect, painter,
00472 style().subRect(QStyle::SR_PushButtonFocusRect,
this),
00473 colorGroup(), flags);
00474 }
00475
#endif
00476
00477
#else // QT_NO_PICTURE
00478
QPushButton::drawButtonLabel(painter);
00479
#endif
00480
}
00481
00482
00483
00484
00485
00486