improved desktop UI
[mardrone] / mardrone / gauges / gaugetape.cpp
1
2 #include "gaugetape.h"
3 #include <stdio.h>
4 #include <math.h>
5 #include <qdebug.h>
6
7 GaugeTape::GaugeTape(QGraphicsItem *parent) :
8     Gauge(parent)
9 {
10 }
11
12 void GaugeTape::paint(QPainter *painter,const QStyleOptionGraphicsItem *option,
13                       QWidget *widget)
14 {
15   int tpix;  // tick division in pixels
16
17   int fval;     // First value visible
18
19   int ntic;
20   float v;
21   float t;
22   float ti;
23   int h=size().height();
24   int w=size().width();
25   int xd;
26   int yd;
27   int th=m_tickLength;
28   //  int y = pgs->y;
29   //  int x = pgs->x;
30   char s[80];
31
32   //  linc = pgs->linc ? pgs->linc: 10;
33   // tpix = m_tspc ? m_tspc: 20;
34   //  tinc = pgs->tinc ? pgs->tinc: 5;
35
36   painter->save();
37   painter->setTransform(QTransform().translate(scenePos().x(),scenePos().y()).scale(m_scale,m_scale));
38   QPen pen(m_color);
39   QBrush brush(m_backColor);
40   painter->setFont(m_font);
41   painter->setPen(pen);
42   painter->setBrush(brush);
43   QFontMetrics fm(m_font);
44   int fontHeight=fm.ascent();
45
46  if ((m_style == UP) || (m_style == COMPASS_UP)) {
47     xd = 1;
48     yd = 0;
49   }
50
51   if (m_style == RIGHT) {
52     xd = 0;
53     yd = 1;
54   }
55
56   if (m_style == DOWN) {
57     xd = 1;
58     yd = 0;
59   }
60
61   if (m_style == LEFT) {
62     xd = 0;
63     yd = 1;
64   }
65   //  printf("draw_tape 1 %s x=%3d y=%3d h=%3d w=%3d linc=%d tpix=%d tinc=%d\n",name.c_str(),x,y,h,w,linc,tpix,tinc);
66
67
68
69
70 //  float low = floor(m_value - ((h * m_tickIncrement)/(m_tickSpacing * 2))/m_tickIncrement)*m_tickIncrement; // Lowest value to display
71   float vof = floor(m_value / m_tickIncrement) * m_tickIncrement; // Value rounded to lover tick increment
72   float tmod= fmod (m_value,m_tickIncrement) * m_tickSpacing/m_tickIncrement;   // Modulus as pixels
73   ntic=ceil((yd?h:w)/(m_tickSpacing));
74   float low=vof-(ntic/2)*m_tickIncrement;
75 //  fval = (m_value - ((tin + 1) * m_tickIncrement)) - (m_value%m_tickIncrement);
76   // t = h - tin * m_tickSpacing - ((m_value%m_tickIncrement) * tpix/m_tickIncrement);
77   // ntic=h/(m_tickSpacing/m_tickMinor);
78   // printf("paintTape %s val=%d tin=%d tpix=%d tinc=%d h2=%d tio=%d fval=%d t=%d low=%d yd=%d\n",m_name.toStdString().c_str(),m_value,tin,tpix,m_tickIncrement,h2,tio,fval,t,low,yd);
79
80
81   v = low;
82   int vpix=tmod+(ntic+1)*m_tickSpacing;
83
84     QBrush bbrush(m_backColor);
85     painter->setBrush(bbrush);
86     painter->drawRect(0,0, w,h);
87     if(yd) painter->drawLine(0,h/2,w,h/2);
88         else painter->drawLine(w/2,0,w/2,h);
89     painter->setClipRect(QRect(0,0,w,h));
90
91
92
93   //qDebug() << "m_value=" << m_value << " vof=" << vof << " low=" << low << " vpix=" << vpix << " ntic=" << ntic << " tmod=" <<tmod;
94   int i=0;
95   while(vpix >0) {
96       int vv=v;
97       if(m_style == COMPASS_UP) {
98           vv=(vv+360)%360;
99           sprintf(s,"%3d",vv);
100           if(vv==0)   strcpy(s," N");
101           if(vv==90)  strcpy(s," E");
102           if(vv==180) strcpy(s," S");
103           if(vv==270) strcpy(s," W");
104       } else
105           sprintf(s,"%3.0f",v);
106       v+=m_tickIncrement;
107       vpix-=m_tickSpacing;
108       i++;
109     //  qDebug() << v << vpix;
110       if(yd)   {
111           painter->drawText(QPoint(20, vpix+fontHeight/2),s);
112            painter->drawLine(0,vpix,th,vpix);
113            for(i=0;i<m_tickMinor;i++) painter->drawLine(0,vpix+i*(m_tickSpacing/m_tickMinor),th/2,vpix+i*(m_tickSpacing/m_tickMinor));
114       }
115       else {
116           painter->drawText(QPoint(w-vpix-20,fontHeight+th),s);
117           painter->drawLine(w-vpix,th,w-vpix,0);
118           for(i=0;i<m_tickMinor;i++) painter->drawLine(w-(vpix+i*(m_tickSpacing/m_tickMinor)),th/2,w-(vpix+i*(m_tickSpacing/m_tickMinor)),0);
119       }
120
121   }
122   painter->restore();  // Restore and remove clicping rectabgle
123
124 }
125
126
127