/* gYAxis Implementation Copyright (c)2011 Mark Watkins License: GPL */ #include #include #include "gYAxis.h" #include "SleepLib/profiles.h" gYSpacer::gYSpacer(int spacer) :Layer("") { Q_UNUSED(spacer) } gXGrid::gXGrid(QColor col) :Layer("") { Q_UNUSED(col) m_major_color=QColor(180,180,180,128); m_minor_color=QColor(220,220,220,128); m_show_major_lines=true; m_show_minor_lines=true; } gXGrid::~gXGrid() { } void gXGrid::paint(gGraph & w,int left,int top, int width, int height) { int x,y; EventDataType miny=w.min_y; EventDataType maxy=w.max_y; if (miny<0) { // even it up if it's starts negative miny=-MAX(fabs(miny),fabs(maxy)); } w.roundY(miny,maxy); //EventDataType dy=maxy-miny; if (height<0) return; QString fd="0"; GetTextExtent(fd,x,y); double max_yticks=round(height / (y+15.0)); // plus spacing between lines //double yt=1/max_yticks; double mxy=MAX(fabs(maxy),fabs(miny)); double mny=miny; if (miny<0) { mny=-mxy; } double rxy=mxy-mny; int myt; bool fnd=false; for (myt=max_yticks;myt>=1;myt--) { float v=rxy/float(myt); if (float(v)==int(v)) { fnd=true; break; } } if (fnd) max_yticks=myt; else { max_yticks=2; } double yt=1/max_yticks; double ymult=height/rxy; double min_ytick=rxy*yt; float ty,h; if (min_ytick<=0) { qDebug() << "min_ytick error in gXGrid::paint()"; return; } if (min_ytick>=1000000) { min_ytick=100; } lines=w.backlines(); for (double i=miny; i<=maxy+min_ytick-0.00001; i+=min_ytick) { ty=(i - miny) * ymult; h=top+height-ty; if (m_show_major_lines && (i > miny)) { lines->add(left,h,left+width,h,m_major_color); } double z=(min_ytick/4)*ymult; double g=h; for (int i=0;i<3;i++) { g+=z; if (g>top+height) break; //if (vertcnt>=maxverts) { // qWarning() << "vertarray bounds exceeded in gYAxis for " << w.title() << "graph" << "MinY =" <2;myt--) { float v=rxy/float(myt); if (v==int(v)) { fnd=true; break; } } if (fnd) max_yticks=myt; double yt=1/max_yticks; double ymult=height/rxy; double min_ytick=rxy*yt; //if (dy>5) { // min_ytick=round(min_ytick); //} else { //} float ty,h; if (min_ytick<=0) { qDebug() << "min_ytick error in gYAxis::Plot()"; return; } if (min_ytick>=1000000) { min_ytick=100; } lines=w.backlines(); for (double i=miny; i<=maxy+min_ytick-0.00001; i+=min_ytick) { ty=(i - miny) * ymult; if (dy<5) { fd=Format(i*m_yaxis_scale,2); } else { fd=Format(i*m_yaxis_scale,1); } GetTextExtent(fd,x,y); // performance bottleneck.. if (x>labelW) labelW=x; h=top+height-ty; if (hadd(left+width-4,h,left+width,h,m_line_color); double z=(min_ytick/4)*ymult; double g=h; for (int i=0;i<3;i++) { g+=z; if (g>top+height) break; lines->add(left+width-3,g,left+width,g,m_line_color); if (lines->full()) { qWarning() << "vertarray bounds exceeded in gYAxis for " << w.title() << "graph" << "MinY =" <=12 ? pm[0]='p' : pm[0]='a'; // yes, inverted.. h %= 12; } else { pm[0]=0; } if (dp>2) return QString().sprintf("%02i:%02i:%02i%s",h,m,s,pm); return QString().sprintf("%i:%02i%s",h,m,pm); }