added support for clicking on regular 'text' menu items

This commit is contained in:
nehalmistry 2003-03-20 08:07:00 +00:00
parent bbe5cad580
commit c141f8543d
4 changed files with 78 additions and 5 deletions

View file

@ -113,6 +113,7 @@ struct _menuitem_;
typedef struct _menuitem_text_ {
unsigned char *text;
unsigned int tflags;
void (*action)(struct _menuitem_ *);
} MenuitemText;
typedef struct _menuitem_button_ {
unsigned char *text;

View file

@ -846,6 +846,8 @@ global void DrawMenu(Menu *menu)
int i;
int n;
int l;
int nc;
int rc;
Menuitem *mi;
Menuitem *mip;
@ -925,6 +927,13 @@ global void DrawMenu(Menu *menu)
case MI_TYPE_TEXT:
if (!mi->d.text.text)
break;
GetDefaultTextColors(&nc, &rc);
if (mi->flags&MenuButtonActive && mi->d.text.action) {
VideoDrawRectangleClip(ColorGray,menu->x+mi->xofs-4,menu->y+mi->yofs-4,
VideoTextLength(mi->font, mi->d.text.text)+5,
VideoTextHeight(mi->font)+5);
SetDefaultTextColors(rc,rc);
}
if (mi->d.text.tflags&MI_TFLAGS_CENTERED)
VideoDrawTextCentered(menu->x+mi->xofs,menu->y+mi->yofs,
mi->font,mi->d.text.text);
@ -935,6 +944,7 @@ global void DrawMenu(Menu *menu)
} else
VideoDrawText(menu->x+mi->xofs,menu->y+mi->yofs,
mi->font,mi->d.text.text);
SetDefaultTextColors(nc, rc);
break;
case MI_TYPE_BUTTON:
DrawMenuButton(mi->d.button.button,mi->flags,
@ -1466,6 +1476,22 @@ local void MenuHandleMouseMove(int x,int y)
mi = menu->items + i;
if (!(mi->flags&MenuButtonDisabled)) {
switch (mi->mitype) {
case MI_TYPE_TEXT:
if (!mi->d.text.text)
continue;
xs = menu->x + mi->xofs;
ys = menu->y + mi->yofs;
if (x < xs - 4 || x > xs + VideoTextLength(mi->font, mi->d.text.text)+5
|| y < ys - 4 || y > ys + VideoTextHeight(mi->font)+5) {
if (!(mi->flags&MenuButtonClicked)) {
if (mi->flags&MenuButtonActive) {
redraw_flag = 1;
mi->flags &= ~MenuButtonActive;
}
}
continue;
}
break;
case MI_TYPE_GEM:
xs = menu->x + mi->xofs;
ys = menu->y + mi->yofs;
@ -1679,6 +1705,7 @@ local void MenuHandleMouseMove(int x,int y)
case MI_TYPE_LISTBOX:
case MI_TYPE_VSLIDER:
case MI_TYPE_HSLIDER:
case MI_TYPE_TEXT:
if (!(mi->flags&MenuButtonActive)) {
redraw_flag = 1;
mi->flags |= MenuButtonActive;
@ -1757,6 +1784,7 @@ local void MenuHandleButtonDown(unsigned b __attribute__((unused)))
case MI_TYPE_VSLIDER:
case MI_TYPE_HSLIDER:
case MI_TYPE_INPUT:
case MI_TYPE_TEXT:
if (MenuButtonCurSel != -1) {
menu->items[MenuButtonCurSel].flags &= ~MenuButtonSelected;
}
@ -1923,6 +1951,18 @@ local void MenuHandleButtonUp(unsigned b)
}
}
break;
case MI_TYPE_TEXT:
if (mi->flags&MenuButtonClicked) {
redraw_flag = 1;
mi->flags &= ~MenuButtonClicked;
if (MenuButtonUnderCursor == i) {
MenuButtonUnderCursor = -1;
if (mi->d.text.action) {
(*mi->d.text.action)(mi);
}
}
}
break;
case MI_TYPE_BUTTON:
if (mi->flags&MenuButtonClicked) {
redraw_flag = 1;

View file

@ -141,6 +141,7 @@ local void GlobalOptionsFogAlphaGem(Menuitem *mi);
local void TipsInit(Menuitem *mi);
local void TipsExit(Menuitem *mi);
local void TipsShowTipsGem(Menuitem *mi);
local void TipsShowTipsText(Menuitem *mi);
local void TipsNextTip(void);
local void TipsPreviousTip(void);
@ -516,6 +517,7 @@ global void InitMenuFuncHash(void) {
HASHADD(TipsInit,"tips-init");
HASHADD(TipsExit,"tips-exit");
HASHADD(TipsShowTipsGem,"tips-show-tips-gem");
HASHADD(TipsShowTipsText,"tips-show-tips-text");
HASHADD(TipsNextTip,"tips-next-tip");
HASHADD(TipsPreviousTip,"tips-previous-tip");
@ -2551,6 +2553,21 @@ local void TipsShowTipsGem(Menuitem *mi)
}
}
/**
** Show tips at startup text callback
*/
local void TipsShowTipsText(Menuitem *mi)
{
if (mi->menu->items[1].d.gem.state == MI_GSTATE_UNCHECKED) {
ShowTips = 1;
mi->menu->items[1].d.gem.state = MI_GSTATE_CHECKED;
} else {
ShowTips = 0;
mi->menu->items[1].d.gem.state = MI_GSTATE_UNCHECKED;
}
MustRedraw |= RedrawMenu;
}
/**
** Tips menu next tip button callback
*/

View file

@ -2535,21 +2535,21 @@ local SCM CclDefineMenuItem(SCM list)
/* Menu types */
} else if( !item->mitype ) {
if ( gh_eq_p(value,gh_symbol2scm("text")) ) {
value=gh_car(list);
sublist=gh_car(list);
list=gh_cdr(list);
item->mitype=MI_TYPE_TEXT;
item->d.text.text = NULL;
if ( !gh_null_p(gh_car(value)) ) {
item->d.text.text=gh_scm2newstr(gh_car(value), NULL);
if ( !gh_null_p(gh_car(sublist)) ) {
item->d.text.text=gh_scm2newstr(gh_car(sublist), NULL);
// FIXME: can be removed
if (!strcmp(item->d.text.text, "null")) {
free(item->d.text.text);
item->d.text.text = NULL;
}
}
value=gh_cdr(value);
value=gh_car(value);
sublist=gh_cdr(sublist);
value=gh_car(sublist);
if ( gh_eq_p(value,gh_symbol2scm("center")) ) {
item->d.text.tflags=MI_TFLAGS_CENTERED;
} else if ( gh_eq_p(value,gh_symbol2scm("left")) ) {
@ -2563,6 +2563,21 @@ local SCM CclDefineMenuItem(SCM list)
fprintf(stderr,"Unknow flag %s\n", s1);
free(s1);
}
sublist=gh_cdr(sublist);
value=gh_car(sublist);
sublist=gh_cdr(sublist);
if ( gh_eq_p(value, gh_symbol2scm("func")) ) {
s1 = gh_scm2newstr(gh_car(sublist),NULL);
func = (void **)hash_find(MenuFuncHash,s1);
if (func != NULL) {
item->d.text.action=(void *)*func;
} else {
fprintf(stderr,"Can't find function: %s\n", s1);
}
free(s1);
sublist=gh_cdr(sublist);
}
} else if ( gh_eq_p(value,gh_symbol2scm("button")) ) {
sublist=gh_car(list);
list=gh_cdr(list);