1
+ /// The base menu class for menus to inherit from.
2
+ /// Contains a mainFrame to put items in.
3
+ class ZFGenericMenu : GenericMenu {
4
+ ZFFrame mainFrame;
5
+ int mouseX;
6
+ int mouseY;
7
+
8
+ override void init(Menu parent) {
9
+ Super.init(parent);
10
+ mainFrame = ZFFrame.create((0, 0), (320, 200));
11
+ mainFrame.setBaseResolution((320, 200));
12
+ }
13
+
14
+ void setBaseResolution(Vector2 size) {
15
+ mainFrame.setBox((0, 0), size);
16
+ mainFrame.setBaseResolution(size);
17
+ }
18
+
19
+ override void ticker() {
20
+ // Trigger a mouse movement UI event to fix things "sticking" sometimes
21
+ let zfEv = new("ZFUiEvent");
22
+ zfEv.type = UIEvent.Type_MouseMove;
23
+ zfEv.mouseX = mouseX;
24
+ zfEv.mouseY = mouseY;
25
+ mainFrame.onUIEvent(zfEv);
26
+
27
+ Super.ticker();
28
+ mainFrame.ticker();
29
+ }
30
+
31
+ override void drawer() {
32
+ Super.drawer();
33
+ mainFrame.drawer();
34
+ }
35
+
36
+ // "relay" all UI events down to the elements so they can handle them
37
+ override bool onUIEvent(UIEvent ev) {
38
+ if (ev.type == UIEvent.Type_MouseMove) {
39
+ mouseX = ev.mouseX;
40
+ mouseY = ev.mouseY;
41
+ }
42
+
43
+ let zfEv = new("ZFUiEvent");
44
+
45
+ ZFUiEvent.fromGZDUiEvent(ev, zfEv);
46
+ mainFrame.onUIEvent(zfEv);
47
+
48
+ return Super.onUIEvent(ev);
49
+ }
50
+ }
51
+
52
+ class ZFEventHandlerMenu ui {
53
+ ZFFrame mainFrame;
54
+
55
+ protected bool useCustomCursor;
56
+ protected string customCursor;
57
+
58
+ virtual void init() {
59
+ mainFrame = ZFFrame.create((0, 0), (320, 200));
60
+ mainFrame.setBaseResolution((320, 200));
61
+ }
62
+
63
+ void setBaseResolution(Vector2 size) {
64
+ mainFrame.setBox((0, 0), size);
65
+ mainFrame.setBaseResolution(size);
66
+ }
67
+
68
+ void doTick() {
69
+ ticker();
70
+ }
71
+
72
+ protected virtual void ticker() {
73
+ // Trigger a mouse movement UI event to fix things "sticking" sometimes
74
+ let zfEv = new("ZFUiEvent");
75
+ zfEv.type = UIEvent.Type_MouseMove;
76
+ zfEv.mouseX = inputProc_MouseX;
77
+ zfEv.mouseY = inputProc_MouseY;
78
+ mainFrame.onUIEvent(zfEv);
79
+
80
+ mainFrame.ticker();
81
+ }
82
+
83
+ void doDraw() {
84
+ drawer();
85
+
86
+ if (useCustomCursor) {
87
+ Screen.DrawTexture(TexMan.checkForTexture(customCursor, TexMan.Type_Any), true, inputProc_MouseX, inputProc_MouseY);
88
+ }
89
+ }
90
+
91
+ protected virtual void drawer() {
92
+ mainFrame.drawer();
93
+ }
94
+
95
+ // "relay" all UI events down to the elements so they can handle them
96
+ virtual bool onUIEvent(UIEvent ev) {
97
+ let zfEv = new("ZFUiEvent");
98
+
99
+ ZFUiEvent.fromGZDUiEvent(ev, zfEv);
100
+ mainFrame.onUIEvent(zfEv);
101
+
102
+ return false;
103
+ }
104
+
105
+ private bool inputProc_Alt;
106
+ private bool inputProc_Shift;
107
+ private bool inputProc_Ctrl;
108
+ protected int inputProc_MouseX;
109
+ protected int inputProc_MouseY;
110
+
111
+ int, int getCustomMousePosition() {
112
+ return inputProc_MouseX, inputProc_MouseY;
113
+ }
114
+
115
+ void setCustomMousePosition(int posX, int posY) {
116
+ inputProc_MouseX = posX;
117
+ inputProc_MouseY = posY;
118
+ }
119
+
120
+ void copyCustomMousePosition(ZFEventHandlerMenu other) {
121
+ inputProc_MouseX = other.inputProc_MouseX;
122
+ inputProc_MouseY = other.inputProc_MouseY;
123
+ }
124
+
125
+ void onInputEvent(InputEvent gzdEv) {
126
+ let ev = new("ZFUiEvent");
127
+
128
+ ev.KeyString = gzdEv.KeyString;
129
+ ev.KeyChar = gzdEv.KeyChar;
130
+
131
+ ev.Type = -1;
132
+
133
+ switch (gzdEv.Type) {
134
+ case InputEvent.Type_None: ev.Type = UiEvent.Type_None; break;
135
+
136
+ case InputEvent.Type_KeyDown:
137
+ switch (gzdEv.KeyScan) {
138
+ // Mouse events
139
+ case InputEvent.Key_Mouse1 : ev.Type = UiEvent.Type_LButtonDown ; break;
140
+ case InputEvent.Key_Mouse2 : ev.Type = UiEvent.Type_RButtonDown ; break;
141
+ case InputEvent.Key_Mouse3 : ev.Type = UiEvent.Type_MButtonDown ; break;
142
+ case InputEvent.Key_MWheelUp : ev.Type = UiEvent.Type_WheelUp ; break;
143
+ case InputEvent.Key_MWheelDown : ev.Type = UiEvent.Type_WheelDown ; break;
144
+ case InputEvent.Key_MWheelLeft : ev.Type = UiEvent.Type_WheelLeft ; break;
145
+ case InputEvent.Key_MWheelRight: ev.Type = UiEvent.Type_WheelRight ; break;
146
+ case InputEvent.Key_Mouse4 : ev.Type = UiEvent.Type_BackButtonDown; break;
147
+ case InputEvent.Key_Mouse5 : ev.Type = UiEvent.Type_FwdButtonDown ; break;
148
+
149
+ // Ctrl, shift and alt
150
+ case InputEvent.Key_LShift: inputProc_Alt = true; break;
151
+ case InputEvent.Key_LCtrl : inputProc_Shift = true; break;
152
+ case InputEvent.Key_LAlt : inputProc_Ctrl = true; break;
153
+
154
+ // Everything else
155
+ default: {
156
+ ev.Type = UiEvent.Type_KeyDown;
157
+
158
+ int val = convertDIKToGUIKey(gzdEv.KeyScan);
159
+
160
+ if (val != -1) {
161
+ ev.KeyChar = val;
162
+ }
163
+ }
164
+ break;
165
+ }
166
+ break;
167
+
168
+ case InputEvent.Type_KeyUp:
169
+ switch (gzdEv.KeyScan) {
170
+ // Mouse events
171
+ case InputEvent.Key_Mouse1 : ev.Type = UiEvent.Type_LButtonUp ; break;
172
+ case InputEvent.Key_Mouse2 : ev.Type = UiEvent.Type_RButtonUp ; break;
173
+ case InputEvent.Key_Mouse3 : ev.Type = UiEvent.Type_MButtonUp ; break;
174
+ case InputEvent.Key_Mouse4 : ev.Type = UiEvent.Type_BackButtonUp; break;
175
+ case InputEvent.Key_Mouse5 : ev.Type = UiEvent.Type_FwdButtonUp ; break;
176
+
177
+ // Ctrl, shift and alt
178
+ case InputEvent.Key_LShift: inputProc_Alt = false; break;
179
+ case InputEvent.Key_LCtrl : inputProc_Shift = false; break;
180
+ case InputEvent.Key_LAlt : inputProc_Ctrl = false; break;
181
+
182
+ // Everything else
183
+ default: {
184
+ ev.Type = UiEvent.Type_KeyUp;
185
+
186
+ int val = convertDIKToGUIKey(gzdEv.KeyScan);
187
+
188
+ if (val != -1) {
189
+ ev.KeyChar = val;
190
+ }
191
+ }
192
+ break;
193
+ }
194
+ break;
195
+
196
+ case InputEvent.Type_Mouse:
197
+ inputProc_MouseX = clamp(inputProc_MouseX + gzdEv.MouseX, 0, Screen.GetWidth ());
198
+ inputProc_MouseY = clamp(inputProc_MouseY - gzdEv.MouseY, 0, Screen.GetHeight());
199
+
200
+ ev.Type = UiEvent.Type_MouseMove;
201
+ ev.MouseX = inputProc_MouseX;
202
+ ev.MouseY = inputProc_MouseY;
203
+ break;
204
+ }
205
+
206
+ if (ev.Type == -1) {
207
+ return;
208
+ }
209
+
210
+ mainFrame.onUIEvent(ev);
211
+ }
212
+
213
+ private int convertDIKToGUIKey(int keyScan) {
214
+ switch (keyScan) {
215
+ case InputEvent.Key_PgDn: return UiEvent.Key_PgDn;
216
+ case InputEvent.Key_PgUp: return UiEvent.Key_PgUp;
217
+ case InputEvent.Key_Home: return UiEvent.Key_Home;
218
+ case InputEvent.Key_End : return UiEvent.Key_End ;
219
+
220
+ case InputEvent.Key_UpArrow : return UiEvent.Key_Up ;
221
+ case InputEvent.Key_DownArrow : return UiEvent.Key_Down ;
222
+ case InputEvent.Key_LeftArrow : return UiEvent.Key_Left ;
223
+ case InputEvent.Key_RightArrow: return UiEvent.Key_Right;
224
+
225
+ case InputEvent.Key_Escape : return UiEvent.Key_Escape ;
226
+ case InputEvent.Key_Enter : return UiEvent.Key_Return ;
227
+ case InputEvent.Key_Tab : return UiEvent.Key_Tab ;
228
+ case InputEvent.Key_Del : return UiEvent.Key_Del ;
229
+ case InputEvent.Key_Backspace: return UiEvent.Key_Backspace;
230
+
231
+ case InputEvent.Key_F1 : return UiEvent.Key_F1 ;
232
+ case InputEvent.Key_F2 : return UiEvent.Key_F2 ;
233
+ case InputEvent.Key_F3 : return UiEvent.Key_F3 ;
234
+ case InputEvent.Key_F4 : return UiEvent.Key_F4 ;
235
+ case InputEvent.Key_F5 : return UiEvent.Key_F5 ;
236
+ case InputEvent.Key_F6 : return UiEvent.Key_F6 ;
237
+ case InputEvent.Key_F7 : return UiEvent.Key_F7 ;
238
+ case InputEvent.Key_F8 : return UiEvent.Key_F8 ;
239
+ case InputEvent.Key_F9 : return UiEvent.Key_F9 ;
240
+ case InputEvent.Key_F10: return UiEvent.Key_F10;
241
+ case InputEvent.Key_F11: return UiEvent.Key_F11;
242
+ case InputEvent.Key_F12: return UiEvent.Key_F12;
243
+ }
244
+
245
+ return -1;
246
+ }
247
+ }
0 commit comments