CMS 3D CMS Logo

IgQtRangeValue.h

Go to the documentation of this file.
00001 #ifndef IGUANA_GL_BROWSERS_IG_QT_RANGE_VALUE_H
00002 # define IGUANA_GL_BROWSERS_IG_QT_RANGE_VALUE_H
00003 
00004 //<<<<<< INCLUDES                                                       >>>>>>
00005 
00006 # include "Iguana/GLBrowsers/interface/config.h"
00007 # include <qstring.h>
00008 # include <climits>
00009 # include <algorithm>
00010 # include <cmath>
00011 
00012 //<<<<<< PUBLIC DEFINES                                                 >>>>>>
00013 //<<<<<< PUBLIC CONSTANTS                                               >>>>>>
00014 //<<<<<< PUBLIC TYPES                                                   >>>>>>
00015 //<<<<<< PUBLIC VARIABLES                                               >>>>>>
00016 //<<<<<< PUBLIC FUNCTIONS                                               >>>>>>
00017 //<<<<<< CLASS DECLARATIONS                                             >>>>>>
00018 
00019 template<class T>
00020 class IGUANA_GL_BROWSERS_API IgQtRangeValue
00021 {
00022 public:
00023     typedef IgQtRangeValue<T> inherited;
00024     
00025     enum BoundaryHandling {
00026         ACCUMULATE,
00027         MODULATE
00028     };
00029 
00030     IgQtRangeValue (T value = 0,
00031                     T min = 0,
00032                     T max = SHRT_MAX);
00033     // implicit copy constructor
00034     // implicit assignment operator
00035     // implicit destructor
00036 
00037     virtual T           value (void) const
00038     { return m_value; }
00039     
00040     virtual void        setValue (T value)
00041     {
00042       value = adjustValue (value);
00043       m_change = value - m_value;
00044       m_value = value;
00045     }
00046     
00047     virtual T           valueChange (void) const
00048     { return m_change; }
00049     
00050     virtual bool        isValueChanged (void) const
00051     { return valueChange () ? true : false; }
00052 
00053     virtual void        setRange (T min, T max)
00054     {
00055       if (min > max)
00056         std::swap (min, max);
00057       m_max = max; m_min = min;
00058       setValue (m_value);
00059     }
00060 
00061     virtual T           minValue (void) const
00062     { return m_min; }
00063     
00064     virtual void        setMinValue (T value)
00065     { setRange (value, maxValue ()); }
00066     
00067     virtual T           maxValue (void) const
00068     { return m_max; }
00069     
00070     virtual void        setMaxValue (T value)
00071     { setRange (minValue (), value); }
00072 
00073     virtual BoundaryHandling boundaryHandling (void) const
00074     { return m_boundary; }
00075     
00076     virtual void        setBoundaryHandling (BoundaryHandling mode)
00077     { m_boundary = mode; setValue (m_value); }
00078     
00079 protected:
00080     T   modulate (T value) const
00081     {
00082       T width = m_max - m_min;
00083       value -= int ((value - m_min) / width) * width;
00084       value += int ((m_max - value) / width) * width;
00085       return value;
00086     }
00087     
00088     T   accumulate (T value) const
00089     {
00090       if (value > m_max)
00091         return m_max;
00092       else if (value < m_min)
00093         return m_min;
00094       return value;
00095     }
00096     
00097     T  adjustValue (T value)
00098     {
00099       switch (boundaryHandling ())
00100       {
00101       case ACCUMULATE:
00102         value = accumulate (value);
00103         break;
00104 
00105       case MODULATE:
00106         value = modulate (value);
00107         break;
00108       }
00109       return value;
00110     }
00111 
00112     void   forceValue (T value)
00113     { m_value = value; }
00114     
00115     void                forceValueChanged (T delta)
00116     { m_change = delta; }
00117 
00118 private:
00119     T                   m_value;
00120     T                   m_change;
00121     T                   m_min;
00122     T                   m_max;
00123     BoundaryHandling    m_boundary;
00124 };
00125 
00126 template<class T>
00127 IgQtRangeValue<T>::IgQtRangeValue (T value /* = 0 */,
00128                                    T min /* = 0 */,
00129                                    T max /* = SHRT_MAX */)
00130     : m_value (value),
00131       m_change (0),
00132       m_min (min),
00133       m_max (max),
00134       m_boundary (ACCUMULATE)
00135 { setValue (value); }
00136 
00137 //<<<<<< INLINE PUBLIC FUNCTIONS                                        >>>>>>
00138 //<<<<<< INLINE MEMBER FUNCTIONS                                        >>>>>>
00139 
00140 #endif // IGUANA_GL_BROWSERS_IG_QT_RANGE_VALUE_H

Generated on Tue Jun 9 17:38:34 2009 for CMSSW by  doxygen 1.5.4