/***************************************************************************
 *   Copyright (C) 2008 by Peter Dahlberg   *
 *   pdahlberg@gmail.com   *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/
#include "graphicsview.h"
//#include <QGLWidget>
#include <QGraphicsItem>
#include <QDebug>
#include <cmath>
#include <QMouseEvent>
#include <QStatusBar>
#include "simulscene.h"
#include <QLocale>


GraphicsView::GraphicsView(QWidget * parent, QStatusBar* statusbar): QGraphicsView(parent) {
	mainWindowStatusBar = statusbar;
	//setMinimumSize(900,700);
	//setDragMode(QGraphicsView::ScrollHandDrag);
	//setRenderHint (QPainter::QPainter::Antialiasing,true);
	//setCacheMode(QGraphicsView::CacheBackground);
	//setTransformationAnchor (QGraphicsView::AnchorUnderMouse);


	//scale(2,2);
	


}

void GraphicsView::drawBackground ( QPainter * painter, const QRectF & rect ) {
	int lineDistance = 20;

	double startX = rect.x();
	double startY = rect.y();
	double endX = rect.x() + rect.width();
	double endY = rect.y() + rect.height();

	QPainterPath currPath;
	int startPaintX = floor(startX/(double)lineDistance)*lineDistance;
	int endPaintX = ceil(endX/(double)lineDistance)*lineDistance;
	for (double i = startPaintX; i<endPaintX; i= i+lineDistance) {
		if (i==0 )continue;
		QPolygonF polygon;
		polygon << QPointF(i,startY) << QPointF(i,endY);
		currPath.addPolygon(polygon);
	}
	int startPaintY = floor(startY/(double)lineDistance)*lineDistance;
	int endPaintY = ceil(endY/(double)lineDistance)*lineDistance;
	for (double i = startPaintY ; i<endPaintY; i= i+lineDistance) {
		if (i==0 )continue;
		QPolygonF polygon;
		polygon << QPointF(startX,i) << QPointF(endX,i);
		currPath.addPolygon(polygon);
	}
	painter->setPen(QPen(Qt::lightGray, 1, Qt::SolidLine));
	painter->drawPath(currPath);

	painter->setPen(QPen(Qt::green, 1, Qt::SolidLine));
	painter->drawLine(startX,0,endX,0);
	painter->drawLine(0,startY,0,endY);

}

void GraphicsView::mouseMoveEvent ( QMouseEvent * e ) {
	QGraphicsView::mouseMoveEvent(e);
	SimulScene* simulScene = dynamic_cast<SimulScene*> (scene());
	if (simulScene != 0 && mainWindowStatusBar !=0) {
		QPointF scenePos = mapToScene(e->pos());
		QString posString;
		posString += "Mausposition: ";
		posString += "x: " + QLocale().toString(scenePos.x(),'g') + " px"+"/";
		posString += QLocale().toString(scenePos.x()*simulScene->getMeterPerPx(),'g') + " m";
		posString += "    y: " + QLocale().toString(scenePos.y(),'g') + " px"+"/";
		posString += QLocale().toString(scenePos.y()*simulScene->getMeterPerPx(),'g') + " m";
		mainWindowStatusBar->showMessage(posString);
	}
}


void GraphicsView::enableOGLViewport() {
	//setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));
}

void GraphicsView::disableOGLViewport() {
	//setViewport(new QWidget(parentWidget()));
}

void GraphicsView::centerOnProbe() {
	SimulScene* simulScene = dynamic_cast<SimulScene*> (scene());
	if (simulScene == 0) return;
	centerOn(simulScene->getProbeChargeItem());
}


GraphicsView::~GraphicsView() {
}


