/*
QtWagon: a project about 3D objects.
Science and technology promotion license applied. Third party license automatically cascaded.
Zhikai Wang/ www.heteroclinic.net 2013
You can do anything with this file or any file(s) published as part QtWagon project, given this header is kept.
*/
//#include <QGLWidget>
//#include <QWidget>
//#include <QtGui>
//#include "glwidget.h"
//#include <GL/glut.h>
//#include <QGLWidget>
//#include <QWidget>
//#include <QtGui>
#include "qtMovingObject.h"

void qtMovingObject::emitGLWidgetOrders(int op,float val) {
	//std::cout<<"qtMovingObject::emitGLWidgetOrders(int op,float val)"<<std::endl;
		emit
		 sigGLWidgetSingleton3DMove(op,val);
};
void  qtMovingObject::dialROLL_valueChanged(int nval) {
	//std::cout<<"qtMovingObject::dialROLL_valueChanged(int nval)"<<std::endl;
	if (NULL == mvopt ) {
		//std::cout<<"qtMovingObject::dialROLL_valueChanged(int nval)  NULL == mvopt "<<std::endl;
		return;
	}
	//std::cout<<"qtMovingObject::dialROLL_valueChanged(int nval)"<<std::endl;
	GLfloat delta =RYPDelta * dialDerivative(nval,valDialRollPrev,dialROLL->maximum());
	//emit
	//	//sig3dMoveOrders(enum3dops::roll,delta);
	//	//sig3dMoveOrderspt(enum3dops::roll,delta,this->mvopt);// wagon forward backward by delta
	//	sigQtMovObjpt3dOrders(enum3dops::roll,delta,this);
			//connect(this,SIGNAL(sigGLWidgetSingleton3DMove(int,float,qtMovingObject *)),glwidgetSingleton::getInstance(),SLOT(slotQtMovobj3DOrders(int,float,qtMovingObject *)));
	//emit
	//	sigGLWidgetSingleton3DMove(enum3dops::roll,delta);
	emitGLWidgetOrders(enum3dops::roll,delta);
}
void qtMovingObject::buttonOneShotPitch_clicked() {
	//if (NULL == mvopt )
	//	return;
	//GLfloat delta =RYPDelta * dialDerivative(nval,valDialRollPrev,dialROLL->maximum());
	//emit
	//	//sig3dMoveOrders(enum3dops::roll,delta);
	//	//sig3dMoveOrderspt(enum3dops::roll,delta,this->mvopt);// wagon forward backward by delta
	//	sigQtMovObjpt3dOrders(enum3dops::roll,delta,this);


	if (NULL == mvopt)
		return;
	//connect(this,SIGNAL(sigGLWidgetSingleton3DMove(int,float,qtMovingObject *)),glwidgetSingleton::getInstance(),SLOT(slotQtMovobj3DOrders(int,float,qtMovingObject *)));
	//emit
	//	//sigQtMovObjpt3dOrders(enum3dops::pitch,RYPDelta,this);
	//	sigGLWidgetSingleton3DMove(enum3dops::pitch,RYPDelta);
	emitGLWidgetOrders(enum3dops::pitch,RYPDelta);
};
void qtMovingObject::buttonOneShotYaw_clicked() {
	//if (NULL == mvopt )
	//	return;
	//GLfloat delta =RYPDelta * dialDerivative(nval,valDialRollPrev,dialROLL->maximum());
	//emit
	//	//sig3dMoveOrders(enum3dops::roll,delta);
	//	//sig3dMoveOrderspt(enum3dops::roll,delta,this->mvopt);// wagon forward backward by delta
	//	sigQtMovObjpt3dOrders(enum3dops::roll,delta,this);


	if (NULL == mvopt)
		return;
	//connect(this,sigGLWidgetSingleton3DMove,glwidgetSingleton::getInstance(),slotQtMovobj3DOrders);
	//connect(this,SIGNAL(sigGLWidgetSingleton3DMove(int,float,qtMovingObject *)),glwidgetSingleton::getInstance(),SLOT(slotQtMovobj3DOrders(int,float,qtMovingObject *)));

	//emit
	//	//sigQtMovObjpt3dOrders(enum3dops::yaw,RYPDelta,this);
	//	//sigGLWidgetSingleton3DMove(enum3dops::yaw,RYPDelta,this);
	//	sigGLWidgetSingleton3DMove(enum3dops::yaw,RYPDelta);
	emitGLWidgetOrders(enum3dops::yaw,RYPDelta);
};

