diff options
| author | Felix Domke <tmbinc@elitedvb.net> | 2003-10-17 15:36:42 +0000 |
|---|---|---|
| committer | Felix Domke <tmbinc@elitedvb.net> | 2003-10-17 15:36:42 +0000 |
| commit | d63d2c3c6cbbd574dda4f8b00ebe6c661735edd5 (patch) | |
| tree | 84d0cacfd0b6c1241c236c7860f7cbd7f26901bb /lib/gui/enumber.cpp | |
| download | enigma2-d63d2c3c6cbbd574dda4f8b00ebe6c661735edd5.tar.gz enigma2-d63d2c3c6cbbd574dda4f8b00ebe6c661735edd5.zip | |
import of enigma2
Diffstat (limited to 'lib/gui/enumber.cpp')
| -rw-r--r-- | lib/gui/enumber.cpp | 447 |
1 files changed, 447 insertions, 0 deletions
diff --git a/lib/gui/enumber.cpp b/lib/gui/enumber.cpp new file mode 100644 index 00000000..c03ec8f7 --- /dev/null +++ b/lib/gui/enumber.cpp @@ -0,0 +1,447 @@ +#include <lib/gui/enumber.h> +#include <lib/driver/rc.h> +#include <lib/gui/eskin.h> +#include <lib/gui/elabel.h> +#include <lib/gdi/fb.h> +#include <lib/gdi/grc.h> +#include <lib/gdi/font.h> +#include <lib/gui/guiactions.h> + +void eNumber::unpack(__u32 l, int *t) +{ + for (int i=0; i<4; i++) + *t++=(l>>((3-i)*8))&0xFF; +} + +void eNumber::pack(__u32 &l, int *t) +{ + l=0; + for (int i=0; i<4; i++) + l|=(*t++)<<((3-i)*8); +} + +eRect eNumber::getNumberRect(int n) +{ + if (deco_selected && have_focus) + return eRect( deco_selected.borderLeft + n * space_selected, deco_selected.borderTop, dspace, crect_selected.height() ); + else if (deco) + return eRect( deco.borderLeft + n * dspace, deco.borderTop, dspace, crect.height() ); + else + return eRect( n * dspace, 0, dspace, height() ); +} + +void eNumber::redrawNumber(gPainter *p, int n, const eRect &area) +{ + eRect pos = getNumberRect(n); + + if (!area.contains(pos) ) + return; + + p->setForegroundColor((have_focus && n==active)?cursorB:normalB); + p->fill(pos); + p->setFont(font); + + eString t; + if (flags & flagFillWithZeros || ( (flags & flagFixedNum) && n )) + { + eString s = "%0"+eString().setNum(maxdigits)+(base==10?"d":"X"); + const char* p = s.c_str(); + char* tmp = new char[10]; + strcpy( tmp, p ); + t.sprintf(tmp, number[n]); + delete [] tmp; + } + else + { + if (flags&flagHideInput) + t="*"; + else if (base==10) + t.sprintf("%d", number[n]); + else if (base==0x10) + t.sprintf("%X", number[n]); + } + + if (!n && flags & flagPosNeg && neg) + t="-"+t; + + if (n && (flags & flagTime)) + t=":"+t; + + else if (n && ( (flags & flagDrawPoints) || (flags & flagFixedNum)) ) + t="."+t; + + p->setForegroundColor((have_focus && n==active)?cursorF:normalF); + p->setBackgroundColor((have_focus && n==active)?cursorB:normalB); + + p->clip( pos ); + if (!n && len==2 && ((flags & flagFixedNum) || (flags & flagTime)) ) // first element... + { + eTextPara *para = new eTextPara( pos ); + para->setFont( font ); + para->renderString( t ); + para->realign( eTextPara::dirRight ); + p->renderPara( *para ); + para->destroy(); + } + else + p->renderText(pos, t); + + p->clippop(); +} + +double eNumber::getFixedNum() +{ + if (flags & flagFixedNum) + { + if (flags&flagPosNeg && neg) + { + double d = -((double)number[0]+(double)number[1]/1000); + eDebug("getFixedNum %lf", d); + return d; + } + else + { + float d = (double)number[0]+(double)number[1]/1000; + eDebug("getFixedNum %lf", d); + return d; + } + } + else + return 0; +} + +void eNumber::setFixedNum(double d) +{ + eDebug("setFixedNum %lf", d); + if (flags & flagPosNeg) + neg=d<0; + else + neg=0; + + d=fabs(d); + + if (flags & flagFixedNum) + { + number[0]=(int)d; + number[1]=(int)round(( ( d - number[0] ) * 1000) ); + } + else + eDebug("eNumber bug... the Number %s is not a fixed Point number", name.c_str()); +} + +void eNumber::redrawWidget(gPainter *p, const eRect &area) +{ + for (int i=0; i<len; i++) + redrawNumber(p, i, area); + + if (deco_selected && have_focus) + deco_selected.drawDecoration(p, ePoint(width(), height())); + else if (deco) + deco.drawDecoration(p, ePoint(width(), height())); +} + +void eNumber::invalidateNum() +{ + if ( have_focus && deco_selected ) + invalidate( crect_selected ); + else if ( deco ) + invalidate( crect ); + else + invalidate(); +} + +int eNumber::eventHandler(const eWidgetEvent &event) +{ +#ifndef DISABLE_LCD + if (LCDTmp) + ((eNumber*) LCDTmp)->eventHandler(event); +#endif + switch (event.type) + { + case eWidgetEvent::changedSize: + if (deco) + dspace = (crect.width()) / len; + else + dspace = (size.width()) / len; + if (deco_selected) + space_selected = (crect_selected.width()) / len; + break; + case eWidgetEvent::evtAction: + if ( len > 1 && event.action == &i_cursorActions->left) + { + int oldac=active; + active--; + invalidate(getNumberRect(oldac)); + if (active<0) + active=len-1; + if (active!=oldac) + invalidate(getNumberRect(active)); + digit=0; + } else if ( len > 1 && (event.action == &i_cursorActions->right) || (event.action == &i_cursorActions->ok)) + { + int oldac=active; + active++; + invalidate(getNumberRect(oldac)); + if (active>=len) + { + if (event.action == &i_cursorActions->ok) + /*emit*/ selected(number); + active=0; + } + if (active!=oldac) + invalidate(getNumberRect(active)); + digit=0; + } else + break; + return 1; + default: + break; + } + return eDecoWidget::eventHandler(event); +} + +// isactive is the digit (always in the first field ) +// that ist active after get the first focus ! + +eNumber::eNumber(eWidget *parent, int _len, int _min, int _max, int _maxdigits, int *init, int isactive, eWidget* descr, int grabfocus, const char *deco) + :eDecoWidget(parent, grabfocus, deco ), + active(0), + cursorB(eSkin::getActive()->queryScheme("global.selected.background")), + cursorF(eSkin::getActive()->queryScheme("global.selected.foreground")), + normalB(eSkin::getActive()->queryScheme("global.normal.background")), + normalF(eSkin::getActive()->queryScheme("global.normal.foreground")), + have_focus(0), digit(isactive), isactive(isactive), flags(0), descr(descr), tmpDescr(0), + neg(false) +{ + setNumberOfFields(_len); + setLimits(_min, _max); + setMaximumDigits(_maxdigits); + setBase(10); + for (int i=0; init && i<len; i++) + number[i]=init[i]; + addActionMap(&i_cursorActions->map); +} + +eNumber::~eNumber() +{ +} + +int eNumber::keyDown(int key) +{ +#ifndef DISABLE_LCD + if (LCDTmp) + ((eNumber*) LCDTmp)->keyDown(key); +#endif + switch (key) + { + case eRCInput::RC_0 ... eRCInput::RC_9: + { + int nn=(digit!=0)?number[active]*10:0; + nn+=key-eRCInput::RC_0; + if (flags & flagTime) + { + if ( active ) + max = 59; + else + max = 23; + } + else if (flags & flagFixedNum) + { + if (active) + max=999; + else + max=oldmax; + } + if (nn>=min && nn<=max) + { + number[active]=nn; + invalidate(getNumberRect(active)); + digit++; + if ((digit>=maxdigits) || (nn==0)) + { + active++; + invalidate(getNumberRect(active-1)); + digit=0; + /*emit*/ numberChanged(); + if (active>=len) + { + /*emit*/ selected(number); + active=0; + } + else + invalidate(getNumberRect(active)); + } + } + break; + + break; + } + case eRCInput::RC_PLUS: + if (flags & flagPosNeg && neg ) + { + neg=false; + invalidate(getNumberRect(0)); + } + break; + + case eRCInput::RC_MINUS: + if (flags & flagPosNeg && !neg ) + { + neg=true; + invalidate(getNumberRect(0)); + } + default: + return 0; + } + return 1; +} + +void eNumber::gotFocus() +{ + have_focus++; + digit=isactive; + + if (deco && deco_selected) + invalidate(); + else + invalidate(getNumberRect(active)); + +#ifndef DISABLE_LCD + if (parent && parent->LCDElement) // detect if LCD Avail + { + LCDTmp = new eNumber(parent->LCDElement, len, min, max, maxdigits, &(number[0]), isactive, 0, 0); + LCDTmp->hide(); + ((eNumber*)LCDTmp)->setFlags(flags); + eSize s = parent->LCDElement->getSize(); + + if (descr) + { + LCDTmp->move(ePoint(0,s.height()/2)); + LCDTmp->resize(eSize(s.width(), s.height()/2)); + tmpDescr = new eLabel(parent->LCDElement); + tmpDescr->hide(); + tmpDescr->move(ePoint(0,0)); + tmpDescr->resize(eSize(s.width(), s.height()/2)); + tmpDescr->setText(descr->getText()); + tmpDescr->show(); + } + else + { + LCDTmp->resize(s); + LCDTmp->move(ePoint(0,0)); + } + ((eNumber*)LCDTmp)->digit=digit; + ((eNumber*)LCDTmp)->active=active; + ((eNumber*)LCDTmp)->normalF=255; + ((eNumber*)LCDTmp)->normalB=0; + ((eNumber*)LCDTmp)->cursorF=0; + ((eNumber*)LCDTmp)->cursorB=255; + ((eNumber*)LCDTmp)->have_focus=1; + LCDTmp->show(); + } + #endif //DISABLE_LCD +} + +void eNumber::lostFocus() +{ +#ifndef DISABLE_LCD + if (LCDTmp) + { + delete LCDTmp; + LCDTmp=0; + if (tmpDescr) + { + delete tmpDescr; + tmpDescr=0; + } + } +#endif + have_focus--; + + if (deco && deco_selected) + invalidate(); + else + invalidate(getNumberRect(active)); + isactive=0; +} + +void eNumber::setNumber(int f, int n) +{ + if (flags & flagPosNeg) + { + if(!f && n<0) + neg=true; + else + neg=false; + } + else + neg=false; + + if ((f>=0) && (f<len)) + number[f]=abs(n); + + invalidate(getNumberRect(f)); +} + +void eNumber::setLimits(int _min, int _max) +{ + min=_min; + max=_max; + oldmax=max; +} + +void eNumber::setNumberOfFields(int n) +{ + len=n; +} + +void eNumber::setMaximumDigits(int n) +{ + if (n > 16) + n=16; + maxdigits=n; + if (digit >= maxdigits) + digit=0; +} + +void eNumber::setFlags(int _flags) +{ + if (flags&flagFixedNum) + len=2; + + flags=_flags; +} + +void eNumber::setBase(int _base) +{ + base=_base; +} + +void eNumber::setNumber(int n) +{ + if ( flags&flagPosNeg ) + neg = n < 0; + else + neg=0; + + if( len == 1 ) + number[0]=abs(n); + else + for (int i=len-1; i>=0; --i) + { + number[i]=n%base; + n/=base; + } + invalidateNum(); +} + +int eNumber::getNumber() +{ + int n=0; + for (int i=0; i<len; i++) + { + n*=base; + n+=number[i]; + } + return flags&flagPosNeg && neg ? -n : n; +} |
