00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "qwt_sldbase.h"
00011 #include "qwt_math.h"
00012
00013 #ifndef WHEEL_DELTA
00014 #define WHEEL_DELTA 120
00015 #endif
00016
00018 QwtSliderBase::QwtSliderBase(Qt::Orientation orient,
00019 QWidget *parent, const char *name, WFlags f):
00020 QWidget(parent, name, f),
00021 d_scrollMode(ScrNone),
00022 d_orientation(orient),
00023 d_readOnly(FALSE)
00024 {
00025 d_tmrID = 0;
00026 d_updTime = 150;
00027 d_mass = 0.0;
00028 d_tracking = TRUE;
00029 d_mouseOffset = 0.0;
00030 setRange(0.0,100.0, 1.0);
00031 setValue(0.0);
00032
00033 setFocusPolicy(TabFocus);
00034 }
00035
00037 QwtSliderBase::~QwtSliderBase()
00038 {
00039 if(d_tmrID)
00040 killTimer(d_tmrID);
00041 }
00042
00043 void QwtSliderBase::setReadOnly(bool readOnly)
00044 {
00045 d_readOnly = readOnly;
00046 update();
00047 }
00048
00049 bool QwtSliderBase::isReadOnly() const
00050 {
00051 return d_readOnly;
00052 }
00053
00059 void QwtSliderBase::setOrientation(Orientation o)
00060 {
00061 d_orientation = o;
00062 }
00063
00064
00065
00066
00067
00068 Qt::Orientation QwtSliderBase::orientation() const
00069 {
00070 return d_orientation;
00071 }
00072
00074
00075 void QwtSliderBase::stopMoving()
00076 {
00077 if(d_tmrID)
00078 {
00079 killTimer(d_tmrID);
00080 d_tmrID = 0;
00081 }
00082 }
00083
00089 void QwtSliderBase::setUpdateTime(int t)
00090 {
00091 if (t < 50)
00092 t = 50;
00093 d_updTime = t;
00094 }
00095
00096
00098 void QwtSliderBase::mousePressEvent(QMouseEvent *e)
00099 {
00100 if ( isReadOnly() )
00101 {
00102 #if QT_VERSION >= 300
00103 e->ignore();
00104 #endif
00105 return;
00106 }
00107 if ( !isValid() )
00108 return;
00109
00110 const QPoint &p = e->pos();
00111
00112 d_timerTick = 0;
00113
00114 getScrollMode(p, d_scrollMode, d_direction);
00115 stopMoving();
00116
00117 switch(d_scrollMode)
00118 {
00119 case ScrPage:
00120 case ScrTimer:
00121 d_mouseOffset = 0;
00122 d_tmrID = startTimer(qwtMax(250, 2 * d_updTime));
00123 break;
00124
00125 case ScrMouse:
00126 d_time.start();
00127 d_speed = 0;
00128 d_mouseOffset = getValue(p) - value();
00129 emit sliderPressed();
00130 break;
00131
00132 default:
00133 d_mouseOffset = 0;
00134 d_direction = 0;
00135 break;
00136 }
00137 }
00138
00139
00141 void QwtSliderBase::buttonReleased()
00142 {
00143 if ((!d_tracking) || (value() != prevValue()))
00144 emit valueChanged(value());
00145 }
00146
00147
00149 void QwtSliderBase::mouseReleaseEvent(QMouseEvent *e)
00150 {
00151 if ( isReadOnly() )
00152 {
00153 #if QT_VERSION >= 300
00154 e->ignore();
00155 #endif
00156 return;
00157 }
00158 if ( !isValid() )
00159 return;
00160
00161 const double inc = step();
00162
00163 switch(d_scrollMode)
00164 {
00165 case ScrMouse:
00166 {
00167 setPosition(e->pos());
00168 d_direction = 0;
00169 d_mouseOffset = 0;
00170 if (d_mass > 0.0)
00171 {
00172 const int ms = d_time.elapsed();
00173 if ((fabs(d_speed) > 0.0) && (ms < 50))
00174 d_tmrID = startTimer(d_updTime);
00175 }
00176 else
00177 {
00178 d_scrollMode = ScrNone;
00179 buttonReleased();
00180 }
00181 emit sliderReleased();
00182
00183 break;
00184 }
00185
00186 case ScrDirect:
00187 {
00188 setPosition(e->pos());
00189 d_direction = 0;
00190 d_mouseOffset = 0;
00191 d_scrollMode = ScrNone;
00192 buttonReleased();
00193 break;
00194 }
00195
00196 case ScrPage:
00197 {
00198 stopMoving();
00199 if (!d_timerTick)
00200 QwtDblRange::incPages(d_direction);
00201 d_timerTick = 0;
00202 buttonReleased();
00203 d_scrollMode = ScrNone;
00204 break;
00205 }
00206
00207 case ScrTimer:
00208 {
00209 stopMoving();
00210 if (!d_timerTick)
00211 QwtDblRange::fitValue(value() + double(d_direction) * inc);
00212 d_timerTick = 0;
00213 buttonReleased();
00214 d_scrollMode = ScrNone;
00215 break;
00216 }
00217
00218 default:
00219 {
00220 d_scrollMode = ScrNone;
00221 buttonReleased();
00222 }
00223 }
00224 }
00225
00226
00231 void QwtSliderBase::setPosition(const QPoint &p)
00232 {
00233 QwtDblRange::fitValue(getValue(p) - d_mouseOffset);
00234 }
00235
00236
00251 void QwtSliderBase::setTracking(bool enable)
00252 {
00253 d_tracking = enable;
00254 }
00255
00257 void QwtSliderBase::mouseMoveEvent(QMouseEvent *e)
00258 {
00259 if ( isReadOnly() )
00260 {
00261 #if QT_VERSION >= 300
00262 e->ignore();
00263 #endif
00264 return;
00265 }
00266
00267 if ( !isValid() )
00268 return;
00269
00270 if (d_scrollMode == ScrMouse )
00271 {
00272 setPosition(e->pos());
00273 if (d_mass > 0.0)
00274 {
00275 double ms = double(d_time.elapsed());
00276 if (ms < 1.0)
00277 ms = 1.0;
00278 d_speed = (exactValue() - exactPrevValue()) / ms;
00279 d_time.start();
00280 }
00281 if (value() != prevValue())
00282 emit sliderMoved(value());
00283 }
00284 }
00285
00287 void QwtSliderBase::wheelEvent(QWheelEvent *e)
00288 {
00289 if ( isReadOnly() )
00290 {
00291 #if QT_VERSION >= 300
00292 e->ignore();
00293 #endif
00294 return;
00295 }
00296
00297 if ( !isValid() )
00298 return;
00299
00300 int mode = ScrNone, direction = 0;
00301
00302
00303 getScrollMode(e->pos(), mode, direction);
00304 if ( mode != ScrNone )
00305 {
00306 const int inc = e->delta() / WHEEL_DELTA;
00307 QwtDblRange::incPages(inc);
00308 if (value() != prevValue())
00309 emit sliderMoved(value());
00310 }
00311 }
00312
00313 void QwtSliderBase::keyPressEvent(QKeyEvent *e)
00314 {
00315 if ( isReadOnly() )
00316 {
00317 #if QT_VERSION >= 300
00318 e->ignore();
00319 #endif
00320 return;
00321 }
00322
00323 if ( !isValid() )
00324 return;
00325
00326 int increment = 0;
00327 switch ( e->key() )
00328 {
00329 case Key_Down:
00330 if ( orientation() == Qt::Vertical )
00331 increment = -1;
00332 break;
00333 case Key_Up:
00334 if ( orientation() == Qt::Vertical )
00335 increment = 1;
00336 break;
00337 case Key_Left:
00338 if ( orientation() == Qt::Horizontal )
00339 increment = -1;
00340 break;
00341 case Key_Right:
00342 if ( orientation() == Qt::Horizontal )
00343 increment = 1;
00344 break;
00345 default:;
00346 #if QT_VERSION >= 300
00347 e->ignore();
00348 #endif
00349 }
00350
00351 if ( increment != 0 )
00352 {
00353 QwtDblRange::incValue(increment);
00354 if (value() != prevValue())
00355 emit sliderMoved(value());
00356 }
00357 }
00358
00360 void QwtSliderBase::timerEvent(QTimerEvent *)
00361 {
00362 const double inc = step();
00363
00364 switch (d_scrollMode)
00365 {
00366 case ScrMouse:
00367 {
00368 if (d_mass > 0.0)
00369 {
00370 d_speed *= exp( - double(d_updTime) * 0.001 / d_mass );
00371 const double newval =
00372 exactValue() + d_speed * double(d_updTime);
00373 QwtDblRange::fitValue(newval);
00374
00375 if (fabs(d_speed) < 0.001 * fabs(step()))
00376 {
00377 d_speed = 0;
00378 stopMoving();
00379 buttonReleased();
00380 }
00381
00382 }
00383 else
00384 stopMoving();
00385 break;
00386 }
00387
00388 case ScrPage:
00389 {
00390 QwtDblRange::incPages(d_direction);
00391 if (!d_timerTick)
00392 {
00393 killTimer(d_tmrID);
00394 d_tmrID = startTimer(d_updTime);
00395 }
00396 break;
00397 }
00398 case ScrTimer:
00399 {
00400 QwtDblRange::fitValue(value() + double(d_direction) * inc);
00401 if (!d_timerTick)
00402 {
00403 killTimer(d_tmrID);
00404 d_tmrID = startTimer(d_updTime);
00405 }
00406 break;
00407 }
00408 default:
00409 {
00410 stopMoving();
00411 break;
00412 }
00413 }
00414
00415 d_timerTick = 1;
00416 }
00417
00418
00427 void QwtSliderBase::valueChange()
00428 {
00429 if (d_tracking)
00430 emit valueChanged(value());
00431 }
00432
00450 void QwtSliderBase::setMass(double val)
00451 {
00452 if (val < 0.001)
00453 d_mass = 0.0;
00454 else if (val > 100.0)
00455 d_mass = 100.0;
00456 else
00457 d_mass = val;
00458 }
00459
00464 double QwtSliderBase::mass() const
00465 {
00466 return d_mass;
00467 }
00468
00469
00478 void QwtSliderBase::setValue(double val)
00479 {
00480 if (d_scrollMode == ScrMouse)
00481 stopMoving();
00482 QwtDblRange::setValue(val);
00483 }
00484
00485
00491 void QwtSliderBase::fitValue(double val)
00492 {
00493 if (d_scrollMode == ScrMouse)
00494 stopMoving();
00495 QwtDblRange::fitValue(val);
00496 }
00497
00498
00503 void QwtSliderBase::incValue(int steps)
00504 {
00505 if (d_scrollMode == ScrMouse)
00506 stopMoving();
00507 QwtDblRange::incValue(steps);
00508 }