void qtMovingObject::buttonOneShotRoll_clicked() {
	//if (NULL == mvopt )
	//	return;
	//GLfloat delta =RYPDelta * dialDerivative(nval,valDialRollPrev,dialROLL->maximum());
	//emit
	//	//sig3dMoveOrders(enum3dops::roll,delta);
	//	//sig3dMoveOrderspt(enum3dops::roll,delta,this->mvopt);// wagon forward backward by delta
	//	sigQtMovObjpt3dOrders(enum3dops::roll,delta,this);


	//if (NULL == mvopt)
	//	return;
	//connect(this,sigGLWidgetSingleton3DMove,glwidgetSingleton::getInstance(),slotQtMovobj3DOrders);
	//emit
	//	//sigQtMovObjpt3dOrders(enum3dops::roll,RYPDelta,this);
	//sigGLWidgetSingleton3DMove(enum3dops::roll,RYPDelta,this);
	if (NULL == mvopt)
		return;
	////connect(this,SIGNAL(sigGLWidgetSingleton3DMove(int,float,qtMovingObject *)),glwidgetSingleton::getInstance(),SLOT(slotQtMovobj3DOrders(int,float,qtMovingObject *)));
	//emit
	//	sigGLWidgetSingleton3DMove(enum3dops::roll,RYPDelta);
	emitGLWidgetOrders(enum3dops::roll,RYPDelta);

};

void qtMovingObject::buttonOneShotFB_clicked() {
	//bool OK = false;
	//double val =editRYPDelta->text().toDouble(&OK);   // val == 1234.56 
	//if (OK ) {
	//	RYPDelta = val;
	//} else {
	//	editRYPDelta->setText(QString("%1").arg( formatDouble(  RYPDelta ).c_str()) );
	//	this->update();
	//};
	//if (NULL == mvopt)
	//	return;
	////GLfloat delta = FBDelta * dialDerivative(nval,valDialFBPrev, dialFB->maximum());
	////std::cout<<"qtMovingObject::dialFB_valueChanged(int nval)"<<std::endl;
	//connect(this,sigGLWidgetSingleton3DMove,glwidgetSingleton::getInstance(),slotQtMovobj3DOrders);
	//emit
	//	//sig3dMoveOrders(enum3dops::wfb,delta);// wagon forward backward by delta
	//	//sig3dMoveOrderspt(enum3dops::wfb,delta,this->mvopt);// wagon forward backward by delta
	//	//sigQtMovObjpt3dOrders(enum3dops::wfb,FBDelta,this);
	//sigGLWidgetSingleton3DMove(enum3dops::wfb,FBDelta,this);
	if (NULL == mvopt)
		return;
	////connect(this,SIGNAL(sigGLWidgetSingleton3DMove(int,float,qtMovingObject *)),glwidgetSingleton::getInstance(),SLOT(slotQtMovobj3DOrders(int,float,qtMovingObject *)));
	//emit
	//	sigGLWidgetSingleton3DMove(enum3dops::wfb,FBDelta);
	emitGLWidgetOrders(enum3dops::wfb,FBDelta);

};

//qtMovingObject::qtMovingObject(QWidget * parent = 0)
//	:
//QWidget(parent)
qtMovingObject::qtMovingObject()
	:
