/***************************************************************************
                          testplot_widget.cpp  -  description
                             -------------------
    begin                : Thu Oct 26 2006
    copyright            : (C) 2006 by Jason Harris
    email                : kstars@30doradus.org
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   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.                                   *
 *                                                                         *
 ***************************************************************************/

#include <math.h>
#include <QtGui/QComboBox>
#include <QtGui/QBoxLayout>
#include <QtGui/QPen>
#include <kdebug.h>

#include "kplotwidget.h"
#include "kplotobject.h"
#include "kplotaxis.h"
#include "testplot_widget.h"

TestPlot::TestPlot( QWidget *p ) : KMainWindow( p ), po1(0), po2(0) {
	QWidget *w = new QWidget(this);
	vlay = new QVBoxLayout(w);

	PlotSelector = new QComboBox( w );
	PlotSelector->addItem( "Points plot" );
	PlotSelector->addItem( "Lines plot" );
	PlotSelector->addItem( "Bars plot" );
	PlotSelector->addItem( "Points plot with labels" );
	PlotSelector->addItem( "Points, lines and bars" );
	PlotSelector->addItem( "Points, lines and bars with labels" );

	plot = new KPlotWidget( w );
	plot->setMinimumSize( 400,400 );
	plot->setAntialiasing( true );
	vlay->addWidget( PlotSelector );
	vlay->addWidget( plot );

	setCentralWidget( w );

	connect( PlotSelector, SIGNAL(activated(int)), this, SLOT(slotSelectPlot(int)) );

	slotSelectPlot( PlotSelector->currentIndex() );
}

void TestPlot::slotSelectPlot( int n ) {
	plot->resetPlot();

	switch ( n ) {
	case 0: //Points plot
		{
			plot->setLimits( -6.0, 11.0, -10.0, 110.0 );
			
			po1 = new KPlotObject( Qt::white, KPlotObject::Points, 4, KPlotObject::Asterisk );
			po2 = new KPlotObject( Qt::green, KPlotObject::Points, 4, KPlotObject::Triangle );

			for ( float x=-5.0; x<=10.0; x+=1.0 ) {
				po1->addPoint( x, x*x );
				po2->addPoint( x, 50.0 - 5.0*x );
			}
			
			plot->addPlotObject( po1 );
			plot->addPlotObject( po2 );
			
			plot->update();
			break;
		}

	case 1: //Lines plot
		{
			plot->setLimits( -0.1, 6.38, -1.1, 1.1 );
			plot->setSecondaryLimits( -5.73, 365.55, -1.1, 1.1 );
			plot->axis(KPlotWidget::TopAxis)->setTickLabelsShown( true );
			plot->axis(KPlotWidget::BottomAxis)->setLabel("Angle [radians]");
			plot->axis(KPlotWidget::TopAxis)->setLabel("Angle [degrees]");

			po1 = new KPlotObject( Qt::red,  KPlotObject::Lines, 2 );
			po2 = new KPlotObject( Qt::cyan, KPlotObject::Lines, 2 );

			for ( float t=0.0; t<=6.28; t+=0.04 ) {
				po1->addPoint( t, sin(t) );
				po2->addPoint( t, cos(t) );
			}

			plot->addPlotObject( po1 );
			plot->addPlotObject( po2 );

			plot->update();
			break;
		}

	case 2: //Bars plot
		{
			plot->setLimits( -7.0, 7.0, -5.0, 105.0 );

			po1 = new KPlotObject( Qt::white, KPlotObject::Bars, 2 );
			po1->setBarBrush( QBrush(Qt::green, Qt::Dense4Pattern) );

			for ( float x=-6.5; x<=6.5; x+=0.5 ) {
				po1->addPoint( x, 100*exp( -0.5*x*x ), "", 0.5 );
			}

			plot->addPlotObject( po1 );

			plot->update();
			break;
		}

	case 3: //Points plot with labels
		{
			plot->setLimits( -1.1, 1.1, -1.1, 1.1 );

			po1 = new KPlotObject( Qt::yellow, KPlotObject::Points, 10, KPlotObject::Star );
			po1->setLabelPen( QPen(Qt::green) );

			po1->addPoint(  0.0,  0.8, "North" );
			po1->addPoint(  0.57,  0.57, "Northeast" );
			po1->addPoint(  0.8,  0.0, "East" );
			po1->addPoint(  0.57, -0.57, "Southeast" );
			po1->addPoint(  0.0, -0.8, "South" );
			po1->addPoint( -0.57, -0.57, "Southwest" );
			po1->addPoint( -0.8,  0.0, "West" );
			po1->addPoint( -0.57,  0.57, "Northwest" );

			plot->addPlotObject( po1 );

			plot->update();
			break;
		}

	case 4: //Points, Lines and Bars plot
		{
			plot->setLimits( -2.1, 2.1, -0.1, 4.1 );

			po1 = new KPlotObject( Qt::white, KPlotObject::Points, 10, KPlotObject::Pentagon );

			po1->setShowLines( true );
			po1->setShowBars( true );
			po1->setLabelPen( QPen( QColor( "#AA8800" ) ) );
			po1->setLinePen( QPen( Qt::red, 3.0, Qt::DashDotLine ) );
			po1->setBarBrush( QBrush( Qt::blue, Qt::BDiagPattern ) );

			po1->addPoint( -1.75, 0.5  );
			po1->addPoint( -1.25, 1.0  );
			po1->addPoint( -0.75, 1.25 );
			po1->addPoint( -0.25, 1.5  );
			po1->addPoint(  0.25, 2.5  );
			po1->addPoint(  0.75, 3.0  );
			po1->addPoint(  1.25, 1.5  );
			po1->addPoint(  1.75, 1.75 );

			plot->addPlotObject( po1 );

			update();
			break;
		}

	case 5: //Points, Lines and Bars plot with labels
		{
			plot->setLimits( -2.1, 2.1, -0.1, 4.1 );

			po1 = new KPlotObject( Qt::white, KPlotObject::Points, 10, KPlotObject::Pentagon );

			po1->setShowLines( true );
			po1->setShowBars( true );
			po1->setLabelPen( QPen( QColor( "#AA8800" ) ) );
			po1->setLinePen( QPen( Qt::red, 3.0, Qt::DashDotLine ) );
			po1->setBarBrush( QBrush( Qt::blue, Qt::BDiagPattern ) );

			po1->addPoint( -1.75, 0.5, "A" );
			po1->addPoint( -1.25, 1.0, "B" );
			po1->addPoint( -0.75, 1.25, "C" );
			po1->addPoint( -0.25, 1.5, "D" );
			po1->addPoint(  0.25, 2.5, "E" );
			po1->addPoint(  0.75, 3.0, "F" );
			po1->addPoint(  1.25, 1.5, "G" );
			po1->addPoint(  1.75, 1.75, "H" );

			plot->addPlotObject( po1 );

			update();
			break;
		}
	}
}

#include "testplot_widget.moc"
