//
// qtpendel.cc
//
//  - Hubert Feyrer <hubert@feyrer.de>
// 

#include "qtpendel.h"
#include "qtpendel-puls.h"

#include "qtpendel.moc"

/*************************************************************************/
QtPendel::QtPendel(QWidget *parent)
{
	box = new QVBox(parent?parent:this);

	title = new QLabel("Fuzzy-Pendel", box);
	title->setAlignment(AlignCenter);
	title->setFont(QFont("Helvetica", 24, QFont::Bold));	
	
	bumpbox = new QHButtonGroup(box);
	bumpleft = new QPushButton("<", bumpbox);
	bumpleft->setSizePolicy(sizepol_fe);
	pendelmap = new QLabel(bumpbox);
	pendelbuf = new QPixmap(pendelmap->width(), pendelmap->height());
	pendelbuf->fill();
	pendelmap->setPixmap(*pendelbuf);
	pendelmap->setSizePolicy(sizepol_ee);
	bumpright = new QPushButton(">", bumpbox);
	bumpright->setSizePolicy(sizepol_fe);

	winkelbox = new QHButtonGroup(box);
	winkelmap = new QLabel(winkelbox);
	winkelbuf = new QPixmap(winkelmap->width(), winkelmap->height());
	winkelbuf->fill();
	winkelmap->setPixmap(*winkelbuf);
	winkelmap->setSizePolicy(sizepol_ee);

	tabbox = new QHButtonGroup(box);
	
	alpha_tab = new QtPendelTab("alpha", tabbox);
	alphaDot_tab = new QtPendelTab("alphaDot", tabbox);
	a_tab = new QtPendelTab("a", tabbox);

	buttonbox = new QHButtonGroup(box);
	(new QLabel("", buttonbox)) -> setSizePolicy(sizepol_ef);	// filler
	start = new QPushButton("St&art",buttonbox); start -> setSizePolicy(sizepol_ef);
	(new QLabel("", buttonbox)) -> setSizePolicy(sizepol_ef);	// filler
	step = new QPushButton("St&ep",buttonbox); step -> setSizePolicy(sizepol_ef);
	(new QLabel("", buttonbox)) -> setSizePolicy(sizepol_ef);	// filler
	stop = new QPushButton("St&op",buttonbox); stop -> setSizePolicy(sizepol_ef);
	(new QLabel("", buttonbox)) -> setSizePolicy(sizepol_ef);	// filler
	stop->setDisabled(true);

	data = new QtPendelData();
	data->init();

	herz = new QtPendelPuls(this);

	QObject::connect(start, SIGNAL(clicked()), this, SLOT(start_slot()));
	QObject::connect(stop, SIGNAL(clicked()), this, SLOT(stop_slot()));
	QObject::connect(step, SIGNAL(clicked()), this, SLOT(step_slot()));
	QObject::connect(bumpleft, SIGNAL(clicked()), this, SLOT(bumpleft_slot()));
	QObject::connect(bumpright, SIGNAL(clicked()), this, SLOT(bumpright_slot()));
}

/*************************************************************************/
void QtPendel::start_slot(void)
{
	start->setDisabled(true);
	stop->setEnabled(true);
	step->setDisabled(true);
	
	herz->start();
}

/*************************************************************************/
void QtPendel::stop_slot(void)
{
	start->setEnabled(true);
	stop->setDisabled(true);
	step->setEnabled(true);
	
	herz->stop();
}

/*************************************************************************/
void QtPendel::step_slot(void)
{
	herz->step();
}

/*************************************************************************/
void QtPendel::bumpleft_slot(void)
{
	data->bumpleft();

	step_slot();
}

/*************************************************************************/
void QtPendel::bumpright_slot(void)
{
	data->bumpright();

	step_slot();
}

/*************************************************************************/
void QtPendel::resizeEvent(QResizeEvent *e)
{
	delete winkelbuf;
	delete pendelbuf;

	alpha_tab->resize(e->size());
	alphaDot_tab->resize(e->size());
	a_tab->resize(e->size());

	pendelbuf = new QPixmap(pendelmap->width(), pendelmap->height());
	pendelbuf->fill();
	pendelmap->setPixmap(*pendelbuf);
	winkelbuf = new QPixmap(winkelmap->width(), winkelmap->height());
	winkelbuf->fill();
	winkelmap->setPixmap(*winkelbuf);
}

/*************************************************************************/
void QtPendel::update_pendel(void)
{
	QPainter p;
	int h, w, x;

	h = pendelmap->height();
	w = pendelmap->width();

	pendelbuf->fill();

	p.begin(pendelbuf);
	p.setPen(black);
	p.drawLine(0,h-1, w, h-1);

	x = int(w/2.0 + 100.0*data->xpos);
	if (x < 0) {
		data->xpos += w/100.0;
		x = int(w/2.0 + 100.0*data->xpos);
	}
	if (x > w) {
		data->xpos -= w/100.0;
		x = int(w/2.0 + 100.0*data->xpos);
	}
	
	p.drawLine(x, h-2,
		   x - 0.95*h*cos(data->alpha.currentvalue), h-1 - 0.95*h*sin(data->alpha.currentvalue));
	
	p.end();
	bitBlt(pendelmap, 0, 0, pendelbuf);
}

/*************************************************************************/
void QtPendel::update_winkel(void)
{
	QPainter p;
	int h, w, x;
	static double lasty=0;
	static int xpos=0;		// X-Position
	double y;

	h = winkelmap->height();
	w = winkelmap->width();

	if (xpos >= w) {
		xpos = 0;
		winkelbuf->fill();
	}

	// Achse
	p.begin(winkelbuf);
	p.setPen(black);
	p.drawLine(0,h/2, w, h/2);

	y = (data->alpha.currentvalue - data->pi/2.0) / data->pi * h;
	p.drawLine(xpos-1, h/2 - lasty, 
		   xpos, h/2 - y);
	lasty = y;

	xpos++;
	
	p.end();
	bitBlt(winkelmap, 0, 0, winkelbuf);
}