QWidget(0)
{

	//glwpt =  NULL;
	mvopt = NULL;

	myBox = new QGroupBox(QObject::tr("Moving object panel"));
	myLayout = new QVBoxLayout;

	editDialFBDelta = createDoubleEditLine();
	dialFB = createDial();

	//QLineEdit * editGlbPosx, * editGlbPosy, * editGlbPosz;
	QGroupBox * boxGlobalPos = new QGroupBox(tr("Forward/backward delta, RYP delta(degree), position(x,y,z)"));
	//QHBoxLayout * layoutGlobalPos = new QHBoxLayout;
	QGridLayout * layoutGlobalPos = new QGridLayout;
	boxGlobalPos->setLayout(layoutGlobalPos);
	editGlbPosx = createDoubleEditLine();
	editGlbPosy = createDoubleEditLine();
	editGlbPosz = createDoubleEditLine();
	editRYPDelta = createDoubleEditLine();

	connect(editGlbPosx, SIGNAL(editingFinished()), this, SLOT(editGlbPosx_editingFinished())); 
	connect(editGlbPosy, SIGNAL(editingFinished()), this, SLOT(editGlbPosy_editingFinished()));
	connect(editGlbPosz, SIGNAL(editingFinished()), this, SLOT(editGlbPosz_editingFinished()));
	connect(editRYPDelta, SIGNAL(editingFinished()), this, SLOT(editRYPDelta_editingFinished()));

	//QPushButton * buttonOneShotFB;
	//QPushButton * buttonOneShotRoll;
	//QPushButton * buttonOneShotYaw;
	//QPushButton * buttonOneShotPitch;
	buttonOneShotFB = new QPushButton   (tr("One  shot  f/b"));
	buttonOneShotRoll = new QPushButton (tr("One  shot roll"));
	buttonOneShotYaw = new QPushButton  (tr("One  shot  yaw"));
	buttonOneShotPitch = new QPushButton(tr("One shot pitch"));

	connect(buttonOneShotFB, SIGNAL(clicked()), this, SLOT(buttonOneShotFB_clicked()));
	connect(buttonOneShotRoll, SIGNAL(clicked()), this, SLOT(buttonOneShotRoll_clicked()));
	connect(buttonOneShotYaw, SIGNAL(clicked()), this, SLOT(buttonOneShotYaw_clicked()));
	connect(buttonOneShotPitch, SIGNAL(clicked()), this, SLOT(buttonOneShotPitch_clicked()));


	//layoutGlobalPos->addWidget(new QLabel(tr("Forward/backward:")));
	//layoutGlobalPos->addWidget(new QLabel(tr("Delta:")));
	layoutGlobalPos->addWidget(editDialFBDelta,0,0);
	layoutGlobalPos->addWidget(editRYPDelta,0,1);
	layoutGlobalPos->addWidget(buttonOneShotFB,0,2);
	//layoutGlobalPos->addWidget(new QLabel(tr("Position (x,y,z):")));
	layoutGlobalPos->addWidget(editGlbPosx,1,0);
	layoutGlobalPos->addWidget(editGlbPosy,1,1);
	layoutGlobalPos->addWidget(editGlbPosz,1,2);

	layoutGlobalPos->addWidget(buttonOneShotRoll,2,0);
	layoutGlobalPos->addWidget(buttonOneShotYaw,2,1);
	layoutGlobalPos->addWidget(buttonOneShotPitch,2,2);

	//GLfloat  RYPDelta;
	//QLineEdit * editRYPDelta;
	//QGroupBox * boxRYPDelta = new QGroupBox;
	//QHBoxLayout * layoutRYPDelta = new QHBoxLayout;
	//boxRYPDelta->setLayout(layoutRYPDelta);
	//editRYPDelta = createDoubleEditLine();
	//connect(editRYPDelta, SIGNAL(editingFinished()), this, SLOT(editRYPDelta_editingFinished()));
	//layoutRYPDelta->addWidget(new QLabel(tr("RYP delta:")));
	//layoutRYPDelta->addWidget(editRYPDelta);
	//myLayout->addWidget(boxRYPDelta);


	myLayout->addWidget(boxGlobalPos);

	connect(editDialFBDelta, SIGNAL(editingFinished ()), this, SLOT(editDialFBDelta_editingFinished ()));

	//myLayout->addWidget(new QLabel(tr("Dials for roll, yaw and pitch:")));
	//QDial  * dialYAW;
	//QDial  * dialROLL;
	//QDial  * dialPITCH;
	QGroupBox * boxRYP = new QGroupBox(tr("Dials for forward/backward, roll, yaw and pitch:"));
	QGridLayout * layoutRYP = new QGridLayout;
	boxRYP->setLayout(layoutRYP);
	dialYAW = createDial();
	dialROLL = createDial();
	dialPITCH = createDial();
	layoutRYP->addWidget(dialFB,0,0);
	layoutRYP->addWidget(dialROLL,0,1);
	layoutRYP->addWidget(dialYAW,1,0);
	layoutRYP->addWidget(dialPITCH,1,1);
	myLayout->addWidget(boxRYP);


	QGroupBox * boxVectors = new QGroupBox("Vectors: front,up,left.");
	QGridLayout *  layoutVectors = new QGridLayout;
	boxVectors->setLayout( layoutVectors);

	editFrontx = new QLabel(QString("%1").arg(  formatDouble(  0.0 ).c_str() ));
	editFronty = new QLabel(QString("%1").arg(  formatDouble(  0.0 ).c_str() ));
	editFrontz = new QLabel(QString("%1").arg(  formatDouble(  0.0 ).c_str() ));
	layoutVectors->addWidget( editFrontx,0,0);
	layoutVectors->addWidget( editFronty,0,1);
	layoutVectors->addWidget( editFrontz,0,2);

	editUpx = new QLabel(QString("%1").arg( formatDouble(0.0).c_str()) );
	editUpy = new QLabel(QString("%1").arg( formatDouble(0.0).c_str()) );
	editUpz = new QLabel(QString("%1").arg( formatDouble(0.0).c_str()) );
	
	layoutVectors->addWidget(editUpx,1,0);
	layoutVectors->addWidget(editUpy,1,1);
	layoutVectors->addWidget(editUpz,1,2);

	editLeftx = new QLabel(QString("%1").arg( formatDouble( 0.0 ).c_str()) );
	editLefty =new QLabel(QString("%1").arg(  formatDouble(  0.0 ).c_str()) );
	editLeftz = new QLabel(QString("%1").arg(  formatDouble(  0.0 ).c_str()) );

	layoutVectors->addWidget( editLeftx,2,0);
	layoutVectors->addWidget( editLefty,2,1);
	layoutVectors->addWidget( editLeftz,2,2);



	myLayout->addWidget(boxVectors);

	////QLineEdit *  editLocalPosx,* editLocalPosy,* editLocalPosz;
	////these values are not editable
	//QGroupBox * boxLocalPos = new QGroupBox;
	//QHBoxLayout *  layoutLocalPos = new QHBoxLayout;
	//boxLocalPos->setLayout( layoutLocalPos);

	//editUpx = new QLabel(QString("%1").arg( formatDouble(0.0).c_str()) );
	//editUpy = new QLabel(QString("%1").arg( formatDouble(0.0).c_str()) );
	//editUpz = new QLabel(QString("%1").arg( formatDouble(0.0).c_str()) );
	//layoutLocalPos->addWidget(new QLabel(tr      ("Up   vecotor:")));
	//layoutLocalPos->addWidget(editUpx);
	//layoutLocalPos->addWidget(editUpy);
	//layoutLocalPos->addWidget(editUpz);
	//myLayout->addWidget( boxLocalPos);


	////QLineEdit *  editLeftx,* editLefty,* editLeftz;//these values are not editable
	//QGroupBox * boxLeft = new QGroupBox;
	//QHBoxLayout * layoutLeft  = new QHBoxLayout;
	//boxLeft->setLayout( layoutLeft);
	//editLeftx = new QLabel(QString("%1").arg( formatDouble( 0.0 ).c_str()) );
	//editLefty =new QLabel(QString("%1").arg(  formatDouble(  0.0 ).c_str()) );
	//editLeftz = new QLabel(QString("%1").arg(  formatDouble(  0.0 ).c_str()) );

	//layoutLeft->addWidget(new QLabel(tr("Left  vecotor:")));
	//layoutLeft->addWidget( editLeftx);
	//layoutLeft->addWidget( editLefty);
	//layoutLeft->addWidget( editLeftz);

	//editFrontx = new QLabel(QString("%1").arg(  formatDouble(  0.0 ).c_str() ));
	//editFronty = new QLabel(QString("%1").arg(  formatDouble(  0.0 ).c_str() ));
	//editFrontz = new QLabel(QString("%1").arg(  formatDouble(  0.0 ).c_str() ));
	//layoutLeft->addWidget(new QLabel(tr("Front vecotor:")));
	//layoutLeft->addWidget( editFrontx);
	//layoutLeft->addWidget( editFronty);
	//layoutLeft->addWidget( editFrontz);
	//myLayout->addWidget( boxLeft);// no connections

	setControlsDefaultValues();
	myBox->setLayout(myLayout);
	setConnections();// set class connection only
};
QLineEdit *  qtMovingObject::createDoubleEditLine() {
	QLineEdit * tmp = new QLineEdit;
	tmp->setValidator(new QDoubleValidator(tmp));
	return tmp;
}
QDial  * qtMovingObject::createDial(bool on) {
	QDial  *  tdial = new QDial;
	tdial->setFocusPolicy(Qt::StrongFocus);
	tdial->setMinimum(0);//int
	tdial->setMaximum(60);
	tdial->setWrapping ( on ) ;
	return tdial;
}
void qtMovingObject::editGlbPosx_editingFinished() {
	bool OK = false;
	double val =editGlbPosx->text().toDouble(&OK);   // val == 1234.56 
	if (OK ) {
		if (NULL != mvopt )  {
			mathPoint<GLfloat> pos = mvopt->getPosition();
			mathPoint<GLfloat> npos = mathPoint<GLfloat>(val,pos.gety(),pos.getz()) ;
			//mvopt->setPosition(npos);
			//connect(this,sigGLWidgetSingletonUpdateGL,glwidgetSingleton::getInstance(),slotQtMovobj3DOrders);
			//emit
			//	sigUpdateGL();
			//connect(this,SIGNAL(sigGLWidgetSingletonUpdateGL()),glwidgetSingleton::getInstance(),				SLOT(updateGL()) );
			emit
				//sigGLWidgetSingletonUpdateGL();
			emitGLWidgetOrders(enum3dops::global_positionx,val);

			//setControls();
		} else {
			setControlsDefaultValues(1);
		}
	} else {
		if (NULL != mvopt )  {
			setControls();
		} else {
			setControlsDefaultValues(1);
		}
	};
};
void qtMovingObject::editGlbPosy_editingFinished() {
	bool OK = false;
	double val =editGlbPosy->text().toDouble(&OK);   // val == 1234.56 
	if (OK ) {
		if (NULL != mvopt )  {
			mathPoint<GLfloat> pos = mvopt->getPosition();
			mathPoint<GLfloat> npos = mathPoint<GLfloat>(pos.getx(),val,pos.getz()) ;
			//mvopt->setPosition(npos);
			//emit
			//	sigUpdateGL();
			//connect(this,SIGNAL(sigGLWidgetSingletonUpdateGL()),glwidgetSingleton::getInstance(),				SLOT(updateGL()) );
			emit
				//sigGLWidgetSingletonUpdateGL();
				//emitGLWidgetOrders(enum3dops::updateGLonly,1.0f);
				emitGLWidgetOrders(enum3dops::global_positiony,val);
			//setControls();
		} else {
			setControlsDefaultValues(1);
		}
	} else {
		if (NULL != mvopt )  {
			setControls();
		} else {
			setControlsDefaultValues(1);
		}
	};
};
void qtMovingObject::editGlbPosz_editingFinished() {
	bool OK = false;
	double val =editGlbPosz->text().toDouble(&OK);   // val == 1234.56 
	if (OK ) {
		if (NULL != mvopt )  {
			mathPoint<GLfloat> pos = mvopt->getPosition();
			mathPoint<GLfloat> npos = mathPoint<GLfloat>(pos.getx(),pos.gety(),val) ;
			//mvopt->setPosition(npos);
			//emit
			//	sigUpdateGL();
			//connect(this,SIGNAL(sigGLWidgetSingletonUpdateGL()),glwidgetSingleton::getInstance(),				SLOT(updateGL()) );
			emit
				//sigGLWidgetSingletonUpdateGL();
				//emitGLWidgetOrders(enum3dops::updateGLonly,1.0f);
				emitGLWidgetOrders(enum3dops::global_positionz,val);
			//setControls();

		} else {
			setControlsDefaultValues(1);
		}
	} else {
		if (NULL != mvopt)  {
			setControls();
		} else {
			setControlsDefaultValues(1);
		}
	};
};


