Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include <QmitkNumberPropertySlider.h>
00018 #include <mitkRenderingManager.h>
00019
00020 #define DT_SHORT 1
00021 #define DT_INT 2
00022 #define DT_FLOAT 3
00023 #define DT_DOUBLE 4
00024
00025 #define ROUND(x) (((x) > 0) ? int((x) + 0.5) : int((x) - 0.5))
00026 #define ROUND_SHORT(x) (((x) > 0) ? short((x) + 0.5) : short((x) - 0.5))
00027
00028 QmitkNumberPropertySlider::QmitkNumberPropertySlider( mitk::IntProperty* property, QWidget* parent, const char* )
00029 : QSlider( parent ),
00030 PropertyEditor( property ),
00031 m_IntProperty(property),
00032 m_DataType(DT_INT)
00033 {
00034 initialize();
00035 }
00036
00037 QmitkNumberPropertySlider::QmitkNumberPropertySlider( mitk::FloatProperty* property, QWidget* parent, const char* )
00038 : QSlider( parent ),
00039 PropertyEditor( property ),
00040 m_FloatProperty(property),
00041 m_DataType(DT_FLOAT)
00042 {
00043 initialize();
00044 }
00045
00046 QmitkNumberPropertySlider::QmitkNumberPropertySlider( mitk::DoubleProperty* property, QWidget* parent, const char* )
00047 : QSlider( parent ),
00048 PropertyEditor( property ),
00049 m_DoubleProperty(property),
00050 m_DataType(DT_DOUBLE)
00051 {
00052 initialize();
00053 }
00054
00055 QmitkNumberPropertySlider::~QmitkNumberPropertySlider()
00056 {
00057 }
00058
00059 void QmitkNumberPropertySlider::initialize()
00060 {
00061
00062
00063
00064
00065 setOrientation( Qt::Horizontal );
00066
00067
00068 m_DecimalPlaces = 0;
00069 m_FactorPropertyToSlider = 1.0;
00070 m_FactorSliderToDisplay = 1.0;
00071 m_ShowPercents = false;
00072
00073
00074 m_SelfChangeLock = false;
00075
00076 connect( this, SIGNAL(valueChanged(int)), this, SLOT(onValueChanged(int)) );
00077
00078
00079 DisplayNumber();
00080 }
00081
00082 void QmitkNumberPropertySlider::adjustFactors(short newDecimalPlaces, bool newShowPercents)
00083 {
00084 int oldMax = maxValue();
00085 int oldMin = minValue();
00086
00087 m_DecimalPlaces = newDecimalPlaces;
00088 m_ShowPercents = newShowPercents;
00089
00090 m_FactorPropertyToSlider = pow(10.0,m_DecimalPlaces);
00091 m_FactorSliderToDisplay = 1.0 / m_FactorPropertyToSlider;
00092
00093
00094
00095
00096 if ( m_ShowPercents )
00097 {
00098 m_FactorPropertyToSlider *= 100.0;
00099
00100
00101 }
00102 else
00103 {
00104
00105 }
00106
00107 setMinimum(oldMin);
00108 setMaximum(oldMax);
00109 }
00110
00111 short QmitkNumberPropertySlider::getDecimalPlaces() const
00112 {
00113 return m_DecimalPlaces;
00114 }
00115
00116 void QmitkNumberPropertySlider::setDecimalPlaces(short places)
00117 {
00118 switch (m_DataType)
00119 {
00120 case DT_FLOAT:
00121 case DT_DOUBLE:
00122 {
00123 adjustFactors( places, m_ShowPercents );
00124 DisplayNumber();
00125 break;
00126 }
00127 default:
00128 break;
00129 }
00130 }
00131
00132 bool QmitkNumberPropertySlider::getShowPercent() const
00133 {
00134 return m_ShowPercents;
00135 }
00136
00137 void QmitkNumberPropertySlider::setShowPercent(bool showPercent)
00138 {
00139 if ( showPercent == m_ShowPercents ) return;
00140
00141 switch (m_DataType)
00142 {
00143 case DT_FLOAT:
00144 case DT_DOUBLE:
00145 {
00146 adjustFactors( m_DecimalPlaces, showPercent );
00147 break;
00148 }
00149 default:
00150 {
00151 break;
00152 }
00153 }
00154
00155 DisplayNumber();
00156 }
00157
00158 int QmitkNumberPropertySlider::minValue() const
00159 {
00160 return ROUND( QSlider::minimum() / m_FactorPropertyToSlider );
00161 }
00162
00163 void QmitkNumberPropertySlider::setMinValue(int value)
00164 {
00165 QSlider::setMinimum( ROUND(value * m_FactorPropertyToSlider ) );
00166 }
00167
00168 int QmitkNumberPropertySlider::maxValue() const
00169 {
00170 return ROUND( QSlider::maximum() / m_FactorPropertyToSlider );
00171 }
00172
00173 void QmitkNumberPropertySlider::setMaxValue(int value)
00174 {
00175 QSlider::setMaximum( ROUND( value * m_FactorPropertyToSlider ) );
00176 }
00177
00178 double QmitkNumberPropertySlider::doubleValue() const
00179 {
00180 return static_cast<double>((QSlider::value()) / m_FactorPropertyToSlider );
00181 }
00182
00183 void QmitkNumberPropertySlider::setDoubleValue(double value)
00184 {
00185 QSlider::setValue( ROUND( value * m_FactorPropertyToSlider ) );
00186
00187 }
00188
00189 void QmitkNumberPropertySlider::onValueChanged(int value)
00190 {
00191 if (m_SelfChangeLock) return;
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201 BeginModifyProperty();
00202
00203 double newValue( value / m_FactorPropertyToSlider );
00204
00205 switch (m_DataType)
00206 {
00207
00208
00209
00210
00211
00212
00213
00214 case DT_INT:
00215 {
00216 m_IntProperty->SetValue(ROUND(newValue));
00217 break;
00218 }
00219 case DT_FLOAT:
00220 {
00221 m_FloatProperty->SetValue(newValue);
00222 break;
00223 }
00224 case DT_DOUBLE:
00225 {
00226 m_DoubleProperty->SetValue(newValue);
00227 break;
00228 }
00229 }
00230 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00231
00232 EndModifyProperty();
00233 }
00234
00235 void QmitkNumberPropertySlider::PropertyChanged()
00236 {
00237 DisplayNumber();
00238 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00239 }
00240
00241 void QmitkNumberPropertySlider::PropertyRemoved()
00242 {
00243 m_Property = NULL;
00244 }
00245
00246 void QmitkNumberPropertySlider::DisplayNumber()
00247 {
00248 if (! m_Property ) return;
00249
00250 m_SelfChangeLock = true;
00251 switch (m_DataType)
00252 {
00253
00254
00255
00256
00257
00258
00259
00260
00261 case DT_INT:
00262 {
00263 int i = m_IntProperty->GetValue();
00264 QSlider::setValue( i );
00265 break;
00266 }
00267 case DT_FLOAT:
00268 {
00269 float f = m_FloatProperty->GetValue();
00270 setDoubleValue( f );
00271 break;
00272 }
00273 case DT_DOUBLE:
00274 {
00275 double d = m_DoubleProperty->GetValue();
00276 setDoubleValue( d );
00277 break;
00278 }
00279 default:
00280 break;
00281 }
00282 m_SelfChangeLock = false;
00283 }
00284