#include "Convac.h" // Edit class
void prepareField(byte l, byte t, byte r, byte b, bool andclip) {
d.flags=d.R2_ZERO;
if (andclip) d.andClip(l,t,r,b); else d.setClip(l,t,r,b);
d.fillClip();
d.flags=d.COLOR|d.R2_COPYPEN;
d.gotoXY(l,t);
}
void Edit::removeLeadingZero() {
if (cursor==maxlen && text[0]=='0') {
memmove(text,text+1,strlen);
strlen--;
cursor--;
}
}
void Edit::setText(const char*s) {
strcpy(text,s);
strlen=::strlen(s);
cursor=strlen?0xFF:0; // alles markieren oder Strichkursor
update();
}
bool Edit::handleInput(byte chr) {
if (!chr) { // Null-Byte zum Cursor blinken lassen
xorCursor();
return true;
}
switch (chr) {
case '\a': return false; // Fehlergenerator-Kode
case BS: { // Zeichen links löschen
if (cursor==0xFF) { // alles markiert?
*text=strlen=cursor=0; // alles löschen
break;
}
if (!cursor) return false; // Cursor bereits links
if (!strlen) return false; // dürfte nicht passieren
memmove(text+cursor-1,text+cursor,strlen-cursor+1);
strlen--;
cursor--;
}break;
case CUL: {
if (cursor==0xFF) cursor=strlen; // von hinten anfangen
if (!cursor) return false;
cursor--;
}break;
case CUR: {
if (cursor==0xFF) cursor=0; // von vorn anfangen
if (cursor==strlen) return false;
cursor++;
}break;
default: { // Zeichen zum Einfügen
if (cursor==0xFF) *text=strlen=cursor=0; // alles löschen
if (strlen==maxlen) return false;
memmove(text+cursor+1,text+cursor,strlen-cursor+1);
strlen++;
text[cursor++]=chr;
}
}
update();
return true;
}
void Edit::update() {
prepareField(L,T,R,B);
byte w=d.getTextExtent(text);
d.gotoXY(R-w,T);
d.print(text);
xorFocusRect(L,T,R,B);
startFocusCounter();
xorCursor();
}
void Edit::xorCursor() {
byte l=L+1;
byte t=T+2;
byte r=R-1;
byte b=B-2;
d.flags=d.COLOR|d.R2_XORPEN;
if (cursor!=0xFF) {
r-=d.getTextExtent(text+cursor); // rechtsbündig
l=r; // eine Pixelspalte
}
d.fillRect(l,t,r,b);
GPIOR0^=1;
}
Vorgefundene Kodierung: UTF-8 | 0
|