From c141f8543ddc9d08e4768aa2b1e2c1c361ca2743 Mon Sep 17 00:00:00 2001 From: nehalmistry <> Date: Thu, 20 Mar 2003 08:07:00 +0000 Subject: [PATCH] added support for clicking on regular 'text' menu items --- src/include/menus.h | 1 + src/ui/menu_proc.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ src/ui/menus.cpp | 17 +++++++++++++++++ src/ui/script_ui.cpp | 25 ++++++++++++++++++++----- 4 files changed, 78 insertions(+), 5 deletions(-) diff --git a/src/include/menus.h b/src/include/menus.h index 660bb1d3b..4a2697db4 100644 --- a/src/include/menus.h +++ b/src/include/menus.h @@ -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; diff --git a/src/ui/menu_proc.cpp b/src/ui/menu_proc.cpp index ca44b5382..dad41b407 100644 --- a/src/ui/menu_proc.cpp +++ b/src/ui/menu_proc.cpp @@ -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; diff --git a/src/ui/menus.cpp b/src/ui/menus.cpp index ed705fde5..b747d6a00 100644 --- a/src/ui/menus.cpp +++ b/src/ui/menus.cpp @@ -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 */ diff --git a/src/ui/script_ui.cpp b/src/ui/script_ui.cpp index 2f2dd41a5..62071f867 100644 --- a/src/ui/script_ui.cpp +++ b/src/ui/script_ui.cpp @@ -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);