]> Creatis software - clitk.git/blob - vv/vvIntensityValueSlider.cxx
added the new headers
[clitk.git] / vv / vvIntensityValueSlider.cxx
1 /*=========================================================================
2   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
3
4   Authors belong to: 
5   - University of LYON              http://www.universite-lyon.fr/
6   - Léon Bérard cancer center       http://oncora1.lyon.fnclcc.fr
7   - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
8
9   This software is distributed WITHOUT ANY WARRANTY; without even
10   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11   PURPOSE.  See the copyright notices for more information.
12
13   It is distributed under dual licence
14
15   - BSD        See included LICENSE.txt file
16   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ======================================================================-====*/
18 #include "vvIntensityValueSlider.h"
19
20 //------------------------------------------------------------------------------
21 vvIntensityValueSlider::vvIntensityValueSlider(QWidget * parent, Qt::WindowFlags f)
22   :QWidget(parent,f),  Ui::vvIntensityValueSlider() 
23 {
24   // GUI Initialization
25   setupUi(this);  
26   mIsInteger = true;
27   mButtonPlus->setHidden(true);
28   mButtonMinus->setHidden(true);
29   
30   // Connect signals & slots
31   connect(mSpinBox, SIGNAL(valueChanged(double)), this, SLOT(valueChangedFromSpinBox(double)));
32   connect(mSlider, SIGNAL(valueChanged(int)), this, SLOT(valueChangedFromSlider(int)));
33   connect(mButtonPlus, SIGNAL(clicked()), this, SLOT(SingleStepPlusClicked()));
34   connect(mButtonMinus, SIGNAL(clicked()), this, SLOT(SingleStepMinusClicked()));
35 }
36 //------------------------------------------------------------------------------
37
38
39 //------------------------------------------------------------------------------
40 vvIntensityValueSlider::~vvIntensityValueSlider() {
41 }
42 //------------------------------------------------------------------------------
43
44
45 //------------------------------------------------------------------------------
46 void vvIntensityValueSlider::SingleStepMinusClicked() {
47   mSpinBox->setSingleStep(mSpinBox->singleStep()*10);
48   mSpinBox->setDecimals(mSpinBox->decimals()-1);
49 }
50 //------------------------------------------------------------------------------
51
52
53 //------------------------------------------------------------------------------
54 void vvIntensityValueSlider::SetSingleStep(double step) {
55   mSpinBox->setSingleStep(step);
56 }
57 //------------------------------------------------------------------------------
58
59
60 //------------------------------------------------------------------------------
61 void vvIntensityValueSlider::SingleStepPlusClicked() {
62   mSpinBox->setSingleStep(mSpinBox->singleStep()/10);
63   mSpinBox->setDecimals(mSpinBox->decimals()+1);
64 }
65 //------------------------------------------------------------------------------
66
67
68 //------------------------------------------------------------------------------
69 void vvIntensityValueSlider::valueChangedFromSpinBox(double v) {
70   if (v == mValue) return;
71   mSpinBox->setValue(v);
72   v = mSpinBox->value(); // this is needed to 'round' value according to spinBox precision
73   double vv;
74   if (!mIsInteger) {
75     vv = ((v-mMin)/mWidth)/mSliderFactor;
76   }
77   else vv = v;
78   mSlider->setValue(vv);
79   mValue = v;
80   emit valueChanged(v);
81 }
82 //------------------------------------------------------------------------------
83
84
85 //------------------------------------------------------------------------------
86 void vvIntensityValueSlider::valueChangedFromSlider(int vv) {
87   double v;
88   if (!mIsInteger) {
89     v = ((double)vv*mSliderFactor)*mWidth+mMin;
90   }
91   else v= vv;
92
93   // arrondir ! ?
94
95   if (mValue == v) return;
96   mSpinBox->setValue(v);
97   mValue = v;
98 }
99 //------------------------------------------------------------------------------
100
101
102 //------------------------------------------------------------------------------
103 void vvIntensityValueSlider::SetText(QString t) {
104   mLabel->setText(t);
105 }
106 //------------------------------------------------------------------------------
107
108
109 //------------------------------------------------------------------------------
110 void vvIntensityValueSlider::SetImage(vvImage * im) { 
111   mImage = im; 
112   Update(); 
113 }
114 //------------------------------------------------------------------------------
115
116
117 //------------------------------------------------------------------------------
118 void vvIntensityValueSlider::SetValue(double v) { 
119   mValue = v;
120   mSpinBox->setValue(v);
121 }
122 //------------------------------------------------------------------------------
123
124
125 //------------------------------------------------------------------------------
126 void vvIntensityValueSlider::SetMaximum(double max) {
127   mMax = max;
128   mSpinBox->setMaximum(max);
129   
130   // If integer values : update slider max
131   if (mIsInteger == 1) {
132     mSlider->setMaximum(max);
133   }
134   else {
135     double step = mWidth/1000.0;
136     mSpinBox->setSingleStep(step);
137     mWidth = mMax-mMin;
138   }
139   if (mValue > max) { SetValue(max); }
140   QString tip = QString("Min = %1    Max = %2").arg(mSpinBox->minimum()).arg(max);
141   setToolTip(tip);
142 }
143 //------------------------------------------------------------------------------
144
145
146 //------------------------------------------------------------------------------
147 void vvIntensityValueSlider::SetMinimum(double min) {
148   mMin = min;
149   mSpinBox->setMinimum(min);
150
151   if (mIsInteger == 1) {
152     mSlider->setMinimum(min);
153   }
154   else {
155     double step = mWidth/1000.0;
156     mSpinBox->setSingleStep(step);
157     mWidth = mMax-mMin;
158   }
159
160   if (mValue < min) { SetValue(min); }
161   QString tip = QString("Min = %1    Max = %2").arg(min).arg(mSpinBox->maximum());
162   setToolTip(tip);
163 }
164 //------------------------------------------------------------------------------
165
166
167 //------------------------------------------------------------------------------
168 void vvIntensityValueSlider::Update() {
169   double range[2];
170   mImage->GetFirstVTKImageData()->GetScalarRange(range);
171   mMin = range[0];
172   mMax = range[1];
173   double step = (mMax-mMin)/1000.0;
174   
175   if (mImage->IsScalarTypeInteger()) {
176     mIsInteger = true;
177     mSpinBox->setSingleStep(1.0);
178     mSpinBox->setDecimals(0);
179     mSlider->setMaximum(mMax);
180     mSlider->setMinimum(mMin);
181     mSlider->setSingleStep(1);
182     mSliderFactor = 1.0;
183     mWidth = 1.0;
184   }
185   else {
186     mIsInteger = false;
187     mButtonPlus->setHidden(false);
188     mButtonMinus->setHidden(false);
189     mSpinBox->sizePolicy().setHorizontalPolicy(QSizePolicy::Expanding);
190     mSpinBox->setSingleStep(step);
191     mSpinBox->setDecimals(4);
192     mSlider->setMaximum(1000);
193     mSlider->setMinimum(0);
194     mSlider->setSingleStep(1);
195     mSliderFactor = 1.0/1000.0;
196     mWidth = mMax-mMin;
197   }
198   
199   mSpinBox->setMaximum(mMax);
200   mSpinBox->setMinimum(mMin);
201   mSpinBox->setValue((mMax-mMin)/2.0+mMin);
202   
203   QString tip = QString("Min = %1    Max = %2").arg(mMin).arg(mMax);
204   setToolTip(tip);
205 }
206 //------------------------------------------------------------------------------
207
208