Explorar el Código

BUG: Emit ctkRangeSlider::valuesChanged(double, double) before minimumValueChanged(double)/maximumValueChanged(double)
Emitting the optimized signal valuesChanged(double,double) first allows connected objects to update their values in an optimized way first.

Julien Finet hace 15 años
padre
commit
dd0a9e0002

+ 24 - 2
Libs/Widgets/ctkDoubleRangeSlider.cpp

@@ -419,6 +419,7 @@ void ctkDoubleRangeSlider::onMinValueChanged(int newValue)
     return;
     }
   d->MinValue = doubleNewValue;
+  emit this->valuesChanged(d->MinValue, d->MaxValue);
   emit this->minimumValueChanged(d->MinValue);
 }
 
@@ -432,14 +433,35 @@ void ctkDoubleRangeSlider::onMaxValueChanged(int newValue)
     return;
     }
   d->MaxValue = doubleNewValue;
+  emit this->valuesChanged(d->MinValue, d->MaxValue);
   emit this->maximumValueChanged(d->MaxValue);
 }
 
 // --------------------------------------------------------------------------
-void ctkDoubleRangeSlider::onValuesChanged(int min, int max)
+void ctkDoubleRangeSlider::onValuesChanged(int newMinValue, int newMaxValue)
 {
   CTK_D(ctkDoubleRangeSlider);
-  emit this->valuesChanged(d->minFromInt(min), d->maxFromInt(max));
+  double doubleNewMinValue = d->minFromInt(newMinValue);
+  double doubleNewMaxValue = d->maxFromInt(newMaxValue);
+
+  bool emitMinValueChanged = (d->MinValue != doubleNewMinValue);
+  bool emitMaxValueChanged = (d->MaxValue != doubleNewMaxValue);
+
+  if (!emitMinValueChanged && !emitMaxValueChanged)
+    {
+    return;
+    }
+  d->MinValue = doubleNewMinValue;
+  d->MaxValue = doubleNewMaxValue;
+  emit this->valuesChanged(d->MinValue, d->MaxValue);
+  if (emitMinValueChanged)
+    {
+    emit this->minimumValueChanged(d->MinValue);
+    }
+  if (emitMaxValueChanged)
+    {
+    emit this->maximumValueChanged(d->MaxValue);
+    }
 }
 
 // --------------------------------------------------------------------------

+ 9 - 9
Libs/Widgets/ctkRangeSlider.cpp

@@ -297,6 +297,10 @@ void ctkRangeSlider::setValues(int l, int u)
   
   if (isSliderDown())
     {
+    if (emitMinPosChanged || emitMaxPosChanged)
+      {
+      emit positionsChanged(minimumValue, maximumValue);
+      }
     if (emitMinPosChanged)
       {
       emit minimumPositionChanged(minimumValue);
@@ -305,10 +309,11 @@ void ctkRangeSlider::setValues(int l, int u)
       {
       emit maximumPositionChanged(maximumValue);
       }
-    if (emitMinPosChanged || emitMaxPosChanged)
-      {
-      emit positionsChanged(minimumValue, maximumValue);
-      }
+    }
+  if (emitMinValChanged || emitMaxValChanged)
+    {
+    emit valuesChanged(d->m_MinimumValue, 
+                       d->m_MaximumValue);
     }
   if (emitMinValChanged)
     {
@@ -318,11 +323,6 @@ void ctkRangeSlider::setValues(int l, int u)
     {
     emit maximumValueChanged(maximumValue);
     }
-  if (emitMinValChanged || emitMaxValChanged)
-    {
-    emit valuesChanged(d->m_MinimumValue, 
-                       d->m_MaximumValue);
-    }
   if (emitMinPosChanged || emitMaxPosChanged || 
       emitMinValChanged || emitMaxValChanged)
     {

+ 15 - 4
Libs/Widgets/ctkRangeWidget.cpp

@@ -158,17 +158,20 @@ ctkRangeWidget::ctkRangeWidget(QWidget* _parent) : Superclass(_parent)
   d->MaximumSpinBox->setMaximum(d->Slider->maximum());
   d->MinimumSpinBox->setValue(d->Slider->minimumValue());
   d->MaximumSpinBox->setValue(d->Slider->maximumValue());
-  this->connect(d->Slider, SIGNAL(minimumValueChanged(double)), d->MinimumSpinBox, SLOT(setValue(double)));
+  
+  //this->connect(d->Slider, SIGNAL(minimumValueChanged(double)), d->MinimumSpinBox, SLOT(setValue(double)));
+  //this->connect(d->Slider, SIGNAL(maximumValueChanged(double)), d->MaximumSpinBox, SLOT(setValue(double)));
+  this->connect(d->Slider, SIGNAL(valuesChanged(double, double)), this, SLOT(changeValues(double,double)));
+  this->connect(d->Slider, SIGNAL(minimumValueChanged(double)), this, SLOT(changeMinimumValue(double)));
+  this->connect(d->Slider, SIGNAL(maximumValueChanged(double)), this, SLOT(changeMaximumValue(double)));
+  
   this->connect(d->MinimumSpinBox, SIGNAL(valueChanged(double)), d->Slider, SLOT(setMinimumValue(double)));
-  this->connect(d->Slider, SIGNAL(maximumValueChanged(double)), d->MaximumSpinBox, SLOT(setValue(double)));
   this->connect(d->MaximumSpinBox, SIGNAL(valueChanged(double)), d->Slider, SLOT(setMaximumValue(double)));
   this->connect(d->MinimumSpinBox, SIGNAL(valueChanged(double)), this, SLOT(setMinimumToMaximumSpinBox(double)));
   this->connect(d->MaximumSpinBox, SIGNAL(valueChanged(double)), this, SLOT(setMaximumToMinimumSpinBox(double)));
 
   this->connect(d->Slider, SIGNAL(sliderPressed()), this, SLOT(startChanging()));
   this->connect(d->Slider, SIGNAL(sliderReleased()), this, SLOT(stopChanging()));
-  this->connect(d->Slider, SIGNAL(minimumValueChanged(double)), this, SLOT(changeMinimumValue(double)));
-  this->connect(d->Slider, SIGNAL(maximumValueChanged(double)), this, SLOT(changeMaximumValue(double)));
   d->MinimumSpinBox->installEventFilter(this);
   d->MaximumSpinBox->installEventFilter(this);
 }
@@ -387,6 +390,14 @@ void ctkRangeWidget::changeMaximumValue(double newValue)
 }
 
 // --------------------------------------------------------------------------
+void ctkRangeWidget::changeValues(double newMinValue, double newMaxValue)
+{
+  CTK_D(ctkRangeWidget);
+  d->MinimumSpinBox->setValue(newMinValue);
+  d->MaximumSpinBox->setValue(newMaxValue);
+}
+
+// --------------------------------------------------------------------------
 bool ctkRangeWidget::eventFilter(QObject *obj, QEvent *event)
  {
    if (event->type() == QEvent::MouseButtonPress)

+ 1 - 0
Libs/Widgets/ctkRangeWidget.h

@@ -177,6 +177,7 @@ signals:
 protected slots:
   void startChanging();
   void stopChanging();
+  void changeValues(double newMinValue, double newMaxValue);
   void changeMinimumValue(double value);
   void changeMaximumValue(double value);
   void setMinimumToMaximumSpinBox(double minimum);