Main Page | Class Hierarchy | Alphabetical List | Compound List | File List | Compound Members | File Members | Related Pages

qwt_sldbase.cpp

Go to the documentation of this file.
00001 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
00002  * Qwt Widget Library
00003  * Copyright (C) 1997   Josef Wilgen
00004  * Copyright (C) 2002   Uwe Rathmann
00005  * 
00006  * This library is free software; you can redistribute it and/or
00007  * modify it under the terms of the Qwt License, Version 1.0
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   \return Orientation
00066   \sa QwtSliderBase::setOrientation
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     // Give derived classes a chance to say ScrNone
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                 // stop if d_speed < one step per second
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 }

Generated on Fri Nov 7 14:11:46 2003 for Qwt Developer's Guide by doxygen 1.3.2