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