00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
#include <qevent.h>
00011
#include "qwt_sldbase.h"
00012
#include "qwt_math.h"
00013
00014
#ifndef WHEEL_DELTA
00015
#define WHEEL_DELTA 120
00016
#endif
00017
00019 QwtSliderBase::QwtSliderBase(Qt::Orientation orient,
00020 QWidget *parent,
const char *name, Qt::WFlags f):
00021 QWidget(parent, name, f),
00022 d_scrollMode(ScrNone),
00023 d_orientation(orient),
00024 d_readOnly(FALSE)
00025 {
00026 d_tmrID = 0;
00027 d_updTime = 150;
00028 d_mass = 0.0;
00029 d_tracking = TRUE;
00030 d_mouseOffset = 0.0;
00031
setRange(0.0,100.0, 1.0);
00032
setValue(0.0);
00033
00034 setFocusPolicy(QWidget::TabFocus);
00035 }
00036
00038 QwtSliderBase::~QwtSliderBase()
00039 {
00040
if(d_tmrID)
00041 killTimer(d_tmrID);
00042 }
00043
00053 void QwtSliderBase::setReadOnly(
bool readOnly)
00054 {
00055 d_readOnly = readOnly;
00056 update();
00057 }
00058
00066 bool QwtSliderBase::isReadOnly()
const
00067
{
00068
return d_readOnly;
00069 }
00070
00076 void QwtSliderBase::setOrientation(Orientation o)
00077 {
00078 d_orientation = o;
00079 }
00080
00085 Qt::Orientation
QwtSliderBase::orientation()
const
00086
{
00087
return d_orientation;
00088 }
00089
00091
00092 void QwtSliderBase::stopMoving()
00093 {
00094
if(d_tmrID)
00095 {
00096 killTimer(d_tmrID);
00097 d_tmrID = 0;
00098 }
00099 }
00100
00106 void QwtSliderBase::setUpdateTime(
int t)
00107 {
00108
if (t < 50)
00109 t = 50;
00110 d_updTime = t;
00111 }
00112
00113
00115 void QwtSliderBase::mousePressEvent(QMouseEvent *e)
00116 {
00117
if (
isReadOnly() )
00118 {
00119
#if QT_VERSION >= 300
00120
e->ignore();
00121
#endif
00122
return;
00123 }
00124
if ( !
isValid() )
00125
return;
00126
00127
const QPoint &p = e->pos();
00128
00129 d_timerTick = 0;
00130
00131
getScrollMode(p, d_scrollMode, d_direction);
00132
stopMoving();
00133
00134
switch(d_scrollMode)
00135 {
00136
case ScrPage:
00137
case ScrTimer:
00138 d_mouseOffset = 0;
00139 d_tmrID = startTimer(qwtMax(250, 2 * d_updTime));
00140
break;
00141
00142
case ScrMouse:
00143 d_time.start();
00144 d_speed = 0;
00145 d_mouseOffset =
getValue(p) -
value();
00146 emit
sliderPressed();
00147
break;
00148
00149
default:
00150 d_mouseOffset = 0;
00151 d_direction = 0;
00152
break;
00153 }
00154 }
00155
00156
00158
void QwtSliderBase::buttonReleased()
00159 {
00160
if ((!d_tracking) || (
value() !=
prevValue()))
00161 emit
valueChanged(
value());
00162 }
00163
00164
00166 void QwtSliderBase::mouseReleaseEvent(QMouseEvent *e)
00167 {
00168
if (
isReadOnly() )
00169 {
00170
#if QT_VERSION >= 300
00171
e->ignore();
00172
#endif
00173
return;
00174 }
00175
if ( !
isValid() )
00176
return;
00177
00178
const double inc =
step();
00179
00180
switch(d_scrollMode)
00181 {
00182
case ScrMouse:
00183 {
00184
setPosition(e->pos());
00185 d_direction = 0;
00186 d_mouseOffset = 0;
00187
if (d_mass > 0.0)
00188 {
00189
const int ms = d_time.elapsed();
00190
if ((fabs(d_speed) > 0.0) && (ms < 50))
00191 d_tmrID = startTimer(d_updTime);
00192 }
00193
else
00194 {
00195 d_scrollMode = ScrNone;
00196 buttonReleased();
00197 }
00198 emit
sliderReleased();
00199
00200
break;
00201 }
00202
00203
case ScrDirect:
00204 {
00205
setPosition(e->pos());
00206 d_direction = 0;
00207 d_mouseOffset = 0;
00208 d_scrollMode = ScrNone;
00209 buttonReleased();
00210
break;
00211 }
00212
00213
case ScrPage:
00214 {
00215
stopMoving();
00216
if (!d_timerTick)
00217
QwtDblRange::incPages(d_direction);
00218 d_timerTick = 0;
00219 buttonReleased();
00220 d_scrollMode = ScrNone;
00221
break;
00222 }
00223
00224
case ScrTimer:
00225 {
00226
stopMoving();
00227
if (!d_timerTick)
00228
QwtDblRange::fitValue(
value() +
double(d_direction) * inc);
00229 d_timerTick = 0;
00230 buttonReleased();
00231 d_scrollMode = ScrNone;
00232
break;
00233 }
00234
00235
default:
00236 {
00237 d_scrollMode = ScrNone;
00238 buttonReleased();
00239 }
00240 }
00241 }
00242
00243
00248 void QwtSliderBase::setPosition(
const QPoint &p)
00249 {
00250
QwtDblRange::fitValue(
getValue(p) - d_mouseOffset);
00251 }
00252
00253
00268 void QwtSliderBase::setTracking(
bool enable)
00269 {
00270 d_tracking = enable;
00271 }
00272
00274 void QwtSliderBase::mouseMoveEvent(QMouseEvent *e)
00275 {
00276
if (
isReadOnly() )
00277 {
00278
#if QT_VERSION >= 300
00279
e->ignore();
00280
#endif
00281
return;
00282 }
00283
00284
if ( !
isValid() )
00285
return;
00286
00287
if (d_scrollMode == ScrMouse )
00288 {
00289
setPosition(e->pos());
00290
if (d_mass > 0.0)
00291 {
00292
double ms = double(d_time.elapsed());
00293
if (ms < 1.0)
00294 ms = 1.0;
00295 d_speed = (
exactValue() -
exactPrevValue()) / ms;
00296 d_time.start();
00297 }
00298
if (
value() !=
prevValue())
00299 emit
sliderMoved(
value());
00300 }
00301 }
00302
00304 void QwtSliderBase::wheelEvent(QWheelEvent *e)
00305 {
00306
if (
isReadOnly() )
00307 {
00308
#if QT_VERSION >= 300
00309
e->ignore();
00310
#endif
00311
return;
00312 }
00313
00314
if ( !
isValid() )
00315
return;
00316
00317
int mode = ScrNone, direction = 0;
00318
00319
00320
getScrollMode(e->pos(), mode, direction);
00321
if ( mode != ScrNone )
00322 {
00323
const int inc = e->delta() / WHEEL_DELTA;
00324
QwtDblRange::incPages(inc);
00325
if (
value() !=
prevValue())
00326 emit
sliderMoved(
value());
00327 }
00328 }
00329
00341 void QwtSliderBase::keyPressEvent(QKeyEvent *e)
00342 {
00343
if (
isReadOnly() )
00344 {
00345
#if QT_VERSION >= 300
00346
e->ignore();
00347
#endif
00348
return;
00349 }
00350
00351
if ( !
isValid() )
00352
return;
00353
00354
int increment = 0;
00355
switch ( e->key() )
00356 {
00357
case Qt::Key_Down:
00358
if (
orientation() == Qt::Vertical )
00359 increment = -1;
00360
break;
00361
case Qt::Key_Up:
00362
if (
orientation() == Qt::Vertical )
00363 increment = 1;
00364
break;
00365
case Qt::Key_Left:
00366
if (
orientation() == Qt::Horizontal )
00367 increment = -1;
00368
break;
00369
case Qt::Key_Right:
00370
if (
orientation() == Qt::Horizontal )
00371 increment = 1;
00372
break;
00373
default:;
00374
#if QT_VERSION >= 300
00375
e->ignore();
00376
#endif
00377
}
00378
00379
if ( increment != 0 )
00380 {
00381
QwtDblRange::incValue(increment);
00382
if (
value() !=
prevValue())
00383 emit
sliderMoved(
value());
00384 }
00385 }
00386
00388 void QwtSliderBase::timerEvent(QTimerEvent *)
00389 {
00390
const double inc =
step();
00391
00392
switch (d_scrollMode)
00393 {
00394
case ScrMouse:
00395 {
00396
if (d_mass > 0.0)
00397 {
00398 d_speed *= exp( -
double(d_updTime) * 0.001 / d_mass );
00399
const double newval =
00400
exactValue() + d_speed * double(d_updTime);
00401
QwtDblRange::fitValue(newval);
00402
00403
if (fabs(d_speed) < 0.001 * fabs(
step()))
00404 {
00405 d_speed = 0;
00406
stopMoving();
00407 buttonReleased();
00408 }
00409
00410 }
00411
else
00412
stopMoving();
00413
break;
00414 }
00415
00416
case ScrPage:
00417 {
00418
QwtDblRange::incPages(d_direction);
00419
if (!d_timerTick)
00420 {
00421 killTimer(d_tmrID);
00422 d_tmrID = startTimer(d_updTime);
00423 }
00424
break;
00425 }
00426
case ScrTimer:
00427 {
00428
QwtDblRange::fitValue(
value() +
double(d_direction) * inc);
00429
if (!d_timerTick)
00430 {
00431 killTimer(d_tmrID);
00432 d_tmrID = startTimer(d_updTime);
00433 }
00434
break;
00435 }
00436
default:
00437 {
00438
stopMoving();
00439
break;
00440 }
00441 }
00442
00443 d_timerTick = 1;
00444 }
00445
00446
00455 void QwtSliderBase::valueChange()
00456 {
00457
if (d_tracking)
00458 emit
valueChanged(
value());
00459 }
00460
00478 void QwtSliderBase::setMass(
double val)
00479 {
00480
if (val < 0.001)
00481 d_mass = 0.0;
00482
else if (val > 100.0)
00483 d_mass = 100.0;
00484
else
00485 d_mass = val;
00486 }
00487
00492 double QwtSliderBase::mass()
const
00493
{
00494
return d_mass;
00495 }
00496
00497
00506 void QwtSliderBase::setValue(
double val)
00507 {
00508
if (d_scrollMode == ScrMouse)
00509
stopMoving();
00510
QwtDblRange::setValue(val);
00511 }
00512
00513
00519 void QwtSliderBase::fitValue(
double val)
00520 {
00521
if (d_scrollMode == ScrMouse)
00522
stopMoving();
00523
QwtDblRange::fitValue(val);
00524 }
00525
00526
00531 void QwtSliderBase::incValue(
int steps)
00532 {
00533
if (d_scrollMode == ScrMouse)
00534
stopMoving();
00535
QwtDblRange::incValue(steps);
00536 }