void qtMovingObject::setControlsDefaultValues(int inited ) {
	//void qtMovingObject::setControlsDefaultValues(int inited = 0) {// default define only in the header
	if (0 == inited) {
		FBDelta = 0.01f;
		editDialFBDelta->setText( QString("%1").arg(formatDouble(FBDelta ).c_str() ) );
	}

	//glbPosx_f  = 0.0f,glbPosy_f= 0.0f,glbPosz_f= 0.0f;
	editGlbPosx->setText( QString("%1").arg(  formatDouble( 0.0f).c_str() ) );
	editGlbPosy->setText( QString("%1").arg( formatDouble( 0.0f).c_str() ) );
	editGlbPosz->setText( QString("%1").arg( formatDouble( 0.0f).c_str() ) );

	//GLfloat  RYPDelta;
	//QLineEdit * editRYPDelta;
	if (0 == inited) {
		RYPDelta = 1.0f;
		editRYPDelta->setText( QString("%1").arg( formatDouble( RYPDelta).c_str() ) );
	}

	//QLineEdit *  editUpx,* editUpy,* editUpz; //these values are not editable
	editUpx->setText( QString("%1").arg( formatDouble( 0.0f).c_str() ) );
	editUpy->setText( QString("%1").arg( formatDouble( 0.0f).c_str() ) );
	editUpz->setText( QString("%1").arg( formatDouble( 0.0f).c_str() ) );

	//QLineEdit *  editLeftx,* editLefty,* editLeftz;//these values are not editable
	editLeftx->setText( QString("%1").arg( formatDouble( 0.0f).c_str() ) );
	editLefty->setText( QString("%1").arg( formatDouble( 0.0f).c_str() ) );
	editLeftz->setText( QString("%1").arg(  formatDouble( 0.0f ).c_str() ) );

	//QLineEdit *   editFrontx,* editFronty,* editFrontz; //these values are not editable
	editFrontx->setText( QString("%1").arg( formatDouble( 0.0f).c_str() ) );
	editFronty->setText( QString("%1").arg( formatDouble( 0.0f).c_str() ) );
	editFrontz->setText( QString("%1").arg( formatDouble( 0.0f).c_str() ) );
	if (0 == inited) {
		valDialFBPrev = 0,valDialRollPrev = 0 ,valDialYawPrev= 0,valDialPitchPrev= 0;
	}
}
void qtMovingObject::setControls() {
	if (NULL != mvopt) {
		mathPoint<GLfloat> pos = mvopt->getPosition();

		GLfloat glbPosx_f  = pos.getx(),glbPosy_f= pos.gety(),glbPosz_f= pos.getz();
		editGlbPosx->setText( QString("%1").arg(formatDouble(glbPosx_f).c_str()) );
		editGlbPosy->setText( QString("%1").arg( formatDouble( glbPosy_f).c_str() ) );
		editGlbPosz->setText( QString("%1").arg( formatDouble( glbPosz_f).c_str() ) );

		mathVector<GLfloat> tmpmv =  mvopt->getUpVectorValue() ;
		editUpx->setText( QString("%1").arg( formatDouble( tmpmv.getx()).c_str() ) );
		editUpy->setText( QString("%1").arg( formatDouble( tmpmv.gety()).c_str() ) );
		editUpz->setText( QString("%1").arg( formatDouble( tmpmv.getz()).c_str() ) );

		tmpmv =  mvopt->getLeftVectorValue() ;
		editLeftx->setText( QString("%1").arg( formatDouble( tmpmv.getx()).c_str() ) );
		editLefty->setText( QString("%1").arg( formatDouble( tmpmv.gety()).c_str() ) );
		editLeftz->setText( QString("%1").arg( formatDouble( tmpmv.getz()).c_str() ) );

		tmpmv =  mvopt->getFrontVectorValue() ;
		editFrontx->setText( QString("%1").arg( formatDouble( tmpmv.getx()).c_str() ) );
		editFronty->setText( QString("%1").arg( formatDouble( tmpmv.gety()).c_str() ) );
		editFrontz->setText( QString("%1").arg( formatDouble( tmpmv.getz()).c_str() ) );
	} else {
		setControlsDefaultValues(0 );
	}

};
void qtMovingObject::editDialFBDelta_editingFinished () {
	bool OK = false;
	double val =editDialFBDelta->text().toDouble(&OK);   // val == 1234.56 
	if (OK ) {
		FBDelta = val;
	} else {
		editDialFBDelta->setText(QString("%1").arg( formatDouble( FBDelta).c_str() ) );
		this->update();
	};
};

