Selaa lähdekoodia

Add tests to ctkCoordinatesWidget and fix bugs

Julien Finet 14 vuotta sitten
vanhempi
commit
4a0a6c164f

+ 134 - 2
Libs/Widgets/Testing/Cpp/ctkCoordinatesWidgetTest1.cpp

@@ -20,6 +20,7 @@
 
 // Qt includes
 #include <QApplication>
+#include <QTimer>
 
 // CTK includes
 #include "ctkCoordinatesWidget.h"
@@ -33,9 +34,140 @@ int ctkCoordinatesWidgetTest1(int argc, char * argv [] )
 {
   QApplication app(argc, argv);
 
-  ctkCoordinatesWidget ctkObject;
+  ctkCoordinatesWidget coordinatesWidget;
 
+  if (coordinatesWidget.dimension() != 3)
+    {
+    std::cerr << "ctkCoordinatesWidget: bad default dimension" << std::endl;
+    return EXIT_FAILURE;
+    }
 
-  return EXIT_SUCCESS;
+  coordinatesWidget.setDimension(4);
+
+  if (coordinatesWidget.dimension() != 4)
+    {
+    std::cerr << "ctkCoordinatesWidget::setDimension failed" << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  if (coordinatesWidget.decimals() != 3 ||
+      coordinatesWidget.singleStep() != 1. ||
+      coordinatesWidget.minimum() != -100000. ||
+      coordinatesWidget.maximum() != 100000.)
+    {
+    std::cerr << "Bad default ctkCoordinatesWidget values" << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  coordinatesWidget.setDecimals(4); 
+
+  if (coordinatesWidget.decimals() != 4)
+    {
+    std::cerr << "ctkCoordinatesWidget::setDecimals failed" << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  coordinatesWidget.setSingleStep(0.1); 
+
+  if (coordinatesWidget.singleStep() != 0.1)
+    {
+    std::cerr << "ctkCoordinatesWidget::setSingleStep failed" << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  coordinatesWidget.setMinimum(-9999.); 
+
+  if (coordinatesWidget.minimum() != -9999.)
+    {
+    std::cerr << "ctkCoordinatesWidget::setMinimum failed" << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  coordinatesWidget.setMaximum(9999.); 
+
+  if (coordinatesWidget.maximum() != 9999.)
+    {
+    std::cerr << "ctkCoordinatesWidget::setMaximum failed" << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  double const* coordinates = coordinatesWidget.coordinates();
+
+  if (coordinates[0] != 0. ||
+      coordinates[1] != 0. ||
+      coordinates[2] != 0. ||
+      coordinates[3] != 0.)
+    {
+    std::cerr << "ctkCoordinatesWidget::coordinates() failed"
+              << coordinates[0] << " "
+              << coordinates[1] << " "
+              << coordinates[2] << " "
+              << coordinates[3] << " " << std::endl;
+    return EXIT_FAILURE;
+    }
+  
+  if (coordinatesWidget.coordinatesAsString() != "0,0,0,0")
+    {
+    std::cerr << "ctkCoordinatesWidget::coordinatesAsString() failed"
+              << coordinatesWidget.coordinatesAsString().toStdString()
+              << std::endl;
+    return EXIT_FAILURE;
+    }
+  
+  double newCoordinates[4] = {1.0, 10.00012, -541292., 0.4};
+  coordinatesWidget.setCoordinates(newCoordinates);
+  coordinates = coordinatesWidget.coordinates();
+  
+  if (coordinates[0] != 1. ||
+      coordinates[1] != 10.0001 ||
+      coordinates[2] != -9999. ||
+      coordinates[3] != 0.4)
+    {
+    std::cerr << "ctkCoordinatesWidget::coordinates() failed"
+              << coordinates[0] << " "
+              << coordinates[1] << " "
+              << coordinates[2] << " "
+              << coordinates[3] << " " << std::endl;
+    return EXIT_FAILURE;
+    }
+  
+  if (coordinatesWidget.coordinatesAsString() != "1,10.0001,-9999,0.4")
+    {
+    std::cerr << "ctkCoordinatesWidget::coordinatesAsString() failed"
+              << coordinatesWidget.coordinatesAsString().toStdString() << std::endl;
+    return EXIT_FAILURE;
+    }
+  
+  coordinatesWidget.setCoordinatesAsString("1.000000001, -2, 3.01, 40000.01");
+  coordinates = coordinatesWidget.coordinates();
+  if (!qFuzzyCompare(coordinates[0], 1.) ||
+      !qFuzzyCompare(coordinates[1], -2.) ||
+      !qFuzzyCompare(coordinates[2], 3.01) ||
+      !qFuzzyCompare(coordinates[3], 9999.))
+    {
+    std::cerr << "ctkCoordinatesWidget::coordinates() failed: "
+              << coordinates[0] << " " << qFuzzyCompare(coordinates[0], 1.) << ", "
+              << coordinates[1] << " " << qFuzzyCompare(coordinates[1], -2.) << ", "
+              << coordinates[2] << " " << qFuzzyCompare(coordinates[2], 3.01) << ", "
+              << coordinates[3] << " " << qFuzzyCompare(coordinates[3], 9999.) << ", "
+              << std::endl;
+    return EXIT_FAILURE;
+    }
+  
+  if (coordinatesWidget.coordinatesAsString() != "1,-2,3.01,9999")
+    {
+    std::cerr << "ctkCoordinatesWidget::coordinatesAsString() failed"
+              << coordinatesWidget.coordinatesAsString().toStdString() << std::endl;
+    return EXIT_FAILURE;
+    }
+
+  coordinatesWidget.show();
+
+  if (argc < 2 || QString(argv[1]) != "-I" )
+    {
+    QTimer::singleShot(200, &app, SLOT(quit()));
+    }
+  
+  return app.exec();
 }
 

+ 39 - 14
Libs/Widgets/ctkCoordinatesWidget.cpp

@@ -28,9 +28,10 @@
 //------------------------------------------------------------------------------
 ctkCoordinatesWidget::ctkCoordinatesWidget(QWidget* _parent) :QWidget(_parent)
 {
+  this->Decimals = 3;
+  this->SingleStep = 1.;
   this->Minimum = -100000.;
   this->Maximum = 100000.;
-  this->SingleStep = 1.;
   this->Dimension = 3;
   this->Coordinates = new double [this->Dimension];
   
@@ -54,11 +55,12 @@ ctkCoordinatesWidget::~ctkCoordinatesWidget()
 void ctkCoordinatesWidget::addSpinBox()
 {
   QDoubleSpinBox* spinBox = new QDoubleSpinBox(this);
+  spinBox->setDecimals(this->Decimals);
+  spinBox->setSingleStep(this->SingleStep);
   spinBox->setMinimum(this->Minimum);
   spinBox->setMaximum(this->Maximum);
-  spinBox->setSingleStep(this->SingleStep);
   connect( spinBox, SIGNAL(valueChanged(double)), 
-           this, SLOT(coordinateChanged(double)));
+           this, SLOT(updateCoordinate(double)));
   this->layout()->addWidget(spinBox);
 }
 
@@ -96,7 +98,7 @@ void ctkCoordinatesWidget::setDimension(int dim)
 
   this->updateGeometry();
   
-  this->coordinatesChanged();
+  this->updateCoordinates();
 }
 
 //------------------------------------------------------------------------------
@@ -150,6 +152,28 @@ double ctkCoordinatesWidget::maximum() const
 }
 
 //------------------------------------------------------------------------------
+void ctkCoordinatesWidget::setDecimals(int newDecimals)
+{
+  this->Decimals = newDecimals;
+  for (int i = 0; this->layout()->itemAt(i); ++i)
+    {
+    QLayoutItem* item = this->layout()->itemAt(i);
+    QDoubleSpinBox* spinBox = item ? dynamic_cast<QDoubleSpinBox*>(
+      item->widget()) : 0;
+    if (spinBox)
+      {
+      spinBox->setDecimals(newDecimals);
+      }
+    }
+}
+
+//------------------------------------------------------------------------------
+int ctkCoordinatesWidget::decimals() const
+{
+  return this->Decimals;
+}
+
+//------------------------------------------------------------------------------
 void ctkCoordinatesWidget::setSingleStep(double step)
 {
   for (int i = 0; this->layout()->itemAt(i); ++i)
@@ -222,43 +246,44 @@ void ctkCoordinatesWidget::setCoordinates(double* _pos)
       }
     }
   this->blockSignals(blocked);
-  emit valueChanged(this->Coordinates);
+  this->updateCoordinates();
 }
 
 //------------------------------------------------------------------------------
-double* ctkCoordinatesWidget::coordinates()const
+double const * ctkCoordinatesWidget::coordinates()const
 {
   return this->Coordinates;
 }
 
 //------------------------------------------------------------------------------
-void ctkCoordinatesWidget::coordinateChanged(double coordinate)
+void ctkCoordinatesWidget::updateCoordinate(double coordinate)
 {
   for (int i = 0; i < this->Dimension; ++i)
     {
     QLayoutItem* item = this->layout()->itemAt(i);
-    QObject* spinBox = 
-      item ? dynamic_cast<QObject*>(item->widget()) : 0;
+    QDoubleSpinBox* spinBox = 
+      item ? qobject_cast<QDoubleSpinBox*>(item->widget()) : 0;
     if ( spinBox && spinBox == this->sender())
       {
       this->Coordinates[i] = coordinate;
+      break;
       }
     }
-  emit valueChanged(this->Coordinates);
+  emit coordinatesChanged(this->Coordinates);
 }
 
 //------------------------------------------------------------------------------
-void ctkCoordinatesWidget::coordinatesChanged()
+void ctkCoordinatesWidget::updateCoordinates()
 {
   for (int i = 0; i < this->Dimension; ++i)
     {
     QLayoutItem* item = this->layout()->itemAt(i);
-    QSpinBox* spinBox = 
-      item ? dynamic_cast<QSpinBox*>(item->widget()) : 0;
+    QDoubleSpinBox* spinBox = 
+      item ? qobject_cast<QDoubleSpinBox*>(item->widget()) : 0;
     if ( spinBox)
       {
       this->Coordinates[i] = spinBox->value();
       }
     }
-  emit valueChanged(this->Coordinates);
+  emit coordinatesChanged(this->Coordinates);
 }

+ 24 - 7
Libs/Widgets/ctkCoordinatesWidget.h

@@ -34,10 +34,12 @@
 class CTK_WIDGETS_EXPORT ctkCoordinatesWidget : public QWidget
 {
   Q_OBJECT 
+  Q_PROPERTY(int decimals READ decimals WRITE setDecimals)
+  Q_PROPERTY(double singleStep  READ singleStep WRITE setSingleStep STORED false)
   Q_PROPERTY(int Dimension READ dimension WRITE setDimension)
   Q_PROPERTY(double minimum READ minimum WRITE setMinimum)
   Q_PROPERTY(double maximum READ maximum WRITE setMaximum)
-  Q_PROPERTY(double singleStep  READ singleStep WRITE setSingleStep STORED false)
+
   Q_PROPERTY(QString coordinates READ coordinatesAsString WRITE setCoordinatesAsString)
     
 public:
@@ -45,51 +47,66 @@ public:
   virtual ~ctkCoordinatesWidget();
 
   /// 
-  /// Set/Get the dimension of the point (3 by default)
+  /// Set/Get the dimension of the point
+  /// The default dimension is 3
   void setDimension(int dim);
   int dimension() const;
+  
+  /// 
+  /// Set/Get the number of decimals of each coordinate QDoubleSpinBoxes 
+  /// The default single step is 3
+  void setDecimals(int decimals);
+  int decimals() const;
+  
 
   /// 
   /// Set/Get the single step of each coordinate QDoubleSpinBoxes 
+  /// The default single step is 1.
   void setSingleStep(double step);
   double singleStep() const;
 
   /// 
   /// Set/Get the minimum value of each coordinate QDoubleSpinBoxes 
+  /// The default minimum is -100000.
   void setMinimum(double minimum);
   double minimum() const;
 
   /// 
   /// Set/Get the maximum value of each coordinate QDoubleSpinBoxes 
+  /// The default maximum is 100000.
   void setMaximum(double minimum);
   double maximum() const;
 
   /// 
   /// Set/Get the coordinates. Use commas between numbers
+  /// i.e. "0,0.0,0." 
   void setCoordinatesAsString(QString pos);
   QString coordinatesAsString()const;
 
   /// 
   /// Set/Get the coordinates
+  /// The default values are 0.
   void setCoordinates(double* pos);
-  double* coordinates()const;
+  double const * coordinates()const;
 
 signals:
   ///
   /// valueChanged is fired anytime a coordinate is modified, the returned
   /// value is the point coordinates
-  void valueChanged(double* pos);
+  /// TODO: Don't fire the signal if the new values are not changed 
+  void coordinatesChanged(double* pos);
 
 protected slots:
-  void coordinateChanged(double);
-  void coordinatesChanged();
+  void updateCoordinate(double);
+  void updateCoordinates();
 
 protected:
   void addSpinBox();
 
+  int     Decimals;
+  double  SingleStep;
   double  Minimum;
   double  Maximum;
-  double  SingleStep;
   int     Dimension;
   double* Coordinates;
 };