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