X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=vv%2FvvIntensityValueSlider.cxx;h=bbd31e56aac34785ce971b378b9afb7ece79e58d;hb=ba7eb37f66c14a90fe67ac035ecf9d8bc70fef1a;hp=55ae8f23243cfd1015ebdba4a042365da3d40358;hpb=0a85e47a06c7d046d06a4645b724c4e81b19998d;p=clitk.git diff --git a/vv/vvIntensityValueSlider.cxx b/vv/vvIntensityValueSlider.cxx index 55ae8f2..bbd31e5 100644 --- a/vv/vvIntensityValueSlider.cxx +++ b/vv/vvIntensityValueSlider.cxx @@ -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/24 11:42:42 $ - Version: $Revision: 1.3 $ - 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 . - - =========================================================================*/ + 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); +} //------------------------------------------------------------------------------ + +