OSCAR-code/Graphs/gCandleStick.cpp
2011-06-28 11:51:21 +10:00

118 lines
3.1 KiB
C++

/********************************************************************
gCandleStick Graph Implementation
Copyright (c)2011 Mark Watkins <jedimark@users.sourceforge.net>
License: GPL
*********************************************************************/
#include <math.h>
#include "gCandleStick.h"
gCandleStick::gCandleStick(gPointData *d,Qt::Orientation o)
:gLayer(d)
{
m_orientation=o;
}
gCandleStick::~gCandleStick()
{
}
void gCandleStick::Plot(gGraphWindow & w,float scrx,float scry)
{
if (!m_visible) return;
if (!data) return;
if (!data->IsReady()) return;
int start_px=w.GetLeftMargin();
int start_py=w.GetBottomMargin();
int width=scrx-(w.GetLeftMargin()+w.GetRightMargin())-1;
int height=scry-(w.GetTopMargin()+w.GetBottomMargin())-1;
float sum=0;
for (int i=0;i<data->np[0];i++)
sum+=data->point[0][i].y();
float pxr;
float px;
if (m_orientation==Qt::Vertical) {
pxr=height/sum;
px=start_py;
} else {
pxr=width/sum;
px=start_px;
}
float x,y;
float t1,t2;
int barwidth;
if (m_orientation==Qt::Vertical) {
barwidth=width;
} else {
barwidth=height;
}
QColor col2=QColor("light grey");
QColor c(0,0,0,255);
QString str,st;
QRect rect;
//Qt::AlignmDirection dir;
glLineWidth(1);
// glDisable(GL_LINE_SMOOTH);
for (int i=0;i<data->np[0];i++) {
t1=floor(px);
t2=data->point[0][i].y()*pxr;
px+=t2;
t2=ceil(t2);
if (m_orientation==Qt::Vertical) {
rect=QRect(start_px,t1,barwidth,t2);
//dir=wxEAST;
} else {
rect=QRect(t1,start_py,t2,barwidth);
//dir=wxSOUTH;
}
QColor col1=color[i % color.size()];
glBegin(GL_QUADS);
glColor4ub(col1.red(),col1.green(),col1.blue(),col1.alpha());
glVertex2f(rect.x()+1, rect.y()+height);
glVertex2f(rect.x()+rect.width(), rect.y()+height);
glColor4ub(col2.red(),col2.green(),col2.blue(),col2.alpha());
glVertex2f(rect.x()+rect.width(), rect.y()+1);
glVertex2f(rect.x()+1, rect.y()+1);
glEnd();
glColor4ub(0,0,0,255);
glBegin(GL_LINE_LOOP);
glVertex2f(rect.x()+1, rect.y()+height);
glVertex2f(rect.x()+rect.width(), rect.y()+height);
glVertex2f(rect.x()+rect.width(), rect.y()+1);
glVertex2f(rect.x()+1, rect.y()+1);
glEnd();
//LinedRoundedRectangle(rect.x,rect.y,rect.width,rect.height,0,1,c);
str="";
if ((int)m_names.size()>i) {
// str=m_names[i]+" ";
}
str+=st.sprintf("%0.1f",data->point[0][i].x());
GetTextExtent(str, x, y);
//x+=5;
if (t2>x+5) {
int j=t1+((t2/2.0)-(x/2.0));
if (m_orientation==Qt::Vertical) {
DrawText(w,str,start_px+barwidth+2+y,scry-j,270.0);
} else {
//w.renderText(j,float(scry)-(float(start_py)+(barwidth/2.0)-(y/2.0)+3),str);
DrawText(w,str,j,scry-(start_py+(barwidth/2.0)-(y/2.0)));
}
}
} // for (int i
glFlush();
}