2 CLASS(Container) EXTENDS(Item)
3 METHOD(Container, draw, void(entity))
4 METHOD(Container, keyUp, float(entity, float, float, float))
5 METHOD(Container, keyDown, float(entity, float, float, float))
6 METHOD(Container, mouseMove, float(entity, vector))
7 METHOD(Container, mousePress, float(entity, vector))
8 METHOD(Container, mouseDrag, float(entity, vector))
9 METHOD(Container, mouseRelease, float(entity, vector))
10 METHOD(Container, focusLeave, void(entity))
11 METHOD(Container, resizeNotify, void(entity, vector, vector, vector, vector))
12 METHOD(Container, resizeNotifyLie, void(entity, vector, vector, vector, vector, .vector, .vector, .vector))
13 METHOD(Container, addItem, void(entity, entity, vector, vector, float))
14 METHOD(Container, addItemCentered, void(entity, entity, vector, float))
15 METHOD(Container, addItemRightCentered, void(entity, entity, vector, float))
16 METHOD(Container, moveItemAfter, void(entity, entity, entity))
17 METHOD(Container, removeItem, void(entity, entity))
18 METHOD(Container, setFocus, void(entity, entity))
19 METHOD(Container, saveFocus, void(entity))
20 METHOD(Container, setAlphaOf, void(entity, entity, float))
21 METHOD(Container, itemFromPoint, entity(entity, vector))
22 METHOD(Container, showNotify, void(entity))
23 METHOD(Container, hideNotify, void(entity))
24 METHOD(Container, preferredFocusedGrandChild, entity(entity))
25 ATTRIB(Container, focusable, float, 0)
26 ATTRIB(Container, firstChild, entity, NULL)
27 ATTRIB(Container, lastChild, entity, NULL)
28 ATTRIB(Container, focusedChild, entity, NULL)
29 ATTRIB(Container, savedFocus, entity, NULL)
30 ATTRIB(Container, shown, float, 0)
32 METHOD(Container, enterSubitem, void(entity, entity))
33 METHOD(Container, enterLieSubitem, void(entity, vector, vector, vector, float))
34 METHOD(Container, leaveSubitem, void(entity))
39 .vector Container_origin;
40 .vector Container_size;
41 .vector Container_fontscale;
42 .float Container_alpha;
43 .vector Container_save_shift;
44 .vector Container_save_scale;
45 .vector Container_save_fontscale;
46 .float Container_save_alpha;
50 void Container_enterSubitem(entity me, entity sub)
52 me.enterLieSubitem(me, sub.Container_origin, sub.Container_size, sub.Container_fontscale, sub.Container_alpha);
55 void Container_enterLieSubitem(entity me, vector o, vector s, vector f, float a)
57 me.Container_save_shift = draw_shift;
58 me.Container_save_scale = draw_scale;
59 me.Container_save_alpha = draw_alpha;
60 me.Container_save_fontscale = draw_fontscale;
62 draw_shift = boxToGlobal(o, draw_shift, draw_scale);
63 draw_scale = boxToGlobalSize(s, draw_scale);
65 draw_fontscale = boxToGlobalSize(f, draw_fontscale);
69 void Container_leaveSubitem(entity me)
71 draw_shift = me.Container_save_shift;
72 draw_scale = me.Container_save_scale;
73 draw_alpha = me.Container_save_alpha;
74 draw_fontscale = me.Container_save_fontscale;
77 void Container_showNotify(entity me)
83 for(e = me.firstChild; e; e = e.nextSibling)
84 if(e.Container_alpha > 0)
88 void Container_hideNotify(entity me)
94 for(e = me.firstChild; e; e = e.nextSibling)
95 if(e.Container_alpha > 0)
99 void Container_setAlphaOf(entity me, entity other, float theAlpha)
103 if(other.Container_alpha > 0)
104 other.hideNotify(other);
108 if(other.Container_alpha <= 0)
109 other.showNotify(other);
111 other.Container_alpha = theAlpha;
114 void Container_resizeNotifyLie(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize, .vector originField, .vector sizeField, .vector fontScaleField)
119 for(e = me.firstChild; e; e = e.nextSibling)
123 me.enterLieSubitem(me, o, s, e.fontScaleField, e.Container_alpha);
124 e.resizeNotify(e, o, s, boxToGlobal(o, absOrigin, absSize), boxToGlobalSize(s, absSize));
130 for(e = me.firstChild; e; e = e.nextSibling)
137 me.enterLieSubitem(me, o, s, e.fontScaleField, e.Container_alpha);
138 e.resizeNotify(e, o, s, boxToGlobal(o, absOrigin, absSize), boxToGlobalSize(s, absSize));
143 SUPER(Container).resizeNotify(me, relOrigin, relSize, absOrigin, absSize);
146 void Container_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
148 me.resizeNotifyLie(me, relOrigin, relSize, absOrigin, absSize, Container_origin, Container_size, Container_fontscale);
151 entity Container_itemFromPoint(entity me, vector pos)
155 for(e = me.lastChild; e; e = e.prevSibling)
157 o = e.Container_origin;
158 s = e.Container_size;
159 if(pos.x < o.x) continue;
160 if(pos.y < o.y) continue;
161 if(pos.x >= o.x + s.x) continue;
162 if(pos.y >= o.y + s.y) continue;
168 void Container_draw(entity me)
173 for(e = me.firstChild; e; e = e.nextSibling)
177 if(e.Container_alpha < 0.003) // can't change color values anyway
179 me.enterSubitem(me, e);
184 SUPER(Container).draw(me);
187 void Container_focusLeave(entity me)
189 me.setFocus(me, NULL);
192 float Container_keyUp(entity me, float scan, float ascii, float shift)
199 me.enterSubitem(me, f);
200 r = f.keyUp(f, scan, ascii, shift);
207 float Container_keyDown(entity me, float scan, float ascii, float shift)
214 me.enterSubitem(me, f);
215 r = f.keyDown(f, scan, ascii, shift);
222 float Container_mouseMove(entity me, vector pos)
229 me.enterSubitem(me, f);
230 r = f.mouseMove(f, globalToBox(pos, f.Container_origin, f.Container_size));
236 float Container_mousePress(entity me, vector pos)
243 me.enterSubitem(me, f);
244 r = f.mousePress(f, globalToBox(pos, f.Container_origin, f.Container_size));
250 float Container_mouseDrag(entity me, vector pos)
257 me.enterSubitem(me, f);
258 r = f.mouseDrag(f, globalToBox(pos, f.Container_origin, f.Container_size));
264 float Container_mouseRelease(entity me, vector pos)
271 me.enterSubitem(me, f);
272 r = f.mouseRelease(f, globalToBox(pos, f.Container_origin, f.Container_size));
279 void Container_addItemCentered(entity me, entity other, vector theSize, float theAlpha)
281 me.addItem(me, other, '0.5 0.5 0' - 0.5 * theSize, theSize, theAlpha);
284 void Container_addItemRightCentered(entity me, entity other, vector theSize, float theAlpha)
286 me.addItem(me, other, '1 0.5 0' - 0.5 * theSize, theSize, theAlpha);
289 void Container_addItem(entity me, entity other, vector theOrigin, vector theSize, float theAlpha)
292 error("Can't add already added item!");
299 theOrigin.x -= 0.5 * (theSize.x - 1);
304 theOrigin.y -= 0.5 * (theSize.y - 1);
307 theOrigin.x = bound(0, theOrigin.x, 1 - theSize.x);
308 theOrigin.y = bound(0, theOrigin.y, 1 - theSize.y);
311 other.Container_origin = theOrigin;
312 other.Container_size = theSize;
313 me.setAlphaOf(me, other, theAlpha);
319 l.nextSibling = other;
321 me.firstChild = other;
323 other.prevSibling = l;
324 other.nextSibling = NULL;
325 me.lastChild = other;
328 void Container_removeItem(entity me, entity other)
330 if(other.parent != me)
331 error("Can't remove from wrong container!");
339 n = other.nextSibling;
340 p = other.prevSibling;
353 void Container_setFocus(entity me, entity other)
355 if(me.focusedChild == other)
360 me.focusedChild.focused = 0;
361 me.focusedChild.focusLeave(me.focusedChild);
362 me.focusedChild = NULL;
368 error("Trying to set focus in a non-focused control!");
372 me.focusedChild = me.savedFocus;
373 me.savedFocus = NULL;
374 me.focusedChild.focused = 1;
375 me.focusedChild.focusEnter(me.focusedChild);
377 if(me.focusedChild.instanceOfContainer)
378 me.focusedChild.setFocus(me.focusedChild, me.focusedChild.savedFocus);
382 me.focusedChild = other;
383 me.focusedChild.focused = 1;
384 me.focusedChild.focusEnter(me.focusedChild);
389 void Container_saveFocus(entity me)
391 me.savedFocus = me.focusedChild;
393 if(me.focusedChild.instanceOfContainer)
394 me.focusedChild.saveFocus(me.focusedChild);
397 void Container_moveItemAfter(entity me, entity other, entity dest)
399 // first: remove other from the chain
402 if(other.parent != me)
403 error("Can't move in wrong container!");
405 n = other.nextSibling;
406 p = other.prevSibling;
418 // now other got removed. Insert it behind dest now.
419 other.prevSibling = dest;
421 other.nextSibling = dest.nextSibling;
423 other.nextSibling = me.firstChild;
426 dest.nextSibling = other;
428 me.firstChild = other;
430 if(other.nextSibling)
431 other.nextSibling.prevSibling = other;
433 me.lastChild = other;
436 entity Container_preferredFocusedGrandChild(entity me)
443 for(e = me.firstChild; e; e = e.nextSibling)
445 if(e.instanceOfContainer)
447 e2 = e.preferredFocusedGrandChild(e);
449 if(!best || best.preferredFocusPriority < e2.preferredFocusPriority)
453 if(!best || best.preferredFocusPriority < e.preferredFocusPriority)