]> Creatis software - clitk.git/blobdiff - vv/vvIntensityValueSlider.cxx
Debug RTStruct conversion with empty struc
[clitk.git] / vv / vvIntensityValueSlider.cxx
index 82d9258a853617455fd1cb5ba7168320b42e765b..bbd31e56aac34785ce971b378b9afb7ece79e58d 100644 (file)
@@ -1,62 +1,86 @@
 /*=========================================================================
+  Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
 
-  Program:   vv
-  Module:    $RCSfile: vvIntensityValueSlider.cxx,v $
-  Language:  C++
-  Date:      $Date: 2010/02/07 12:00:59 $
-  Version:   $Revision: 1.2 $
-  Author :   David Sarrut (david.sarrut@creatis.insa-lyon.fr)
+  Authors belong to:
+  - University of LYON              http://www.universite-lyon.fr/
+  - Léon Bérard cancer center       http://www.centreleonberard.fr
+  - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
 
-  Copyright (C) 2008
-  Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr
-  CREATIS-LRMN http://www.creatis.insa-lyon.fr
+  This software is distributed WITHOUT ANY WARRANTY; without even
+  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+  PURPOSE.  See the copyright notices for more information.
 
-  This program is free software: you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published by
-  the Free Software Foundation, version 3 of the License.
-
-  This program is distributed in the hope that it will be useful,
-  but WITHOUT ANY WARRANTY; without even the implied warranty of
-  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-  GNU General Public License for more details.
-
-  You should have received a copy of the GNU General Public License
-  along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-  =========================================================================*/
+  It is distributed under dual licence
 
+  - BSD        See included LICENSE.txt file
+  - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+===========================================================================**/
 #include "vvIntensityValueSlider.h"
-#include "clitkCommon.h"
 
 //------------------------------------------------------------------------------
 vvIntensityValueSlider::vvIntensityValueSlider(QWidget * parent, Qt::WindowFlags f)
