cvs20080628 - trunk
[gitenigma.git] / lib / gui / egauge.cpp
blob5914e0598b6b1050516be6d06a32b474d01be7d6
1 #include <lib/gui/egauge.h>
3 #include <stdlib.h>
5 #include <lib/base/erect.h>
6 #include <lib/gdi/fb.h>
7 #include <lib/gdi/lcd.h>
8 #include <lib/gui/eskin.h>
9 #include <lib/system/init.h>
10 #include <lib/system/init_num.h>
11 #include <lib/system/math.h>
14 * eGauge skin widget. Uses same syntax as eProgress
15 * - start parameter indicates start and end offset in degrees for the marker.
16 * - The 'start' parameter can be set in skin file
17 * - The 'pixmap' parameter can be used to specify a background pixmap
18 * - The 'sliderpixmap' parameter can be used to specify a png file as marker instead of the line.
19 * It is drawn just against the border.
20 * Note: The pixmap itself will not be rotated. So it is best to use a circular picture.
21 * - the egauge background is set to transparent
24 eGauge::eGauge(eWidget *parent, int takefocus)
25 : eProgress(parent, takefocus)
29 eGauge::~eGauge()
33 void eGauge::redrawWidget(gPainter *target, const eRect &area)
35 if (pixmap)
37 target->blit(*pixmap, ePoint(0, 0), area, gPixmap::blitAlphaTest);
40 if (border)
42 /* draw border */
43 target->setForegroundColor(getForegroundColor());
44 target->fill(eRect(0, 0, size.width(), border));
45 target->fill(eRect(0, border, border, size.height()-border));
46 target->fill(eRect(border, size.height()-border, size.width()-border, border));
47 target->fill(eRect(size.width()-border, border, border, size.height()-border));
50 int endx, endy;
51 int basex = size.width() >> 1;
52 int basey = size.height() >> 1;
54 //target->setForegroundColor(right);
55 //target->fill(eRect(border, border, size.width()-border*2, size.height()-border*2));
56 // angle in degrees
57 double angle = (double) start + (double) perc * (double)(360 - (start<<1)) / 100.0;
58 double rads = Radians(angle);
60 if (!sliderPixmap)
62 if (direction)
64 endx = basex + (int) (SIN(rads) * (double)(size.width() - (border<<1))/2.0);
65 endy = basey - (int) (COS(rads) * (double)(size.height() - (border<<1))/2.0);
67 else
69 endx = basex - (int) (SIN(rads) * (double)(size.width() - (border<<1))/2.0);
70 endy = basey + (int) (COS(rads) * (double)(size.height() - (border<<1))/2.0);
72 target->setForegroundColor(left);
73 target->line(ePoint(basex, basey), ePoint(endx, endy));
75 else
77 if (direction)
79 endx = basex + (int) (SIN(rads) * (double)(size.width() - (border<<1) - sliderPixmap->x) / 2.0) - (sliderPixmap->x >> 1);
80 endy = basey - (int) (COS(rads) * (double)(size.height() - (border<<1) - sliderPixmap->y) / 2.0) - (sliderPixmap->y >> 1);
82 else
84 endx = basex - (int) (SIN(rads) * (double)(size.width() - (border<<1) - sliderPixmap->x) / 2.0) - (sliderPixmap->x >> 1);
85 endy = basey + (int) (COS(rads) * (double)(size.height() - (border<<1) - sliderPixmap->y) / 2.0) - (sliderPixmap->y >> 1);
87 //eDebug("sliderPixmap %d,%d at %d,%d size=%d,%d border=%d offset=%d", basex, basey, endx, endy, sliderPixmap->x, sliderPixmap->y, border, pixmapoffset );
88 target->blit(*sliderPixmap, ePoint(endx, endy), area, gPixmap::blitAlphaTest);
92 static eWidget *create_eGauge(eWidget *parent)
94 return new eGauge(parent);
97 class eGaugeSkinInit
99 public:
100 eGaugeSkinInit()
102 eSkin::addWidgetCreator("eGauge", create_eGauge);
104 ~eGaugeSkinInit()
106 eSkin::removeWidgetCreator("eGauge", create_eGauge);
110 eAutoInitP0<eGaugeSkinInit> init_eGaugeSkinInit(eAutoInitNumbers::guiobject, "eGauge");