| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 | /*=========================================================================  Library:   CTK  Copyright (c) Kitware Inc.   All rights reserved.  Distributed under a BSD License. See LICENSE.txt file.  This software is distributed "AS IS" WITHOUT ANY WARRANTY; without even  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the above copyright notice for more information.=========================================================================*/// Qt includes#include <QHBoxLayout>#include <QDoubleSpinBox>// CTK includes#include "ctkCoordinatesWidget.h"//------------------------------------------------------------------------------ctkCoordinatesWidget::ctkCoordinatesWidget(QWidget* _parent) :QWidget(_parent){  this->Minimum = -100000.;  this->Maximum = 100000.;  this->SingleStep = 1.;  this->Dimension = 3;  this->Coordinates = new double [this->Dimension];    QHBoxLayout* hboxLayout = new QHBoxLayout(this);  this->setLayout(hboxLayout);  for (int i = 0; i < this->Dimension; ++i)    {    this->Coordinates[i] = 0.;    this->AddSpinBox();    }  hboxLayout->setContentsMargins(0, 0, 0, 0);}//------------------------------------------------------------------------------ctkCoordinatesWidget::~ctkCoordinatesWidget(){  delete [] this->Coordinates;}//------------------------------------------------------------------------------void ctkCoordinatesWidget::AddSpinBox(){  QDoubleSpinBox* spinBox = new QDoubleSpinBox(this);  spinBox->setMinimum(this->Minimum);  spinBox->setMaximum(this->Maximum);  spinBox->setSingleStep(this->SingleStep);  connect( spinBox, SIGNAL(valueChanged(double)),            this, SLOT(coordinateChanged(double)));  this->layout()->addWidget(spinBox);}//------------------------------------------------------------------------------void ctkCoordinatesWidget::setDimension(int dim){  if (dim < 1)    {    return;    }  double* newPos = new double[dim];  if (dim > this->Dimension)    {    memcpy(newPos, this->Coordinates, this->Dimension * sizeof(double));    for (int i = this->Dimension; i < dim; ++i)      {      newPos[i] = 0.;      this->AddSpinBox();      }    }  else    {    memcpy(newPos, this->Coordinates, dim * sizeof(double));    for (int i = this->Dimension - 1 ; i >= dim; --i)      {      QLayoutItem* item = this->layout()->takeAt(i);      QWidget* widget = item ? item->widget() : 0;      delete item;      delete widget;      }    }  delete [] this->Coordinates;  this->Coordinates = newPos;  this->Dimension = dim;  this->updateGeometry();    this->coordinatesChanged();}//------------------------------------------------------------------------------int ctkCoordinatesWidget::dimension() const{  return this->Dimension;}//------------------------------------------------------------------------------void ctkCoordinatesWidget::setMinimum(double min){  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->setMinimum(min);      }    }  this->Minimum = min;}//------------------------------------------------------------------------------double ctkCoordinatesWidget::minimum() const{  return this->Minimum;}//------------------------------------------------------------------------------void ctkCoordinatesWidget::setMaximum(double max){  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->setMaximum(max);      }    }  this->Maximum = max;}//------------------------------------------------------------------------------double ctkCoordinatesWidget::maximum() const{  return this->Maximum;}//------------------------------------------------------------------------------void ctkCoordinatesWidget::setSingleStep(double step){  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->setSingleStep(step);      }    }  this->SingleStep = step;}//------------------------------------------------------------------------------double ctkCoordinatesWidget::singleStep() const{  return this->SingleStep;}//------------------------------------------------------------------------------void ctkCoordinatesWidget::setCoordinatesAsString(QString _pos){  QStringList posList = _pos.split(',');  if (posList.count() != this->Dimension)    {    return;    }  double* newPos = new double[this->Dimension];  for (int i = 0; i < this->Dimension; ++i)    {    newPos[i] = posList[i].toDouble();    }  this->setCoordinates(newPos);  delete [] newPos;}//------------------------------------------------------------------------------QString ctkCoordinatesWidget::coordinatesAsString()const{  QString res;  for (int i = 0; i < this->Dimension; ++i)    {    if (i != 0)      {      res += ",";      }    res += QString::number(this->Coordinates[i]);    }  return res;}//------------------------------------------------------------------------------void ctkCoordinatesWidget::setCoordinates(double* _pos){  for (int i = 0; i < this->Dimension; ++i)    {    this->Coordinates[i] = _pos[i];    }  bool blocked = this->blockSignals(true);  for (int i = 0; i < this->Dimension; ++i)    {    QLayoutItem* item = this->layout()->itemAt(i);    QDoubleSpinBox* spinBox =       item ? dynamic_cast<QDoubleSpinBox*>(item->widget()) : 0;    if (spinBox)      {      spinBox->setValue(this->Coordinates[i]);      }    }  this->blockSignals(blocked);  emit valueChanged(this->Coordinates);}//------------------------------------------------------------------------------double* ctkCoordinatesWidget::coordinates()const{  return this->Coordinates;}//------------------------------------------------------------------------------void ctkCoordinatesWidget::coordinateChanged(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;    if ( spinBox && spinBox == this->sender())      {      this->Coordinates[i] = coordinate;      }    }  emit valueChanged(this->Coordinates);}//------------------------------------------------------------------------------void ctkCoordinatesWidget::coordinatesChanged(){  for (int i = 0; i < this->Dimension; ++i)    {    QLayoutItem* item = this->layout()->itemAt(i);    QSpinBox* spinBox =       item ? dynamic_cast<QSpinBox*>(item->widget()) : 0;    if ( spinBox)      {      this->Coordinates[i] = spinBox->value();      }    }  emit valueChanged(this->Coordinates);}
 |