void qtMovingObject::slotUpdateControlsValueOnly(){
	//setControlsByWagon();
	setControls();
}


void qtMovingObject::editRYPDelta_editingFinished() {
	bool OK = false;
	double val =editRYPDelta->text().toDouble(&OK);   // val == 1234.56 
	if (OK ) {
		RYPDelta = val;
	} else {
		editRYPDelta->setText(QString("%1").arg( formatDouble(  RYPDelta ).c_str()) );
		this->update();
	};
};
qtMovingObject::~ qtMovingObject() {
	//std::cout<<"~ qtwagon()"<<std::endl;
};
void  qtMovingObject::dialFB_valueChanged(int nval) {
	if (NULL == mvopt)
		return;
	GLfloat delta = FBDelta * dialDerivative(nval,valDialFBPrev, dialFB->maximum());
	////std::cout<<"qtMovingObject::dialFB_valueChanged(int nval)"<<std::endl;
	////emit
	////	//sig3dMoveOrders(enum3dops::wfb,delta);// wagon forward backward by delta
	////	//sig3dMoveOrderspt(enum3dops::wfb,delta,this->mvopt);// wagon forward backward by delta
	////	sigQtMovObjpt3dOrders(enum3dops::wfb,delta,this);
	////connect(this,SIGNAL(sigGLWidgetSingleton3DMove(int,float,qtMovingObject *)),glwidgetSingleton::getInstance(),SLOT(slotQtMovobj3DOrders(int,float,qtMovingObject *)));
	//emit
	//	sigGLWidgetSingleton3DMove(enum3dops::wfb,delta);
	emitGLWidgetOrders(enum3dops::wfb,delta);
}
void  qtMovingObject::dialYAW_valueChanged(int nval) {
	if (NULL == mvopt )
		return;
	GLfloat delta =RYPDelta * dialDerivative(nval,valDialYawPrev, dialYAW->maximum());
	////emit
	////	//sig3dMoveOrders(enum3dops::yaw,delta);
	////	//sig3dMoveOrderspt(enum3dops::yaw,delta,this->mvopt);// wagon forward backward by delta
	////	sigQtMovObjpt3dOrders(enum3dops::yaw,delta,this);
	//	//connect(this,SIGNAL(sigGLWidgetSingleton3DMove(int,float,qtMovingObject *)),glwidgetSingleton::getInstance(),SLOT(slotQtMovobj3DOrders(int,float,qtMovingObject *)));
	//emit
	//	sigGLWidgetSingleton3DMove(enum3dops::yaw,delta);
	emitGLWidgetOrders(enum3dops::yaw,delta);

}

