00001 #ifndef IGUANA_GL_BROWSERS_IG_QT_RANGE_VALUE_H
00002 # define IGUANA_GL_BROWSERS_IG_QT_RANGE_VALUE_H
00003
00004
00005
00006 # include "Iguana/GLBrowsers/interface/config.h"
00007 # include <qstring.h>
00008 # include <climits>
00009 # include <algorithm>
00010 # include <cmath>
00011
00012
00013
00014
00015
00016
00017
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
00034
00035
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 ,
00128 T min ,
00129 T 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
00138
00139
00140 #endif // IGUANA_GL_BROWSERS_IG_QT_RANGE_VALUE_H