]> Creatis software - cpPlugins.git/blob - lib/cpExtensions/QT/WindowLevelImageConfiguration.cxx
...
[cpPlugins.git] / lib / cpExtensions / QT / WindowLevelImageConfiguration.cxx
1 #include <cpExtensions/QT/WindowLevelImageConfiguration.h>
2 #include <cpExtensions/QT/ui_WindowLevelImageConfiguration.h>
3 #include <cpExtensions/QT/SimpleMPRWidget.h>
4
5 // -------------------------------------------------------------------------
6 cpExtensions::QT::WindowLevelImageConfiguration::
7 WindowLevelImageConfiguration( QWidget* parent, Qt::WindowFlags f )
8   : Superclass( parent, f ),
9     m_UI( new Ui::WindowLevelImageConfiguration ),
10     m_Data( NULL ),
11     m_Name( "" )
12 {
13   this->m_UI->setupUi( this );
14 }
15
16 // -------------------------------------------------------------------------
17 cpExtensions::QT::WindowLevelImageConfiguration::
18 ~WindowLevelImageConfiguration( )
19 {
20   delete this->m_UI;
21 }
22
23 // -------------------------------------------------------------------------
24 void cpExtensions::QT::WindowLevelImageConfiguration::
25 setData( ActorsWidgetInterface* data, const std::string& name )
26 {
27   if( this->m_Data != data )
28   {
29     this->m_Data = data;
30     this->m_Name = name;
31
32     // Get data
33     double range[ 2 ], win_lev[ 2 ];
34     this->m_Data->GetScalarRange( this->m_Name, range );
35     this->m_Data->GetWindowLevel( this->m_Name, win_lev );
36
37     // Intensity range
38     this->m_UI->MinimumBox->setMinimum( -1000000 );
39     this->m_UI->MinimumBox->setMaximum(  1000000 );
40     this->m_UI->MaximumBox->setMinimum( -1000000 );
41     this->m_UI->MaximumBox->setMaximum(  1000000 );
42     this->m_UI->MinimumBox->setValue( range[ 0 ] );
43     this->m_UI->MaximumBox->setValue( range[ 1 ] );
44
45     // Window/level
46     double off = range[ 1 ] - range[ 0 ];
47     this->m_UI->WindowBox->setMinimum( 0 );
48     this->m_UI->WindowBox->setMaximum( off );
49     this->m_UI->LevelBox->setMinimum( range[ 0 ] );
50     this->m_UI->LevelBox->setMaximum( range[ 1 ] );
51     this->m_UI->WindowBox->setValue( win_lev[ 0 ] );
52     this->m_UI->LevelBox->setValue( win_lev[ 1 ] );
53
54     double w = win_lev[ 0 ] / off;
55     w *=
56       double( this->m_UI->WindowSlider->maximum( ) ) -
57       double( this->m_UI->WindowSlider->minimum( ) );
58     w += double( this->m_UI->WindowSlider->minimum( ) );
59     this->m_UI->WindowSlider->setValue( w );
60
61     double l = ( win_lev[ 1 ] - range[ 0 ] ) / off;
62     l *=
63       double( this->m_UI->LevelSlider->maximum( ) ) -
64       double( this->m_UI->LevelSlider->minimum( ) );
65     l += double( this->m_UI->LevelSlider->minimum( ) );
66     this->m_UI->LevelSlider->setValue( l );
67
68     // Opacity
69     double o = this->m_Data->GetOpacity( this->m_Name );
70     o *=
71       double( this->m_UI->OpacitySlider->maximum( ) ) -
72       double( this->m_UI->OpacitySlider->minimum( ) );
73     o += double( this->m_UI->OpacitySlider->minimum( ) );
74     this->m_UI->OpacitySlider->setValue( o );
75
76     // Interpolation mode
77     switch( this->m_Data->GetImageInterpolation( this->m_Name ) )
78     {
79     case 'L': this->m_UI->InterpolatorBox->setCurrentIndex( 1 ); break;
80     case 'C': this->m_UI->InterpolatorBox->setCurrentIndex( 2 ); break;
81     default : this->m_UI->InterpolatorBox->setCurrentIndex( 0 ); break;
82     } // hctiws
83
84     // Slots <-> signals
85     this->connect(
86       this->m_UI->MaximumBox, SIGNAL( valueChanged( int ) ),
87       this, SLOT( _maximumValue( int ) )
88       );
89     this->connect(
90       this->m_UI->MinimumBox, SIGNAL( valueChanged( int ) ),
91       this, SLOT( _minimumValue( int ) )
92       );
93     this->connect(
94       this->m_UI->LevelBox, SIGNAL( valueChanged( int ) ),
95       this, SLOT( _levelValue( int ) )
96       );
97     this->connect(
98       this->m_UI->LevelSlider, SIGNAL( valueChanged( int ) ),
99       this, SLOT( _levelValue( int ) )
100       );
101     this->connect(
102       this->m_UI->WindowBox, SIGNAL( valueChanged( int ) ),
103       this, SLOT( _windowValue( int ) )
104       );
105     this->connect(
106       this->m_UI->WindowSlider, SIGNAL( valueChanged( int ) ),
107       this, SLOT( _windowValue( int ) )
108       );
109     this->connect(
110       this->m_UI->OpacitySlider, SIGNAL( valueChanged( int ) ),
111       this, SLOT( _opacityValue( int ) )
112       );
113     this->connect(
114       this->m_UI->InterpolatorBox, SIGNAL( currentIndexChanged( int ) ),
115       this, SLOT( _interpolatorValue( int ) )
116       );
117
118   } // fi
119 }
120
121 // -------------------------------------------------------------------------
122 void cpExtensions::QT::WindowLevelImageConfiguration::
123 _maximumValue( int v )
124 {
125   double range[ 2 ];
126   range[ 0 ] = double( this->m_UI->MinimumBox->value( ) );
127   range[ 1 ] = double( v );
128   this->m_Data->SetScalarRange( this->m_Name, range );
129 }
130
131 // -------------------------------------------------------------------------
132 void cpExtensions::QT::WindowLevelImageConfiguration::
133 _minimumValue( int v )
134 {
135   double range[ 2 ];
136   range[ 0 ] = double( v );
137   range[ 1 ] = double( this->m_UI->MaximumBox->value( ) );
138   this->m_Data->SetScalarRange( this->m_Name, range );
139 }
140
141 // -------------------------------------------------------------------------
142 void cpExtensions::QT::WindowLevelImageConfiguration::
143 _levelValue( int v )
144 {
145   double r[ 2 ];
146   double l, s;
147
148   this->m_Data->GetScalarRange( this->m_Name, r );
149   if( this->sender( ) == this->m_UI->LevelSlider )
150   {
151     s = double( v ) / double( this->m_UI->LevelSlider->maximum( ) );
152     l = ( ( r[ 1 ] - r[ 0 ] ) * s ) + r[ 0 ];
153   }
154   else
155   {
156     l = double( v );
157     s = ( l - r[ 0 ] ) / ( r[ 1 ] - r[ 0 ] );
158
159   } // fi
160   s *= this->m_UI->LevelSlider->maximum( );
161
162   bool b = this->m_UI->LevelSlider->blockSignals( true );
163   this->m_UI->LevelSlider->setValue( s );
164   this->m_UI->LevelSlider->blockSignals( b );
165   b = this->m_UI->LevelBox->blockSignals( true );
166   this->m_UI->LevelBox->setValue( l );
167   this->m_UI->LevelBox->blockSignals( b );
168
169   this->m_Data->SetLevel( this->m_Name, l );
170 }
171
172 // -------------------------------------------------------------------------
173 void cpExtensions::QT::WindowLevelImageConfiguration::
174 _windowValue( int v )
175 {
176   double r[ 2 ];
177   double w, s;
178
179   this->m_Data->GetScalarRange( this->m_Name, r );
180   if( this->sender( ) == this->m_UI->WindowSlider )
181   {
182     s = double( v ) / double( this->m_UI->WindowSlider->maximum( ) );
183     w = ( ( r[ 1 ] - r[ 0 ] ) * s ) + r[ 0 ];
184   }
185   else
186   {
187     w = double( v );
188     s = ( w - r[ 0 ] ) / ( r[ 1 ] - r[ 0 ] );
189
190   } // fi
191   s *= this->m_UI->WindowSlider->maximum( );
192
193   bool b = this->m_UI->WindowSlider->blockSignals( true );
194   this->m_UI->WindowSlider->setValue( s );
195   this->m_UI->WindowSlider->blockSignals( b );
196   b = this->m_UI->WindowBox->blockSignals( true );
197   this->m_UI->WindowBox->setValue( w );
198   this->m_UI->WindowBox->blockSignals( b );
199
200   this->m_Data->SetWindow( this->m_Name, w );
201 }
202
203 // -------------------------------------------------------------------------
204 void cpExtensions::QT::WindowLevelImageConfiguration::
205 _opacityValue( int v )
206 {
207   if( this->m_Data != NULL )
208   {
209     double o = double( v );
210     o -= double( this->m_UI->OpacitySlider->minimum( ) );
211     o /=
212       double( this->m_UI->OpacitySlider->maximum( ) ) -
213       double( this->m_UI->OpacitySlider->minimum( ) );
214     this->m_Data->SetOpacity( this->m_Name, o );
215
216   } // fi
217 }
218
219 // -------------------------------------------------------------------------
220 void cpExtensions::QT::WindowLevelImageConfiguration::
221 _interpolatorValue( int v )
222 {
223   switch( v )
224   {
225   case 1  : this->m_Data->SetImageInterpolation( this->m_Name, 'L' ); break;
226   case 2  : this->m_Data->SetImageInterpolation( this->m_Name, 'C' ); break;
227   default : this->m_Data->SetImageInterpolation( this->m_Name, 'N' ); break;
228   } // hctiws
229 }
230
231 // eof - $RCSfile$