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