]> Creatis software - clitk.git/blob - vv/vvIntensityValueSlider.cxx
Remove signal/slot connection bug with Profile tool
[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://www.centreleonberard.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 //------------------------------------------------------------------------------
47 void vvIntensityValueSlider::SingleStepMinusClicked()
48 {
49   mSpinBox->setSingleStep(mSpinBox->singleStep()*10);
50   mSpinBox->setDecimals(mSpinBox->decimals()-1);
51 }
52 //------------------------------------------------------------------------------
53
54
55 //------------------------------------------------------------------------------
56 void vvIntensityValueSlider::SetSingleStep(double step)
57 {
58   mSpinBox->setSingleStep(step);
59 }
60 //------------------------------------------------------------------------------
61
62
63 //------------------------------------------------------------------------------
64 void vvIntensityValueSlider::SingleStepPlusClicked()
65 {
66   mSpinBox->setSingleStep(mSpinBox->singleStep()/10);
67   mSpinBox->setDecimals(mSpinBox->decimals()+1);
68 }
69 //------------------------------------------------------------------------------
70
71
72 //------------------------------------------------------------------------------
73 void vvIntensityValueSlider::valueChangedFromSpinBox(double v)
74 {
75   if (v == mValue) return;
76   mSpinBox->setValue(v);
77   v = mSpinBox->value(); // this is needed to 'round' value according to spinBox precision
78   double vv;
79   if (!mIsInteger) {
80     vv = ((v-mMin)/mWidth)/mSliderFactor;
81   } else vv = v;
82   mSlider->setValue(vv);
83   mValue = v;
84   emit valueChanged(v);
85 }
86 //------------------------------------------------------------------------------
87
88
89 //------------------------------------------------------------------------------
90 void vvIntensityValueSlider::valueChangedFromSlider(int vv)
91 {
92   double v;
93   if (!mIsInteger) {
94     v = ((double)vv*mSliderFactor)*mWidth+mMin;
95   } else v= vv;
96
97   // arrondir ! ?
98
99   if (mValue == v) return;
100   mSpinBox->setValue(v);
101   mValue = v;
102 }
103 //------------------------------------------------------------------------------
104
105
106 //------------------------------------------------------------------------------
107 void vvIntensityValueSlider::SetText(QString t)
108 {
109   mLabel->setText(t);
110 }
111 //------------------------------------------------------------------------------
112
113
114 //------------------------------------------------------------------------------
115 void vvIntensityValueSlider::SetImage(vvImage * im)
116 {
117   mImage = im;
118   Update();
119 }
120 //------------------------------------------------------------------------------
121
122
123 //------------------------------------------------------------------------------
124 void vvIntensityValueSlider::SetValue(double v)
125 {
126   mValue = v;
127   mSpinBox->setValue(v);
128 }
129 //------------------------------------------------------------------------------
130
131
132 //------------------------------------------------------------------------------
133 void vvIntensityValueSlider::SetMaximum(double max)
134 {
135   mMax = max;
136   mSpinBox->setMaximum(max);
137
138   // If integer values : update slider max
139   if (mIsInteger == 1) {
140     mSlider->setMaximum(max);
141   } else {
142     double step = mWidth/1000.0;
143     mSpinBox->setSingleStep(step);
144     mWidth = mMax-mMin;
145   }
146   if (mValue > max) {
147     SetValue(max);
148   }
149   QString tip = QString("Min = %1    Max = %2").arg(mSpinBox->minimum()).arg(max);
150   setToolTip(tip);
151 }
152 //------------------------------------------------------------------------------
153
154
155 //------------------------------------------------------------------------------
156 void vvIntensityValueSlider::SetMinimum(double min)
157 {
158   mMin = min;
159   mSpinBox->setMinimum(min);
160
161   if (mIsInteger == 1) {
162     mSlider->setMinimum(min);
163   } else {
164     double step = mWidth/1000.0;
165     mSpinBox->setSingleStep(step);
166     mWidth = mMax-mMin;
167   }
168
169   if (mValue < min) {
170     SetValue(min);
171   }
172   QString tip = QString("Min = %1    Max = %2").arg(min).arg(mSpinBox->maximum());
173   setToolTip(tip);
174 }
175 //------------------------------------------------------------------------------
176
177
178 //------------------------------------------------------------------------------
179 void vvIntensityValueSlider::Update()
180 {
181   double range[2];
182   mImage->GetFirstVTKImageData()->GetScalarRange(range);
183   mMin = range[0];
184   mMax = range[1];
185   double step = (mMax-mMin)/1000.0;
186
187   if (mImage->IsScalarTypeInteger()) {
188     mIsInteger = true;
189     mSpinBox->setSingleStep(1.0);
190     mSpinBox->setDecimals(0);
191     mSlider->setMaximum(mMax);
192     mSlider->setMinimum(mMin);
193     mSlider->setSingleStep(1);
194     mSliderFactor = 1.0;
195     mWidth = 1.0;
196   } else {
197     mIsInteger = false;
198     mButtonPlus->setHidden(false);
199     mButtonMinus->setHidden(false);
200     mSpinBox->sizePolicy().setHorizontalPolicy(QSizePolicy::Expanding);
201     mSpinBox->setSingleStep(step);
202     mSpinBox->setDecimals(4);
203     mSlider->setMaximum(1000);
204     mSlider->setMinimum(0);
205     mSlider->setSingleStep(1);
206     mSliderFactor = 1.0/1000.0;
207     mWidth = mMax-mMin;
208   }
209
210   mSpinBox->setMaximum(mMax);
211   mSpinBox->setMinimum(mMin);
212   mSpinBox->setValue((mMax-mMin)/2.0+mMin);
213
214   QString tip = QString("Min = %1    Max = %2").arg(mMin).arg(mMax);
215   setToolTip(tip);
216 }
217 //------------------------------------------------------------------------------
218
219