1 #include <lib/gui/enumber.h>
2 #include <lib/driver/rc.h>
3 #include <lib/gui/eskin.h>
4 #include <lib/gui/elabel.h>
5 #include <lib/gdi/fb.h>
6 #include <lib/gdi/grc.h>
7 #include <lib/gdi/font.h>
8 #include <lib/gui/guiactions.h>
10 void eNumber::unpack(__u32 l, int *t)
12 for (int i=0; i<4; i++)
13 *t++=(l>>((3-i)*8))&0xFF;
16 void eNumber::pack(__u32 &l, int *t)
19 for (int i=0; i<4; i++)
23 eRect eNumber::getNumberRect(int n)
25 if (deco_selected && have_focus)
26 return eRect( deco_selected.borderLeft + n * space_selected, deco_selected.borderTop, dspace, crect_selected.height() );
28 return eRect( deco.borderLeft + n * dspace, deco.borderTop, dspace, crect.height() );
30 return eRect( n * dspace, 0, dspace, height() );
33 void eNumber::redrawNumber(gPainter *p, int n, const eRect &area)
35 eRect pos = getNumberRect(n);
37 if (!area.contains(pos) )
40 p->setForegroundColor((have_focus && n==active)?cursorB:normalB);
45 if (flags & flagFillWithZeros || ( (flags & flagFixedNum) && n ))
47 eString s = "%0"+eString().setNum(maxdigits)+(base==10?"d":"X");
48 const char* p = s.c_str();
49 char* tmp = new char[10];
51 t.sprintf(tmp, number[n]);
56 if (flags&flagHideInput)
59 t.sprintf("%d", number[n]);
61 t.sprintf("%X", number[n]);
64 if (!n && flags & flagPosNeg && neg)
67 if (n && (flags & flagTime))
70 else if (n && ( (flags & flagDrawPoints) || (flags & flagFixedNum)) )
73 p->setForegroundColor((have_focus && n==active)?cursorF:normalF);
74 p->setBackgroundColor((have_focus && n==active)?cursorB:normalB);
77 if (!n && len==2 && ((flags & flagFixedNum) || (flags & flagTime)) ) // first element...
79 eTextPara *para = new eTextPara( pos );
80 para->setFont( font );
81 para->renderString( t );
82 para->realign( eTextPara::dirRight );
83 p->renderPara( *para );
87 p->renderText(pos, t);
92 double eNumber::getFixedNum()
94 if (flags & flagFixedNum)
96 if (flags&flagPosNeg && neg)
98 double d = -((double)number[0]+(double)number[1]/1000);
99 eDebug("getFixedNum %lf", d);
104 float d = (double)number[0]+(double)number[1]/1000;
105 eDebug("getFixedNum %lf", d);
113 void eNumber::setFixedNum(double d)
115 eDebug("setFixedNum %lf", d);
116 if (flags & flagPosNeg)
123 if (flags & flagFixedNum)
126 number[1]=(int)round(( ( d - number[0] ) * 1000) );
129 eDebug("eNumber bug... the Number %s is not a fixed Point number", name.c_str());
132 void eNumber::redrawWidget(gPainter *p, const eRect &area)
134 for (int i=0; i<len; i++)
135 redrawNumber(p, i, area);
137 if (deco_selected && have_focus)
138 deco_selected.drawDecoration(p, ePoint(width(), height()));
140 deco.drawDecoration(p, ePoint(width(), height()));
143 void eNumber::invalidateNum()
145 if ( have_focus && deco_selected )
146 invalidate( crect_selected );
153 int eNumber::eventHandler(const eWidgetEvent &event)
157 ((eNumber*) LCDTmp)->eventHandler(event);
161 case eWidgetEvent::changedSize:
163 dspace = (crect.width()) / len;
165 dspace = (size.width()) / len;
167 space_selected = (crect_selected.width()) / len;
169 case eWidgetEvent::evtAction:
170 if ( len > 1 && event.action == &i_cursorActions->left)
174 invalidate(getNumberRect(oldac));
178 invalidate(getNumberRect(active));
180 } else if ( len > 1 && (event.action == &i_cursorActions->right) || (event.action == &i_cursorActions->ok))
184 invalidate(getNumberRect(oldac));
187 if (event.action == &i_cursorActions->ok)
188 /*emit*/ selected(number);
192 invalidate(getNumberRect(active));
200 return eDecoWidget::eventHandler(event);
203 // isactive is the digit (always in the first field )
204 // that ist active after get the first focus !
206 eNumber::eNumber(eWidget *parent, int _len, int _min, int _max, int _maxdigits, int *init, int isactive, eWidget* descr, int grabfocus, const char *deco)
207 :eDecoWidget(parent, grabfocus, deco ),
209 cursorB(eSkin::getActive()->queryScheme("global.selected.background")),
210 cursorF(eSkin::getActive()->queryScheme("global.selected.foreground")),
211 normalB(eSkin::getActive()->queryScheme("global.normal.background")),
212 normalF(eSkin::getActive()->queryScheme("global.normal.foreground")),
213 have_focus(0), digit(isactive), isactive(isactive), flags(0), descr(descr), tmpDescr(0),
216 setNumberOfFields(_len);
217 setLimits(_min, _max);
218 setMaximumDigits(_maxdigits);
220 for (int i=0; init && i<len; i++)
222 addActionMap(&i_cursorActions->map);
229 int eNumber::keyDown(int key)
233 ((eNumber*) LCDTmp)->keyDown(key);
237 case eRCInput::RC_0 ... eRCInput::RC_9:
239 int nn=(digit!=0)?number[active]*10:0;
240 nn+=key-eRCInput::RC_0;
241 if (flags & flagTime)
248 else if (flags & flagFixedNum)
255 if (nn>=min && nn<=max)
258 invalidate(getNumberRect(active));
260 if ((digit>=maxdigits) || (nn==0))
263 invalidate(getNumberRect(active-1));
265 /*emit*/ numberChanged();
268 /*emit*/ selected(number);
272 invalidate(getNumberRect(active));
279 case eRCInput::RC_PLUS:
280 if (flags & flagPosNeg && neg )
283 invalidate(getNumberRect(0));
287 case eRCInput::RC_MINUS:
288 if (flags & flagPosNeg && !neg )
291 invalidate(getNumberRect(0));
299 void eNumber::gotFocus()
304 if (deco && deco_selected)
307 invalidate(getNumberRect(active));
310 if (parent && parent->LCDElement) // detect if LCD Avail
312 LCDTmp = new eNumber(parent->LCDElement, len, min, max, maxdigits, &(number[0]), isactive, 0, 0);
314 ((eNumber*)LCDTmp)->setFlags(flags);
315 eSize s = parent->LCDElement->getSize();
319 LCDTmp->move(ePoint(0,s.height()/2));
320 LCDTmp->resize(eSize(s.width(), s.height()/2));
321 tmpDescr = new eLabel(parent->LCDElement);
323 tmpDescr->move(ePoint(0,0));
324 tmpDescr->resize(eSize(s.width(), s.height()/2));
325 tmpDescr->setText(descr->getText());
331 LCDTmp->move(ePoint(0,0));
333 ((eNumber*)LCDTmp)->digit=digit;
334 ((eNumber*)LCDTmp)->active=active;
335 ((eNumber*)LCDTmp)->normalF=255;
336 ((eNumber*)LCDTmp)->normalB=0;
337 ((eNumber*)LCDTmp)->cursorF=0;
338 ((eNumber*)LCDTmp)->cursorB=255;
339 ((eNumber*)LCDTmp)->have_focus=1;
345 void eNumber::lostFocus()
361 if (deco && deco_selected)
364 invalidate(getNumberRect(active));
368 void eNumber::setNumber(int f, int n)
370 if (flags & flagPosNeg)
380 if ((f>=0) && (f<len))
383 invalidate(getNumberRect(f));
386 void eNumber::setLimits(int _min, int _max)
393 void eNumber::setNumberOfFields(int n)
398 void eNumber::setMaximumDigits(int n)
403 if (digit >= maxdigits)
407 void eNumber::setFlags(int _flags)
409 if (flags&flagFixedNum)
415 void eNumber::setBase(int _base)
420 void eNumber::setNumber(int n)
422 if ( flags&flagPosNeg )
430 for (int i=len-1; i>=0; --i)
438 int eNumber::getNumber()
441 for (int i=0; i<len; i++)
446 return flags&flagPosNeg && neg ? -n : n;