diff options
author | Chris Xiong <chirs241097@gmail.com> | 2015-10-02 23:48:34 +0800 |
---|---|---|
committer | Chris Xiong <chirs241097@gmail.com> | 2015-10-02 23:48:34 +0800 |
commit | b9d4b60486e224261990c0732852513e86dd94ff (patch) | |
tree | 9f9dd20a888875833af11dc7a67b849a74825b5b /src/ui/menuframework/menuclass.cpp | |
parent | abffe5f72dfb39da8d480ce3c4b546404684a060 (diff) | |
download | bullet-lab-remix-b9d4b60486e224261990c0732852513e86dd94ff.tar.xz |
Add BLR3 files. Modify Readme.
Currently BLR3 is VERY primitive!!
Diffstat (limited to 'src/ui/menuframework/menuclass.cpp')
-rw-r--r-- | src/ui/menuframework/menuclass.cpp | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/src/ui/menuframework/menuclass.cpp b/src/ui/menuframework/menuclass.cpp new file mode 100644 index 0000000..d135a01 --- /dev/null +++ b/src/ui/menuframework/menuclass.cpp @@ -0,0 +1,115 @@ +#include "menuframework.hpp" +#include <cstring> +#include <cmath> +SMELT* menuCtrlLCD::sm=NULL; +SMELT* menuLCD::sm=NULL; +void menuCtrlLCD::render(float x,float y) +{ + fnt->setColor(color); + fnt->render(x+skv,y,1,ALIGN_LEFT,NULL,rt); +} +void menuCtrlLCD::update() +{ + if(overlen) + { + if(selected) + { + ++scd; + if(scd>30)++scv,scd=0; + if(scv>(int)strlen(tr))scv=0; + char rr[48];sprintf(rr,"%s %s",tr,tr); + sprintf(rt,"%s %.*s",tl,(int)(maxw-strlen(tl)-1),rr+scv); + } + else + { + scv=0; + sprintf(rt,"%s %.*s...",tl,(int)(maxw-strlen(tl)-4),tr); + } + } + if(skd>0){skv=-skv;--skd;}else skd=skv=0; + if(selected) + {color=SETA(color,(int)(0x60*fabsf(sin(6*sm->smGetTime())))+0x90);} + else + color=SETA(color,0x80); +} +void menuCtrlLCD::setText(const char* l,const char* r) +{ + if(!l)l="";if(!r)r=""; + tl=l;tr=r; + if((int)(strlen(l)+strlen(r)+1)>maxw) + { + overlen=true;scv=0;scd=0; + } + else + { + overlen=false; + sprintf(rt,"%s %*s",l,(int)(maxw-strlen(l)-1),r); + } +} +void menuLCD::addCtrl(menuCtrlLCD *ctrl) +{ + if(ctrl->id==0)ctrl->selected=true;else ctrl->selected=false; + menuCtrlLCD *last=ctrls; + if(!ctrls) + { + ctrls=ctrl; + ctrl->last=0; + ctrl->next=0; + } + else + { + while(last->next)last=last->next; + last->next=ctrl; + ctrl->last=last; + ctrl->next=0; + } + ctrl->color=0x80333333; +} +menuCtrlLCD* menuLCD::getCtrl(int id) +{ + for(menuCtrlLCD* i=ctrls;i;i=i->next) + if(i->id==id)return i; + return NULL; +} +bool menuLCD::update() +{ + if(sm->smGetKeyState(SMK_DOWN)==SMKST_HIT) + { + getCtrl(selected)->selected=false; + menuCtrlLCD* c; + for(int i=selected+1;(c=getCtrl(i));++i) + {if(c->enabled){selected=i;break;}} + getCtrl(selected)->selected=true; + } + if(sm->smGetKeyState(SMK_UP)==SMKST_HIT) + { + getCtrl(selected)->selected=false; + menuCtrlLCD* c; + for(int i=selected-1;(c=getCtrl(i));++i) + {if(c->enabled){selected=i;break;}} + getCtrl(selected)->selected=true; + } + for(menuCtrlLCD* i=ctrls;i;i=i->next)i->update(); + if(sm->smGetKey()) + return getCtrl(selected)->ikp(); + else return false; +} +void menuLCD::render() +{ + int cr=rows/2+1; + getCtrl(selected)->render(x,y+(cr-1)*itemh); + menuCtrlLCD* t=getCtrl(selected); + for(int ccr=cr-1;ccr>0;--ccr) + { + if(t)t=getCtrl(t->id-1); + if(!t){fnt->setColor(0x80333333);fnt->printf(x,y+(ccr-1)*itemh,1,ALIGN_LEFT,NULL,"%*s",maxw," ");} + else t->render(x,y+(ccr-1)*itemh); + } + t=getCtrl(selected); + for(int ccr=cr+1;ccr<=rows;++ccr) + { + if(t)t=getCtrl(t->id+1); + if(!t){fnt->setColor(0x80333333);fnt->printf(x,y+(ccr-1)*itemh,1,ALIGN_LEFT,NULL,"%*s",maxw," ");} + else t->render(x,y+(ccr-1)*itemh); + } +} |