00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include <math.h>
00011 #include <qpainter.h>
00012 #if QT_VERSION >= 0x040000
00013 #include <qbitmap.h>
00014 #include <qpalette.h>
00015 #endif
00016 #include <qpixmap.h>
00017 #include <qevent.h>
00018 #include "qwt_math.h"
00019 #include "qwt_scale_engine.h"
00020 #include "qwt_scale_map.h"
00021 #include "qwt_paint_buffer.h"
00022 #include "qwt_painter.h"
00023 #include "qwt_dial_needle.h"
00024 #include "qwt_dial.h"
00025
00026 class QwtDial::PrivateData
00027 {
00028 public:
00029 PrivateData():
00030 visibleBackground(true),
00031 frameShadow(Sunken),
00032 lineWidth(0),
00033 mode(RotateNeedle),
00034 direction(Clockwise),
00035 origin(90.0),
00036 minScaleArc(0.0),
00037 maxScaleArc(0.0),
00038 scaleDraw(0),
00039 maxMajIntv(36),
00040 maxMinIntv(10),
00041 scaleStep(0.0),
00042 needle(0)
00043 {
00044 }
00045
00046 ~PrivateData()
00047 {
00048 delete scaleDraw;
00049 delete needle;
00050 }
00051 bool visibleBackground;
00052 Shadow frameShadow;
00053 int lineWidth;
00054
00055 QwtDial::Mode mode;
00056 QwtDial::Direction direction;
00057
00058 double origin;
00059 double minScaleArc;
00060 double maxScaleArc;
00061
00062 QwtDialScaleDraw *scaleDraw;
00063 int maxMajIntv;
00064 int maxMinIntv;
00065 double scaleStep;
00066
00067 QwtDialNeedle *needle;
00068
00069 static double previousDir;
00070 };
00071
00072 double QwtDial::PrivateData::previousDir = -1.0;
00073
00079 QwtDialScaleDraw::QwtDialScaleDraw(QwtDial *parent):
00080 d_parent(parent),
00081 d_penWidth(1)
00082 {
00083 }
00084
00092 void QwtDialScaleDraw::setPenWidth(uint penWidth)
00093 {
00094 d_penWidth = penWidth;
00095 }
00096
00101 uint QwtDialScaleDraw::penWidth() const
00102 {
00103 return d_penWidth;
00104 }
00105
00113 QwtText QwtDialScaleDraw::label(double value) const
00114 {
00115 if ( d_parent == NULL )
00116 return QwtRoundScaleDraw::label(value);
00117
00118 return d_parent->scaleLabel(value);
00119 }
00120
00131 QwtDial::QwtDial(QWidget* parent):
00132 QwtAbstractSlider(Qt::Horizontal, parent)
00133 {
00134 initDial();
00135 }
00136
00137 #if QT_VERSION < 0x040000
00138
00148 QwtDial::QwtDial(QWidget* parent, const char *name):
00149 QwtAbstractSlider(Qt::Horizontal, parent)
00150 {
00151 setName(name);
00152 initDial();
00153 }
00154 #endif
00155
00156 void QwtDial::initDial()
00157 {
00158 d_data = new PrivateData;
00159
00160 #if QT_VERSION < 0x040000
00161 setWFlags(Qt::WNoAutoErase);
00162 #endif
00163
00164 #if QT_VERSION >= 0x040000
00165 using namespace Qt;
00166 #endif
00167 setFocusPolicy(TabFocus);
00168
00169 QPalette p = palette();
00170 for ( int i = 0; i < QPalette::NColorGroups; i++ )
00171 {
00172 const QPalette::ColorGroup cg = (QPalette::ColorGroup)i;
00173
00174
00175
00176
00177 #if QT_VERSION < 0x040000
00178 p.setColor(cg, QColorGroup::Foreground,
00179 p.color(cg, QColorGroup::Base));
00180 #else
00181 p.setColor(cg, QPalette::Foreground,
00182 p.color(cg, QPalette::Base));
00183 #endif
00184 }
00185 setPalette(p);
00186
00187 d_data->scaleDraw = new QwtDialScaleDraw(this);
00188 d_data->scaleDraw->setRadius(0);
00189
00190 setScaleArc(0.0, 360.0);
00191 setRange(0.0, 360.0, 1.0, 10);
00192 }
00193
00195 QwtDial::~QwtDial()
00196 {
00197 delete d_data;
00198 }
00199
00208 void QwtDial::showBackground(bool show)
00209 {
00210 if ( d_data->visibleBackground != show )
00211 {
00212 d_data->visibleBackground = show;
00213 updateMask();
00214 }
00215 }
00216
00222 bool QwtDial::hasVisibleBackground() const
00223 {
00224 return d_data->visibleBackground;
00225 }
00226
00232 void QwtDial::setFrameShadow(Shadow shadow)
00233 {
00234 if ( shadow != d_data->frameShadow )
00235 {
00236 d_data->frameShadow = shadow;
00237 if ( lineWidth() > 0 )
00238 update();
00239 }
00240 }
00241
00246 QwtDial::Shadow QwtDial::frameShadow() const
00247 {
00248 return d_data->frameShadow;
00249 }
00250
00257 void QwtDial::setLineWidth(int lineWidth)
00258 {
00259 if ( lineWidth < 0 )
00260 lineWidth = 0;
00261
00262 if ( d_data->lineWidth != lineWidth )
00263 {
00264 d_data->lineWidth = lineWidth;
00265 update();
00266 }
00267 }
00268
00273 int QwtDial::lineWidth() const
00274 {
00275 return d_data->lineWidth;
00276 }
00277
00282 QRect QwtDial::contentsRect() const
00283 {
00284 const int lw = lineWidth();
00285
00286 QRect r = boundingRect();
00287 if ( lw > 0 )
00288 {
00289 r.setRect(r.x() + lw, r.y() + lw,
00290 r.width() - 2 * lw, r.height() - 2 * lw);
00291 }
00292 return r;
00293 }
00294
00299 QRect QwtDial::boundingRect() const
00300 {
00301 const int radius = qwtMin(width(), height()) / 2;
00302
00303 QRect r(0, 0, 2 * radius, 2 * radius);
00304 r.moveCenter(rect().center());
00305 return r;
00306 }
00307
00312 QRect QwtDial::scaleContentsRect() const
00313 {
00314 #if QT_VERSION < 0x040000
00315 const QPen scalePen(colorGroup().text(), 0, Qt::NoPen);
00316 #else
00317 const QPen scalePen(palette().text(), 0, Qt::NoPen);
00318 #endif
00319
00320 int scaleDist = 0;
00321 if ( d_data->scaleDraw )
00322 {
00323 scaleDist = d_data->scaleDraw->extent(scalePen, font());
00324 scaleDist++;
00325 }
00326
00327 const QRect rect = contentsRect();
00328 return QRect(rect.x() + scaleDist, rect.y() + scaleDist,
00329 rect.width() - 2 * scaleDist, rect.height() - 2 * scaleDist);
00330 }
00331
00347 void QwtDial::setMode(Mode mode)
00348 {
00349 if ( mode != d_data->mode )
00350 {
00351 d_data->mode = mode;
00352 update();
00353 }
00354 }
00355
00370 QwtDial::Mode QwtDial::mode() const
00371 {
00372 return d_data->mode;
00373 }
00374
00385 void QwtDial::setWrapping(bool wrapping)
00386 {
00387 setPeriodic(wrapping);
00388 }
00389
00398 bool QwtDial::wrapping() const
00399 {
00400 return periodic();
00401 }
00402
00409 void QwtDial::setDirection(Direction direction)
00410 {
00411 if ( direction != d_data->direction )
00412 {
00413 d_data->direction = direction;
00414 update();
00415 }
00416 }
00417
00425 QwtDial::Direction QwtDial::direction() const
00426 {
00427 return d_data->direction;
00428 }
00429
00434 void QwtDial::resizeEvent(QResizeEvent *e)
00435 {
00436 QWidget::resizeEvent(e);
00437
00438 if ( !hasVisibleBackground() )
00439 updateMask();
00440 }
00441
00446 void QwtDial::paintEvent(QPaintEvent *e)
00447 {
00448 const QRect &ur = e->rect();
00449 if ( ur.isValid() )
00450 {
00451 #if QT_VERSION < 0x040000
00452 QwtPaintBuffer paintBuffer(this, ur);
00453 QPainter &painter = *paintBuffer.painter();
00454 #else
00455 QPainter painter(this);
00456 painter.setRenderHint(QPainter::Antialiasing, true);
00457 #endif
00458
00459 painter.save();
00460 drawContents(&painter);
00461 painter.restore();
00462
00463 painter.save();
00464 drawFrame(&painter);
00465 painter.restore();
00466
00467 if ( hasFocus() )
00468 drawFocusIndicator(&painter);
00469 }
00470 }
00471
00477 void QwtDial::drawFocusIndicator(QPainter *painter) const
00478 {
00479 if ( !isReadOnly() )
00480 {
00481 QRect focusRect = contentsRect();
00482
00483 const int margin = 2;
00484 focusRect.setRect(
00485 focusRect.x() + margin,
00486 focusRect.y() + margin,
00487 focusRect.width() - 2 * margin,
00488 focusRect.height() - 2 * margin);
00489
00490 #if QT_VERSION < 0x040000
00491 QColor color = colorGroup().color(QColorGroup::Base);
00492 #else
00493 QColor color = palette().color(QPalette::Base);
00494 #endif
00495 if (color.isValid())
00496 {
00497 const QColor gray(Qt::gray);
00498
00499 int h, s, v;
00500 #if QT_VERSION < 0x040000
00501 color.hsv(&h, &s, &v);
00502 #else
00503 color.getHsv(&h, &s, &v);
00504 #endif
00505 color = (v > 128) ? gray.dark(120) : gray.light(120);
00506 }
00507 else
00508 color = Qt::darkGray;
00509
00510 painter->save();
00511 painter->setBrush(Qt::NoBrush);
00512 painter->setPen(QPen(color, 0, Qt::DotLine));
00513 painter->drawEllipse(focusRect);
00514 painter->restore();
00515 }
00516 }
00517
00524 void QwtDial::drawFrame(QPainter *painter)
00525 {
00526 const int lw = lineWidth();
00527 const int off = (lw + 1) % 2;
00528
00529 QRect r = boundingRect();
00530 r.setRect(r.x() + lw / 2 - off, r.y() + lw / 2 - off,
00531 r.width() - lw + off + 1, r.height() - lw + off + 1);
00532 #if QT_VERSION >= 0x040000
00533 r.setX(r.x() + 1);
00534 r.setY(r.y() + 1);
00535 r.setWidth(r.width() - 2);
00536 r.setHeight(r.height() - 2);
00537 #endif
00538
00539 if ( lw > 0 )
00540 {
00541 switch(d_data->frameShadow)
00542 {
00543 case QwtDial::Raised:
00544 #if QT_VERSION < 0x040000
00545 QwtPainter::drawRoundFrame(painter, r,
00546 lw, colorGroup(), false);
00547 #else
00548 QwtPainter::drawRoundFrame(painter, r,
00549 lw, palette(), false);
00550 #endif
00551 break;
00552 case QwtDial::Sunken:
00553 #if QT_VERSION < 0x040000
00554 QwtPainter::drawRoundFrame(painter, r,
00555 lw, colorGroup(), true);
00556 #else
00557 QwtPainter::drawRoundFrame(painter, r,
00558 lw, palette(), true);
00559 #endif
00560 break;
00561 default:
00562 {
00563 painter->save();
00564 painter->setPen(QPen(Qt::black, lw));
00565 painter->setBrush(Qt::NoBrush);
00566 painter->drawEllipse(r);
00567 painter->restore();
00568 }
00569 }
00570 }
00571 }
00572
00584 void QwtDial::drawContents(QPainter *painter) const
00585 {
00586 #if QT_VERSION < 0x040000
00587 if ( backgroundMode() == Qt::NoBackground ||
00588 colorGroup().brush(QColorGroup::Base) !=
00589 colorGroup().brush(QColorGroup::Background) )
00590 #else
00591 if ( testAttribute(Qt::WA_NoSystemBackground) ||
00592 palette().brush(QPalette::Base) !=
00593 palette().brush(QPalette::Background) )
00594 #endif
00595 {
00596
00597 const QRect br = boundingRect();
00598
00599 painter->save();
00600 painter->setPen(Qt::NoPen);
00601
00602 #if QT_VERSION < 0x040000
00603 painter->setBrush(colorGroup().brush(QColorGroup::Base));
00604 #else
00605 painter->setBrush(palette().brush(QPalette::Base));
00606 #endif
00607
00608 painter->drawEllipse(br);
00609 painter->restore();
00610 }
00611
00612
00613 const QRect insideScaleRect = scaleContentsRect();
00614 #if QT_VERSION < 0x040000
00615 if ( colorGroup().brush(QColorGroup::Foreground) !=
00616 colorGroup().brush(QColorGroup::Base) )
00617 #else
00618 if ( palette().brush(QPalette::Foreground) !=
00619 palette().brush(QPalette::Base) )
00620 #endif
00621 {
00622 painter->save();
00623 painter->setPen(Qt::NoPen);
00624
00625 #if QT_VERSION < 0x040000
00626 painter->setBrush(colorGroup().brush(QColorGroup::Foreground));
00627 #else
00628 painter->setBrush(palette().brush(QPalette::Foreground));
00629 #endif
00630
00631 painter->drawEllipse(insideScaleRect.x() - 1, insideScaleRect.y() - 1,
00632 insideScaleRect.width(), insideScaleRect.height() );
00633
00634 painter->restore();
00635 }
00636
00637 const QPoint center = insideScaleRect.center();
00638 const int radius = insideScaleRect.width() / 2;
00639
00640 painter->save();
00641 drawScaleContents(painter, center, radius);
00642 painter->restore();
00643
00644 double direction = d_data->origin;
00645
00646 if (isValid())
00647 {
00648 direction = d_data->minScaleArc;
00649 if ( maxValue() > minValue() && d_data->maxScaleArc > d_data->minScaleArc )
00650 {
00651 const double ratio =
00652 (value() - minValue()) / (maxValue() - minValue());
00653 direction += ratio * (d_data->maxScaleArc - d_data->minScaleArc);
00654 }
00655
00656 if ( d_data->direction == QwtDial::CounterClockwise )
00657 direction = d_data->maxScaleArc - (direction - d_data->minScaleArc);
00658
00659 direction += d_data->origin;
00660 if ( direction >= 360.0 )
00661 direction -= 360.0;
00662 else if ( direction < 0.0 )
00663 direction += 360.0;
00664 }
00665
00666 double origin = d_data->origin;
00667 if ( mode() == RotateScale )
00668 {
00669 origin -= direction - d_data->origin;
00670 direction = d_data->origin;
00671 }
00672
00673 painter->save();
00674 drawScale(painter, center, radius, origin,
00675 d_data->minScaleArc, d_data->maxScaleArc);
00676 painter->restore();
00677
00678 if ( isValid() )
00679 {
00680 QPalette::ColorGroup cg;
00681 if ( isEnabled() )
00682 cg = hasFocus() ? QPalette::Active : QPalette::Inactive;
00683 else
00684 cg = QPalette::Disabled;
00685
00686 painter->save();
00687 drawNeedle(painter, center, radius, direction, cg);
00688 painter->restore();
00689 }
00690 }
00691
00701 void QwtDial::drawNeedle(QPainter *painter, const QPoint ¢er,
00702 int radius, double direction, QPalette::ColorGroup cg) const
00703 {
00704 if ( d_data->needle )
00705 {
00706 direction = 360.0 - direction;
00707 d_data->needle->draw(painter, center, radius, direction, cg);
00708 }
00709 }
00710
00723 void QwtDial::drawScale(QPainter *painter, const QPoint ¢er,
00724 int radius, double origin, double minArc, double maxArc) const
00725 {
00726 if ( d_data->scaleDraw == NULL )
00727 return;
00728
00729 origin -= 270.0;
00730
00731 double angle = maxArc - minArc;
00732 if ( angle > 360.0 )
00733 angle = ::fmod(angle, 360.0);
00734
00735 minArc += origin;
00736 if ( minArc < -360.0 )
00737 minArc = ::fmod(minArc, 360.0);
00738
00739 maxArc = minArc + angle;
00740 if ( maxArc > 360.0 )
00741 {
00742
00743
00744 minArc -= 360.0;
00745 maxArc -= 360.0;
00746 }
00747
00748 if ( d_data->direction == QwtDial::CounterClockwise )
00749 qSwap(minArc, maxArc);
00750
00751 painter->setFont(font());
00752
00753 d_data->scaleDraw->setAngleRange(minArc, maxArc);
00754 d_data->scaleDraw->setRadius(radius);
00755 d_data->scaleDraw->moveCenter(center);
00756
00757 #if QT_VERSION < 0x040000
00758 QColorGroup cg = colorGroup();
00759
00760 const QColor textColor = cg.color(QColorGroup::Text);
00761 cg.setColor(QColorGroup::Foreground, textColor);
00762 painter->setPen(QPen(textColor, d_data->scaleDraw->penWidth()));
00763
00764 d_data->scaleDraw->draw(painter, cg);
00765 #else
00766 QPalette pal = palette();
00767
00768 const QColor textColor = pal.color(QPalette::Text);
00769 pal.setColor(QPalette::Foreground, textColor);
00770
00771 painter->setPen(QPen(textColor, d_data->scaleDraw->penWidth()));
00772
00773 d_data->scaleDraw->draw(painter, pal);
00774 #endif
00775 }
00776
00777 void QwtDial::drawScaleContents(QPainter *,
00778 const QPoint &, int) const
00779 {
00780
00781 }
00782
00793 void QwtDial::setNeedle(QwtDialNeedle *needle)
00794 {
00795 if ( needle != d_data->needle )
00796 {
00797 if ( d_data->needle )
00798 delete d_data->needle;
00799
00800 d_data->needle = needle;
00801 update();
00802 }
00803 }
00804
00809 const QwtDialNeedle *QwtDial::needle() const
00810 {
00811 return d_data->needle;
00812 }
00813
00818 QwtDialNeedle *QwtDial::needle()
00819 {
00820 return d_data->needle;
00821 }
00822
00824 void QwtDial::rangeChange()
00825 {
00826 updateScale();
00827 }
00828
00833 void QwtDial::updateScale()
00834 {
00835 if ( d_data->scaleDraw )
00836 {
00837 QwtLinearScaleEngine scaleEngine;
00838
00839 const QwtScaleDiv scaleDiv = scaleEngine.divideScale(
00840 minValue(), maxValue(),
00841 d_data->maxMajIntv, d_data->maxMinIntv, d_data->scaleStep);
00842
00843 d_data->scaleDraw->setTransformation(scaleEngine.transformation());
00844 d_data->scaleDraw->setScaleDiv(scaleDiv);
00845 }
00846 }
00847
00849 QwtDialScaleDraw *QwtDial::scaleDraw()
00850 {
00851 return d_data->scaleDraw;
00852 }
00853
00855 const QwtDialScaleDraw *QwtDial::scaleDraw() const
00856 {
00857 return d_data->scaleDraw;
00858 }
00859
00866 void QwtDial::setScaleDraw(QwtDialScaleDraw *scaleDraw)
00867 {
00868 if ( scaleDraw != d_data->scaleDraw )
00869 {
00870 if ( d_data->scaleDraw )
00871 delete d_data->scaleDraw;
00872
00873 d_data->scaleDraw = scaleDraw;
00874 updateScale();
00875 update();
00876 }
00877 }
00878
00883 void QwtDial::setScale(int maxMajIntv, int maxMinIntv, double step)
00884 {
00885 d_data->maxMajIntv = maxMajIntv;
00886 d_data->maxMinIntv = maxMinIntv;
00887 d_data->scaleStep = step;
00888
00889 updateScale();
00890 }
00891
00906 void QwtDial::setScaleOptions(int options)
00907 {
00908 if ( options == 0 )
00909 setScaleDraw(NULL);
00910
00911 QwtDialScaleDraw *sd = d_data->scaleDraw;
00912 if ( sd == NULL )
00913 return;
00914
00915 sd->enableComponent(QwtAbstractScaleDraw::Backbone,
00916 options & ScaleBackbone);
00917
00918 sd->enableComponent(QwtAbstractScaleDraw::Ticks,
00919 options & ScaleTicks);
00920
00921 sd->enableComponent(QwtAbstractScaleDraw::Labels,
00922 options & ScaleLabel);
00923 }
00924
00935 void QwtDial::setScaleTicks(int minLen, int medLen,
00936 int majLen, int penWidth)
00937 {
00938 QwtDialScaleDraw *sd = d_data->scaleDraw;
00939 if ( sd )
00940 {
00941 sd->setTickLength(QwtScaleDiv::MinorTick, minLen);
00942 sd->setTickLength(QwtScaleDiv::MediumTick, medLen);
00943 sd->setTickLength(QwtScaleDiv::MajorTick, majLen);
00944 sd->setPenWidth(penWidth);
00945 }
00946 }
00947
00954 QwtText QwtDial::scaleLabel(double value) const
00955 {
00956 #if 1
00957 if ( value == -0 )
00958 value = 0;
00959 #endif
00960
00961 return QString::number(value);
00962 }
00963
00965 double QwtDial::minScaleArc() const
00966 {
00967 return d_data->minScaleArc;
00968 }
00969
00971 double QwtDial::maxScaleArc() const
00972 {
00973 return d_data->maxScaleArc;
00974 }
00975
00984 void QwtDial::setOrigin(double origin)
00985 {
00986 d_data->origin = origin;
00987 update();
00988 }
00989
00996 double QwtDial::origin() const
00997 {
00998 return d_data->origin;
00999 }
01000
01007 void QwtDial::setScaleArc(double minArc, double maxArc)
01008 {
01009 if ( minArc != 360.0 && minArc != -360.0 )
01010 minArc = fmod(minArc, 360.0);
01011 if ( maxArc != 360.0 && maxArc != -360.0 )
01012 maxArc = fmod(maxArc, 360.0);
01013
01014 d_data->minScaleArc = qwtMin(minArc, maxArc);
01015 d_data->maxScaleArc = qwtMax(minArc, maxArc);
01016 if ( d_data->maxScaleArc - d_data->minScaleArc > 360.0 )
01017 d_data->maxScaleArc = d_data->minScaleArc + 360.0;
01018
01019 update();
01020 }
01021
01023 void QwtDial::valueChange()
01024 {
01025 update();
01026 QwtAbstractSlider::valueChange();
01027 }
01028
01032 QSize QwtDial::sizeHint() const
01033 {
01034 int sh = 0;
01035 if ( d_data->scaleDraw )
01036 sh = d_data->scaleDraw->extent( QPen(), font() );
01037
01038 const int d = 6 * sh + 2 * lineWidth();
01039
01040 return QSize( d, d );
01041 }
01042
01048 QSize QwtDial::minimumSizeHint() const
01049 {
01050 int sh = 0;
01051 if ( d_data->scaleDraw )
01052 sh = d_data->scaleDraw->extent(QPen(), font() );
01053
01054 const int d = 3 * sh + 2 * lineWidth();
01055
01056 return QSize( d, d );
01057 }
01058
01059 static double line2Radians(const QPoint &p1, const QPoint &p2)
01060 {
01061 const QPoint p = p2 - p1;
01062
01063 double angle;
01064 if ( p.x() == 0 )
01065 angle = ( p.y() <= 0 ) ? M_PI_2 : 3 * M_PI_2;
01066 else
01067 {
01068 angle = atan(double(-p.y()) / double(p.x()));
01069 if ( p.x() < 0 )
01070 angle += M_PI;
01071 if ( angle < 0.0 )
01072 angle += 2 * M_PI;
01073 }
01074 return 360.0 - angle * 180.0 / M_PI;
01075 }
01076
01083 double QwtDial::getValue(const QPoint &pos)
01084 {
01085 if ( d_data->maxScaleArc == d_data->minScaleArc || maxValue() == minValue() )
01086 return minValue();
01087
01088 double dir = line2Radians(rect().center(), pos) - d_data->origin;
01089 if ( dir < 0.0 )
01090 dir += 360.0;
01091
01092 if ( mode() == RotateScale )
01093 dir = 360.0 - dir;
01094
01095
01096
01097
01098 const double completeCircle = 360.0 / (d_data->maxScaleArc - d_data->minScaleArc)
01099 * (maxValue() - minValue());
01100
01101 double posValue = minValue() + completeCircle * dir / 360.0;
01102
01103 if ( scrollMode() == ScrMouse )
01104 {
01105 if ( d_data->previousDir >= 0.0 )
01106 {
01107
01108
01109
01110 bool clockWise = false;
01111
01112 const double angle = dir - d_data->previousDir;
01113 if ( (angle >= 0.0 && angle <= 180.0) || angle < -180.0 )
01114 clockWise = true;
01115
01116 if ( clockWise )
01117 {
01118 if ( dir < d_data->previousDir && mouseOffset() > 0.0 )
01119 {
01120
01121 setMouseOffset(mouseOffset() - completeCircle);
01122 }
01123
01124 if ( wrapping() )
01125 {
01126 if ( posValue - mouseOffset() > maxValue() )
01127 {
01128
01129
01130
01131 setMouseOffset(posValue - minValue());
01132 }
01133 }
01134 else
01135 {
01136 if ( posValue - mouseOffset() > maxValue() ||
01137 value() == maxValue() )
01138 {
01139
01140
01141
01142 setMouseOffset(posValue - maxValue());
01143 }
01144 }
01145 }
01146 else
01147 {
01148 if ( dir > d_data->previousDir && mouseOffset() < 0.0 )
01149 {
01150
01151 setMouseOffset(mouseOffset() + completeCircle);
01152 }
01153
01154 if ( wrapping() )
01155 {
01156 if ( posValue - mouseOffset() < minValue() )
01157 {
01158
01159
01160
01161 setMouseOffset(posValue - maxValue());
01162 }
01163 }
01164 else
01165 {
01166 if ( posValue - mouseOffset() < minValue() ||
01167 value() == minValue() )
01168 {
01169
01170
01171
01172 setMouseOffset(posValue - minValue());
01173 }
01174 }
01175 }
01176 }
01177 d_data->previousDir = dir;
01178 }
01179
01180 return posValue;
01181 }
01182
01192 void QwtDial::getScrollMode(const QPoint &pos, int &scrollMode, int &direction)
01193 {
01194 direction = 0;
01195 scrollMode = ScrNone;
01196
01197 const QRegion region(contentsRect(), QRegion::Ellipse);
01198 if ( region.contains(pos) && pos != rect().center() )
01199 {
01200 scrollMode = ScrMouse;
01201 d_data->previousDir = -1.0;
01202 }
01203 }
01204
01225 void QwtDial::keyPressEvent(QKeyEvent *event)
01226 {
01227 if ( isReadOnly() )
01228 {
01229 event->ignore();
01230 return;
01231 }
01232
01233 if ( !isValid() )
01234 return;
01235
01236 double previous = prevValue();
01237 switch ( event->key() )
01238 {
01239 case Qt::Key_Down:
01240 case Qt::Key_Left:
01241 QwtDoubleRange::incValue(-1);
01242 break;
01243 #if QT_VERSION < 0x040000
01244 case Qt::Key_Prior:
01245 #else
01246 case Qt::Key_PageUp:
01247 #endif
01248 QwtDoubleRange::incValue(-pageSize());
01249 break;
01250 case Qt::Key_Home:
01251 setValue(minValue());
01252 break;
01253
01254 case Qt::Key_Up:
01255 case Qt::Key_Right:
01256 QwtDoubleRange::incValue(1);
01257 break;
01258 #if QT_VERSION < 0x040000
01259 case Qt::Key_Next:
01260 #else
01261 case Qt::Key_PageDown:
01262 #endif
01263 QwtDoubleRange::incValue(pageSize());
01264 break;
01265 case Qt::Key_End:
01266 setValue(maxValue());
01267 break;
01268 default:;
01269 event->ignore();
01270 }
01271
01272 if (value() != previous)
01273 emit sliderMoved(value());
01274 }
01275
01284 void QwtDial::updateMask()
01285 {
01286 if ( d_data->visibleBackground )
01287 clearMask();
01288 else
01289 setMask(QRegion(boundingRect(), QRegion::Ellipse));
01290 }