00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
#include <qpainter.h>
00013
#include <qevent.h>
00014
#include "qwt_painter.h"
00015
#include "qwt_scale.h"
00016
#include "qwt_math.h"
00017
#include "qwt_paint_buffer.h"
00018
#include "qwt_text.h"
00019
00027 QwtScale::QwtScale(QWidget *parent,
const char *name):
00028 QWidget(parent, name, Qt::WRepaintNoErase|Qt::WResizeNoErase)
00029 {
00030 initScale(QwtScale::Left);
00031 }
00032
00041 QwtScale::QwtScale(QwtScale::Position pos, QWidget *parent,
const char *name):
00042 QWidget(parent,name, Qt::WRepaintNoErase|Qt::WResizeNoErase)
00043 {
00044 initScale(pos);
00045 }
00046
00048 QwtScale::~QwtScale()
00049 {
00050
delete d_scaleDraw;
00051
delete d_title;
00052 }
00053
00055
void QwtScale::initScale(QwtScale::Position pos)
00056 {
00057 QwtScaleDraw::Orientation sdo;
00058 d_borderDist[0] = 0;
00059 d_borderDist[1] = 0;
00060 d_baseDist = 4;
00061 d_titleOffset = 0;
00062 d_titleDist = 2;
00063
00064
switch(pos)
00065 {
00066
case QwtScale::Left:
00067 sdo = QwtScaleDraw::Left;
00068
break;
00069
case QwtScale::Right:
00070 sdo = QwtScaleDraw::Right;
00071
break;
00072
case QwtScale::Bottom:
00073 sdo = QwtScaleDraw::Bottom;
00074
break;
00075
case QwtScale::Top:
00076 sdo = QwtScaleDraw::Top;
00077
break;
00078
default:
00079 sdo = QwtScaleDraw::Left;
00080 }
00081
00082 d_scaleDraw =
new QwtScaleDraw;
00083 d_scaleDraw->
setGeometry(0, 0, 10, sdo);
00084
00085 d_title =
new QwtPlainText( QString::null, font(),
00086 Qt::AlignHCenter | Qt::WordBreak | Qt::ExpandTabs);
00087 }
00088
00094 void QwtScale::setTitle(
const QString &text)
00095 {
00096
if (text ==
title())
00097
return;
00098
00099
QwtText *
title =
QwtText::makeText(text, d_title->
alignment(),
00100 d_title->
font(), d_title->
color());
00101
00102
delete d_title;
00103 d_title = title;
00104
00105
layoutScale();
00106 }
00107
00113 void QwtScale::setPosition(Position pos)
00114 {
00115 QwtScaleDraw::Orientation sdo;
00116
switch(pos)
00117 {
00118
case QwtScale::Left:
00119 sdo = QwtScaleDraw::Left;
00120
break;
00121
case QwtScale::Right:
00122 sdo = QwtScaleDraw::Right;
00123
break;
00124
case QwtScale::Bottom:
00125 sdo = QwtScaleDraw::Bottom;
00126
break;
00127
case QwtScale::Top:
00128 sdo = QwtScaleDraw::Top;
00129
break;
00130
default:
00131 sdo = QwtScaleDraw::Left;
00132 }
00133
00134
if (d_scaleDraw)
00135 d_scaleDraw->
setGeometry(0,0,10,sdo);
00136
layoutScale();
00137 }
00138
00139
00144 QwtScale::Position QwtScale::position()
const
00145
{
00146
if (!
scaleDraw())
00147
return Left;
00148
00149 QwtScaleDraw::Orientation ori =
scaleDraw()->
orientation();
00150
switch(ori)
00151 {
00152
case QwtScaleDraw::Left:
00153
return QwtScale::Left;
00154
case QwtScaleDraw::Right:
00155
return QwtScale::Right;
00156
case QwtScaleDraw::Bottom:
00157
return QwtScale::Bottom;
00158
case QwtScaleDraw::Top:
00159
return QwtScale::Top;
00160
default:
00161
return QwtScale::Left;
00162 }
00163 }
00164
00173 void QwtScale::setBorderDist(
int dist1,
int dist2)
00174 {
00175
if ( dist1 != d_borderDist[0] || dist2 != d_borderDist[1] )
00176 {
00177 d_borderDist[0] = dist1;
00178 d_borderDist[1] = dist2;
00179
layoutScale();
00180 }
00181 }
00182
00188 void QwtScale::setBaselineDist(
int bd)
00189 {
00190 bd = qwtMax( 0, bd );
00191
if ( bd != d_baseDist )
00192 {
00193 d_baseDist = bd;
00194
layoutScale();
00195 }
00196 }
00197
00203 void QwtScale::setTitleDist(
int td)
00204 {
00205 td = qwtMax( 0, td );
00206
if ( td != d_titleDist )
00207 {
00208 d_titleDist = td;
00209
layoutScale();
00210 }
00211 }
00212
00213
00219 void QwtScale::setTitleFont(
const QFont &f)
00220 {
00221
if (f == d_title->
font())
00222
return;
00223
00224 d_title->
setFont(f);
00225
layoutScale();
00226 }
00227
00233 void QwtScale::setTitleColor(
const QColor &c)
00234 {
00235 d_title->
setColor(c);
00236 update();
00237 }
00238
00247 void QwtScale::setTitleAlignment(
int flags)
00248 {
00249 flags &= ~(Qt::AlignTop | Qt::AlignBottom);
00250 d_title->
setAlignment(flags);
00251
layoutScale();
00252 }
00253
00265 void QwtScale::setLabelFormat(
char f,
int prec,
int fieldwidth)
00266 {
00267 d_scaleDraw->
setLabelFormat(f, prec, fieldwidth);
00268
layoutScale();
00269 }
00270
00278 void QwtScale::setLabelAlignment(
int align)
00279 {
00280 d_scaleDraw->
setLabelAlignment(align);
00281
layoutScale();
00282 }
00283
00289 void QwtScale::setLabelRotation(
double rotation)
00290 {
00291 d_scaleDraw->
setLabelRotation(rotation);
00292
layoutScale();
00293 }
00294
00300 void QwtScale::setScaleDraw(QwtScaleDraw *sd)
00301 {
00302
if ( sd == NULL || sd == d_scaleDraw )
00303
return;
00304
00305
if ( d_scaleDraw )
00306 *sd = *d_scaleDraw;
00307
00308
delete d_scaleDraw;
00309 d_scaleDraw = sd;
00310
00311
layoutScale();
00312 }
00313
00324 void QwtScale::labelFormat(
char &f,
int &prec,
int &fieldwidth)
const
00325
{
00326 d_scaleDraw->
labelFormat(f, prec, fieldwidth);
00327 }
00328
00333 const QwtScaleDraw *
QwtScale::scaleDraw()
const
00334
{
00335
return d_scaleDraw;
00336 }
00337
00342 int QwtScale::titleAlignment()
const
00343
{
00344
return d_title->
alignment();
00345 }
00346
00351 const QFont
QwtScale::titleFont()
const
00352
{
00353
return d_title->
font();
00354 }
00355
00360 const QColor
QwtScale::titleColor()
const
00361
{
00362
return d_title->
color();
00363 }
00364
00369 const QString
QwtScale::title()
const
00370
{
00371
return d_title->
text();
00372 }
00373
00378 int QwtScale::startBorderDist()
const
00379
{
00380
return d_borderDist[0];
00381 }
00382
00387 int QwtScale::endBorderDist()
const
00388
{
00389
return d_borderDist[1];
00390 }
00391
00396 int QwtScale::baseLineDist()
const
00397
{
00398
return d_baseDist;
00399 }
00400
00405 int QwtScale::titleDist()
const
00406
{
00407
return d_titleDist;
00408 }
00409
00413 void QwtScale::paintEvent(QPaintEvent *e)
00414 {
00415
const QRect &ur = e->rect();
00416
if ( ur.isValid() )
00417 {
00418
QwtPaintBuffer paintBuffer(
this, ur);
00419
draw(paintBuffer.
painter());
00420 }
00421 }
00422
00426 void QwtScale::draw(QPainter *p)
const
00427
{
00428 d_scaleDraw->
draw(p);
00429
00430 QRect r = rect();
00431
00432
switch(d_scaleDraw->
orientation())
00433 {
00434
case QwtScaleDraw::Bottom:
00435 r.setTop( r.top() + d_titleOffset );
00436
break;
00437
00438
case QwtScaleDraw::Left:
00439 r.setRight( r.right() - d_titleOffset );
00440
break;
00441
00442
case QwtScaleDraw::Right:
00443 r.setLeft( r.left() + d_titleOffset );
00444
break;
00445
00446
case QwtScaleDraw::Top:
00447
default:
00448 r.setBottom( r.bottom() - d_titleOffset );
00449
break;
00450 }
00451
00452
drawTitle(p, d_scaleDraw->
orientation(), r);
00453 }
00454
00458 void QwtScale::resizeEvent(QResizeEvent *)
00459 {
00460
layoutScale(FALSE);
00461 }
00462
00464
00465
00466
00467
00468 void QwtScale::layoutScale(
bool update_geometry )
00469 {
00470 QRect r = this->rect();
00471
00472
00473
00474
int bd0, bd1;
00475
minBorderDist(bd0, bd1);
00476
if ( d_borderDist[0] > bd0 )
00477 bd0 = d_borderDist[0];
00478
if ( d_borderDist[1] > bd1 )
00479 bd1 = d_borderDist[1];
00480
00481
const QFontMetrics fm(font());
00482
switch(d_scaleDraw->
orientation())
00483 {
00484
case QwtScaleDraw::Bottom:
00485 d_scaleDraw->
setGeometry(r.x() + bd0, r.y() + d_baseDist,
00486 r.width() - bd0 - bd1, QwtScaleDraw::Bottom);
00487
00488 d_titleOffset = d_titleDist + d_baseDist +
00489 d_scaleDraw->
maxHeight(QPen(), fm);
00490
break;
00491
00492
case QwtScaleDraw::Top:
00493 d_scaleDraw->
setGeometry(r.x() + bd0, r.bottom() - d_baseDist,
00494 r.width() - bd0 - bd1, QwtScaleDraw::Top);
00495 d_titleOffset = d_titleDist + d_baseDist +
00496 d_scaleDraw->
maxHeight(QPen(), fm);
00497
break;
00498
00499
case QwtScaleDraw::Left:
00500 d_scaleDraw->
setGeometry(r.right() - d_baseDist, r.y() + bd0,
00501 r.height() - bd0 - bd1, QwtScaleDraw::Left);
00502 d_titleOffset = d_baseDist + d_titleDist +
00503 d_scaleDraw->
maxWidth(QPen(), fm);
00504
break;
00505
00506
case QwtScaleDraw::Right:
00507 d_scaleDraw->
setGeometry(r.x() + d_baseDist, r.y() + bd0,
00508 r.height() - bd0 - bd1, QwtScaleDraw::Right);
00509 d_titleOffset = d_baseDist + d_titleDist +
00510 d_scaleDraw->
maxWidth(QPen(), fm);
00511
break;
00512
default:
00513
break;
00514 }
00515
if ( update_geometry )
00516 {
00517 updateGeometry();
00518 update();
00519 }
00520 }
00521
00529 void QwtScale::drawTitle(QPainter *painter,
00530 QwtScaleDraw::Orientation o,
const QRect &rect)
const
00531
{
00532 QRect r;
00533
double angle;
00534
int align = d_title->
alignment() & ~(Qt::AlignTop | Qt::AlignBottom);
00535
00536
switch(o)
00537 {
00538
#ifndef QT_NO_TRANSFORMATIONS
00539
case QwtScaleDraw::Left:
00540 align |= Qt::AlignTop;
00541 angle = -90.0;
00542 r.setRect(rect.left(), rect.bottom(), rect.height(), rect.width());
00543
break;
00544
case QwtScaleDraw::Right:
00545 align |= Qt::AlignTop;
00546 angle = 90.0;
00547 r.setRect(rect.right(), rect.top(), rect.height(), rect.width());
00548
break;
00549
#else
00550
case QwtScaleDraw::Left:
00551
case QwtScaleDraw::Right:
00552
00553
return;
00554
#endif
00555
case QwtScaleDraw::Top:
00556 align |= Qt::AlignTop;
00557 angle = 0.0;
00558 r = rect;
00559
break;
00560
case QwtScaleDraw::Bottom:
00561
default:
00562 align |= Qt::AlignBottom;
00563 angle = 0.0;
00564 r = rect;
00565
break;
00566 }
00567
00568 d_title->
setAlignment(align);
00569
00570 painter->save();
00571 painter->translate(r.x(), r.y());
00572
#ifndef QT_NO_TRANSFORMATIONS
00573
if (angle != 0.0)
00574 painter->rotate(angle);
00575
#endif
00576
d_title->
draw(painter, QRect(0, 0, r.width(), r.height()));
00577
00578
00579 d_title->
setAlignment(align & ~(Qt::AlignTop | Qt::AlignBottom));
00580 painter->restore();
00581 }
00582
00591 void QwtScale::scaleChange()
00592 {
00593
layoutScale();
00594 }
00595
00600 QSizePolicy
QwtScale::sizePolicy()
const
00601
{
00602 QSizePolicy sp;
00603
if ( d_scaleDraw->
orientation() == QwtScaleDraw::Left ||
00604 d_scaleDraw->
orientation() == QwtScaleDraw::Right )
00605 {
00606 sp.setHorData( QSizePolicy::Fixed );
00607 sp.setVerData( QSizePolicy::MinimumExpanding );
00608 }
00609
else
00610 {
00611 sp.setHorData( QSizePolicy::MinimumExpanding );
00612 sp.setVerData( QSizePolicy::Fixed );
00613 }
00614
return sp;
00615 }
00616
00620 QSize
QwtScale::sizeHint()
const
00621
{
00622
return minimumSizeHint();
00623 }
00624
00628 QSize
QwtScale::minimumSizeHint()
const
00629
{
00630 Qt::Orientation o = Qt::Horizontal;
00631
if ( d_scaleDraw->
orientation() == QwtScaleDraw::Left ||
00632 d_scaleDraw->
orientation() == QwtScaleDraw::Right )
00633 {
00634 o = Qt::Vertical;
00635 }
00636
00637
00638
00639
int length = 0;
00640
int mbd1, mbd2;
00641
minBorderDist(mbd1, mbd2);
00642 length += qwtMax( 0, d_borderDist[0] - mbd1 );
00643 length += qwtMax( 0, d_borderDist[1] - mbd2 );
00644
00645
const QFontMetrics fm(font());
00646
if ( o == Qt::Vertical )
00647 length += d_scaleDraw->
minHeight(QPen(), fm);
00648
else
00649 length += d_scaleDraw->
minWidth(QPen(), fm);
00650
00651
int dim =
dimForLength(length, fm);
00652
if ( length < dim )
00653 {
00654
00655 length = dim;
00656 dim =
dimForLength(length, fm);
00657 }
00658
00659 QSize size(length + 2, dim);
00660
if ( o == Qt::Vertical )
00661 size.transpose();
00662
00663
return size;
00664 }
00665
00672 int QwtScale::titleHeightForWidth(
int width)
const
00673
{
00674
return d_title->
heightForWidth(width);
00675 }
00676
00686 int QwtScale::dimForLength(
int length,
00687
const QFontMetrics &scaleFontMetrics)
const
00688
{
00689
int dim = d_baseDist;
00690
if ( d_scaleDraw->
orientation() == QwtScaleDraw::Left ||
00691 d_scaleDraw->
orientation() == QwtScaleDraw::Right )
00692 {
00693 dim += d_scaleDraw->
minWidth(QPen(), scaleFontMetrics);
00694
#ifdef QT_NO_TRANSFORMATIONS
00695
return dim;
00696
#endif
00697
}
00698
else
00699 dim += d_scaleDraw->
minHeight(QPen(), scaleFontMetrics);
00700
00701
if ( !d_title->
text().isEmpty() )
00702 {
00703 dim +=
titleHeightForWidth(length) + d_titleDist;
00704 }
00705
return dim;
00706 }
00707
00718 void QwtScale::minBorderDist(
int &start,
int &end)
const
00719
{
00720
const QFontMetrics fm(font());
00721 d_scaleDraw->
minBorderDist(fm, start, end);
00722 }
00723
00732 void QwtScale::fontChange(
const QFont &oldFont)
00733 {
00734 QWidget::fontChange( oldFont );
00735
layoutScale();
00736 }
00737
00746 void QwtScale::setScaleDiv(
const QwtScaleDiv &sd)
00747 {
00748
if (d_scaleDraw->
scaleDiv() != sd)
00749 {
00750 d_scaleDraw->
setScale(sd);
00751
layoutScale();
00752 }
00753 }
00754
00755
00756
00757
00758
00759