void  qtMovingObject::dialPITCH_valueChanged(int nval) {
	if (NULL == mvopt )
		return;
	GLfloat delta =RYPDelta * dialDerivative(nval,valDialPitchPrev,dialPITCH->maximum());
	////emit
	////	//sig3dMoveOrders(enum3dops::pitch,delta);
	////	//	sig3dMoveOrderspt(enum3dops::pitch,delta,this->mvopt);// wagon forward backward by delta
	////	sigQtMovObjpt3dOrders(enum3dops::pitch,delta,this);
	////connect(this,SIGNAL(sigGLWidgetSingleton3DMove(int,float,qtMovingObject *)),glwidgetSingleton::getInstance(),SLOT(slotQtMovobj3DOrders(int,float,qtMovingObject *)));
	//emit
	//	sigGLWidgetSingleton3DMove(enum3dops::pitch,delta);
	emitGLWidgetOrders(enum3dops::pitch,delta);

}
int  qtMovingObject::dialDerivative(int nval,int & prevVal, int max) {
	int derivative = 1;
	if (nval - prevVal > 0) {//maximum()
		if ( abs( nval - prevVal ) >= (max/2) )
			derivative = -1 ;
	}
	else if(nval - prevVal < 0) {
		if ( abs( nval - prevVal ) <= (max/2) )
			derivative = -1  ;
	} 
	else {
		return 0; //do nothing
	}
	prevVal = nval;
	return derivative;
}




