1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <strings.h>
4 #include <string.h>
5 #include "machine_type.h"
6 #include "menu.h"
7 #include "output.h"
8 #include "input.h"
9 
clearMenu(tMenu * Menu)10 void clearMenu(tMenu* Menu)
11 {
12 	Menu->menuitemnum=0;
13 	Menu->menuitemactive=0;
14 }
newMenuItem(tMenu * Menu,char * text,tUInt16 y,tUInt16 x,char hotkey,tBool active,tInt8 * itemnum)15 void newMenuItem(tMenu* Menu,char* text,tUInt16 y,tUInt16 x,char hotkey,tBool active,tInt8* itemnum)
16 {
17 	memcpy(Menu->MenuItems[Menu->menuitemnum].menutext,text,64);
18 	Menu->MenuItems[Menu->menuitemnum].x=x;
19 	Menu->MenuItems[Menu->menuitemnum].y=y;
20 	if (hotkey>='a' && hotkey<='z') hotkey-=32;	// make the hotkey uppercase
21 	Menu->MenuItems[Menu->menuitemnum].hotkey=hotkey;
22 
23 	if (active) Menu->menuitemactive=Menu->menuitemnum;
24 	*itemnum=Menu->menuitemnum;
25 	Menu->menuitemnum++;
26 }
printMenu(tOutput * output,tMenu * Menu,tUInt16 offsy,tUInt16 offsx)27 void printMenu(tOutput* output,tMenu* Menu,tUInt16 offsy,tUInt16 offsx)
28 {
29 	int i;
30 	int j;
31 	for (i=0;i<Menu->menuitemnum;i++)
32 	{
33 		setcolor(output,(i==Menu->menuitemactive)?COLOR_MENUACTIVE:COLOR_MENUNORMAL);
34 		mvwprintw(output->win,offsy+Menu->MenuItems[i].y,offsx+Menu->MenuItems[i].x,"%s",Menu->MenuItems[i].menutext);
35 		if (Menu->MenuItems[i].hotkey)
36 		{
37 			for (j=0;j<strlen(Menu->MenuItems[i].menutext);j++)
38 			{
39 				if (Menu->MenuItems[i].menutext[j]==Menu->MenuItems[i].hotkey || (Menu->MenuItems[i].hotkey>='A' && Menu->MenuItems[i].hotkey<='Z' && Menu->MenuItems[i].menutext[j]-32==Menu->MenuItems[i].hotkey))
40 				{
41 					setcolor(output,(i==Menu->menuitemactive)?COLOR_MENUHOTKEYACTIVE:COLOR_MENUHOTKEY);
42 					mvwprintw(output->win,offsy+Menu->MenuItems[i].y,offsx+Menu->MenuItems[i].x+j,"%c",Menu->MenuItems[i].menutext[j]);
43 					j=65;
44 				}
45 			}
46 		}
47 	}
48 }
MenuMoveLeft(tMenu * Menu)49 void MenuMoveLeft(tMenu* Menu)
50 {
51 	tUInt16	actx;
52 	tUInt16	acty;
53 	tInt16	diffx;
54 	tInt16	diffy;
55 	tInt16	mindiffx;
56 	tInt16	mindiffy;
57 	tUInt16	minact;
58 	int i;
59 
60 	actx=Menu->MenuItems[Menu->menuitemactive].x;
61 	acty=Menu->MenuItems[Menu->menuitemactive].y;
62 
63 
64 	mindiffx=COLS;
65 	mindiffy=LINES;
66 	minact=Menu->menuitemactive;
67 
68 	for (i=0;i<Menu->menuitemnum;i++)
69 	if (i!=Menu->menuitemactive)
70 	{
71 		diffx=actx-Menu->MenuItems[i].x;
72 		diffy=acty-Menu->MenuItems[i].y;
73 		if (diffy<0) diffy=-diffy;
74 		if (mindiffy>diffy)
75 		{
76 			mindiffy=diffy;
77 			mindiffx=COLS;
78 		}
79 		if (mindiffy==diffy)
80 		{
81 			if (mindiffx>=diffx && diffx>0)
82 			{
83 				mindiffx=diffx;
84 				minact=i;
85 			}
86 		}
87 	}
88 	Menu->menuitemactive=minact;
89 }
MenuMoveRight(tMenu * Menu)90 void MenuMoveRight(tMenu* Menu)
91 {
92 	tUInt16	actx;
93 	tUInt16	acty;
94 	tInt16	diffx;
95 	tInt16	diffy;
96 	tInt16	mindiffx;
97 	tInt16	mindiffy;
98 	tUInt16	minact;
99 	int i;
100 
101 	actx=Menu->MenuItems[Menu->menuitemactive].x;
102 	acty=Menu->MenuItems[Menu->menuitemactive].y;
103 
104 
105 	mindiffx=COLS;
106 	mindiffy=LINES;
107 	minact=Menu->menuitemactive;
108 
109 	for (i=0;i<Menu->menuitemnum;i++)
110 	if (i!=Menu->menuitemactive)
111 	{
112 		diffx=Menu->MenuItems[i].x-actx;
113 		diffy=acty-Menu->MenuItems[i].y;
114 		if (diffy<0) diffy=-diffy;
115 		if (mindiffy>diffy)
116 		{
117 			mindiffy=diffy;
118 			mindiffx=COLS;
119 		}
120 		if (mindiffy==diffy)
121 		{
122 			if (mindiffx>=diffx && diffx>0)
123 			{
124 				mindiffx=diffx;
125 				minact=i;
126 			}
127 		}
128 	}
129 	Menu->menuitemactive=minact;
130 }
MenuMoveUp(tMenu * Menu)131 void MenuMoveUp(tMenu* Menu)
132 {
133 	tUInt16	actx;
134 	tUInt16	acty;
135 	tInt16	diffx;
136 	tInt16	diffy;
137 	tInt16	mindiffx;
138 	tInt16	mindiffy;
139 	tUInt16	minact;
140 	int i;
141 
142 	actx=Menu->MenuItems[Menu->menuitemactive].x;
143 	acty=Menu->MenuItems[Menu->menuitemactive].y;
144 
145 
146 	mindiffx=COLS;
147 	mindiffy=LINES;
148 	minact=Menu->menuitemactive;
149 
150 	for (i=0;i<Menu->menuitemnum;i++)
151 	if (i!=Menu->menuitemactive)
152 	{
153 		diffx=Menu->MenuItems[i].x-actx;
154 		diffy=acty-Menu->MenuItems[i].y;
155 		if (diffx<0) diffx=-diffx;
156 		if (mindiffx>diffx)
157 		{
158 			mindiffx=diffx;
159 			mindiffy=LINES;
160 		}
161 		if (mindiffx==diffx)
162 		{
163 			if (mindiffy>=diffy && diffy>0)
164 			{
165 				mindiffy=diffy;
166 				minact=i;
167 			}
168 		}
169 	}
170 	Menu->menuitemactive=minact;
171 }
MenuMoveDown(tMenu * Menu)172 void MenuMoveDown(tMenu* Menu)
173 {
174 	tUInt16	actx;
175 	tUInt16	acty;
176 	tInt16	diffx;
177 	tInt16	diffy;
178 	tInt16	mindiffx;
179 	tInt16	mindiffy;
180 	tUInt16	minact;
181 	int i;
182 
183 	actx=Menu->MenuItems[Menu->menuitemactive].x;
184 	acty=Menu->MenuItems[Menu->menuitemactive].y;
185 
186 
187 	mindiffx=COLS;
188 	mindiffy=LINES;
189 	minact=Menu->menuitemactive;
190 
191 	for (i=0;i<Menu->menuitemnum;i++)
192 	if (i!=Menu->menuitemactive)
193 	{
194 		diffx=Menu->MenuItems[i].x-actx;
195 		diffy=Menu->MenuItems[i].y-acty;
196 		if (diffx<0) diffx=-diffx;
197 
198 		if (mindiffx>diffx)
199 		{
200 			mindiffx=diffx;
201 			mindiffy=LINES;
202 		}
203 		if (mindiffx==diffx)
204 		{
205 			if (mindiffy>=diffy && diffy>0)
206 			{
207 				mindiffy=diffy;
208 				minact=i;
209 			}
210 		}
211 	}
212 	Menu->menuitemactive=minact;
213 }
MenuSetActiveItem(tMenu * Menu,tInt8 itemnum)214 void MenuSetActiveItem(tMenu* Menu,tInt8 itemnum)
215 {
216 	Menu->menuitemactive=itemnum;
217 }
MenuInteract(tOutput * output,tMenu * Menu,tInt16 offsy,tInt16 offsx)218 tInt8 MenuInteract(tOutput* output,tMenu* Menu,tInt16 offsy,tInt16 offsx)
219 {
220 	tInt16	ch;
221 	int	i;
222 
223 	ch=0;
224 	printMenu(output,Menu,offsy,offsx);
225 	while (ch!=KEYENTER)
226 	{
227 		ch=getkey((tKeyTab*)output->pKeyTab,0);
228 		switch(ch)
229 		{
230 			case	KEYLEFT:	MenuMoveLeft(Menu);						break;
231 			case	KEYRIGHT:	MenuMoveRight(Menu);						break;
232 			case	KEYUP:		MenuMoveUp(Menu);						break;
233 			case	KEYDOWN:	MenuMoveDown(Menu);						break;
234 			case	KEYTAB:		Menu->menuitemactive=(Menu->menuitemactive+1)%Menu->menuitemnum;break;
235 			default:
236 				if (ch>=' ' && ch<127)
237 				{
238 					if (ch>='a' && ch<='z') ch-=32;
239 					for (i=0;i<Menu->menuitemnum;i++)
240 					{
241 						if (Menu->MenuItems[i].hotkey==ch)
242 						{
243 							Menu->menuitemactive=i;
244 							ch=KEYENTER;
245 						}
246 					}
247 				}
248 			break;
249 		}
250 		printMenu(output,Menu,offsy,offsx);
251 	}
252 	return Menu->menuitemactive;
253 }
254