2 CLASS(Container) EXTENDS(Item)
\r
3 METHOD(Container, draw, void(entity))
\r
4 METHOD(Container, keyUp, float(entity, float, float, float))
\r
5 METHOD(Container, keyDown, float(entity, float, float, float))
\r
6 METHOD(Container, mouseMove, float(entity, vector))
\r
7 METHOD(Container, mousePress, float(entity, vector))
\r
8 METHOD(Container, mouseDrag, float(entity, vector))
\r
9 METHOD(Container, mouseRelease, float(entity, vector))
\r
10 METHOD(Container, focusLeave, void(entity))
\r
11 METHOD(Container, resizeNotify, void(entity, vector, vector, vector, vector))
\r
12 METHOD(Container, resizeNotifyLie, void(entity, vector, vector, vector, vector, .vector, .vector))
\r
13 METHOD(Container, addItem, void(entity, entity, vector, vector, float))
\r
14 METHOD(Container, addItemCentered, void(entity, entity, vector, float))
\r
15 METHOD(Container, moveItemAfter, void(entity, entity, entity))
\r
16 METHOD(Container, removeItem, void(entity, entity))
\r
17 METHOD(Container, setFocus, void(entity, entity))
\r
18 METHOD(Container, setAlphaOf, void(entity, entity, float))
\r
19 METHOD(Container, itemFromPoint, entity(entity, vector))
\r
20 METHOD(Container, showNotify, void(entity))
\r
21 METHOD(Container, hideNotify, void(entity))
\r
22 METHOD(Container, preferredFocusedGrandChild, entity(entity))
\r
23 ATTRIB(Container, focusable, float, 0)
\r
24 ATTRIB(Container, firstChild, entity, NULL)
\r
25 ATTRIB(Container, lastChild, entity, NULL)
\r
26 ATTRIB(Container, focusedChild, entity, NULL)
\r
27 ATTRIB(Container, shown, float, 0)
\r
29 .entity nextSibling;
\r
30 .entity prevSibling;
\r
32 .vector Container_origin;
\r
33 .vector Container_size;
\r
34 .vector Container_fontscale;
\r
35 .float Container_alpha;
\r
38 #ifdef IMPLEMENTATION
\r
39 void showNotifyContainer(entity me)
\r
45 for(e = me.firstChild; e; e = e.nextSibling)
\r
46 if(e.Container_alpha > 0)
\r
50 void hideNotifyContainer(entity me)
\r
56 for(e = me.firstChild; e; e = e.nextSibling)
\r
57 if(e.Container_alpha > 0)
\r
61 void setAlphaOfContainer(entity me, entity other, float theAlpha)
\r
65 if(other.Container_alpha > 0)
\r
66 other.hideNotify(other);
\r
70 if(other.Container_alpha <= 0)
\r
71 other.showNotify(other);
\r
73 other.Container_alpha = theAlpha;
\r
76 void resizeNotifyLieContainer(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize, .vector originField, .vector sizeField)
\r
81 for(e = me.firstChild; e; e = e.nextSibling)
\r
85 e.resizeNotify(e, o, s, boxToGlobal(o, absOrigin, absSize), boxToGlobalSize(s, absSize));
\r
90 for(e = me.firstChild; e; e = e.nextSibling)
\r
97 e.resizeNotify(e, o, s, boxToGlobal(o, absOrigin, absSize), boxToGlobalSize(s, absSize));
\r
101 resizeNotifyItem(me, relOrigin, relSize, absOrigin, absSize);
\r
104 void resizeNotifyContainer(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
\r
106 me.resizeNotifyLie(me, relOrigin, relSize, absOrigin, absSize, Container_origin, Container_size);
\r
109 entity itemFromPointContainer(entity me, vector pos)
\r
113 for(e = me.lastChild; e; e = e.prevSibling)
\r
115 o = e.Container_origin;
\r
116 s = e.Container_size;
\r
117 if(pos_x < o_x) continue;
\r
118 if(pos_y < o_y) continue;
\r
119 if(pos_x >= o_x + s_x) continue;
\r
120 if(pos_y >= o_y + s_y) continue;
\r
126 void drawContainer(entity me)
\r
131 vector oldfontscale;
\r
134 oldshift = draw_shift;
\r
135 oldscale = draw_scale;
\r
136 oldalpha = draw_alpha;
\r
137 oldfontscale = draw_fontscale;
\r
139 for(e = me.firstChild; e; e = e.nextSibling)
\r
143 if(e.Container_alpha < 0.003) // can't change color values anyway
\r
145 draw_shift = boxToGlobal(e.Container_origin, oldshift, oldscale);
\r
146 draw_scale = boxToGlobalSize(e.Container_size, oldscale);
\r
147 if(e.Container_fontscale != '0 0 0')
\r
148 draw_fontscale = boxToGlobalSize(e.Container_fontscale, oldfontscale);
\r
149 draw_alpha *= e.Container_alpha;
\r
151 draw_shift = oldshift;
\r
152 draw_scale = oldscale;
\r
153 draw_fontscale = oldfontscale;
\r
154 draw_alpha = oldalpha;
\r
158 void focusLeaveContainer(entity me)
\r
160 me.setFocus(me, NULL);
\r
163 float keyUpContainer(entity me, float scan, float ascii, float shift)
\r
166 f = me.focusedChild;
\r
168 return f.keyUp(f, scan, ascii, shift);
\r
172 float keyDownContainer(entity me, float scan, float ascii, float shift)
\r
175 f = me.focusedChild;
\r
177 return f.keyDown(f, scan, ascii, shift);
\r
181 float mouseMoveContainer(entity me, vector pos)
\r
184 f = me.focusedChild;
\r
186 return f.mouseMove(f, globalToBox(pos, f.Container_origin, f.Container_size));
\r
189 float mousePressContainer(entity me, vector pos)
\r
192 f = me.focusedChild;
\r
194 return f.mousePress(f, globalToBox(pos, f.Container_origin, f.Container_size));
\r
197 float mouseDragContainer(entity me, vector pos)
\r
200 f = me.focusedChild;
\r
202 return f.mouseDrag(f, globalToBox(pos, f.Container_origin, f.Container_size));
\r
205 float mouseReleaseContainer(entity me, vector pos)
\r
208 f = me.focusedChild;
\r
210 return f.mouseRelease(f, globalToBox(pos, f.Container_origin, f.Container_size));
\r
214 void addItemCenteredContainer(entity me, entity other, vector theSize, float theAlpha)
\r
216 me.addItem(me, other, '0.5 0.5 0' - 0.5 * theSize, theSize, theAlpha);
\r
219 void addItemContainer(entity me, entity other, vector theOrigin, vector theSize, float theAlpha)
\r
222 error("Can't add already added item!");
\r
224 if(other.focusable)
\r
229 theOrigin_x -= 0.5 * (theSize_x - 1);
\r
234 theOrigin_y -= 0.5 * (theSize_y - 1);
\r
237 theOrigin_x = bound(0, theOrigin_x, 1 - theSize_x);
\r
238 theOrigin_y = bound(0, theOrigin_y, 1 - theSize_y);
\r
241 other.Container_origin = theOrigin;
\r
242 other.Container_size = theSize;
\r
243 me.setAlphaOf(me, other, theAlpha);
\r
250 l.nextSibling = other;
\r
252 me.firstChild = other;
\r
254 other.prevSibling = l;
\r
255 other.nextSibling = NULL;
\r
256 me.lastChild = other;
\r
258 draw_NeedResizeNotify = 1;
\r
261 void removeItemContainer(entity me, entity other)
\r
263 if(other.parent != me)
\r
264 error("Can't remove from wrong container!");
\r
266 if(other.focusable)
\r
269 other.parent = NULL;
\r
274 n = other.nextSibling;
\r
275 p = other.prevSibling;
\r
288 void setFocusContainer(entity me, entity other)
\r
292 error("Trying to set focus in a non-focused control!");
\r
293 if(me.focusedChild == other)
\r
295 //print(etos(me), ": focus changes from ", etos(me.focusedChild), " to ", etos(other), "\n");
\r
296 if(me.focusedChild)
\r
298 me.focusedChild.focused = 0;
\r
299 me.focusedChild.focusLeave(me.focusedChild);
\r
304 other.focusEnter(other);
\r
306 me.focusedChild = other;
\r
309 void moveItemAfterContainer(entity me, entity other, entity dest)
\r
311 // first: remove other from the chain
\r
314 if(other.parent != me)
\r
315 error("Can't move in wrong container!");
\r
319 n = other.nextSibling;
\r
320 p = other.prevSibling;
\r
332 // now other got removed. Insert it behind dest now.
\r
333 other.prevSibling = dest;
\r
335 other.nextSibling = dest.nextSibling;
\r
337 other.nextSibling = me.firstChild;
\r
340 dest.nextSibling = other;
\r
342 me.firstChild = other;
\r
344 if(other.nextSibling)
\r
345 other.nextSibling.prevSibling = other;
\r
347 me.lastChild = other;
\r
350 entity preferredFocusedGrandChildContainer(entity me)
\r
357 for(e = me.firstChild; e; e = e.nextSibling)
\r
359 if(e.instanceOfContainer)
\r
361 e2 = e.preferredFocusedGrandChild(e);
\r
363 if(!best || best.preferredFocusPriority < e2.preferredFocusPriority)
\r
367 if(!best || best.preferredFocusPriority < e.preferredFocusPriority)
\r