QGroupBox * qtMovingObject::getMyBox() {
	//std::cout<<"QGroupBox * qtMovingObject::getMyBox()"<<std::endl;
	return myBox;
};
	//virtual QVBoxLayout *myLayout ;
QVBoxLayout * qtMovingObject::getMyLayout()  {
	return myLayout ;
};

//void qtMovingObject::setGLWidgetPt(GLWidget * nglwpt) {
//	glwpt = nglwpt;
//};
void qtMovingObject::setMovingObjPt(glMovingObject<GLfloat> * n_mvopt) {
	mvopt = n_mvopt;
	setControls();
};

glMovingObjectf * qtMovingObject::getMovingObjPt() {
	return mvopt;
};

void qtMovingObject::setConnections() {
	connect(dialFB, SIGNAL(valueChanged(int)), this, SLOT(dialFB_valueChanged(int)));
	connect(dialYAW, SIGNAL(valueChanged(int)), this, SLOT(dialYAW_valueChanged(int)));
	connect(dialROLL, SIGNAL(valueChanged(int)), this, SLOT(dialROLL_valueChanged(int)));
	connect(dialPITCH, SIGNAL(valueChanged(int)), this, SLOT(dialPITCH_valueChanged(int)));

	//connect(this,SIGNAL(sigGLWidgetSingleton3DMove(int,float,qtMovingObject *)),glwidgetSingleton::getInstance(),SLOT(slotQtMovobj3DOrders(int,float,qtMovingObject *)));
	//connect(this,SIGNAL(sigGLWidgetSingletonUpdateGL()),glwidgetSingleton::getInstance(),SLOT(updateGL()) );

	//connect(this, SIGNAL( sig3dMoveOrderspt(int,float,glMovingObjectf *)), glwpt, SLOT(slotMOV3dMoveOrderspt(int,float,glMovingObjectf *)));
	//connect(this, SIGNAL( sigQtMovObjpt3dOrders(int,float,qtMovingObject *)), glwpt, SLOT(slotQtMovObjpt3dOrders(int,float,qtMovingObject *)));
	//connect(this, SIGNAL( sig3dMoveOrders(int,float)), glwpt, SLOT(slotMOV3dMoveOrders(int,float)));
	//connect(this, SIGNAL(sigUpdateGL()), glwpt, SLOT(updateGL()));
};