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