]> Creatis software - cpPlugins.git/blobdiff - lib/cpExtensions/QT/WindowLevelImageConfiguration.cxx
yet another refactoring
[cpPlugins.git] / lib / cpExtensions / QT / WindowLevelImageConfiguration.cxx
diff --git a/lib/cpExtensions/QT/WindowLevelImageConfiguration.cxx b/lib/cpExtensions/QT/WindowLevelImageConfiguration.cxx
new file mode 100644 (file)
index 0000000..b2baa94
--- /dev/null
@@ -0,0 +1,231 @@
+#include <cpExtensions/QT/WindowLevelImageConfiguration.h>
+#include <cpExtensions/QT/ui_WindowLevelImageConfiguration.h>
+#include <cpExtensions/QT/SimpleMPRWidget.h>
+
+// -------------------------------------------------------------------------
+cpExtensions::QT::WindowLevelImageConfiguration::
+WindowLevelImageConfiguration( QWidget* parent, Qt::WindowFlags f )
+  : Superclass( parent, f ),
+    m_UI( new Ui::WindowLevelImageConfiguration ),
+    m_Data( NULL ),
+    m_Name( "" )
+{
+  this->m_UI->setupUi( this );
+}
+
+// -------------------------------------------------------------------------
+cpExtensions::QT::WindowLevelImageConfiguration::
+~WindowLevelImageConfiguration( )
+{
+  delete this->m_UI;
+}
+
+// -------------------------------------------------------------------------
+void cpExtensions::QT::WindowLevelImageConfiguration::
+setData( ActorsWidgetInterface* data, const std::string& name )
+{
+  if( this->m_Data != data )
+  {
+    this->m_Data = data;
+    this->m_Name = name;
+
+    // Get data
+    double range[ 2 ], win_lev[ 2 ];
+    this->m_Data->GetScalarRange( this->m_Name, range );
+    this->m_Data->GetWindowLevel( this->m_Name, win_lev );
+
+    // Intensity range
+    this->m_UI->MinimumBox->setMinimum( -1000000 );
+    this->m_UI->MinimumBox->setMaximum(  1000000 );
+    this->m_UI->MaximumBox->setMinimum( -1000000 );
+    this->m_UI->MaximumBox->setMaximum(  1000000 );
+    this->m_UI->MinimumBox->setValue( range[ 0 ] );
+    this->m_UI->MaximumBox->setValue( range[ 1 ] );
+
+    // Window/level
+    double off = range[ 1 ] - range[ 0 ];
+    this->m_UI->WindowBox->setMinimum( 0 );
+    this->m_UI->WindowBox->setMaximum( off );
+    this->m_UI->LevelBox->setMinimum( range[ 0 ] );
+    this->m_UI->LevelBox->setMaximum( range[ 1 ] );
+    this->m_UI->WindowBox->setValue( win_lev[ 0 ] );
+    this->m_UI->LevelBox->setValue( win_lev[ 1 ] );
+
+    double w = win_lev[ 0 ] / off;
+    w *=
+      double( this->m_UI->WindowSlider->maximum( ) ) -
+      double( this->m_UI->WindowSlider->minimum( ) );
+    w += double( this->m_UI->WindowSlider->minimum( ) );
+    this->m_UI->WindowSlider->setValue( w );
+
+    double l = ( win_lev[ 1 ] - range[ 0 ] ) / off;
+    l *=
+      double( this->m_UI->LevelSlider->maximum( ) ) -
+      double( this->m_UI->LevelSlider->minimum( ) );
+    l += double( this->m_UI->LevelSlider->minimum( ) );
+    this->m_UI->LevelSlider->setValue( l );
+
+    // Opacity
+    double o = this->m_Data->GetOpacity( this->m_Name );
+    o *=
+      double( this->m_UI->OpacitySlider->maximum( ) ) -
+      double( this->m_UI->OpacitySlider->minimum( ) );
+    o += double( this->m_UI->OpacitySlider->minimum( ) );
+    this->m_UI->OpacitySlider->setValue( o );
+
+    // Interpolation mode
+    switch( this->m_Data->GetImageInterpolation( this->m_Name ) )
+    {
+    case 'L': this->m_UI->InterpolatorBox->setCurrentIndex( 1 ); break;
+    case 'C': this->m_UI->InterpolatorBox->setCurrentIndex( 2 ); break;
+    default : this->m_UI->InterpolatorBox->setCurrentIndex( 0 ); break;
+    } // hctiws
+
+    // Slots <-> signals
+    this->connect(
+      this->m_UI->MaximumBox, SIGNAL( valueChanged( int ) ),
+      this, SLOT( _maximumValue( int ) )
+      );
+    this->connect(
+      this->m_UI->MinimumBox, SIGNAL( valueChanged( int ) ),
+      this, SLOT( _minimumValue( int ) )
+      );
+    this->connect(
+      this->m_UI->LevelBox, SIGNAL( valueChanged( int ) ),
+      this, SLOT( _levelValue( int ) )
+      );
+    this->connect(
+      this->m_UI->LevelSlider, SIGNAL( valueChanged( int ) ),
+      this, SLOT( _levelValue( int ) )
+      );
+    this->connect(
+      this->m_UI->WindowBox, SIGNAL( valueChanged( int ) ),
+      this, SLOT( _windowValue( int ) )
+      );
+    this->connect(
+      this->m_UI->WindowSlider, SIGNAL( valueChanged( int ) ),
+      this, SLOT( _windowValue( int ) )
+      );
+    this->connect(
+      this->m_UI->OpacitySlider, SIGNAL( valueChanged( int ) ),
+      this, SLOT( _opacityValue( int ) )
+      );
+    this->connect(
+      this->m_UI->InterpolatorBox, SIGNAL( currentIndexChanged( int ) ),
+      this, SLOT( _interpolatorValue( int ) )
+      );
+
+  } // fi
+}
+
+// -------------------------------------------------------------------------
+void cpExtensions::QT::WindowLevelImageConfiguration::
+_maximumValue( int v )
+{
+  double range[ 2 ];
+  range[ 0 ] = double( this->m_UI->MinimumBox->value( ) );
+  range[ 1 ] = double( v );
+  this->m_Data->SetScalarRange( this->m_Name, range );
+}
+
+// -------------------------------------------------------------------------
+void cpExtensions::QT::WindowLevelImageConfiguration::
+_minimumValue( int v )
+{
+  double range[ 2 ];
+  range[ 0 ] = double( v );
+  range[ 1 ] = double( this->m_UI->MaximumBox->value( ) );
+  this->m_Data->SetScalarRange( this->m_Name, range );
+}
+
+// -------------------------------------------------------------------------
+void cpExtensions::QT::WindowLevelImageConfiguration::
+_levelValue( int v )
+{
+  double r[ 2 ];
+  double l, s;
+
+  this->m_Data->GetScalarRange( this->m_Name, r );
+  if( this->sender( ) == this->m_UI->LevelSlider )
+  {
+    s = double( v ) / double( this->m_UI->LevelSlider->maximum( ) );
+    l = ( ( r[ 1 ] - r[ 0 ] ) * s ) + r[ 0 ];
+  }
+  else
+  {
+    l = double( v );
+    s = ( l - r[ 0 ] ) / ( r[ 1 ] - r[ 0 ] );
+
+  } // fi
+  s *= this->m_UI->LevelSlider->maximum( );
+
+  bool b = this->m_UI->LevelSlider->blockSignals( true );
+  this->m_UI->LevelSlider->setValue( s );
+  this->m_UI->LevelSlider->blockSignals( b );
+  b = this->m_UI->LevelBox->blockSignals( true );
+  this->m_UI->LevelBox->setValue( l );
+  this->m_UI->LevelBox->blockSignals( b );
+
+  this->m_Data->SetLevel( this->m_Name, l );
+}
+
+// -------------------------------------------------------------------------
+void cpExtensions::QT::WindowLevelImageConfiguration::
+_windowValue( int v )
+{
+  double r[ 2 ];
+  double w, s;
+
+  this->m_Data->GetScalarRange( this->m_Name, r );
+  if( this->sender( ) == this->m_UI->WindowSlider )
+  {
+    s = double( v ) / double( this->m_UI->WindowSlider->maximum( ) );
+    w = ( ( r[ 1 ] - r[ 0 ] ) * s ) + r[ 0 ];
+  }
+  else
+  {
+    w = double( v );
+    s = ( w - r[ 0 ] ) / ( r[ 1 ] - r[ 0 ] );
+
+  } // fi
+  s *= this->m_UI->WindowSlider->maximum( );
+
+  bool b = this->m_UI->WindowSlider->blockSignals( true );
+  this->m_UI->WindowSlider->setValue( s );
+  this->m_UI->WindowSlider->blockSignals( b );
+  b = this->m_UI->WindowBox->blockSignals( true );
+  this->m_UI->WindowBox->setValue( w );
+  this->m_UI->WindowBox->blockSignals( b );
+
+  this->m_Data->SetWindow( this->m_Name, w );
+}
+
+// -------------------------------------------------------------------------
+void cpExtensions::QT::WindowLevelImageConfiguration::
+_opacityValue( int v )
+{
+  if( this->m_Data != NULL )
+  {
+    double o = double( v );
+    o -= double( this->m_UI->OpacitySlider->minimum( ) );
+    o /=
+      double( this->m_UI->OpacitySlider->maximum( ) ) -
+      double( this->m_UI->OpacitySlider->minimum( ) );
+    this->m_Data->SetOpacity( this->m_Name, o );
+
+  } // fi
+}
+
+// -------------------------------------------------------------------------
+void cpExtensions::QT::WindowLevelImageConfiguration::
+_interpolatorValue( int v )
+{
+  switch( v )
+  {
+  case 1  : this->m_Data->SetImageInterpolation( this->m_Name, 'L' ); break;
+  case 2  : this->m_Data->SetImageInterpolation( this->m_Name, 'C' ); break;
+  default : this->m_Data->SetImageInterpolation( this->m_Name, 'N' ); break;
+  } // hctiws
+}
+
+// eof - $RCSfile$