-  :QWidget(parent,f),  Ui::vvIntensityValueSlider() 
+  :QWidget(parent,f),  Ui::vvIntensityValueSlider()
 {
   // GUI Initialization
-  setupUi(this);  
-  mValue = 0;
-  SetMaximum(1000);
-  SetMinimum(-1000);
-  
+  setupUi(this);
+  mIsInteger = true;
+  mButtonPlus->setHidden(true);
+  mButtonMinus->setHidden(true);
+  mValue=0;
+
   // Connect signals & slots
   connect(mSpinBox, SIGNAL(valueChanged(double)), this, SLOT(valueChangedFromSpinBox(double)));
   connect(mSlider, SIGNAL(valueChanged(int)), this, SLOT(valueChangedFromSlider(int)));
+  connect(mButtonPlus, SIGNAL(clicked()), this, SLOT(SingleStepPlusClicked()));
+  connect(mButtonMinus, SIGNAL(clicked()), this, SLOT(SingleStepMinusClicked()));
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+vvIntensityValueSlider::~vvIntensityValueSlider()
+{
 }
 //------------------------------------------------------------------------------
 
 
 //------------------------------------------------------------------------------
-vvIntensityValueSlider::~vvIntensityValueSlider() {
-  // DD("Delete vvIntensityValueSlider");
+void vvIntensityValueSlider::SingleStepMinusClicked()
+{
+  mSpinBox->setSingleStep(mSpinBox->singleStep()*10);
+  mSpinBox->setDecimals(mSpinBox->decimals()-1);
 }
 //------------------------------------------------------------------------------
 
 
 //------------------------------------------------------------------------------
-void vvIntensityValueSlider::valueChangedFromSpinBox(double v) {
-  //  DD("valueChangedFromSpinBox");
-  //   DD(v);
-  mSlider->setValue(v);
+void vvIntensityValueSlider::SetSingleStep(double step)
+{
+  mSpinBox->setSingleStep(step);
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvIntensityValueSlider::SingleStepPlusClicked()
+{
+  mSpinBox->setSingleStep(mSpinBox->singleStep()/10);
+  mSpinBox->setDecimals(mSpinBox->decimals()+1);
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvIntensityValueSlider::valueChangedFromSpinBox(double v)
+{
+  if (v == mValue) return;
+  mSpinBox->setValue(v);
+  v = mSpinBox->value(); // this is needed to 'round' value according to spinBox precision
+  double vv;
+  if (!mIsInteger) {
+    vv = ((v-mMin)/mWidth)/mSliderFactor;
+  } else vv = v;
+  mSlider->setValue(vv);
   mValue = v;
   emit valueChanged(v);
 }
@@ -64,43 +88,65 @@ void vvIntensityValueSlider::valueChangedFromSpinBox(double v) {
 
 
 //------------------------------------------------------------------------------
-void vvIntensityValueSlider::valueChangedFromSlider(int v) {
-  //   DD("valueChangedFromSlider");
-  //   DD(v);
-  //   DD(v*mSliderFactor);
-  mSpinBox->setValue(v*mSliderFactor);
-  //  emit valueChanged(v*mSliderFactor);
+void vvIntensityValueSlider::valueChangedFromSlider(int vv)
+{
+  double v;
+  if (!mIsInteger) {
+    v = ((double)vv*mSliderFactor)*mWidth+mMin;
+  } else v= vv;
+
+  // arrondir ! ?
+
+  if (mValue == v) return;
+  mSpinBox->setValue(v);
+  mValue = v;
 }
 //------------------------------------------------------------------------------
 
 
 //------------------------------------------------------------------------------
-void vvIntensityValueSlider::SetText(QString t) {
+void vvIntensityValueSlider::SetText(QString t)
+{
   mLabel->setText(t);
 }
 //------------------------------------------------------------------------------
 
 
 //------------------------------------------------------------------------------
-void vvIntensityValueSlider::SetImage(vvImage * im) { 
-  mImage = im; 
-  Update(); 
+void vvIntensityValueSlider::SetImage(vvImage * im)
+{
+  mImage = im;
+  Update();
 }
 //------------------------------------------------------------------------------
 
 
 //------------------------------------------------------------------------------
-void vvIntensityValueSlider::SetValue(double d) { 
-  mSpinBox->setValue(d);
+void vvIntensityValueSlider::SetValue(double v)
+{
+  mValue = v;
+  mSpinBox->setValue(v);
 }
 //------------------------------------------------------------------------------
 
 
 //------------------------------------------------------------------------------
-void vvIntensityValueSlider::SetMaximum(double max) {
-  mSlider->setMaximum(max);
+void vvIntensityValueSlider::SetMaximum(double max)
+{
+  mMax = max;
   mSpinBox->setMaximum(max);
-  if (mValue > max) { SetValue(max); }
+
+  // If integer values : update slider max
+  if (mIsInteger == 1) {
+    mSlider->setMaximum(max);
+  } else {
+    double step = mWidth/1000.0;
+    mSpinBox->setSingleStep(step);
+    mWidth = mMax-mMin;
+  }
+  if (mValue > max) {
+    SetValue(max);
+  }
   QString tip = QString("Min = %1    Max = %2").arg(mSpinBox->minimum()).arg(max);
   setToolTip(tip);
 }
@@ -108,10 +154,22 @@ void vvIntensityValueSlider::SetMaximum(double max) {
 
 
 //------------------------------------------------------------------------------
-void vvIntensityValueSlider::SetMinimum(double min) {
-  mSlider->setMinimum(min);
+void vvIntensityValueSlider::SetMinimum(double min)
+{
+  mMin = min;
   mSpinBox->setMinimum(min);
-  if (mValue < min) { SetValue(min); }
+
+  if (mIsInteger == 1) {
+    mSlider->setMinimum(min);
+  } else {
+    double step = mWidth/1000.0;
+    mSpinBox->setSingleStep(step);
+    mWidth = mMax-mMin;
+  }
+
+  if (mValue < min) {
+    SetValue(min);
+  }
   QString tip = QString("Min = %1    Max = %2").arg(min).arg(mSpinBox->maximum());
   setToolTip(tip);
 }
@@ -119,38 +177,44 @@ void vvIntensityValueSlider::SetMinimum(double min) {
 
 
 //------------------------------------------------------------------------------
-void vvIntensityValueSlider::Update() {
-  DD(mImage->GetScalarTypeAsString());
-  DD(mImage->GetFirstVTKImageData()->GetScalarTypeMax());
-  DD(mImage->GetFirstVTKImageData()->GetScalarTypeMin());
+void vvIntensityValueSlider::Update()
+{
+  double range[2];
+  mImage->GetFirstVTKImageData()->GetScalarRange(range);
+  mMin = range[0];
+  mMax = range[1];
+  double step = (mMax-mMin)/1000.0;
 
-  // double max = mImage->GetFirstVTKImageData()->GetScalarTypeMax();
-//   double min = mImage->GetFirstVTKImageData()->GetScalarTypeMin();
-    
   if (mImage->IsScalarTypeInteger()) {
-
+    mIsInteger = true;
     mSpinBox->setSingleStep(1.0);
     mSpinBox->setDecimals(0);
-    mSliderFactor = 1.0;
-
-    double range[2];
-    mImage->GetFirstVTKImageData()->GetScalarRange(range);
-    mMin = range[0];
-    mMax = range[1];
-    DD(mMax);
-    DD(mMin);
     mSlider->setMaximum(mMax);
     mSlider->setMinimum(mMin);
-    mSpinBox->setMaximum(mMax);
-    mSpinBox->setMinimum(mMin);
-
-    QString tip = QString("Min = %1    Max = %2").arg(mMin).arg(mMax);
-    setToolTip(tip);
-  }
-  else {
-    std::cerr << "NO floating point image yet !!" << std::endl;
-    exit(0);
+    mSlider->setSingleStep(1);
+    mSliderFactor = 1.0;
+    mWidth = 1.0;
+  } else {
+    mIsInteger = false;
+    mButtonPlus->setHidden(false);
+    mButtonMinus->setHidden(false);
+    mSpinBox->sizePolicy().setHorizontalPolicy(QSizePolicy::Expanding);
+    mSpinBox->setSingleStep(step);
+    mSpinBox->setDecimals(4);
+    mSlider->setMaximum(1000);
+    mSlider->setMinimum(0);
+    mSlider->setSingleStep(1);
+    mSliderFactor = 1.0/1000.0;
+    mWidth = mMax-mMin;
   }
-}
 
+  mSpinBox->setMaximum(mMax);
+  mSpinBox->setMinimum(mMin);
+  mSpinBox->setValue((mMax-mMin)/2.0+mMin);
+
+  QString tip = QString("Min = %1    Max = %2").arg(mMin).arg(mMax);
+  setToolTip(tip);
+}
 //------------------------------------------------------------------------------
+
+