00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "quaternionpropertywidgetitem.h"
00023
00024 #include <QHBoxLayout>
00025 #include <QLabel>
00026 #include <QDoubleSpinBox>
00027 #include <QtGui/QQuaternion>
00028 #include <cfloat>
00029 #include <cmath>
00030 #include <core/gluonvarianttypes.h>
00031
00032 REGISTER_PROPERTYWIDGETITEM( GluonCreator, QuaternionPropertyWidgetItem )
00033
00034 using namespace GluonCreator;
00035
00036 class QuaternionPropertyWidgetItem::QuaternionPropertyWidgetItemPrivate
00037 {
00038 public:
00039 QuaternionPropertyWidgetItemPrivate() { }
00040
00041 QDoubleSpinBox* x;
00042 QDoubleSpinBox* y;
00043 QDoubleSpinBox* z;
00044 QDoubleSpinBox* angle;
00045
00046 QQuaternion value;
00047 };
00048
00049 QuaternionPropertyWidgetItem::QuaternionPropertyWidgetItem( QWidget* parent, Qt::WindowFlags f ): PropertyWidgetItem( parent, f )
00050 {
00051 d = new QuaternionPropertyWidgetItemPrivate;
00052
00053 QWidget* base = new QWidget( this );
00054 QVBoxLayout* layout = new QVBoxLayout( base );
00055 layout->setSpacing( 0 );
00056 base->setLayout( layout );
00057
00058 QHBoxLayout* vectorLayout = new QHBoxLayout();
00059 layout->addLayout( vectorLayout );
00060
00061 d->x = new QDoubleSpinBox( this );
00062 d->x->setPrefix( "X: " );
00063 d->x->setRange( 0, 1 );
00064 vectorLayout->addWidget( d->x );
00065 connect( d->x, SIGNAL( valueChanged( double ) ), this, SLOT( valueChanged( double ) ) );
00066
00067 d->y = new QDoubleSpinBox( this );
00068 d->y->setPrefix( "Y: " );
00069 d->y->setRange( 0, 1 );
00070 vectorLayout->addWidget( d->y );
00071 connect( d->y, SIGNAL( valueChanged( double ) ), this, SLOT( valueChanged( double ) ) );
00072
00073 d->z = new QDoubleSpinBox( this );
00074 d->z->setPrefix( "Z: " );
00075 d->z->setRange( 0, 1 );
00076 vectorLayout->addWidget( d->z );
00077 connect( d->z, SIGNAL( valueChanged( double ) ), this, SLOT( valueChanged( double ) ) );
00078
00079 d->angle = new QDoubleSpinBox( this );
00080 d->angle->setPrefix( "Angle: " );
00081 d->angle->setRange( -FLT_MAX, FLT_MAX );
00082 layout->addWidget( d->angle );
00083 connect( d->angle, SIGNAL( valueChanged( double ) ), this, SLOT( valueChanged( double ) ) );
00084
00085 setEditWidget( base );
00086 }
00087
00088 QuaternionPropertyWidgetItem::~QuaternionPropertyWidgetItem()
00089 {
00090 delete d;
00091 }
00092
00093 QStringList
00094 QuaternionPropertyWidgetItem::supportedDataTypes() const
00095 {
00096 QStringList supportedTypes;
00097 supportedTypes.append( "QQuaternion" );
00098 return supportedTypes;
00099 }
00100
00101 PropertyWidgetItem*
00102 QuaternionPropertyWidgetItem::instantiate()
00103 {
00104 return new QuaternionPropertyWidgetItem();
00105 }
00106
00107 void QuaternionPropertyWidgetItem::setEditValue( const QVariant& value )
00108 {
00109 d->value = value.value<QQuaternion>();
00110
00111 d->x->setValue( d->value.x() * sqrt( 1 - d->value.scalar() * d->value.scalar() ) );
00112 d->y->setValue( d->value.y() * sqrt( 1 - d->value.scalar() * d->value.scalar() ) );
00113 d->z->setValue( d->value.z() * sqrt( 1 - d->value.scalar() * d->value.scalar() ) );
00114
00115 d->angle->setValue(( 2 * acos( d->value.scalar() ) ) *( 180 / M_PI ) );
00116 }
00117
00118 void QuaternionPropertyWidgetItem::valueChanged( QVariant value )
00119 {
00120 valueChanged( value.toDouble() );
00121 }
00122
00123 void QuaternionPropertyWidgetItem::valueChanged( double value )
00124 {
00125 Q_UNUSED( value )
00126 d->value = QQuaternion::fromAxisAndAngle( d->x->value(), d->y->value(), d->z->value(), d->angle->value() );
00127 PropertyWidgetItem::valueChanged( d->value );
00128 }
00129
00130