Skip to content

Commit 28f9a51

Browse files
committed
Add ZForms lib.
1 parent db23496 commit 28f9a51

19 files changed

+1332
-0
lines changed

ZForms/BaseMenu.zsc

+247
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,247 @@
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+
}

ZForms/BoundingBox.zsc

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/// Bounding box class for positioning items.
2+
class ZFAABB {
3+
Vector2 pos;
4+
Vector2 size;
5+
6+
bool pointCollides(Vector2 point) {
7+
if (point.x > pos.x && point.x < pos.x + size.x &&
8+
point.y > pos.y && point.y < pos.y + size.y ) {
9+
return true;
10+
}
11+
return false;
12+
}
13+
14+
ZFAABB rectOfIntersection(ZFAABB other) {
15+
double left = max(pos.x, other.pos.x);
16+
double right = min(pos.x + size.x, other.pos.x + other.size.x);
17+
double top = max(pos.y, other.pos.y);
18+
double bottom = min(pos.y + size.y, other.pos.y + other.size.y);
19+
if (right - left > 0 && bottom - top > 0) {
20+
ZFAABB ret = new("ZFAABB");
21+
ret.pos = (left, top);
22+
ret.size = (right - left, bottom - top);
23+
return ret;
24+
}
25+
return new("ZFAABB");
26+
}
27+
}

ZForms/BoxImage.zsc

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
class ZFBoxImage : ZFElement {
2+
ZFBoxTextures boxTex;
3+
Vector2 boxScale;
4+
5+
void config(ZFBoxTextures textures = NULL, Vector2 scale = (1, 1)) {
6+
self.boxTex = textures;
7+
self.boxScale = scale;
8+
9+
self.alpha = 1;
10+
}
11+
12+
static ZFBoxImage create(Vector2 pos, Vector2 size, ZFBoxTextures textures = NULL, Vector2 scale = (1, 1)) {
13+
let ret = new('ZFBoxImage');
14+
15+
ret.config(textures, scale);
16+
ret.setBox(pos, size);
17+
18+
return ret;
19+
}
20+
21+
override void drawer() {
22+
drawBox((0, 0), box.size, boxTex, true, boxScale);
23+
}
24+
25+
override void onUIEvent (ZFUiEvent ev) {
26+
if (ev.type == UIEvent.Type_MouseMove) {
27+
doHover((ev.mouseX, ev.mouseY));
28+
}
29+
}
30+
}

ZForms/BoxTextures.zsc

+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
/// Used to determine what to be drawn to the screen for boxes.
2+
class ZFBoxTextures ui {
3+
string boxTexture;
4+
bool scaleSides;
5+
bool scaleMiddle;
6+
7+
Vector2 midSliceTopLeft;
8+
Vector2 midSliceBottomRight;
9+
10+
static ZFBoxTextures createSingleTexture(string tex, bool scaleTex) {
11+
let ret = new('ZFBoxTextures');
12+
13+
ret.setSingleTexture(tex);
14+
ret.scaleMiddle = scaleTex;
15+
16+
return ret;
17+
}
18+
19+
static ZFBoxTextures createTexturePixels(string boxTex, Vector2 topLeft, Vector2 bottomRight, bool scaleSides,
20+
bool scaleMiddle) {
21+
let ret = new('ZFBoxTextures');
22+
23+
ret.setTexturePixels(boxTex, topLeft, bottomRight);
24+
ret.scaleSides = scaleSides;
25+
ret.scaleMiddle = scaleMiddle;
26+
27+
return ret;
28+
}
29+
30+
static ZFBoxTextures createTextureNormalized(string boxTex, Vector2 topLeft, Vector2 bottomRight, bool scaleSides,
31+
bool scaleMiddle) {
32+
let ret = new('ZFBoxTextures');
33+
34+
ret.setTextureNormalized(boxTex, topLeft, bottomRight);
35+
ret.scaleSides = scaleSides;
36+
ret.scaleMiddle = scaleMiddle;
37+
38+
return ret;
39+
}
40+
41+
void setSingleTexture(string tex) {
42+
boxTexture = tex;
43+
44+
midSliceTopLeft = (0, 0);
45+
midSliceBottomRight = (1, 1);
46+
}
47+
48+
void setTexturePixels(string boxTex, Vector2 topLeft, Vector2 bottomRight) {
49+
boxTexture = boxTex;
50+
51+
Vector2 texSize = TexMan.getScaledSize(TexMan.checkForTexture(boxTexture, TexMan.Type_Any));
52+
midSliceTopLeft = (topLeft.x / texSize.x, topLeft.y / texSize.y);
53+
midSliceBottomRight = (bottomRight.x / texSize.x, bottomRight.y / texSize.y);
54+
}
55+
56+
void setTextureNormalized(string boxTex, Vector2 topLeft, Vector2 bottomRight) {
57+
boxTexture = boxTex;
58+
59+
midSliceTopLeft = topLeft;
60+
midSliceBottomRight = bottomRight;
61+
}
62+
63+
ZFBoxTextures duplicate() {
64+
let ret = new('ZFBoxTextures');
65+
66+
ret.boxTexture = boxTexture;
67+
ret.scaleSides = scaleSides;
68+
69+
ret.midSliceTopLeft = midSliceTopLeft;
70+
ret.midSliceBottomRight = midSliceBottomRight;
71+
72+
return ret;
73+
}
74+
}

0 commit comments

Comments
 (0)