added support for clicking on regular 'text' menu items
This commit is contained in:
parent
bbe5cad580
commit
c141f8543d
4 changed files with 78 additions and 5 deletions
src
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue