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);