2025-01-26 18:33:45 +01:00

2470 lines
61 KiB
C

/*
Raydium - CQFD Corp.
http://raydium.org/
License: GPL - GNU General Public License, see "gpl.txt" file.
*/
#ifndef DONT_INCLUDE_HEADERS
#include "index.h"
#else
#include "headers/gui.h"
#endif
#include "gui.h"
// Disclaimer ;)
// Some part of this file are quite ugly, sorry about that.
// (mainly for combos management [strings and double drawing])
// There also a lot of duplicated code.
// Needs some internal work, but API is quite stable, now.
void raydium_gui_window_init(int window)
{
raydium_gui_Window *w;
int i;
w=&raydium_gui_windows[window];
w->state=0;
w->id=window;
w->name[0]=0;
w->pos[0]=w->pos[1]=0;
w->size[0]=w->size[1]=0;
w->focused_widget=-1;
w->old_focused=-1;
w->OnDelete=NULL;
for(i=0;i<RAYDIUM_GUI_MAX_OBJECTS;i++)
{
w->widgets[i].id=i;
w->widgets[i].name[0]=0;
w->widgets[i].state=0;
w->widgets[i].window=window;
w->widgets[i].pos[0]=w->widgets[i].pos[1]=0;
w->widgets[i].size[0]=w->widgets[i].size[1]=0;
w->widgets[i].font_size=20;
if(w->widgets[i].widget!=NULL)
{
free(w->widgets[i].widget);
w->widgets[i].widget=NULL;
}
}
}
// "One time init"
void raydium_gui_init(void)
{
int i,j;
raydium_gui_visible=0;
raydium_gui_window_focused=-1;
raydium_gui_oldstate=0;
raydium_gui_button_clicked_id=-1;
raydium_gui_widget_sizes(15,5,16);
raydium_gui_AfterGuiDrawCallback=NULL;
raydium_gui_theme_init();
// mark all windows's objetcs (widgets to NULL) ...
for(i=0;i<RAYDIUM_GUI_MAX_WINDOWS;i++)
for(j=0;j<RAYDIUM_GUI_MAX_OBJECTS;j++)
{
raydium_gui_windows[i].widgets[j].state=0;
raydium_gui_windows[i].widgets[j].widget=NULL;
}
// ... and then, get back to a regular init :
for(i=0;i<RAYDIUM_GUI_MAX_WINDOWS;i++)
raydium_gui_window_init(i);
raydium_log("gui: OK");
}
void raydium_gui_theme_init(void)
{
raydium_gui_theme_current.loaded=0;
raydium_gui_theme_current.filename[0]=0;
raydium_gui_theme_current.texture=0;
raydium_gui_theme_current.texture_size[0]=1;
raydium_gui_theme_current.texture_size[1]=1;
memset(raydium_gui_theme_current.background_uv,0,sizeof(GLfloat)*4);
strcpy(raydium_gui_theme_current.font,"font2.tga");
}
int raydium_gui_theme_load(char *filename)
{
FILE *fp;
int ret;
char var[RAYDIUM_MAX_NAME_LEN];
char val_s[RAYDIUM_MAX_NAME_LEN];
GLfloat val_f[4];
int size;
char done;
fp=raydium_file_fopen(filename,"rt");
if(!fp)
{
raydium_log("gui: ERROR: Cannot open %s theme file",filename);
return 0;
}
raydium_gui_theme_init();
strcpy(raydium_gui_theme_current.filename,filename);
while( (ret=raydium_parser_read(var,val_s,val_f,&size,fp))!=RAYDIUM_PARSER_TYPE_EOF)
{
done=0;
if(!strcasecmp(var,"texture"))
{
int t;
if(ret!=RAYDIUM_PARSER_TYPE_STRING)
{
raydium_log("gui: parser: texture: wrong type");
continue;
}
t=raydium_texture_find_by_name(val_s);
if(!t)
{
fclose(fp);
return 0;
}
raydium_gui_theme_current.texture=t;
done=1;
}
if(!strcasecmp(var,"font"))
{
int t;
if(ret!=RAYDIUM_PARSER_TYPE_STRING)
{
raydium_log("gui: parser: font: wrong type");
continue;
}
t=raydium_texture_find_by_name(val_s);
if(t)
strcpy(raydium_gui_theme_current.font,val_s);
else
raydium_log("gui: parser: load: cannt load font '%s'",val_s);
done=1;
}
if(!strcasecmp(var,"texture_size"))
{
if(ret!=RAYDIUM_PARSER_TYPE_FLOAT || size!=2)
{
raydium_log("gui: parser: texture_size: wrong type");
continue;
}
// cast floats to ints
raydium_gui_theme_current.texture_size[0]=(int)val_f[0];
raydium_gui_theme_current.texture_size[1]=(int)val_f[1];
done=1;
}
if(!strcasecmp(var,"background"))
{
if(ret!=RAYDIUM_PARSER_TYPE_FLOAT || size!=4)
{
raydium_log("gui: parser: background: wrong type");
continue;
}
memcpy(raydium_gui_theme_current.background_uv,val_f,sizeof(GLfloat)*4);
done=1;
}
/*
// We're only parsing "general" properties: no need to reports unknown ones
if(!done)
raydium_log("gui: parser: invalid or unsupported option '%s' (%s)",var,filename);
*/
}
fclose(fp);
raydium_gui_theme_current.loaded=1;
return 1;
}
signed char raydium_gui_window_isvalid(int i)
{
if(i>=0 && i<RAYDIUM_GUI_MAX_WINDOWS &&
raydium_gui_windows[i].state)
return 1;
return 0;
}
int raydium_gui_window_find(char *name)
{
int i;
for(i=0;i<RAYDIUM_GUI_MAX_WINDOWS;i++)
if(!strcmp(name,raydium_gui_windows[i].name) && raydium_gui_window_isvalid(i))
return i;
return -1;
}
signed char raydium_gui_widget_isvalid(int i, int window)
{
if(!raydium_gui_window_isvalid(window))
return 0;
if(i>=0 && i<RAYDIUM_GUI_MAX_OBJECTS &&
raydium_gui_windows[window].widgets[i].state)
return 1;
return 0;
}
int raydium_gui_widget_find(char *name, int window)
{
int i;
if(!raydium_gui_window_isvalid(window))
return -1;
for(i=0;i<RAYDIUM_GUI_MAX_OBJECTS;i++)
if(!strcmp(name,raydium_gui_windows[window].widgets[i].name) && raydium_gui_widget_isvalid(i,window))
return i;
return -1;
}
void raydium_gui_widget_next(void)
{
int i;
raydium_gui_Window *w;
if(!raydium_gui_window_isvalid(raydium_gui_window_focused))
return;
w=&raydium_gui_windows[raydium_gui_window_focused];
for(i=w->focused_widget+1;i<RAYDIUM_GUI_MAX_OBJECTS;i++)
if(raydium_gui_widget_isvalid(i,raydium_gui_window_focused) && w->widgets[i].type!=RAYDIUM_GUI_LABEL)
{
w->focused_widget=i;
return;
}
// Not found : rewind
for(i=0;i<RAYDIUM_GUI_MAX_OBJECTS;i++)
if(raydium_gui_widget_isvalid(i,raydium_gui_window_focused) && w->widgets[i].type!=RAYDIUM_GUI_LABEL)
{
w->focused_widget=i;
return;
}
}
void raydium_gui_widget_focus(int widget, int window)
{
if(!raydium_gui_window_isvalid(raydium_gui_window_focused))
{
raydium_log("gui: error: cannot set focus: invalid window");
return;
}
if(raydium_gui_widget_isvalid(widget,raydium_gui_window_focused))
{
//printf("%i %i\n",widget,raydium_gui_window_focused);
raydium_gui_windows[raydium_gui_window_focused].focused_widget=widget;
}
else
raydium_log("gui: error: cannot set focus: invalid widget");
}
void raydium_gui_widget_focus_name(char *widget, char *window)
{
int w;
w=raydium_gui_window_find(window);
raydium_gui_widget_focus(raydium_gui_widget_find(widget,w),w);
}
void raydium_gui_widget_draw_internal(GLfloat *uv, GLfloat *xy)
{
raydium_osd_start();
raydium_texture_current_set(raydium_gui_theme_current.texture);
raydium_rendering_internal_prepare_texture_render(raydium_gui_theme_current.texture);
glBegin(GL_QUADS);
glTexCoord2f(uv[0],uv[1]);
glVertex3f(xy[0],xy[3],0);
glTexCoord2f(uv[2],uv[1]);
glVertex3f(xy[2],xy[3],0);
glTexCoord2f(uv[2],uv[3]);
glVertex3f(xy[2],xy[1],0);
glTexCoord2f(uv[0],uv[3]);
glVertex3f(xy[0],xy[1],0);
glEnd();
raydium_osd_stop();
}
///////////////////////////
// final Widgets drawing //
///////////////////////////
void raydium_gui_button_draw(int w, int window)
{
GLfloat uv[4];
GLfloat xy[4];
GLfloat fxy[2];
GLfloat mxy[2];
GLfloat wfactor[2];
GLfloat *suv;
GLfloat tmp;
char style;
char substyle;
raydium_gui_Button *b;
if(!raydium_gui_window_isvalid(window))
return;
if(!raydium_gui_widget_isvalid(w,window))
return;
b=raydium_gui_windows[window].widgets[w].widget;
mxy[0]= ((float)raydium_mouse_x/raydium_window_tx)*100;
mxy[1]=100-((float)raydium_mouse_y/raydium_window_ty)*100;
wfactor[0]=raydium_gui_windows[window].size[0]/100.;
wfactor[1]=raydium_gui_windows[window].size[1]/100.;
xy[0]=raydium_gui_windows[window].pos[0]+
(raydium_gui_windows[window].widgets[w].pos[0]*wfactor[0]);
xy[1]=raydium_gui_windows[window].pos[1]+
(raydium_gui_windows[window].widgets[w].pos[1]*wfactor[1]);
xy[2]=raydium_gui_windows[window].pos[0] +
(raydium_gui_windows[window].widgets[w].pos[0]*wfactor[0]) +
raydium_gui_windows[window].widgets[w].size[0];
xy[3]=raydium_gui_windows[window].pos[1] +
(raydium_gui_windows[window].widgets[w].pos[1]*wfactor[1]) +
raydium_gui_windows[window].widgets[w].size[1];
style=RAYDIUM_GUI_NORMAL;
substyle=RAYDIUM_GUI_NORMAL;
if(raydium_gui_windows[window].focused_widget==w)
{
style=RAYDIUM_GUI_FOCUS;
substyle=RAYDIUM_GUI_FOCUS;
}
if(raydium_gui_window_focused==window &&
(mxy[0]>=xy[0] && mxy[1]>=xy[1] &&
mxy[0]<=xy[2] && mxy[1]<=xy[3] ))
style=RAYDIUM_GUI_HOVER;
// uv
switch(style)
{
case RAYDIUM_GUI_NORMAL:
suv=b->uv_normal;
break;
case RAYDIUM_GUI_FOCUS:
suv=b->uv_focus;
break;
case RAYDIUM_GUI_HOVER:
suv=b->uv_hover;
break;
}
uv[0]= suv[0]/raydium_gui_theme_current.texture_size[0];
uv[1]=1-suv[1]/raydium_gui_theme_current.texture_size[1];
uv[2]= (suv[0] + suv[2]) / raydium_gui_theme_current.texture_size[0];
uv[3]=1-(suv[1] + suv[3]) / raydium_gui_theme_current.texture_size[1];
raydium_gui_widget_draw_internal(uv,xy);
if(strlen(b->caption)>0)
{
fxy[0]=xy[0]+(xy[2]-xy[0])/2;
fxy[1]=xy[1]+(xy[3]-xy[1])/2;
if(strlen(b->caption)>1)
{
tmp=raydium_gui_windows[window].widgets[w].font_size/RAYDIUM_OSD_FONT_SIZE_FACTOR;
tmp=((strlen(b->caption)-1)*tmp)/2;
}
else
tmp=0;
raydium_osd_color_change(b->font_color[0],b->font_color[1],b->font_color[2]);
raydium_osd_printf(fxy[0]-tmp,fxy[1],
raydium_gui_windows[window].widgets[w].font_size,
0.5,raydium_gui_theme_current.font,"%s",b->caption);
} // end caption drawing
// Events management
// Here, I consider that HOVER (mouse) have priority over FOCUS for Enter key
if( raydium_gui_window_focused==window &&
((style==RAYDIUM_GUI_HOVER && raydium_mouse_click==1) ||
((style==RAYDIUM_GUI_FOCUS || substyle==RAYDIUM_GUI_FOCUS) && raydium_key_last==1013)) )
{
void (*f)(raydium_gui_Object *);
raydium_key_last=0;
raydium_mouse_click=0;
raydium_mouse_button[0]=0;
raydium_gui_windows[window].focused_widget=w;
f=b->OnClick;
if(f)
f(&raydium_gui_windows[window].widgets[w]);
raydium_gui_button_clicked_id=window*1000+w;
}
}
void raydium_gui_zone_draw(int w, int window)
{
raydium_gui_Zone *z;
GLfloat xy[4];
GLfloat mxy[2];
GLfloat wfactor[2];
char style;
GLfloat *col;
if(!raydium_gui_window_isvalid(window))
return;
if(!raydium_gui_widget_isvalid(w,window))
return;
z=raydium_gui_windows[window].widgets[w].widget;
mxy[0]= ((float)raydium_mouse_x/raydium_window_tx)*100;
mxy[1]=100-((float)raydium_mouse_y/raydium_window_ty)*100;
wfactor[0]=raydium_gui_windows[window].size[0]/100.;
wfactor[1]=raydium_gui_windows[window].size[1]/100.;
xy[0]=raydium_gui_windows[window].pos[0]+
(raydium_gui_windows[window].widgets[w].pos[0]*wfactor[0]);
xy[1]=raydium_gui_windows[window].pos[1]+
(raydium_gui_windows[window].widgets[w].pos[1]*wfactor[1]);
xy[2]=raydium_gui_windows[window].pos[0] +
(raydium_gui_windows[window].widgets[w].pos[0]*wfactor[0]) +
raydium_gui_windows[window].widgets[w].size[0];
xy[3]=raydium_gui_windows[window].pos[1] +
(raydium_gui_windows[window].widgets[w].pos[1]*wfactor[1]) +
raydium_gui_windows[window].widgets[w].size[1];
//printf("%f %f\n",
style=RAYDIUM_GUI_NORMAL;
if(raydium_gui_windows[window].focused_widget==w)
style=RAYDIUM_GUI_FOCUS;
if(raydium_gui_window_focused==window &&
(mxy[0]>=xy[0] && mxy[1]>=xy[1] &&
mxy[0]<=xy[2] && mxy[1]<=xy[3] ))
style=RAYDIUM_GUI_HOVER;
// uv
switch(style)
{
case RAYDIUM_GUI_NORMAL:
col=z->col_normal;
break;
case RAYDIUM_GUI_FOCUS:
col=z->col_focus;
break;
case RAYDIUM_GUI_HOVER:
col=z->col_hover;
break;
}
raydium_osd_start();
glDisable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glColor4fv(col);
glBegin(GL_QUADS);
glVertex3f(xy[0],xy[3],0);
glVertex3f(xy[2],xy[3],0);
glVertex3f(xy[2],xy[1],0);
glVertex3f(xy[0],xy[1],0);
glEnd();
glDisable(GL_BLEND);
glEnable(GL_TEXTURE_2D);
raydium_osd_stop();
if( raydium_gui_window_focused==window &&
((style==RAYDIUM_GUI_HOVER && raydium_mouse_click==1) ||
(style==RAYDIUM_GUI_FOCUS && raydium_key_last==1013)) )
{
void (*f)(raydium_gui_Object *);
raydium_key_last=0;
raydium_mouse_click=0;
raydium_mouse_button[0]=0;
raydium_gui_windows[window].focused_widget=w;
f=z->OnClick;
if(f)
f(&raydium_gui_windows[window].widgets[w]);
raydium_gui_button_clicked_id=window*1000+w;
}
}
void raydium_gui_track_draw(int w, int window)
{
GLfloat uv[4];
GLfloat rxy[4];
GLfloat cxy[4];
GLfloat cdec[2];
GLfloat mxy[2];
GLfloat wfactor[2];
GLfloat rcfactor[2];
GLfloat *ruv;
GLfloat *cuv;
char style;
raydium_gui_Track *t;
if(!raydium_gui_window_isvalid(window))
return;
if(!raydium_gui_widget_isvalid(w,window))
return;
t=raydium_gui_windows[window].widgets[w].widget;
mxy[0]= ((float)raydium_mouse_x/raydium_window_tx)*100;
mxy[1]=100-((float)raydium_mouse_y/raydium_window_ty)*100;
wfactor[0]=raydium_gui_windows[window].size[0]/100.;
wfactor[1]=raydium_gui_windows[window].size[1]/100.;
style=RAYDIUM_GUI_NORMAL;
if(raydium_gui_windows[window].focused_widget==w)
style=RAYDIUM_GUI_FOCUS;
// rule ...
rxy[0]=raydium_gui_windows[window].pos[0]+
(raydium_gui_windows[window].widgets[w].pos[0]*wfactor[0]);
rxy[1]=raydium_gui_windows[window].pos[1]+
(raydium_gui_windows[window].widgets[w].pos[1]*wfactor[1]);
rxy[2]=raydium_gui_windows[window].pos[0] +
(raydium_gui_windows[window].widgets[w].pos[0]*wfactor[0]) +
raydium_gui_windows[window].widgets[w].size[0];
rxy[3]=raydium_gui_windows[window].pos[1] +
(raydium_gui_windows[window].widgets[w].pos[1]*wfactor[1]) +
raydium_gui_windows[window].widgets[w].size[1];
// uv
ruv=t->uv_rule;
uv[0]= ruv[0]/raydium_gui_theme_current.texture_size[0];
uv[1]=1-ruv[1]/raydium_gui_theme_current.texture_size[1];
uv[2]= (ruv[0] + ruv[2]) / raydium_gui_theme_current.texture_size[0];
uv[3]=1-(ruv[1] + ruv[3]) / raydium_gui_theme_current.texture_size[1];
raydium_gui_widget_draw_internal(uv,rxy);
// ... end rule
// cursor ...
// uv
switch(style)
{
case RAYDIUM_GUI_NORMAL:
cuv=t->uv_cursor_normal;
break;
case RAYDIUM_GUI_FOCUS:
cuv=t->uv_cursor_focus;
break;
}
uv[0]= cuv[0]/raydium_gui_theme_current.texture_size[0];
uv[1]=1-cuv[1]/raydium_gui_theme_current.texture_size[1];
uv[2]= (cuv[0] + cuv[2]) / raydium_gui_theme_current.texture_size[0];
uv[3]=1-(cuv[1] + cuv[3]) / raydium_gui_theme_current.texture_size[1];
rcfactor[0]=cuv[2]/ruv[2];
rcfactor[1]=cuv[3]/ruv[3];
//raydium_log("%f %f",cuv[4],ruv[4]);
cxy[0]=rxy[0];
cxy[1]=rxy[1];
cxy[2]=raydium_gui_windows[window].pos[0] +
(raydium_gui_windows[window].widgets[w].pos[0]*wfactor[0]) +
(raydium_gui_windows[window].widgets[w].size[0]*rcfactor[0]);
cxy[3]=raydium_gui_windows[window].pos[1] +
(raydium_gui_windows[window].widgets[w].pos[1]*wfactor[1]) +
(raydium_gui_windows[window].widgets[w].size[1]*rcfactor[1]);
cdec[0]=(rxy[2]-rxy[0]) * ((float)(t->current - t->min)/(t->max - t->min));
cdec[0]-=(cxy[2]-cxy[0])/2;
cdec[1]=(cxy[3]-cxy[1])/2 - (rxy[3]-rxy[1])/2;
cxy[0]+=cdec[0];
cxy[2]+=cdec[0];
cxy[1]-=cdec[1];
cxy[3]-=cdec[1];
raydium_gui_widget_draw_internal(uv,cxy);
// ... end cursor
// Events management
// hover
if(raydium_gui_window_focused==window &&
(mxy[0]>=rxy[0] && mxy[1]>=rxy[1] &&
mxy[0]<=rxy[2] && mxy[1]<=rxy[3] ) &&
raydium_mouse_button[0])
{
GLfloat fact;
raydium_gui_windows[window].focused_widget=w;
fact=(mxy[0]-rxy[0])/(rxy[2]-rxy[0]);
t->current= t->min + (fact*(t->max - t->min));
}
if(raydium_gui_window_focused==window && style==RAYDIUM_GUI_FOCUS && raydium_key_last==100)
{
t->current--;
raydium_key_last=0;
}
if(raydium_gui_window_focused==window && style==RAYDIUM_GUI_FOCUS && raydium_key_last==102)
{
t->current++;
raydium_key_last=0;
}
if(t->current<t->min)
t->current=t->min;
if(t->current>t->max)
t->current=t->max;
}
void raydium_gui_label_draw(int w, int window)
{
GLfloat xy[2];
GLfloat wfactor[2];
GLfloat tmp;
raydium_gui_Label *l;
if(!raydium_gui_window_isvalid(window))
return;
if(!raydium_gui_widget_isvalid(w,window))
return;
l=raydium_gui_windows[window].widgets[w].widget;
wfactor[0]=raydium_gui_windows[window].size[0]/100.;
wfactor[1]=raydium_gui_windows[window].size[1]/100.;
xy[0]=raydium_gui_windows[window].pos[0]+
(raydium_gui_windows[window].widgets[w].pos[0]*wfactor[0]);
xy[1]=raydium_gui_windows[window].pos[1]+
(raydium_gui_windows[window].widgets[w].pos[1]*wfactor[1]);
if(strlen(l->caption)>0)
{
if(strlen(l->caption)>1)
{
tmp=raydium_gui_windows[window].widgets[w].font_size/RAYDIUM_OSD_FONT_SIZE_FACTOR;
tmp=((strlen(l->caption)-1)*tmp)/2;
}
else
tmp=0;
raydium_osd_color_change(l->font_color[0],l->font_color[1],l->font_color[2]);
raydium_osd_printf(xy[0]-tmp,xy[1],
raydium_gui_windows[window].widgets[w].font_size,
0.5,raydium_gui_theme_current.font,"%s",l->caption);
} // end caption drawing
}
void raydium_gui_edit_draw(int w, int window)
{
GLfloat uv[4];
GLfloat xy[4];
GLfloat mxy[2];
GLfloat wfactor[2];
GLfloat *suv;
char style;
int len;
raydium_gui_Edit *e;
// ugly temp vars
GLfloat fxy[2];
GLfloat tmp,tmp2;
char zone[RAYDIUM_MAX_NAME_LEN];
if(!raydium_gui_window_isvalid(window))
return;
if(!raydium_gui_widget_isvalid(w,window))
return;
e=raydium_gui_windows[window].widgets[w].widget;
mxy[0]= ((float)raydium_mouse_x/raydium_window_tx)*100;
mxy[1]=100-((float)raydium_mouse_y/raydium_window_ty)*100;
wfactor[0]=raydium_gui_windows[window].size[0]/100.;
wfactor[1]=raydium_gui_windows[window].size[1]/100.;
xy[0]=raydium_gui_windows[window].pos[0]+
(raydium_gui_windows[window].widgets[w].pos[0]*wfactor[0]);
xy[1]=raydium_gui_windows[window].pos[1]+
(raydium_gui_windows[window].widgets[w].pos[1]*wfactor[1]);
xy[2]=raydium_gui_windows[window].pos[0] +
(raydium_gui_windows[window].widgets[w].pos[0]*wfactor[0]) +
raydium_gui_windows[window].widgets[w].size[0];
xy[3]=raydium_gui_windows[window].pos[1] +
(raydium_gui_windows[window].widgets[w].pos[1]*wfactor[1]) +
raydium_gui_windows[window].widgets[w].size[1];
style=RAYDIUM_GUI_NORMAL;
if(raydium_gui_windows[window].focused_widget==w)
style=RAYDIUM_GUI_FOCUS;
// uv
switch(style)
{
case RAYDIUM_GUI_NORMAL:
suv=e->uv_normal;
break;
case RAYDIUM_GUI_FOCUS:
suv=e->uv_focus;
break;
}
uv[0]= suv[0]/raydium_gui_theme_current.texture_size[0];
uv[1]=1-suv[1]/raydium_gui_theme_current.texture_size[1];
uv[2]= (suv[0] + suv[2]) / raydium_gui_theme_current.texture_size[0];
uv[3]=1-(suv[1] + suv[3]) / raydium_gui_theme_current.texture_size[1];
raydium_gui_widget_draw_internal(uv,xy);
len=strlen(e->text);
fxy[0]=xy[0];
fxy[1]=xy[1]+(xy[3]-xy[1])/2;
tmp=raydium_gui_windows[window].widgets[w].font_size/RAYDIUM_OSD_FONT_SIZE_FACTOR;
tmp2=(xy[2]-xy[0])-tmp;
tmp2/=tmp;
if(tmp2>250)
{
raydium_log("GUI: Error: edit zone is too long");
return;
}
// asserts
if(e->cursor>len)
e->cursor=len;
if(e->cursor<0)
e->cursor=0;
if(e->cursor-e->offset>tmp2)
e->offset=e->cursor-tmp2;
if(e->cursor<e->offset)
e->offset=e->cursor;
strncpy(zone,e->text+e->offset,250);
zone[(int)tmp2+1]=0;
raydium_osd_color_change(e->font_color[0],e->font_color[1],e->font_color[2]);
raydium_osd_printf(fxy[0]+tmp,fxy[1],
raydium_gui_windows[window].widgets[w].font_size,
0.5,raydium_gui_theme_current.font,"%s",zone);
if(style==RAYDIUM_GUI_FOCUS)
raydium_osd_printf(fxy[0]+tmp+(tmp*e->cursor)-(tmp/2)-(e->offset*tmp),fxy[1],
raydium_gui_windows[window].widgets[w].font_size,
0.5,raydium_gui_theme_current.font,"|");
// end of "printf"
// Events management
if(raydium_gui_window_focused==window &&
(mxy[0]>=xy[0] && mxy[1]>=xy[1] &&
mxy[0]<=xy[2] && mxy[1]<=xy[3] ) &&
raydium_mouse_click==1)
{
GLfloat fact;
raydium_mouse_click=0;
raydium_mouse_button[0]=0;
raydium_gui_windows[window].focused_widget=w;
fact=(mxy[0]-xy[0])/(xy[2]-xy[0]);
e->cursor=(tmp2*fact)+(tmp/3.f)+e->offset; // need some work
}
if(raydium_gui_window_focused==window && style==RAYDIUM_GUI_FOCUS && raydium_key_last==100)
{
e->cursor--;
raydium_key_last=0;
}
if(raydium_gui_window_focused==window && style==RAYDIUM_GUI_FOCUS && raydium_key_last==102)
{
e->cursor++;
raydium_key_last=0;
}
if(raydium_gui_window_focused==window && style==RAYDIUM_GUI_FOCUS && (raydium_key_last>=1032 && raydium_key_last<1127) &&
len<(RAYDIUM_GUI_DATASIZE-1))
{
memmove(e->text+e->cursor+1,e->text+e->cursor,strlen(e->text+e->cursor)+1);
e->text[e->cursor]=raydium_key_last-1000;
e->cursor++;
raydium_key_last=0;
}
if(raydium_gui_window_focused==window && style==RAYDIUM_GUI_FOCUS && raydium_key_last==1008 && len>0 && e->cursor>0)
{
memmove(e->text+e->cursor-1,e->text+e->cursor,strlen(e->text+e->cursor)+1);
e->cursor--;
raydium_key_last=0;
}
if(raydium_gui_window_focused==window && style==RAYDIUM_GUI_FOCUS && raydium_key_last==1127 && e->cursor<len)
{
memmove(e->text+e->cursor,e->text+e->cursor+1,strlen(e->text+e->cursor)+1);
raydium_key_last=0;
}
if(raydium_gui_window_focused==window && style==RAYDIUM_GUI_FOCUS && raydium_key_last==106)
{
e->cursor=0;
raydium_key_last=0;
}
if(raydium_gui_window_focused==window && style==RAYDIUM_GUI_FOCUS && raydium_key_last==107)
{
e->cursor=len;
raydium_key_last=0;
}
}
void raydium_gui_check_draw(int w, int window)
{
GLfloat uv[4];
GLfloat xy[4];
GLfloat fxy[2];
GLfloat mxy[2];
GLfloat wfactor[2];
GLfloat *suv;
GLfloat *scol;
char style;
raydium_gui_Check *c;
if(!raydium_gui_window_isvalid(window))
return;
if(!raydium_gui_widget_isvalid(w,window))
return;
c=raydium_gui_windows[window].widgets[w].widget;
mxy[0]= ((float)raydium_mouse_x/raydium_window_tx)*100;
mxy[1]=100-((float)raydium_mouse_y/raydium_window_ty)*100;
wfactor[0]=raydium_gui_windows[window].size[0]/100.;
wfactor[1]=raydium_gui_windows[window].size[1]/100.;
xy[0]=raydium_gui_windows[window].pos[0]+
(raydium_gui_windows[window].widgets[w].pos[0]*wfactor[0]);
xy[1]=raydium_gui_windows[window].pos[1]+
(raydium_gui_windows[window].widgets[w].pos[1]*wfactor[1]);
xy[2]=raydium_gui_windows[window].pos[0] +
(raydium_gui_windows[window].widgets[w].pos[0]*wfactor[0]) +
raydium_gui_windows[window].widgets[w].size[0];
xy[3]=raydium_gui_windows[window].pos[1] +
(raydium_gui_windows[window].widgets[w].pos[1]*wfactor[1]) +
raydium_gui_windows[window].widgets[w].size[1];
style=RAYDIUM_GUI_NORMAL;
if(raydium_gui_windows[window].focused_widget==w)
style=RAYDIUM_GUI_FOCUS;
if(!c->checked)
suv=c->uv_normal;
else
suv=c->uv_checked;
if(style==RAYDIUM_GUI_NORMAL)
scol=c->font_color_normal;
else
scol=c->font_color_focus;
uv[0]= suv[0]/raydium_gui_theme_current.texture_size[0];
uv[1]=1-suv[1]/raydium_gui_theme_current.texture_size[1];
uv[2]= (suv[0] + suv[2]) / raydium_gui_theme_current.texture_size[0];
uv[3]=1-(suv[1] + suv[3]) / raydium_gui_theme_current.texture_size[1];
raydium_gui_widget_draw_internal(uv,xy);
if(strlen(c->caption)>0)
{
fxy[0]=xy[0]+(xy[2]-xy[0]);
fxy[1]=xy[1]+(xy[3]-xy[1])/2;
raydium_osd_color_change(scol[0],scol[1],scol[2]);
raydium_osd_printf(fxy[0],fxy[1],
raydium_gui_windows[window].widgets[w].font_size,
0.5,raydium_gui_theme_current.font,"%s",c->caption);
} // end caption drawing
if(raydium_gui_window_focused==window &&
(mxy[0]>=xy[0] && mxy[1]>=xy[1] &&
mxy[0]<=xy[2] && mxy[1]<=xy[3] ))
style=RAYDIUM_GUI_HOVER;
// Events management
if(raydium_gui_window_focused==window &&
((style==RAYDIUM_GUI_HOVER && raydium_mouse_click==1) ||
(style==RAYDIUM_GUI_FOCUS && raydium_key_last==1013)) )
{
raydium_mouse_click=0;
raydium_mouse_button[0]=0;
raydium_key_last=0;
raydium_gui_windows[window].focused_widget=w;
c->checked=!c->checked;
}
}
void raydium_gui_combo_draw(int w, int window)
{
GLfloat uv[4];
GLfloat xy[4];
GLfloat fxy[2];
GLfloat mxy[2];
GLfloat wfactor[2];
GLfloat *suv;
GLfloat tmp,tmp2,tmp3;
char style;
raydium_gui_Combo *c;
int nitems;
int i;
char str[RAYDIUM_MAX_NAME_LEN];
int start,end,cpt;
char arrow;
int inc=0;
if(!raydium_gui_window_isvalid(window))
return;
if(!raydium_gui_widget_isvalid(w,window))
return;
c=raydium_gui_windows[window].widgets[w].widget;
mxy[0]= ((float)raydium_mouse_x/raydium_window_tx)*100;
mxy[1]=100-((float)raydium_mouse_y/raydium_window_ty)*100;
wfactor[0]=raydium_gui_windows[window].size[0]/100.;
wfactor[1]=raydium_gui_windows[window].size[1]/100.;
xy[0]=raydium_gui_windows[window].pos[0]+
(raydium_gui_windows[window].widgets[w].pos[0]*wfactor[0]);
xy[1]=raydium_gui_windows[window].pos[1]+
(raydium_gui_windows[window].widgets[w].pos[1]*wfactor[1]);
xy[2]=raydium_gui_windows[window].pos[0] +
(raydium_gui_windows[window].widgets[w].pos[0]*wfactor[0]) +
raydium_gui_windows[window].widgets[w].size[0];
xy[3]=raydium_gui_windows[window].pos[1] +
(raydium_gui_windows[window].widgets[w].pos[1]*wfactor[1]) +
raydium_gui_windows[window].widgets[w].size[1];
style=RAYDIUM_GUI_NORMAL;
if(raydium_gui_windows[window].focused_widget==w)
style=RAYDIUM_GUI_FOCUS;
/*
if(raydium_gui_window_focused==window &&
(mxy[0]>=xy[0] && mxy[1]>=xy[1] &&
mxy[0]<=xy[2] && mxy[1]<=xy[3] ))
style=RAYDIUM_GUI_HOVER;
*/
// uv
switch(style)
{
case RAYDIUM_GUI_NORMAL:
suv=c->uv_body_normal;
break;
case RAYDIUM_GUI_FOCUS:
suv=c->uv_body_focus;
break;
}
uv[0]= suv[0]/raydium_gui_theme_current.texture_size[0];
uv[1]=1-suv[1]/raydium_gui_theme_current.texture_size[1];
uv[2]= (suv[0] + suv[2]) / raydium_gui_theme_current.texture_size[0];
uv[3]=1-(suv[1] + suv[3]) / raydium_gui_theme_current.texture_size[1];
raydium_gui_widget_draw_internal(uv,xy);
// count items
for(i=0,nitems=0;c->items[i];i++)
if(c->items[i]==RAYDIUM_GUI_ITEM_SEPARATOR)
nitems++;
nitems++;
if(c->current>=0 && c->current<nitems)
{
fxy[0]=xy[0];
fxy[1]=xy[1]+(xy[3]-xy[1])/2;
tmp=raydium_gui_windows[window].widgets[w].font_size/RAYDIUM_OSD_FONT_SIZE_FACTOR;
tmp2=(xy[2]-xy[0])-tmp;
tmp2/=tmp;
// find current string
str[0]=0;
for(i=0,cpt=0,start=0;c->items[i];i++)
{
if(c->items[i]==RAYDIUM_GUI_ITEM_SEPARATOR || !c->items[i])
cpt++;
if(cpt==c->current)
{
start=i+1;
// first value without previous empty workaround
if(cpt==0)
start=0;
break;
}
}
for(end=start;c->items[end] && c->items[end]!=RAYDIUM_GUI_ITEM_SEPARATOR;end++)
{
// nothing ;)
}
for(i=0;i<end-start;i++)
str[i]=c->items[i+start];
str[end-start]=0;
strcpy(c->current_str,str);
// find body max str len (tmp3)
tmp3=c->body_border_right*((xy[2]-xy[0])/(c->uv_body_normal[2]));
tmp3=tmp2-(tmp3/tmp);
// limit str size using tmp3
if(tmp3 < strlen(str))
str[(int)tmp3]=0;
raydium_osd_color_change(c->font_color[0],c->font_color[1],c->font_color[2]);
raydium_osd_printf(fxy[0]+tmp,fxy[1],
raydium_gui_windows[window].widgets[w].font_size,
0.5,raydium_gui_theme_current.font,"%s",str);
} // end caption drawing
if(raydium_gui_windows[window].focused_widget!=w && c->expanded)
c->expanded=0;
// Events management of body
if(raydium_gui_window_focused==window &&
mxy[0]>=xy[0] && mxy[1]>=xy[1] &&
mxy[0]<=xy[2] && mxy[1]<=xy[3] &&
raydium_mouse_click==1 )
{
raydium_mouse_click=0;
raydium_mouse_button[0]=0;
c->expanded=!c->expanded;
raydium_gui_windows[window].focused_widget=w;
}
if(raydium_gui_window_focused==window &&
style==RAYDIUM_GUI_FOCUS &&
raydium_key_last==1013)
{
raydium_key_last=0;
c->expanded=!c->expanded;
}
// draw expanded part, if needed
if(c->expanded && raydium_gui_windows[window].focused_widget==w)
{
if((raydium_key_last==101 || raydium_mouse_click==4) && c->current>0)
{
c->current--;
raydium_key_last=0;
raydium_mouse_click=0;
raydium_mouse_button[0]=0;
if(c->current < c->offset)
c->offset=c->current;
}
if((raydium_key_last==103 || raydium_mouse_click==5) && c->current<nitems-1)
{
c->current++;
raydium_key_last=0;
raydium_mouse_click=0;
raydium_mouse_button[0]=0;
if(c->current >= c->offset+RAYDIUM_GUI_COMBO_LIST_HEIGHT)
c->offset=c->current-RAYDIUM_GUI_COMBO_LIST_HEIGHT+1;
}
/*
if(raydium_key_last==1032)
{
c->offset++;
raydium_key_last=0;
}
*/
if(c->offset>nitems-RAYDIUM_GUI_COMBO_LIST_HEIGHT)
c->offset=nitems-RAYDIUM_GUI_COMBO_LIST_HEIGHT;
if(c->offset<0)
c->offset=0;
// Apply offset (result's stored in 'i')
for(i=0,cpt=0;i<strlen(c->items)+1;i++)
{
if(cpt==c->offset)
break;
if(c->items[i]==RAYDIUM_GUI_ITEM_SEPARATOR || !c->items[i])
cpt++;
}
// foreach element
start=i;
cpt=0;
for(;i<strlen(c->items)+1;i++)
if(c->items[i]==RAYDIUM_GUI_ITEM_SEPARATOR || !c->items[i])
{
end=i;
memcpy(str,c->items+start,end-start);
str[end-start]=0;
//raydium_log("%i %i -%s-",start,end,str);
// suv
arrow=0;
suv=c->uv_list_middle;
if(cpt==0)
{
suv=c->uv_list_top;
arrow=-1;
}
if(cpt==nitems-1 || cpt==RAYDIUM_GUI_COMBO_LIST_HEIGHT-1)
{
suv=c->uv_list_bottom;
arrow=1;
}
uv[0]= suv[0]/raydium_gui_theme_current.texture_size[0];
uv[1]=1-suv[1]/raydium_gui_theme_current.texture_size[1];
uv[2]= (suv[0] + suv[2]) / raydium_gui_theme_current.texture_size[0];
uv[3]=1-(suv[1] + suv[3]) / raydium_gui_theme_current.texture_size[1];
xy[1]-=raydium_gui_windows[window].widgets[w].size[1];
xy[3]-=raydium_gui_windows[window].widgets[w].size[1];
// draw
raydium_gui_widget_draw_internal(uv,xy);
// test current
// suv current and draw
if(cpt+c->offset==c->current)
{
suv=c->uv_list_current;
uv[0]= suv[0]/raydium_gui_theme_current.texture_size[0];
uv[1]=1-suv[1]/raydium_gui_theme_current.texture_size[1];
uv[2]= (suv[0] + suv[2]) / raydium_gui_theme_current.texture_size[0];
uv[3]=1-(suv[1] + suv[3]) / raydium_gui_theme_current.texture_size[1];
raydium_gui_widget_draw_internal(uv,xy);
}
if(arrow)
{
GLfloat axy[4];
GLfloat sw;
suv=c->uv_arrow;
uv[0]= suv[0]/raydium_gui_theme_current.texture_size[0];
uv[1]=1-suv[1]/raydium_gui_theme_current.texture_size[1];
uv[2]= (suv[0] + suv[2]) / raydium_gui_theme_current.texture_size[0]; uv[3]=1-(suv[1] + suv[3]) / raydium_gui_theme_current.texture_size[1];
if(arrow<0)
{
sw=uv[1];
uv[1]=uv[3];
uv[3]=sw;
}
axy[1]=xy[1];
axy[3]=xy[3];
axy[0]=xy[2];
axy[2]=xy[2]+(axy[3]-axy[1]);
raydium_gui_widget_draw_internal(uv,axy);
if(raydium_gui_window_focused==window &&
mxy[0]>=axy[0] && mxy[1]>=axy[1] &&
mxy[0]<=axy[2] && mxy[1]<=axy[3] &&
raydium_mouse_click==1 )
{
raydium_mouse_click=0;
raydium_mouse_button[0]=0;
raydium_gui_windows[window].focused_widget=w;
inc=arrow;
}
} // end if arrow
fxy[0]=xy[0];
fxy[1]=xy[1]+(xy[3]-xy[1])/2;
tmp=raydium_gui_windows[window].widgets[w].font_size/RAYDIUM_OSD_FONT_SIZE_FACTOR;
tmp2=(xy[2]-xy[0])-tmp;
tmp2/=tmp;
if(tmp2<strlen(str))
str[(int)tmp2]=0;
raydium_osd_color_change(c->font_color[0],c->font_color[1],c->font_color[2]);
raydium_osd_printf(fxy[0]+tmp,fxy[1],
raydium_gui_windows[window].widgets[w].font_size,
0.5,raydium_gui_theme_current.font,"%s",str);
// events (change current ?)
if(raydium_gui_window_focused==window &&
mxy[0]>=xy[0] && mxy[1]>=xy[1] &&
mxy[0]<=xy[2] && mxy[1]<=xy[3] &&
raydium_mouse_click==1 )
{
c->current=cpt+c->offset;
raydium_mouse_click=0;
raydium_mouse_button[0]=0;
c->expanded=0;
raydium_gui_windows[window].focused_widget=w;
}
if(cpt==RAYDIUM_GUI_COMBO_LIST_HEIGHT-1)
break;
start=end+1;
cpt++;
} // end SEPARATOR
} // end expanded
c->offset+=inc;
}
void raydium_gui_window_draw(int window)
{
int i;
GLfloat uv[4];
GLfloat xy[4];
if(!raydium_gui_window_isvalid(window))
return;
uv[0]= raydium_gui_theme_current.background_uv[0]/raydium_gui_theme_current.texture_size[0];
uv[1]=1-raydium_gui_theme_current.background_uv[1]/raydium_gui_theme_current.texture_size[1];
uv[2]=
(raydium_gui_theme_current.background_uv[0] +
raydium_gui_theme_current.background_uv[2] ) /
raydium_gui_theme_current.texture_size[0];
uv[3]=1-
(raydium_gui_theme_current.background_uv[1] +
raydium_gui_theme_current.background_uv[3] ) /
raydium_gui_theme_current.texture_size[1];
xy[0]=raydium_gui_windows[window].pos[0];
xy[1]=raydium_gui_windows[window].pos[1];
xy[2]=raydium_gui_windows[window].pos[0]+raydium_gui_windows[window].size[0];
xy[3]=raydium_gui_windows[window].pos[1]+raydium_gui_windows[window].size[1];
raydium_gui_widget_draw_internal(uv,xy);
// draw combos, first pass (capture input events first)
for(i=0;i<RAYDIUM_GUI_MAX_OBJECTS;i++)
if(raydium_gui_widget_isvalid(i,window))
switch(raydium_gui_windows[window].widgets[i].type)
{
case RAYDIUM_GUI_COMBO:
raydium_gui_combo_draw(i,window);
break;
}
// draw other components
for(i=0;i<RAYDIUM_GUI_MAX_OBJECTS;i++)
if(raydium_gui_widget_isvalid(i,window))
switch(raydium_gui_windows[window].widgets[i].type)
{
case RAYDIUM_GUI_BUTTON:
raydium_gui_button_draw(i,window);
break;
case RAYDIUM_GUI_LABEL:
raydium_gui_label_draw(i,window);
break;
case RAYDIUM_GUI_TRACK:
raydium_gui_track_draw(i,window);
break;
case RAYDIUM_GUI_EDIT:
raydium_gui_edit_draw(i,window);
break;
case RAYDIUM_GUI_CHECK:
raydium_gui_check_draw(i,window);
break;
case RAYDIUM_GUI_ZONE:
raydium_gui_zone_draw(i,window);
break;
}
// draw combos last (overlay all components)
for(i=0;i<RAYDIUM_GUI_MAX_OBJECTS;i++)
if(raydium_gui_widget_isvalid(i,window))
switch(raydium_gui_windows[window].widgets[i].type)
{
case RAYDIUM_GUI_COMBO:
raydium_gui_combo_draw(i,window);
break;
}
// unfocus component
if(raydium_mouse_click==1)
{
raydium_gui_windows[window].focused_widget=-1;
}
}
void raydium_gui_draw(void)
{
int i;
void (*f)(void);
if(!raydium_gui_visible)
return;
if(!raydium_gui_theme_current.loaded)
return;
if(!raydium_gui_window_isvalid(raydium_gui_window_focused))
raydium_gui_window_focused=-1;
if(raydium_key_last==1009)
{
raydium_gui_widget_next();
raydium_key_last=0;
}
// non focused windows (~ creation order)
for(i=0;i<RAYDIUM_GUI_MAX_WINDOWS;i++)
if(raydium_gui_windows[i].state && i!=raydium_gui_window_focused)
raydium_gui_window_draw(i);
// focus window
for(i=0;i<RAYDIUM_GUI_MAX_WINDOWS;i++)
if(raydium_gui_windows[i].state && i==raydium_gui_window_focused)
{
raydium_gui_window_draw(i);
break;
}
raydium_osd_color_ega('f');
f=raydium_gui_AfterGuiDrawCallback;
if(f)
f();
}
////////////////////////
// Internal accessors //
////////////////////////
int raydium_gui_button_read(int window, int widget, char *str)
{
if(!raydium_gui_widget_isvalid(widget,window))
{
raydium_log("gui: error: cannot read widget value: invalid name or index");
return 0;
}
// Nothing is readable on a button :
str[0]=0;
return 0;
}
int raydium_gui_button_write(int window, int widget, char *str)
{
raydium_gui_Button *w;
if(!raydium_gui_widget_isvalid(widget,window))
{
raydium_log("gui: error: cannot write widget value: invalid name or index");
return 0;
}
w=raydium_gui_windows[window].widgets[widget].widget;
strcpy(w->caption,str);
return 1;
}
int raydium_gui_label_read(int window, int widget, char *str)
{
if(!raydium_gui_widget_isvalid(widget,window))
{
raydium_log("gui: error: cannot read widget value: invalid name or index");
return 0;
}
// Nothing is readable on a label :
str[0]=0;
return 0;
}
int raydium_gui_label_write(int window, int widget, char *str)
{
raydium_gui_Label *w;
if(!raydium_gui_widget_isvalid(widget,window))
{
raydium_log("gui: error: cannot write widget value: invalid name or index");
return 0;
}
w=raydium_gui_windows[window].widgets[widget].widget;
strcpy(w->caption,str);
return 1;
}
int raydium_gui_track_read(int window, int widget, char *str)
{
raydium_gui_Track *t;
if(!raydium_gui_widget_isvalid(widget,window))
{
raydium_log("gui: error: cannot read widget value: invalid name or index");
return 0;
}
t=raydium_gui_windows[window].widgets[widget].widget;
// value|ratio|min|max
sprintf(str,"%i|%f|%i|%i",t->current,
(float)(t->current-t->min)/(float)(t->max-t->min),
t->min,
t->max);
return t->current;
}
int raydium_gui_track_write(int window, int widget, int value)
{
raydium_gui_Track *w;
if(!raydium_gui_widget_isvalid(widget,window))
{
raydium_log("gui: error: cannot write widget value: invalid name or index");
return 0;
}
w=raydium_gui_windows[window].widgets[widget].widget;
if(value<w->min || value>w->max)
return 0;
w->current=value;
return 1;
}
int raydium_gui_edit_read(int window, int widget, char *str)
{
raydium_gui_Edit *e;
if(!raydium_gui_widget_isvalid(widget,window))
{
raydium_log("gui: error: cannot read widget value: invalid name or index");
return 0;
}
e=raydium_gui_windows[window].widgets[widget].widget;
strcpy(str,e->text);
return strlen(e->text);
}
int raydium_gui_edit_write(int window, int widget, char *str)
{
raydium_gui_Edit *w;
if(!raydium_gui_widget_isvalid(widget,window))
{
raydium_log("gui: error: cannot write widget value: invalid name or index");
return 0;
}
w=raydium_gui_windows[window].widgets[widget].widget;
strcpy(w->text,str);
return 1;
}
int raydium_gui_check_read(int window, int widget, char *str)
{
raydium_gui_Check *c;
if(!raydium_gui_widget_isvalid(widget,window))
{
raydium_log("gui: error: cannot read widget value: invalid name or index");
return 0;
}
c=raydium_gui_windows[window].widgets[widget].widget;
sprintf(str,"%s",(c->checked?"true":"false"));
return c->checked;
}
int raydium_gui_check_write(int window, int widget, int value)
{
raydium_gui_Check *w;
if(!raydium_gui_widget_isvalid(widget,window))
{
raydium_log("gui: error: cannot write widget value: invalid name or index");
return 0;
}
w=raydium_gui_windows[window].widgets[widget].widget;
w->checked=(value?1:0);
return 1;
}
int raydium_gui_combo_read(int window, int widget, char *str)
{
raydium_gui_Combo *c;
if(!raydium_gui_widget_isvalid(widget,window))
{
raydium_log("gui: error: cannot read widget value: invalid name or index");
return 0;
}
c=raydium_gui_windows[window].widgets[widget].widget;
strcpy(str,c->current_str);
return c->current;
}
int raydium_gui_combo_write(int window, int widget, int value)
{
raydium_gui_Combo *w;
if(!raydium_gui_widget_isvalid(widget,window))
{
raydium_log("gui: error: cannot write widget value: invalid name or index");
return 0;
}
w=raydium_gui_windows[window].widgets[widget].widget;
w->current=value;
return 1;
}
int raydium_gui_zone_read(int window, int widget, char *str)
{
raydium_gui_Zone *z;
if(!raydium_gui_widget_isvalid(widget,window))
{
raydium_log("gui: error: cannot read widget value: invalid name or index");
return 0;
}
// Nothing is readable on a zone :
z=raydium_gui_windows[window].widgets[widget].widget;
sprintf(str,"%i",z->tag);
return z->tag;
}
////////////////////////////
// "public" GUI functions //
////////////////////////////
void raydium_gui_show(void)
{
raydium_gui_visible=1;
if(!raydium_osd_cursor_texture)
{
raydium_gui_oldstate=raydium_mouse_isvisible();
raydium_mouse_show();
}
}
void raydium_gui_hide(void)
{
raydium_gui_visible=0;
if(!raydium_osd_cursor_texture && !raydium_gui_oldstate)
{
raydium_mouse_hide();
raydium_gui_oldstate=0;
}
}
signed char raydium_gui_isvisible(void)
{
return raydium_gui_visible;
}
void raydium_gui_window_delete(int window)
{
void (*f)(void);
if(!raydium_gui_window_isvalid(window))
{
raydium_log("GUI: Error: Cannot delete window: invalid window");
return;
}
f=raydium_gui_windows[window].OnDelete;
if(f)
f();
// focus another window
raydium_gui_window_focused=raydium_gui_windows[window].old_focused;
raydium_gui_window_init(window);
}
void raydium_gui_window_delete_name(char *window)
{
raydium_gui_window_delete(raydium_gui_window_find(window));
}
void raydium_gui_window_OnDelete(int window, void *OnDelete)
{
if(!raydium_gui_window_isvalid(window))
{
raydium_log("GUI: Error: Cannot set OnDelete: invalid window");
return;
}
raydium_gui_windows[window].OnDelete=OnDelete;
}
void raydium_gui_window_OnDelete_name(char *window, void *OnDelete)
{
raydium_gui_window_OnDelete(raydium_gui_window_find(window),OnDelete);
}
void raydium_gui_widget_sizes(GLfloat sizex, GLfloat sizey, GLfloat font_size)
{
raydium_gui_widget_sizes_default[0]=sizex;
raydium_gui_widget_sizes_default[1]=sizey;
raydium_gui_widget_sizes_default[2]=font_size;
}
int raydium_gui_window_create(char *name, GLfloat px, GLfloat py, GLfloat sizex, GLfloat sizey)
{
int i;
if(raydium_gui_window_find(name)>=0)
{
raydium_log("GUI: Error: Cannot create \"%s\" window: name already exists",name);
return -1;
}
for(i=0;i<RAYDIUM_GUI_MAX_WINDOWS;i++)
if(!raydium_gui_windows[i].state)
{
strcpy(raydium_gui_windows[i].name,name);
raydium_gui_windows[i].state=1;
raydium_gui_windows[i].pos[0]=px;
raydium_gui_windows[i].pos[1]=py;
raydium_gui_windows[i].size[0]=sizex;
raydium_gui_windows[i].size[1]=sizey;
raydium_gui_windows[i].old_focused=raydium_gui_window_focused;
raydium_gui_window_focused=i; // take focus
return i;
}
raydium_log("GUI: Error: No more window slots ! aborting \"%s\" creation",name);
return -1;
}
int raydium_gui_internal_object_create(char *name, int window, signed char type, GLfloat px, GLfloat py, GLfloat sizex, GLfloat sizey, GLfloat font_size)
{
int i;
if(!raydium_gui_window_isvalid(window))
{
raydium_log("GUI: Error: Cannot create \"%s\" widget: invalid window",name);
return -1;
}
if(!(strlen(name)>0 && name[0]=='*'))
if(raydium_gui_widget_find(name,window)>=0)
{
raydium_log("GUI: Error: Cannot create \"%s\" widget: name already exists in this window",name);
return -1;
}
for(i=0;i<RAYDIUM_GUI_MAX_OBJECTS;i++)
if(!raydium_gui_windows[window].widgets[i].state)
{
strcpy(raydium_gui_windows[window].widgets[i].name,name);
raydium_gui_windows[window].widgets[i].state=1;
raydium_gui_windows[window].widgets[i].type=type;
raydium_gui_windows[window].widgets[i].pos[0]=px;
raydium_gui_windows[window].widgets[i].pos[1]=py;
raydium_gui_windows[window].widgets[i].font_size=font_size;
raydium_gui_windows[window].widgets[i].size[0]=sizex;
raydium_gui_windows[window].widgets[i].size[1]=sizey;
return i;
}
raydium_log("GUI: Error: Cannot create \"%s\" widget: no more slots",name);
return -1;
}
int raydium_gui_button_create(char *name, int window, GLfloat px, GLfloat py, char *caption, void *OnClick)
{
int wid;
raydium_gui_Button *b;
GLfloat sx,sy,fs;
// used for parsing
FILE *fp;
int ret;
char var[RAYDIUM_MAX_NAME_LEN];
char val_s[RAYDIUM_MAX_NAME_LEN];
GLfloat val_f[4];
int size;
b=malloc(sizeof(raydium_gui_Button));
if(!b)
{
raydium_log("GUI: Error: Cannot create \"%s\" button: malloc failed",name);
return -1;
}
fp=raydium_file_fopen(raydium_gui_theme_current.filename,"rt");
if(!fp)
{
raydium_log("gui: ERROR: Cannot open current theme file");
return -1;
}
sx=raydium_gui_widget_sizes_default[0];
sy=raydium_gui_widget_sizes_default[1];
fs=raydium_gui_widget_sizes_default[2];
wid=raydium_gui_internal_object_create(name,window,RAYDIUM_GUI_BUTTON,px,py,sx,sy,fs);
if(wid<0)
{
raydium_log("GUI: Error: early init failed for button '%s'",name);
return -1;
}
strcpy(b->caption,caption);
b->OnClick=OnClick;
memset(b->uv_normal, 0,sizeof(GLfloat)*4);
memset(b->uv_focus, 0,sizeof(GLfloat)*4);
memset(b->uv_hover, 0,sizeof(GLfloat)*4);
memset(b->font_color,0,sizeof(GLfloat)*3);
while( (ret=raydium_parser_read(var,val_s,val_f,&size,fp))!=RAYDIUM_PARSER_TYPE_EOF)
{
if(!strcasecmp(var,"button_normal"))
{
if(ret!=RAYDIUM_PARSER_TYPE_FLOAT || size!=4)
{
raydium_log("gui: parser: button_normal: wrong type");
continue;
}
memcpy(b->uv_normal,val_f,sizeof(GLfloat)*4);
}
if(!strcasecmp(var,"button_focus"))
{
if(ret!=RAYDIUM_PARSER_TYPE_FLOAT || size!=4)
{
raydium_log("gui: parser: button_focus: wrong type");
continue;
}
memcpy(b->uv_focus,val_f,sizeof(GLfloat)*4);
}
if(!strcasecmp(var,"button_hover"))
{
if(ret!=RAYDIUM_PARSER_TYPE_FLOAT || size!=4)
{
raydium_log("gui: parser: button_hover: wrong type");
continue;
}
memcpy(b->uv_hover,val_f,sizeof(GLfloat)*4);
}
if(!strcasecmp(var,"button_font"))
{
if(ret!=RAYDIUM_PARSER_TYPE_FLOAT || size!=3)
{
raydium_log("gui: parser: button_font: wrong type");
continue;
}
memcpy(b->font_color,val_f,sizeof(GLfloat)*3);
}
}
fclose(fp);
raydium_gui_windows[window].widgets[wid].widget=b;
return wid;
}
int raydium_gui_button_create_simple(char *name, int window, GLfloat px, GLfloat py, char *caption)
{
return raydium_gui_button_create(name,window,px,py,caption,NULL);
}
int raydium_gui_label_create(char *name, int window, GLfloat px, GLfloat py, char *caption, GLfloat r, GLfloat g, GLfloat b)
{
int wid;
raydium_gui_Label *l;
GLfloat fs;
l=malloc(sizeof(raydium_gui_Label));
if(!l)
{
raydium_log("GUI: Error: Cannot create \"%s\" label: malloc failed",name);
return -1;
}
fs=raydium_gui_widget_sizes_default[2];
wid=raydium_gui_internal_object_create(name,window,RAYDIUM_GUI_LABEL,px,py,0,0,fs);
if(wid<0)
{
raydium_log("GUI: Error: early init failed for label '%s'",name);
return -1;
}
strcpy(l->caption,caption);
l->font_color[0]=r;
l->font_color[1]=g;
l->font_color[2]=b;
raydium_gui_windows[window].widgets[wid].widget=l;
return wid;
}
int raydium_gui_track_create(char *name, int window, GLfloat px, GLfloat py, int min, int max, int current)
{
int wid;
raydium_gui_Track *t;
GLfloat sx,sy,fs;
// used for parsing
FILE *fp;
int ret;
char var[RAYDIUM_MAX_NAME_LEN];
char val_s[RAYDIUM_MAX_NAME_LEN];
GLfloat val_f[4];
int size;
t=malloc(sizeof(raydium_gui_Track));
if(!t)
{
raydium_log("GUI: Error: Cannot create \"%s\" track: malloc failed",name);
return -1;
}
fp=raydium_file_fopen(raydium_gui_theme_current.filename,"rt");
if(!fp)
{
raydium_log("gui: ERROR: Cannot open current theme file");
return -1;
}
sx=raydium_gui_widget_sizes_default[0];
sy=raydium_gui_widget_sizes_default[1];
fs=raydium_gui_widget_sizes_default[2];
wid=raydium_gui_internal_object_create(name,window,RAYDIUM_GUI_TRACK,px,py,sx,sy,fs);
if(wid<0)
{
raydium_log("GUI: Error: early init failed for track '%s'",name);
return -1;
}
t->min=min;
t->max=max;
t->current=current;
memset(t->uv_rule,0,sizeof(GLfloat)*4);
memset(t->uv_cursor_normal,0,sizeof(GLfloat)*4);
memset(t->uv_cursor_focus,0,sizeof(GLfloat)*4);
while( (ret=raydium_parser_read(var,val_s,val_f,&size,fp))!=RAYDIUM_PARSER_TYPE_EOF)
{
if(!strcasecmp(var,"track_rule"))
{
if(ret!=RAYDIUM_PARSER_TYPE_FLOAT || size!=4)
{
raydium_log("gui: parser: track_rule: wrong type");
continue;
}
memcpy(t->uv_rule,val_f,sizeof(GLfloat)*4);
}
if(!strcasecmp(var,"track_cursor_normal"))
{
if(ret!=RAYDIUM_PARSER_TYPE_FLOAT || size!=4)
{
raydium_log("gui: parser: track_cursor_normal: wrong type");
continue;
}
memcpy(t->uv_cursor_normal,val_f,sizeof(GLfloat)*4);
}
if(!strcasecmp(var,"track_cursor_focus"))
{
if(ret!=RAYDIUM_PARSER_TYPE_FLOAT || size!=4)
{
raydium_log("gui: parser: track_cursor_focus: wrong type");
continue;
}
memcpy(t->uv_cursor_focus,val_f,sizeof(GLfloat)*4);
}
}
fclose(fp);
raydium_gui_windows[window].widgets[wid].widget=t;
return wid;
}
int raydium_gui_edit_create(char *name, int window, GLfloat px, GLfloat py, char *default_text)
{
int wid;
raydium_gui_Edit *e;
GLfloat sx,sy,fs;
// used for parsing
FILE *fp;
int ret;
char var[RAYDIUM_MAX_NAME_LEN];
char val_s[RAYDIUM_MAX_NAME_LEN];
GLfloat val_f[4];
int size;
e=malloc(sizeof(raydium_gui_Edit));
if(!e)
{
raydium_log("GUI: Error: Cannot create \"%s\" edit: malloc failed",name);
return -1;
}
fp=raydium_file_fopen(raydium_gui_theme_current.filename,"rt");
if(!fp)
{
raydium_log("gui: ERROR: Cannot open current theme file");
return -1;
}
sx=raydium_gui_widget_sizes_default[0];
sy=raydium_gui_widget_sizes_default[1];
fs=raydium_gui_widget_sizes_default[2];
wid=raydium_gui_internal_object_create(name,window,RAYDIUM_GUI_EDIT,px,py,sx,sy,fs);
if(wid<0)
{
raydium_log("GUI: Error: early init failed for edit '%s'",name);
return -1;
}
e->offset=0;
strcpy(e->text,default_text);
e->cursor=strlen(e->text);
//e->cursor=0;
memset(e->uv_normal,0,sizeof(GLfloat)*4);
memset(e->uv_focus,0,sizeof(GLfloat)*4);
memset(e->font_color,0,sizeof(GLfloat)*3);
while( (ret=raydium_parser_read(var,val_s,val_f,&size,fp))!=RAYDIUM_PARSER_TYPE_EOF)
{
if(!strcasecmp(var,"edit_normal"))
{
if(ret!=RAYDIUM_PARSER_TYPE_FLOAT || size!=4)
{
raydium_log("gui: parser: edit_normal: wrong type");
continue;
}
memcpy(e->uv_normal,val_f,sizeof(GLfloat)*4);
}
if(!strcasecmp(var,"edit_focus"))
{
if(ret!=RAYDIUM_PARSER_TYPE_FLOAT || size!=4)
{
raydium_log("gui: parser: edit_focus: wrong type");
continue;
}
memcpy(e->uv_focus,val_f,sizeof(GLfloat)*4);
}
if(!strcasecmp(var,"font_color"))
{
if(ret!=RAYDIUM_PARSER_TYPE_FLOAT || size!=3)
{
raydium_log("gui: parser: font_color: wrong type");
continue;
}
memcpy(e->font_color,val_f,sizeof(GLfloat)*3);
}
}
fclose(fp);
raydium_gui_windows[window].widgets[wid].widget=e;
return wid;
}
int raydium_gui_check_create(char *name, int window, GLfloat px, GLfloat py, char *caption, signed char checked)
{
int wid;
raydium_gui_Check *c;
GLfloat sx,sy,fs;
// used for parsing
FILE *fp;
int ret;
char var[RAYDIUM_MAX_NAME_LEN];
char val_s[RAYDIUM_MAX_NAME_LEN];
GLfloat val_f[4];
int size;
c=malloc(sizeof(raydium_gui_Check));
if(!c)
{
raydium_log("GUI: Error: Cannot create \"%s\" check: malloc failed",name);
return -1;
}
fp=raydium_file_fopen(raydium_gui_theme_current.filename,"rt");
if(!fp)
{
raydium_log("gui: ERROR: Cannot open current theme file");
return -1;
}
sx=raydium_gui_widget_sizes_default[0];
sy=raydium_gui_widget_sizes_default[1];
fs=raydium_gui_widget_sizes_default[2];
wid=raydium_gui_internal_object_create(name,window,RAYDIUM_GUI_CHECK,px,py,sx,sy,fs);
if(wid<0)
{
raydium_log("GUI: Error: early init failed for check '%s'",name);
return -1;
}
strcpy(c->caption,caption);
c->checked=checked;
memset(c->uv_normal,0,sizeof(GLfloat)*4);
memset(c->uv_checked,0,sizeof(GLfloat)*4);
memset(c->font_color_normal,0,sizeof(GLfloat)*3);
memset(c->font_color_focus,0,sizeof(GLfloat)*3);
while( (ret=raydium_parser_read(var,val_s,val_f,&size,fp))!=RAYDIUM_PARSER_TYPE_EOF)
{
if(!strcasecmp(var,"check_normal"))
{
if(ret!=RAYDIUM_PARSER_TYPE_FLOAT || size!=4)
{
raydium_log("gui: parser: check_normal: wrong type");
continue;
}
memcpy(c->uv_normal,val_f,sizeof(GLfloat)*4);
}
if(!strcasecmp(var,"check_checked"))
{
if(ret!=RAYDIUM_PARSER_TYPE_FLOAT || size!=4)
{
raydium_log("gui: parser: check_checked: wrong type");
continue;
}
memcpy(c->uv_checked,val_f,sizeof(GLfloat)*4);
}
if(!strcasecmp(var,"font_color_normal"))
{
if(ret!=RAYDIUM_PARSER_TYPE_FLOAT || size!=3)
{
raydium_log("gui: parser: font_color_normal: wrong type");
continue;
}
memcpy(c->font_color_normal,val_f,sizeof(GLfloat)*3);
}
if(!strcasecmp(var,"font_color_focus"))
{
if(ret!=RAYDIUM_PARSER_TYPE_FLOAT || size!=3)
{
raydium_log("gui: parser: font_color_focus: wrong type");
continue;
}
memcpy(c->font_color_focus,val_f,sizeof(GLfloat)*3);
}
}
fclose(fp);
raydium_gui_windows[window].widgets[wid].widget=c;
return wid;
}
int raydium_gui_combo_create(char *name, int window, GLfloat px, GLfloat py, char *items, int current)
{
int wid;
raydium_gui_Combo *c;
GLfloat sx,sy,fs;
// used for parsing
FILE *fp;
int ret;
char var[RAYDIUM_MAX_NAME_LEN];
char val_s[RAYDIUM_MAX_NAME_LEN];
GLfloat val_f[4];
int size;
c=malloc(sizeof(raydium_gui_Combo));
if(!c)
{
raydium_log("GUI: Error: Cannot create \"%s\" combo: malloc failed",name);
return -1;
}
fp=raydium_file_fopen(raydium_gui_theme_current.filename,"rt");
if(!fp)
{
raydium_log("gui: ERROR: Cannot open current theme file");
return -1;
}
sx=raydium_gui_widget_sizes_default[0];
sy=raydium_gui_widget_sizes_default[1];
fs=raydium_gui_widget_sizes_default[2];
wid=raydium_gui_internal_object_create(name,window,RAYDIUM_GUI_COMBO,px,py,sx,sy,fs);
if(wid<0)
{
raydium_log("GUI: Error: early init failed for combo '%s'",name);
return -1;
}
strcpy(c->items,items);
c->current=current;
c->expanded=0;
c->offset=current;
c->body_border_right=0;
memset(c->uv_body_normal,0,sizeof(GLfloat)*4);
memset(c->uv_body_focus,0,sizeof(GLfloat)*4);
memset(c->uv_list_top,0,sizeof(GLfloat)*4);
memset(c->uv_list_middle,0,sizeof(GLfloat)*4);
memset(c->uv_list_bottom,0,sizeof(GLfloat)*4);
memset(c->uv_list_current,0,sizeof(GLfloat)*4);
memset(c->uv_arrow,0,sizeof(GLfloat)*4);
memset(c->font_color,0,sizeof(GLfloat)*3);
while( (ret=raydium_parser_read(var,val_s,val_f,&size,fp))!=RAYDIUM_PARSER_TYPE_EOF)
{
if(!strcasecmp(var,"combo_body_normal"))
{
if(ret!=RAYDIUM_PARSER_TYPE_FLOAT || size!=4)
{
raydium_log("gui: parser: combo_body_normal: wrong type");
continue;
}
memcpy(c->uv_body_normal,val_f,sizeof(GLfloat)*4);
}
if(!strcasecmp(var,"combo_body_focus"))
{
if(ret!=RAYDIUM_PARSER_TYPE_FLOAT || size!=4)
{
raydium_log("gui: parser: combo_body_focus: wrong type");
continue;
}
memcpy(c->uv_body_focus,val_f,sizeof(GLfloat)*4);
}
if(!strcasecmp(var,"combo_body_border_right"))
{
if(ret!=RAYDIUM_PARSER_TYPE_FLOAT || size!=1)
{
raydium_log("gui: parser: combo_body_border_right: wrong type");
continue;
}
c->body_border_right=(int)val_f[0];
}
if(!strcasecmp(var,"combo_list_top"))
{
if(ret!=RAYDIUM_PARSER_TYPE_FLOAT || size!=4)
{
raydium_log("gui: parser: combo_list_top: wrong type");
continue;
}
memcpy(c->uv_list_top,val_f,sizeof(GLfloat)*4);
}
if(!strcasecmp(var,"combo_list_middle"))
{
if(ret!=RAYDIUM_PARSER_TYPE_FLOAT || size!=4)
{
raydium_log("gui: parser: combo_list_middle: wrong type");
continue;
}
memcpy(c->uv_list_middle,val_f,sizeof(GLfloat)*4);
}
if(!strcasecmp(var,"combo_list_bottom"))
{
if(ret!=RAYDIUM_PARSER_TYPE_FLOAT || size!=4)
{
raydium_log("gui: parser: combo_list_bottom: wrong type");
continue;
}
memcpy(c->uv_list_bottom,val_f,sizeof(GLfloat)*4);
}
if(!strcasecmp(var,"combo_list_current"))
{
if(ret!=RAYDIUM_PARSER_TYPE_FLOAT || size!=4)
{
raydium_log("gui: parser: combo_list_current: wrong type");
continue;
}
memcpy(c->uv_list_current,val_f,sizeof(GLfloat)*4);
}
if(!strcasecmp(var,"combo_arrow"))
{
if(ret!=RAYDIUM_PARSER_TYPE_FLOAT || size!=4)
{
raydium_log("gui: parser: combo_arrow: wrong type");
continue;
}
memcpy(c->uv_arrow,val_f,sizeof(GLfloat)*4);
}
if(!strcasecmp(var,"font_color"))
{
if(ret!=RAYDIUM_PARSER_TYPE_FLOAT || size!=3)
{
raydium_log("gui: parser: font_color: wrong type");
continue;
}
memcpy(c->font_color,val_f,sizeof(GLfloat)*3);
}
}
fclose(fp);
raydium_gui_windows[window].widgets[wid].widget=c;
return wid;
}
int raydium_gui_zone_create(char *name, int window, GLfloat px, GLfloat py, GLfloat sx, GLfloat sy, int tag, void *OnClick)
{
int wid;
raydium_gui_Zone *z;
// used for parsing
FILE *fp;
int ret;
char var[RAYDIUM_MAX_NAME_LEN];
char val_s[RAYDIUM_MAX_NAME_LEN];
GLfloat val_f[4];
int size;
z=malloc(sizeof(raydium_gui_Zone));
if(!z)
{
raydium_log("GUI: Error: Cannot create \"%s\" zone: malloc failed",name);
return -1;
}
fp=raydium_file_fopen(raydium_gui_theme_current.filename,"rt");
if(!fp)
{
raydium_log("gui: ERROR: Cannot open current theme file");
return -1;
}
if(raydium_gui_window_isvalid(window))
{
sx*=raydium_gui_windows[window].size[0]/100.;
sy*=raydium_gui_windows[window].size[1]/100.;
}
wid=raydium_gui_internal_object_create(name,window,RAYDIUM_GUI_ZONE,px,py,sx,sy,0);
if(wid<0)
{
raydium_log("GUI: Error: early init failed for zone '%s'",name);
return -1;
}
z->OnClick=OnClick;
z->tag=tag;
memset(z->col_normal, 0,sizeof(GLfloat)*4);
memset(z->col_focus, 1,sizeof(GLfloat)*4);
memset(z->col_hover, 1,sizeof(GLfloat)*4);
while( (ret=raydium_parser_read(var,val_s,val_f,&size,fp))!=RAYDIUM_PARSER_TYPE_EOF)
{
if(!strcasecmp(var,"zone_normal"))
{
if(ret!=RAYDIUM_PARSER_TYPE_FLOAT || size!=4)
{
raydium_log("gui: parser: zone_normal: wrong type");
continue;
}
memcpy(z->col_normal,val_f,sizeof(GLfloat)*4);
}
if(!strcasecmp(var,"zone_focus"))
{
if(ret!=RAYDIUM_PARSER_TYPE_FLOAT || size!=4)
{
raydium_log("gui: parser: zone_focus: wrong type");
continue;
}
memcpy(z->col_focus,val_f,sizeof(GLfloat)*4);
}
if(!strcasecmp(var,"zone_hover"))
{
if(ret!=RAYDIUM_PARSER_TYPE_FLOAT || size!=4)
{
raydium_log("gui: parser: zone_hover: wrong type");
continue;
}
memcpy(z->col_hover,val_f,sizeof(GLfloat)*4);
}
}
fclose(fp);
raydium_gui_windows[window].widgets[wid].widget=z;
return wid;
}
// str may be big !
int raydium_gui_read(int window, int widget, char *str)
{
if(raydium_gui_widget_isvalid(widget,window))
{
switch(raydium_gui_windows[window].widgets[widget].type)
{
case RAYDIUM_GUI_BUTTON:
return raydium_gui_button_read(window,widget,str);
case RAYDIUM_GUI_LABEL:
return raydium_gui_label_read(window,widget,str);
case RAYDIUM_GUI_TRACK:
return raydium_gui_track_read(window,widget,str);
case RAYDIUM_GUI_EDIT:
return raydium_gui_edit_read(window,widget,str);
case RAYDIUM_GUI_CHECK:
return raydium_gui_check_read(window,widget,str);
case RAYDIUM_GUI_COMBO:
return raydium_gui_combo_read(window,widget,str);
case RAYDIUM_GUI_ZONE:
return raydium_gui_zone_read(window,widget,str);
}
}
else
raydium_log("gui: error: cannot read widget value: invalid name or index");
return 0;
}
int raydium_gui_read_name(char *window, char *widget, char *str)
{
int w;
w=raydium_gui_window_find(window);
return raydium_gui_read(w,raydium_gui_widget_find(widget,w),str);
}
int raydium_gui_read_widget(raydium_gui_Object *w, char *str)
{
if(!w)
{
raydium_log("gui: error: cannot read widget value: invalid name or index");
return 0;
}
return raydium_gui_read(w->window,w->id,str);
}
signed char raydium_gui_write(int window, int widget, char *str, int value)
{
if(!raydium_gui_widget_isvalid(widget,window))
{
raydium_log("gui: error: cannot write widget value: invalid name or index");
return 0;
}
switch(raydium_gui_windows[window].widgets[widget].type)
{
case RAYDIUM_GUI_BUTTON:
return raydium_gui_button_write(window,widget,str);
case RAYDIUM_GUI_LABEL:
return raydium_gui_label_write(window,widget,str);
case RAYDIUM_GUI_TRACK:
return raydium_gui_track_write(window,widget,value);
case RAYDIUM_GUI_EDIT:
return raydium_gui_edit_write(window,widget,str);
case RAYDIUM_GUI_CHECK:
return raydium_gui_check_write(window,widget,value);
case RAYDIUM_GUI_COMBO:
return raydium_gui_combo_write(window,widget,value);
//case RAYDIUM_GUI_ZONE:
// ...
}
return -1; // nothing was done
}
int raydium_gui_write_name(char *window, char *widget, char *str, int value)
{
int w;
w=raydium_gui_window_find(window);
return raydium_gui_write(w,raydium_gui_widget_find(widget,w),str,value);
}
int raydium_gui_button_clicked(void)
{
int ret;
ret=raydium_gui_button_clicked_id;
raydium_gui_button_clicked_id=-1;
return ret;
}
int raydium_gui_list_id(char *item, char *list)
{
int i,cpt,len,start;
char items[RAYDIUM_GUI_DATASIZE];
strcpy(items,list);
len=strlen(items);
for(i=0,cpt=0,start=0;i<=len;i++)
if(items[i]==RAYDIUM_GUI_ITEM_SEPARATOR || items[i]==0)
{
items[i]=0;
if(!strcmp(item,items+start))
{
return cpt;
}
cpt++;
start=i+1;
}
return -1;
}