From 84577f2de4fe7527319d509e2f30a80cf1cd5d5c Mon Sep 17 00:00:00 2001 From: Thor Grimner Date: Wed, 30 May 2012 22:14:30 +0200 Subject: [PATCH] gui pattern editor in place --- bin-win/gui.exe | Bin 61454 -> 72206 bytes gui/loader.c | 2 +- gui/main.c | 17 +-- gui/renderer.c | 61 ++++++-- gui/renderer.h | 5 +- gui/ui.c | 383 ++++++++++++++++++++++++++++++++++++++++++++++-- gui/ui.h | 14 ++ ptn/face.bmp | Bin 2168 -> 3184 bytes 8 files changed, 438 insertions(+), 44 deletions(-) diff --git a/bin-win/gui.exe b/bin-win/gui.exe index 3d2d78a5301e55ca94cdf00a00024cb6e32004ca..203426d5bf408ca5f08bee9dabfadc7d2cac3e59 100755 GIT binary patch literal 72206 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 literal 61454 zcmeFa4|r77wKjexnLvnvi5fI2)K(=evFQjM;p#u-Mt0yZ0-nc8RwQI884BsUj9b=OV;?2)=`iD z$WQ|wTL{GQcbido+vtV!{qqrTBA^)$g=)m(`12XJ)sHUIh?z)e$HQ=^0|`;!`7R!( zU{5i~0E47=K*6m4ea4vj(YLQ$$@iD00LPnHkaCv0Sd}X}gf5Li$n>s7Nrgf$cV-da zL|5g&W4Wwb$DiQ&mq@u@!l7Hi`^15SDDmPU|9bmpHBcP-FxZw_H+#mX{~L-fBLFkLNR*^v?;gtkS_21;m1b|eiP)odmM;d9d= z+6JMA4B^}iqJQ~2T_lNwbH@<&Q9P`WuvY` zJl@q+TeIoHxO6rlo&HpOI`o?vHdDh8X43Z!qki>OlWGu@UH2mMP|+lWBB=PtY_JgQ zba^V!Swlmf%BK;Itq*R`ym?-O+nDq)vifhF^dko6O!^^$z+a=knUsP^jsHT!Z%#Uw zuvZ*(Nk7u{lF;?9L@jSbVFcE!GP;_!K-{kA&$K*a-){XD-W|D5VeYLu_x0eYVi^(K z*-WU_`CI1##`3io8eCf2nyaaatg6_^N>ba|)%x}LG%0DePCF$&O>}b=(kkB$qzTKd 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 diff --git a/gui/loader.c b/gui/loader.c index 2d3a460..4db27ff 100755 --- a/gui/loader.c +++ b/gui/loader.c @@ -44,7 +44,7 @@ void image_convert(uint8_t *p_data) { for(y=0;ydata)[4],((uint16_t*)p_item->data)[0],((uint16_t*)p_item->data)[1]); + view=VIEW_EDIT; return true; } else if(p_ui==top[TOP_DEL]) { ui_list_remove(top[TOP_LIST],ui_list_selected(top[TOP_LIST])); @@ -221,11 +223,6 @@ static bool top_event(SDL_Event *event) { case 1: quit = 1; // Set time to quit return true; - /*default: // keylogger - char text[10]; - sprintf(text,"%i %i",((list_t*)top[TOP_LIST]->obj)->count,event->key.keysym.scancode); - ui_list_add(top[TOP_LIST],text,0); - */ } break; } @@ -532,7 +529,7 @@ int main( int argc, char *argv[] ) { // build edit pattern view vedit=ui_fsview(); - //edit[EDIT_GRID]=ui_add(vedit,ui_grid(1,1,38,23)); + edit[EDIT_GRID]=ui_add(vedit,ui_grid(1,1,38,23)); edit[EDIT_OK]=ui_add(vedit,ui_button(18,26,"OK")); // build start emulator view @@ -564,10 +561,6 @@ int main( int argc, char *argv[] ) { free(p_text); strcpy(p_item->data,p_mach->name); } - // TODO: remove - // p_mach=machine_get(0); - // ui_enable(top[TOP_ADD],true); - // ENDTODO // initial info text ui_field_add(top[TOP_INFO],"CLICK FORMAT\nTO SELECT AND\nBEGIN WORKING\nWITH A SPECIFIC\nKNITTING MACHINE"); diff --git a/gui/renderer.c b/gui/renderer.c index be5aa45..4b70953 100755 --- a/gui/renderer.c +++ b/gui/renderer.c @@ -14,22 +14,22 @@ typedef struct { uint8_t nchar; uint8_t cfont; uint8_t nfont; - int8_t ofsx; - int8_t ofsy; + int8_t ofs; + int8_t bgc; int16_t tick; } termchar_t; static termchar_t *term; uint8_t r_w, r_h; static SDL_Surface *font; -static const char font_chars[] = "#!\"cù% '()|+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZú®¯³ÄÙÀÚ¿´ÃºÍ¼ÈÉ»awdsgyhbnvtumcri"; +static const char font_chars[] = "#!\"cù%ñ'()|+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZú®¯³ÄÙÀÚ¿´ÃºÍ¼ÈÉ»awdsgyhbnvtumcri"; static uint8_t write_index = 0; #ifdef SDL2 static SDL_Renderer *renderer; #endif static SDL_Surface *screen; static SDL_Surface *bg; -static char cx = -1, cy, ct; +static char cx = -1, cy, ct, cs; #ifdef SDL2 static SDL_PixelFormat fmt_rgb = { @@ -52,10 +52,11 @@ static SDL_PixelFormat fmt_rgb = { #define ABS( v ) ( v < 0 ? -v : v ) #define TERM( x, y ) term[ (y) * r_w + (x) ] -void r_cins( unsigned char x, unsigned char y ) { +void r_cins( unsigned char x, unsigned char y, unsigned char style ) { cx = x; cy = y; ct = 0; + cs = style; } void r_crem() { @@ -225,20 +226,35 @@ void r_draw() { } if( TERM( x, y ).cchar ) { - dstrect.x = ( x << 4 ) + TERM( x, y ).ofsx; - dstrect.y = ( y << 4 ) + TERM( x, y ).ofsy; + dstrect.x = ( x << 4 ) + TERM( x, y ).ofs; + dstrect.y = ( y << 4 ) + TERM( x, y ).ofs; srcrect.x = TERM( x, y ).cchar << 4; srcrect.y = ( TERM( x, y ).tick >= 0 ? TERM( x, y ).tick << 4 : 240 ) + TERM( x, y ).cfont * 256; + if( TERM( x, y ).bgc ) { + SDL_FillRect( screen, &dstrect, 0 ); + } SDL_BlitSurface( font, &srcrect, screen, &dstrect ); } } } if( cx >= 0 ) { - srcrect.x = 0; - srcrect.y = ( ct > 15 ? 240 : ct << 4 ); - dstrect.x = cx << 4; - dstrect.y = cy << 4; - SDL_BlitSurface( font, &srcrect, screen, &dstrect ); + if( cs == 0 ) { + srcrect.x = 0; + srcrect.y = ( ct > 15 ? 240 : ct << 4 ); + dstrect.x = cx << 4; + dstrect.y = cy << 4; + SDL_BlitSurface( font, &srcrect, screen, &dstrect ); + } else { + for( x = 0; x < 2; x++ ) { + for( y = 0; y < 2; y++ ) { + srcrect.x = TERM( x + cx, y + cy ).cchar << 4;; + srcrect.y = ( ( ( ct - ( ( x + y ) << 1 ) ) & 31 ) > 15 ? 240 : ( ( ct - ( ( x + y ) << 1 ) ) & 31 ) << 4 ); + dstrect.x = ( x + cx ) << 4; + dstrect.y = ( y + cy ) << 4; + SDL_BlitSurface( font, &srcrect, screen, &dstrect ); + } + } + } if( ++ct == 32 ) ct = 0; } #ifdef SDL2 @@ -295,12 +311,26 @@ void r_button( unsigned char x, unsigned char y, char*caption, unsigned char fb, free(buf); } +void r_char( unsigned char x, unsigned char y, char c, unsigned char f, unsigned char b ) { + unsigned char j; + for( j = 0; j < sizeof( font_chars ) - 1; j++ ) { + if( font_chars[ j ] == c || c == ' ' ) { + if( TERM( x, y ).nchar != j || TERM( x, y ).nfont != f ) { + TERM( x, y ).nchar = j; + TERM( x, y ).nfont = f; + TERM( x, y ).bgc = b; + TERM( x, y ).tick = -( x + y ); + } + } + } +} + void r_write( unsigned char x, unsigned char y, char *s, unsigned char f ) { unsigned char i, j, t = 0; int len = strlen( s ); for( i = 0; i < len; i++ ) { for( j = 0; j < sizeof( font_chars ) - 1; j++ ) { - if( font_chars[ j ] == s[ i ] ) { + if( font_chars[ j ] == s[ i ] || s[ i ] == ' ' ) { if( TERM( x, y ).nchar != j || TERM( x, y ).nfont != f ) { TERM( x, y ).nchar = j; TERM( x, y ).nfont = f; @@ -354,12 +384,11 @@ void r_shine( unsigned char _x, unsigned char _y, unsigned char w, unsigned char } } -void r_offset( unsigned char _x, unsigned char _y, unsigned char w, unsigned char h, char ox, char oy ) { +void r_offset( unsigned char _x, unsigned char _y, unsigned char w, unsigned char h, char o ) { unsigned char x, y; for(y=0;y #ifdef SDL2 #include +#include #else #include +#define SDL_Keycode SDLKey #endif #include "renderer.h" #include "ui.h" /** GENERICS ********************************************************/ +static bool was_fullscreen=true; + SDL_mutex *mx_ui; void ui_init() { @@ -71,6 +75,329 @@ view_t* ui_view(uint8_t w,uint8_t h,char *caption) { return p_obj; } +/** GRID EDITOR *****************************************************/ + +uiobj_t* ui_grid(uint8_t x,uint8_t y,uint8_t w,uint8_t h) { + uiobj_t *p_ui=malloc(sizeof(uiobj_t)); + grid_t *p_obj=malloc(sizeof(grid_t)); + p_ui->x=x; + p_ui->y=y; + p_ui->w=w; + p_ui->h=h; + p_obj->l=0; + p_obj->t=0; + p_obj->x=0; + p_obj->y=0; + p_obj->data=NULL; + p_ui->type=UI_GRID; + p_ui->obj=p_obj; + return p_ui; +} + +void ui_grid_set(uiobj_t *p_ui,void *p_data,uint16_t w,uint16_t h) { + grid_t *p_grid=p_ui->obj; + p_grid->data=p_data; + p_grid->l=0; + p_grid->t=0; + p_grid->x=0; + p_grid->y=0; + p_grid->w=w; + p_grid->h=h; + p_ui->state=1; +} + +static bool grid_cset(uiobj_t *p_ui,int16_t x,int16_t y,char c,uint8_t bg) { + grid_t *p_grid=p_ui->obj; + view_t *p_view=p_ui->view; + uint8_t ax,ay; + if((x<0)||(x-(int16_t)p_grid->l>=0)) { + if((y<0)||(y-(int16_t)p_grid->t>=0)) { + if((x<0)||((x-(int16_t)p_grid->l)w)) { + if((y<0)||((y-(int16_t)p_grid->t)h)) { + if(x==-1) { + ax=p_ui->x+p_view->x-1; + } else if(x==-2) { + ax=p_ui->x+p_view->x+p_ui->w; + } else { + ax=x+p_ui->x+p_view->x-p_grid->l; + } + if(y==-1) { + ay=p_ui->y+p_view->y-1; + } else if(y==-2) { + ay=p_ui->y+p_view->y+p_ui->h; + } else { + ay=y+p_ui->y+p_view->y-p_grid->t; + } + r_char(ax,ay,c,0,bg); + return true; + } + } + } + } + return false; +} + +static void grid_focus(uiobj_t *p_ui) { +/* grid_t *p_grid=p_ui->obj; + view_t *p_view=p_ui->view; + if(p_grid->data) { + r_cins(p_ui->x+p_view->x-p_grid->l+p_grid->x*3+2,p_ui->y+p_view->y-p_grid->t+p_grid->y*3+2); + } +*/ + grid_t *p_grid=p_ui->obj; + view_t *p_view=p_ui->view; + if(p_grid->data) { + r_cins(p_ui->x+p_view->x-p_grid->l+p_grid->x*2+1,p_ui->y+p_view->y-p_grid->t+p_grid->y*2+1,1); + } + +} + +static void grid_draw(uiobj_t *p_ui) { +/* grid_t *p_grid=p_ui->obj; + view_t *p_view=p_ui->view; + uint16_t x,y; + uint8_t bg; + if(p_ui->state&9) { + r_white(p_ui->x+p_view->x-1,p_ui->y+p_view->y-1,p_ui->w+2,p_ui->h+2); + if(p_grid->data) { + for(y=1;y<3*p_grid->h+1;y++) { + grid_cset(p_ui,0,y,'h',0); + grid_cset(p_ui,p_grid->w*3+1,y,'g',0); + if(((y-1)%15)==0) { + grid_cset(p_ui,-1,y ,'0'+(((y-1)/300)%10),0); + grid_cset(p_ui,-1,y+1,'0'+(((y-1)/ 30)%10),0); + grid_cset(p_ui,-1,y+2,'0'+(((y-1)/ 3)%10),0); + grid_cset(p_ui,-2,y ,'0'+(((y-1)/300)%10),0); + grid_cset(p_ui,-2,y+1,'0'+(((y-1)/ 30)%10),0); + grid_cset(p_ui,-2,y+2,'0'+(((y-1)/ 3)%10),0); + } + } + for(x=1;x<3*p_grid->w+1;x++) { + grid_cset(p_ui,x,0,'b',0); + grid_cset(p_ui,x,p_grid->h*3+1,'y',0); + if(((x-1)%15)==0) { + grid_cset(p_ui,x ,-1,'0'+(((x-1)/300)%10),0); + grid_cset(p_ui,x+1,-1,'0'+(((x-1)/ 30)%10),0); + grid_cset(p_ui,x+2,-1,'0'+(((x-1)/ 3)%10),0); + grid_cset(p_ui,x ,-2,'0'+(((x-1)/300)%10),0); + grid_cset(p_ui,x+1,-2,'0'+(((x-1)/ 30)%10),0); + grid_cset(p_ui,x+2,-2,'0'+(((x-1)/ 3)%10),0); + } + } + grid_cset(p_ui,0,0,'m',0); + grid_cset(p_ui,p_grid->w*3+1,0,'c',0); + grid_cset(p_ui,0,p_grid->h*3+1,'r',0); + grid_cset(p_ui,p_grid->w*3+1,p_grid->h*3+1,'i',0); + for(y=0;yh;y++) { + for(x=0;xw;x++) { + bg=(p_grid->data[x+y*p_grid->w]<0x80)?1:0; + grid_cset(p_ui,x*3+1,y*3+1,'t',bg); + grid_cset(p_ui,x*3+2,y*3+1,'y',bg); + grid_cset(p_ui,x*3+3,y*3+1,'u',bg); + grid_cset(p_ui,x*3+1,y*3+2,'g',bg); + grid_cset(p_ui,x*3+2,y*3+2,'ñ',bg); + grid_cset(p_ui,x*3+3,y*3+2,'h',bg); + grid_cset(p_ui,x*3+1,y*3+3,'v',bg); + grid_cset(p_ui,x*3+2,y*3+3,'b',bg); + grid_cset(p_ui,x*3+3,y*3+3,'n',bg); + } + } + if(p_grid->l) for(y=0;yh-0;y++) { + r_char(p_ui->x+p_view->x,p_ui->y+p_view->y+y,'a',0,0); + } + if(p_grid->w*3+2-p_grid->l>p_ui->w) for(y=0;yh-0;y++) { + r_char(p_ui->x+p_view->x+p_ui->w-1,p_ui->y+p_view->y+y,'d',0,0); + } + if(p_grid->t) for(x=0;xw-0;x++) { + r_char(p_ui->x+p_view->x+x,p_ui->y+p_view->y,'w',0,0); + } + if(p_grid->h*3+2-p_grid->t>p_ui->h) for(x=0;xw-0;x++) { + r_char(p_ui->x+p_view->x+x,p_ui->y+p_view->y+p_ui->h-1,'s',0,0); + } + if(p_ui->state&8) { + r_done(p_ui->x+p_view->x-1,p_ui->y+p_view->y-1,p_ui->w+2,p_ui->h+2); + } + } + } + if(p_ui->state&4) { + grid_focus(p_ui); + } + p_ui->state=0; +*/ + grid_t *p_grid=p_ui->obj; + view_t *p_view=p_ui->view; + uint16_t x,y; + uint8_t bg; + if(p_ui->state&9) { + r_white(p_ui->x+p_view->x-1,p_ui->y+p_view->y-1,p_ui->w+2,p_ui->h+2); + if(p_grid->data) { + for(y=1;y<2*p_grid->h+1;y++) { + grid_cset(p_ui,0,y,'h',0); + grid_cset(p_ui,p_grid->w*2+1,y,'g',0); + if(((y-1)%10)==0) { + grid_cset(p_ui,-1,y ,'0'+(((y-1)/200)%10),0); + grid_cset(p_ui,-1,y+1,'0'+(((y-1)/ 20)%10),0); + grid_cset(p_ui,-1,y+2,'0'+(((y-1)/ 2)%10),0); + grid_cset(p_ui,-2,y ,'0'+(((y-1)/200)%10),0); + grid_cset(p_ui,-2,y+1,'0'+(((y-1)/ 20)%10),0); + grid_cset(p_ui,-2,y+2,'0'+(((y-1)/ 2)%10),0); + } + } + for(x=1;x<2*p_grid->w+1;x++) { + grid_cset(p_ui,x,0,'b',0); + grid_cset(p_ui,x,p_grid->h*2+1,'y',0); + if(((x-1)%10)==0) { + grid_cset(p_ui,x ,-1,'0'+(((x-1)/200)%10),0); + grid_cset(p_ui,x+1,-1,'0'+(((x-1)/ 20)%10),0); + grid_cset(p_ui,x+2,-1,'0'+(((x-1)/ 2)%10),0); + grid_cset(p_ui,x ,-2,'0'+(((x-1)/200)%10),0); + grid_cset(p_ui,x+1,-2,'0'+(((x-1)/ 20)%10),0); + grid_cset(p_ui,x+2,-2,'0'+(((x-1)/ 2)%10),0); + } + } + grid_cset(p_ui,0,0,'m',0); + grid_cset(p_ui,p_grid->w*2+1,0,'c',0); + grid_cset(p_ui,0,p_grid->h*2+1,'r',0); + grid_cset(p_ui,p_grid->w*2+1,p_grid->h*2+1,'i',0); + for(y=0;yh;y++) { + for(x=0;xw;x++) { + bg=(p_grid->data[x+y*p_grid->w]<0x80)?1:0; + grid_cset(p_ui,x*2+1,y*2+1,'t',bg); + grid_cset(p_ui,x*2+2,y*2+1,'u',bg); + grid_cset(p_ui,x*2+1,y*2+2,'v',bg); + grid_cset(p_ui,x*2+2,y*2+2,'n',bg); + } + } + if(p_grid->l) for(y=0;yh-0;y++) { + r_char(p_ui->x+p_view->x,p_ui->y+p_view->y+y,'a',0,0); + } + if(p_grid->w*2+2-p_grid->l>p_ui->w) for(y=0;yh-0;y++) { + r_char(p_ui->x+p_view->x+p_ui->w-1,p_ui->y+p_view->y+y,'d',0,0); + } + if(p_grid->t) for(x=0;xw-0;x++) { + r_char(p_ui->x+p_view->x+x,p_ui->y+p_view->y,'w',0,0); + } + if(p_grid->h*2+2-p_grid->t>p_ui->h) for(x=0;xw-0;x++) { + r_char(p_ui->x+p_view->x+x,p_ui->y+p_view->y+p_ui->h-1,'s',0,0); + } + if(p_ui->state&8) { + r_done(p_ui->x+p_view->x-1,p_ui->y+p_view->y-1,p_ui->w+2,p_ui->h+2); + } + } + } + if(p_ui->state&4) { + grid_focus(p_ui); + } + p_ui->state=0; +} + +static bool grid_key(uiobj_t *p_ui,SDL_Keycode sym) { +/* + grid_t *p_grid=p_ui->obj; + switch(sym) { + case SDLK_LEFT: + if(p_grid->x>0) { + p_grid->x--; + p_ui->state|=4; + } + break; + case SDLK_RIGHT: + if(p_grid->xw-1) { + p_grid->x++; + p_ui->state|=4; + } + break; + case SDLK_UP: + if(p_grid->y>0) { + p_grid->y--; + p_ui->state|=4; + } + break; + case SDLK_DOWN: + if(p_grid->yh-1) { + p_grid->y++; + p_ui->state|=4; + } + break; + case SDLK_SPACE: + p_grid->data[p_grid->x+p_grid->y*p_grid->w]=p_grid->data[p_grid->x+p_grid->y*p_grid->w]<0x80?0xFF:0x00; + p_ui->state|=8; + return true; + } + + if((p_grid->x*3+2)-2l) { + p_grid->l=(p_grid->x*3+2)-2; + p_ui->state|=8; + } else if( (p_grid->x*3+2)+3>p_grid->l+p_ui->w ) { + p_grid->l=(p_grid->x*3+2)+3-p_ui->w; + p_ui->state|=8; + } + + if((p_grid->y*3+2)-2t) { + p_grid->t=(p_grid->y*3+2)-2; + p_ui->state|=8; + } else if( (p_grid->y*3+2)+3>p_grid->t+p_ui->h ) { + p_grid->t=(p_grid->y*3+2)+3-p_ui->h; + p_ui->state|=8; + } + + + return false; +*/ + grid_t *p_grid=p_ui->obj; + switch(sym) { + case SDLK_LEFT: + if(p_grid->x>0) { + p_grid->x--; + p_ui->state|=4; + } + break; + case SDLK_RIGHT: + if(p_grid->xw-1) { + p_grid->x++; + p_ui->state|=4; + } + break; + case SDLK_UP: + if(p_grid->y>0) { + p_grid->y--; + p_ui->state|=4; + } + break; + case SDLK_DOWN: + if(p_grid->yh-1) { + p_grid->y++; + p_ui->state|=4; + } + break; + case SDLK_SPACE: + p_grid->data[p_grid->x+p_grid->y*p_grid->w]=p_grid->data[p_grid->x+p_grid->y*p_grid->w]<0x80?0xFF:0x00; + p_ui->state|=8; + break; + default: + return true; + } + + if((p_grid->x*2+2)-2l) { + p_grid->l=(p_grid->x*2+2)-2; + p_ui->state|=8; + } else if( (p_grid->x*2+2)+2>p_grid->l+p_ui->w ) { + p_grid->l=(p_grid->x*2+2)+2-p_ui->w; + p_ui->state|=8; + } + + if((p_grid->y*2+2)-2t) { + p_grid->t=(p_grid->y*2+2)-2; + p_ui->state|=8; + } else if( (p_grid->y*2+2)+2>p_grid->t+p_ui->h ) { + p_grid->t=(p_grid->y*2+2)+2-p_ui->h; + p_ui->state|=8; + } + + return sym=SDLK_SPACE; + +} + /** TEXT INPUT ******************************************************/ uiobj_t* ui_text(uint8_t x,uint8_t y,uint8_t w,char *caption) { @@ -136,10 +463,10 @@ static void text_draw(uiobj_t *p_ui) { static void text_focus(uiobj_t *p_ui) { text_t *p_text=p_ui->obj; view_t *p_view=p_ui->view; - r_cins(p_view->x+p_ui->x+strlen(p_text->caption)+strlen(p_text->text),p_view->y+p_ui->y); + r_cins(p_view->x+p_ui->x+strlen(p_text->caption)+strlen(p_text->text),p_view->y+p_ui->y,0); } -static bool text_key(uiobj_t *p_ui,uint8_t sym) { +static bool text_key(uiobj_t *p_ui,SDL_Keycode sym) { text_t *p_text=p_ui->obj; char key[2]; if((sym>=SDLK_0&&sym<=SDLK_9)||sym==SDLK_BACKSPACE) { @@ -524,6 +851,8 @@ static void ui_refresh(view_t *p_view) { break; case UI_TEXT: text_draw(p_ui); break; + case UI_GRID: grid_draw(p_ui); + break; } p_ui=p_ui->next; } @@ -548,7 +877,7 @@ static void ui_focusprev(view_t *p_view) { if(p_ui&&p_ui!=p_view->focus) { if(p_ui->enabled) { switch(p_ui->type) { - case UI_TEXT: + case UI_TEXT: case UI_GRID: p_found=p_ui; break; } @@ -561,6 +890,9 @@ static void ui_focusprev(view_t *p_view) { case UI_TEXT: text_focus(p_found); break; + case UI_GRID: + grid_focus(p_found); + break; } } } @@ -578,6 +910,10 @@ static void ui_focusnext(view_t *p_view) { p_view->focus=p_ui; text_focus(p_ui); return; + case UI_GRID: + p_view->focus=p_ui; + grid_focus(p_ui); + return; } } } @@ -611,17 +947,21 @@ void ui_display(view_t *p_view,bool(*events)(SDL_Event *e)) { if(!p_view->fullscreen) { r_white(p_view->x-3,p_view->y-3,p_view->w+6,p_view->h+6); r_box(p_view->x-2,p_view->y-2,p_view->w+4,p_view->h+4,p_view->caption,0,3); - } else if(p_view->state==1) { - r_white(0,0,40,30); - p_view->state=2; + } else { + r_white(0,0,40,30); + if(was_fullscreen) { + p_view->state=0; + } else { + p_view->state=1; + } } + was_fullscreen=p_view->fullscreen; while(!done) { SDL_mutexP(mx_ui); ui_refresh(p_view); - if(p_view->fullscreen&p_view->state==0) p_view->state=1; - if(p_view->state==2) { + if(p_view->state==1) { r_done(0,0,40,30); - p_view->state=1; + p_view->state=2; } r_draw(); while(SDL_PollEvent(&e)) { @@ -663,6 +1003,13 @@ void ui_display(view_t *p_view,bool(*events)(SDL_Event *e)) { done|=events(&e); } break; + case UI_GRID: + if(grid_key(p_view->focus,e.key.keysym.sym)) { + e.type=UI_CHANGE; + e.user.data1=p_view->focus; + done|=events(&e); + } + break; } } } @@ -674,9 +1021,9 @@ void ui_display(view_t *p_view,bool(*events)(SDL_Event *e)) { if(p_ui!=p_ui_over) { if(p_ui_down) { if(p_ui==p_ui_down) { - r_offset(p_ui_down->x+p_view->x,p_ui_down->y+p_view->y,p_ui_down->w,p_ui_down->h,2,2); + r_offset(p_ui_down->x+p_view->x,p_ui_down->y+p_view->y,p_ui_down->w,p_ui_down->h,2); } else { - r_offset(p_ui_down->x+p_view->x,p_ui_down->y+p_view->y,p_ui_down->w,p_ui_down->h,0,0); + r_offset(p_ui_down->x+p_view->x,p_ui_down->y+p_view->y,p_ui_down->w,p_ui_down->h,0); } } else { if(p_ui_over) { @@ -713,8 +1060,18 @@ void ui_display(view_t *p_view,bool(*events)(SDL_Event *e)) { p_ui_down=find(p_view,x,y); if(p_ui_down) { switch(p_ui_down->type) { + case UI_GRID: + if(x>p_ui->x+p_view->x&&xx+p_view->x+p_ui->w-1 + &&y>p_ui->y+p_view->y&&yy+p_view->y+p_ui->h-1) { + ((grid_t*)p_ui->obj)->x=(x-(p_ui->x+p_view->x)+((grid_t*)p_ui->obj)->l-1)>>1; + ((grid_t*)p_ui->obj)->y=(y-(p_ui->y+p_view->y)+((grid_t*)p_ui->obj)->t-1)>>1; + p_view->focus=p_ui_down; + grid_focus(p_ui_down); + grid_key(p_ui_down,SDLK_SPACE); + } + break; case UI_BUTTON: case UI_TEXT: - r_offset(p_ui->x+p_view->x,p_ui->y+p_view->y,p_ui->w,p_ui->h,2,2); + r_offset(p_ui->x+p_view->x,p_ui->y+p_view->y,p_ui->w,p_ui->h,2); break; case UI_LIST: x-=p_ui->x+p_view->x; @@ -736,7 +1093,7 @@ void ui_display(view_t *p_view,bool(*events)(SDL_Event *e)) { case SDL_MOUSEBUTTONUP: if(e.button.button==1) { if(p_ui_down) { - r_offset(p_ui_down->x+p_view->x,p_ui_down->y+p_view->y,p_ui_down->w,p_ui_down->h,0,0); + r_offset(p_ui_down->x+p_view->x,p_ui_down->y+p_view->y,p_ui_down->w,p_ui_down->h,0); if(p_ui_over==p_ui_down) { e.type=UI_CLICK; e.user.data1=p_ui_down; diff --git a/gui/ui.h b/gui/ui.h index a4ef8b4..042f738 100755 --- a/gui/ui.h +++ b/gui/ui.h @@ -19,6 +19,16 @@ typedef struct { uint16_t top; } list_t; +typedef struct { + uint16_t l; + uint16_t t; + uint16_t x; + uint16_t y; + uint16_t w; + uint16_t h; + uint8_t *data; +} grid_t; + typedef struct { char *caption; } button_t; @@ -63,6 +73,7 @@ enum { UI_LIST='L', UI_FIELD='F', UI_TEXT='T', + UI_GRID='G', UI_END=' ' }; @@ -81,6 +92,9 @@ view_t* ui_fsview(); view_t* ui_view(uint8_t w,uint8_t h,char *caption); void ui_free_view(view_t *p_view); +uiobj_t* ui_grid(uint8_t x,uint8_t y,uint8_t w,uint8_t h); +void ui_grid_set(uiobj_t *p_ui,void *p_data,uint16_t w,uint16_t h); + uiobj_t* ui_text(uint8_t x,uint8_t y,uint8_t w,char *caption); void ui_text_set(uiobj_t *p_ui,char *p_text); char* ui_text_get(uiobj_t *p_ui); diff --git a/ptn/face.bmp b/ptn/face.bmp index 66cd1c1b8041bede29694d35995fe0c5bd7184f5..cf7e8477ce3753f8014589037dab2fc1f0130d27 100755 GIT binary patch literal 3184 zcmcIiF;c`p3=1_>R8$mH_W}w^dj7)y8*o-wQRLm+2DqKcMwTVnxw-d`&xfU**SIh7 zJje4A&)xDA_p-c2|M4DABjWnH**VP4@x%A=TI1}QPr}gAghBR9Fe69e|HzIZ-S}R1 z6$Zn@brnQcOW;1Y2@$Ej%0zcSst+nM-EGjd7Ro|0$xJ3RS(GXuCTIdPu^GV5NIBy7 zzjuT|NT5E9GDb`DW|+~{K}IKZR|qBe^V!@Y1GYbv&TkWpU^xTy8&scT$$?-Apd^x% zF)>SMvhjIjfF|4x0=2J&Va7+^AB_*FKyI0$Yn%*aV~&(jP8 zW$!lWbW$}8vi}~>;1;D7a9w4d(X{<J7{@;;L=+(;AyGnhlqA_D8OdImkrGj|i|oC!B{O^PS+ci`jEd})y~q2U zXS`i5KiBWP*E#3D@9((p^ZfC8c!wJ!mXi_K>mqC2w$W_^WWYmLH#d>DAS#D}fdSdF zWy8?W5F;ZavS-gujvP72nKLKG#>V8zm5bcDb7Nv+LY_Q%$eTAWrlzKtnVFFRRSFv$8%mchjjgRMWy+MHY}vBd+1X)lZ%?^$<#2FtpnUoARH#saiWMv3=;%nL zN|mTwxiVF%RH16ss#L31jq25_Q=>)=oSdAfS+gd!YSqHo*%=oX7i!n8jjO9Gb?Vf? z&CQLvb?f5p?oPdW_3-fUpnm=OG-%L(h7B9is8J&tH*QRmCQWGCv?-pRo_KkA(X3fB zyuH0?-n=B~9q8Dx zBb_>RqI2iYbm`KCu3fv*ty?#`ckhnBzdt>C^q^#j69!zLxC_{z}Vd&7IgoT9>9v;rH zVZ(@sh+z2e;fxqDf{`OfGHTQ)MvorNm@#7*J9aFQk*MKNyNIL413PjqxN6DCYx z;>3wenly>YlP5D}$`qzfoyxRn)0jSeIx}X>VCKx3%$hZe*|TReXU-hv&YjD=dGnY* ze?AKqEFdN(hJ_0kvS`sF7B61Rk|j%6x^yYamMvrX^5v{pv4YsxSXQoFNnBhUt5&UI z_3G8ES+j<|p24o$T7Ri`~0-vuDp9_U_%wzJ2@Hzkfdm4jka%!Gjz+bcn-;4|C+m5sn@`%CTd| zIDY&%2?+@#CMI&?#0ip;k~n$tB&SZD;`Hg$oH=ubvuDq8?%X-fpFhuq3m3R}@gkQl zUE=cP%Uro~g{xPua_!nRl9Q9Ue*HQ(ZrtGJ&70i1b&Hgg6mH+X&7C`UxO?|5_wL;z zH8qvAv^3Jw)46~DJ`Wx|AR{A#hYug}=+Pq{KYq-UCr^0#^eNAtJ>&WF=e&6Ff|oB} z^6J$qUcY`#W@aXD-n`-M+qb-X_m21P-}B+a2R?rM$fr-A`26`ZU%q_d>({S*`}U3R z-@o(Y#}9t~{K>Chzoh+-g&xoHhoKkfaXnFIswG;aRb;K2{ui#!rQ$MQ8bRr;+-feR za;#MTxFlFn$^ptHS9PZb%b`+HZ6tTCyGoTfB38)y8RS-3akaTn2$96r>or_>Dg*^r z=^96wO4Vy@F{Q@R{B^iGyH2T!wf+KD-Y-6j#*oRfT(K1d)kDQ~?rK+wEXATCa3L2Z z!BGivMMu*LLMPO6q|C2$l%Al0LL;S0O{VH`X#n}BxJ&OBOCZuAE$Nb&N-CE`o)wpj z^h-z9__F>FTr?JZ!PB$#9!m7T@vQyzF0!+9W|?0POV1MTlkUGbC}nZ|g(26a@AI!E GwfhZ1?I=wE