]> Creatis software - clitk.git/blob - vv/vvIntensityValueSlider.cxx
- update vv tool Binarize, now work with float pixel type + display lower contour
[clitk.git] / vv / vvIntensityValueSlider.cxx
1 /*=========================================================================
2
3   Program:   vv
4   Module:    $RCSfile: vvIntensityValueSlider.cxx,v $
5   Language:  C++
6   Date:      $Date: 2010/03/05 10:32:33 $
7   Version:   $Revision: 1.5 $
8   Author :   David Sarrut (david.sarrut@creatis.insa-lyon.fr)
9
10   Copyright (C) 2008
11   Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr
12   CREATIS-LRMN http://www.creatis.insa-lyon.fr
13
14   This program is free software: you can redistribute it and/or modify
15   it under the terms of the GNU General Public License as published by
16   the Free Software Foundation, version 3 of the License.
17
18   This program is distributed in the hope that it will be useful,
19   but WITHOUT ANY WARRANTY; without even the implied warranty of
20   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21   GNU General Public License for more details.
22
23   You should have received a copy of the GNU General Public License
24   along with this program.  If not, see <http://www.gnu.org/licenses/>.
25
26   =========================================================================*/
27
28 #include "vvIntensityValueSlider.h"
29
30 //------------------------------------------------------------------------------
31 vvIntensityValueSlider::vvIntensityValueSlider(QWidget * parent, Qt::WindowFlags f)
32   :QWidget(parent,f),  Ui::vvIntensityValueSlider() 
33 {
34   // GUI Initialization
35   setupUi(this);  
36   mIsInteger = true;
37   mButtonPlus->setHidden(true);
38   mButtonMinus->setHidden(true);
39   
40   // Connect signals & slots
41   connect(mSpinBox, SIGNAL(valueChanged(double)), this, SLOT(valueChangedFromSpinBox(double)));
42   connect(mSlider, SIGNAL(valueChanged(int)), this, SLOT(valueChangedFromSlider(int)));
43   connect(mButtonPlus, SIGNAL(clicked()), this, SLOT(SingleStepPlusClicked()));
44   connect(mButtonMinus, SIGNAL(clicked()), this, SLOT(SingleStepMinusClicked()));
45 }
46 //------------------------------------------------------------------------------
47
48
49 //------------------------------------------------------------------------------
50 vvIntensityValueSlider::~vvIntensityValueSlider() {
51 }
52 //------------------------------------------------------------------------------
53
54
55 //------------------------------------------------------------------------------
56 void vvIntensityValueSlider::SingleStepMinusClicked() {
57   mSpinBox->setSingleStep(mSpinBox->singleStep()*10);
58   mSpinBox->setDecimals(mSpinBox->decimals()-1);
59 }
60 //------------------------------------------------------------------------------
61
62
63 //------------------------------------------------------------------------------
64 void vvIntensityValueSlider::SetSingleStep(double step) {
65   mSpinBox->setSingleStep(step);
66 }
67 //------------------------------------------------------------------------------
68
69
70 //------------------------------------------------------------------------------
71 void vvIntensityValueSlider::SingleStepPlusClicked() {
72   mSpinBox->setSingleStep(mSpinBox->singleStep()/10);
73   mSpinBox->setDecimals(mSpinBox->decimals()+1);
74 }
75 //------------------------------------------------------------------------------
76
77
78 //------------------------------------------------------------------------------
79 void vvIntensityValueSlider::valueChangedFromSpinBox(double v) {
80   if (v == mValue) return;
81   mSpinBox->setValue(v);
82   v = mSpinBox->value(); // this is needed to 'round' value according to spinBox precision
83   double vv;
84   if (!mIsInteger) {
85     vv = ((v-mMin)/mWidth)/mSliderFactor;
86   }
87   else vv = v;
88   mSlider->setValue(vv);
89   mValue = v;
90   emit valueChanged(v);
91 }
92 //------------------------------------------------------------------------------
93
94
95 //------------------------------------------------------------------------------
96 void vvIntensityValueSlider::valueChangedFromSlider(int vv) {
97   double v;
98   if (!mIsInteger) {
99     v = ((double)vv*mSliderFactor)*mWidth+mMin;
100   }
101   else v= vv;
102
103   // arrondir ! ?
104
105   if (mValue == v) return;
106   mSpinBox->setValue(v);
107   mValue = v;
108 }
109 //------------------------------------------------------------------------------
110
111
112 //------------------------------------------------------------------------------
113 void vvIntensityValueSlider::SetText(QString t) {
114   mLabel->setText(t);
115 }
116 //------------------------------------------------------------------------------
117
118
119 //------------------------------------------------------------------------------
120 void vvIntensityValueSlider::SetImage(vvImage * im) { 
121   mImage = im; 
122   Update(); 
123 }
124 //------------------------------------------------------------------------------
125
126
127 //------------------------------------------------------------------------------
128 void vvIntensityValueSlider::SetValue(double v) { 
129   mValue = v;
130   mSpinBox->setValue(v);
131 }
132 //------------------------------------------------------------------------------
133
134
135 //------------------------------------------------------------------------------
136 void vvIntensityValueSlider::SetMaximum(double max) {
137   mMax = max;
138   mSpinBox->setMaximum(max);
139   
140   // If integer values : update slider max
141   if (mIsInteger == 1) {
142     mSlider->setMaximum(max);
143   }
144   else {
145     double step = mWidth/1000.0;
146     mSpinBox->setSingleStep(step);
147     mWidth = mMax-mMin;
148   }
149   if (mValue > max) { SetValue(max); }
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   mMin = min;
159   mSpinBox->setMinimum(min);
160
161   if (mIsInteger == 1) {
162     mSlider->setMinimum(min);
163   }
164   else {
165     double step = mWidth/1000.0;
166     mSpinBox->setSingleStep(step);
167     mWidth = mMax-mMin;
168   }
169
170   if (mValue < min) { SetValue(min); }
171   QString tip = QString("Min = %1    Max = %2").arg(min).arg(mSpinBox->maximum());
172   setToolTip(tip);
173 }
174 //------------------------------------------------------------------------------
175
176
177 //------------------------------------------------------------------------------
178 void vvIntensityValueSlider::Update() {
179   double range[2];
180   mImage->GetFirstVTKImageData()->GetScalarRange(range);
181   mMin = range[0];
182   mMax = range[1];
183   double step = (mMax-mMin)/1000.0;
184   
185   if (mImage->IsScalarTypeInteger()) {
186     mIsInteger = true;
187     mSpinBox->setSingleStep(1.0);
188     mSpinBox->setDecimals(0);
189     mSlider->setMaximum(mMax);
190     mSlider->setMinimum(mMin);
191     mSlider->setSingleStep(1);
192     mSliderFactor = 1.0;
193     mWidth = 1.0;
194   }
195   else {
196     mIsInteger = false;
197     mButtonPlus->setHidden(false);
198     mButtonMinus->setHidden(false);
199     mSpinBox->sizePolicy().setHorizontalPolicy(QSizePolicy::Expanding);
200     mSpinBox->setSingleStep(step);
201     mSpinBox->setDecimals(4);
202     mSlider->setMaximum(1000);
203     mSlider->setMinimum(0);
204     mSlider->setSingleStep(1);
205     mSliderFactor = 1.0/1000.0;
206     mWidth = mMax-mMin;
207   }
208   
209   mSpinBox->setMaximum(mMax);
210   mSpinBox->setMinimum(mMin);
211   mSpinBox->setValue((mMax-mMin)/2.0+mMin);
212   
213   QString tip = QString("Min = %1    Max = %2").arg(mMin).arg(mMax);
214   setToolTip(tip);
215 }
216 //------------------------------------------------------------------------------
217
218