2 CLASS(Nexposee) EXTENDS(Container)
3 METHOD(Nexposee, draw, void(entity))
4 METHOD(Nexposee, keyDown, float(entity, float, float, float))
5 METHOD(Nexposee, keyUp, float(entity, float, float, float))
6 METHOD(Nexposee, mousePress, float(entity, vector))
7 METHOD(Nexposee, mouseMove, float(entity, vector))
8 METHOD(Nexposee, mouseRelease, float(entity, vector))
9 METHOD(Nexposee, mouseDrag, float(entity, vector))
10 METHOD(Nexposee, resizeNotify, void(entity, vector, vector, vector, vector))
11 METHOD(Nexposee, focusEnter, void(entity))
12 METHOD(Nexposee, close, void(entity))
14 ATTRIB(Nexposee, animationState, float, -1)
15 ATTRIB(Nexposee, animationFactor, float, 0)
16 ATTRIB(Nexposee, selectedChild, entity, NULL)
17 ATTRIB(Nexposee, mouseFocusedChild, entity, NULL)
18 METHOD(Nexposee, addItem, void(entity, entity, vector, vector, float))
19 METHOD(Nexposee, calc, void(entity))
20 METHOD(Nexposee, setNexposee, void(entity, entity, vector, float, float))
21 ATTRIB(Nexposee, mousePosition, vector, '0 0 0')
24 void ExposeeCloseButton_Click(entity button, entity other); // un-exposees the current state
28 // 0 = thumbnails seen
32 // animation factor: 0 = minimum theSize, 1 = maximum theSize
36 .vector Nexposee_initialSize;
37 .vector Nexposee_initialOrigin;
38 .float Nexposee_initialAlpha;
40 .vector Nexposee_smallSize;
41 .vector Nexposee_smallOrigin;
42 .float Nexposee_smallAlpha;
43 .float Nexposee_mediumAlpha;
44 .vector Nexposee_scaleCenter;
46 void closeNexposee(entity me)
48 // user must override this
51 void ExposeeCloseButton_Click(entity button, entity other)
53 other.selectedChild = other.focusedChild;
54 other.setFocus(other, NULL);
55 other.animationState = 3;
58 void resizeNotifyNexposee(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
60 me.resizeNotifyLie(me, relOrigin, relSize, absOrigin, absSize, Nexposee_initialOrigin, Nexposee_initialSize);
63 void calcNexposee(entity me)
67 * can't put that here ;)
71 vector emins, emaxs, e2mins, e2maxs;
73 for(scale = 0.7;; scale *= 0.99)
75 for(e = me.firstChild; e; e = e.nextSibling)
77 e.Nexposee_smallOrigin = (e.Nexposee_initialOrigin - e.Nexposee_scaleCenter) * scale + e.Nexposee_scaleCenter;
78 e.Nexposee_smallSize = e.Nexposee_initialSize * scale;
81 for(e = me.firstChild; e; e = e.nextSibling)
83 emins = e.Nexposee_smallOrigin;
84 emaxs = emins + e.Nexposee_smallSize;
85 for(e2 = e.nextSibling; e2; e2 = e2.nextSibling)
87 e2mins = e2.Nexposee_smallOrigin;
88 e2maxs = e2mins + e2.Nexposee_smallSize;
90 // two intervals [amins, amaxs] and [bmins, bmaxs] overlap if:
91 // amins < bmins < amaxs < bmaxs
95 if((e2mins_x - emaxs_x) * (emins_x - e2maxs_x) > 0) // x overlap
96 if((e2mins_y - emaxs_y) * (emins_y - e2maxs_y) > 0) // y overlap
108 for(e = me.firstChild; e; e = e.nextSibling)
110 e.Nexposee_smallOrigin = (e.Nexposee_initialOrigin - e.Nexposee_scaleCenter) * scale + e.Nexposee_scaleCenter;
111 e.Nexposee_smallSize = e.Nexposee_initialSize * scale;
115 void setNexposeeNexposee(entity me, entity other, vector scalecenter, float a0, float a1)
117 other.Nexposee_scaleCenter = scalecenter;
118 other.Nexposee_smallAlpha = a0;
119 me.setAlphaOf(me, other, a0);
120 other.Nexposee_mediumAlpha = a1;
123 void drawNexposee(entity me)
128 if(me.animationState == -1)
130 me.animationState = 0;
134 //print(ftos(me.animationState), "\n");
136 f = min(1, frametime * 5);
137 switch(me.animationState)
140 me.animationFactor = 0;
143 me.animationFactor += f;
144 if(me.animationFactor >= 1)
146 me.animationFactor = 1;
147 me.animationState = 2;
148 setFocusContainer(me, me.selectedChild);
152 me.animationFactor = 1;
155 me.animationFactor -= f;
156 me.mouseFocusedChild = me.itemFromPoint(me, me.mousePosition);
157 if(me.animationFactor <= 0)
159 me.animationFactor = 0;
160 me.animationState = 0;
161 me.selectedChild = me.mouseFocusedChild;
166 f = min(1, frametime * 10);
167 for(e = me.firstChild; e; e = e.nextSibling)
171 if(e == me.selectedChild)
173 e.Container_origin = e.Nexposee_smallOrigin * (1 - me.animationFactor) + e.Nexposee_initialOrigin * me.animationFactor;
174 e.Container_size = e.Nexposee_smallSize * (1 - me.animationFactor) + e.Nexposee_initialSize * me.animationFactor;
175 a0 = e.Nexposee_mediumAlpha;
176 if(me.animationState == 3)
177 if(e != me.mouseFocusedChild)
178 a0 = e.Nexposee_smallAlpha;
179 a = a0 * (1 - me.animationFactor) + me.animationFactor;
183 // minimum theSize counts
184 e.Container_origin = e.Nexposee_smallOrigin;
185 e.Container_size = e.Nexposee_smallSize;
186 a = e.Nexposee_smallAlpha * (1 - me.animationFactor);
188 me.setAlphaOf(me, e, e.Container_alpha * (1 - f) + a * f);
194 float mousePressNexposee(entity me, vector pos)
196 if(me.animationState == 0)
198 me.mouseFocusedChild = NULL;
199 mouseMoveNexposee(me, pos);
200 if(me.mouseFocusedChild)
202 me.animationState = 1;
203 setFocusContainer(me, NULL);
209 else if(me.animationState == 2)
211 if not(mousePressContainer(me, pos))
213 me.animationState = 3;
214 setFocusContainer(me, NULL);
221 float mouseReleaseNexposee(entity me, vector pos)
223 if(me.animationState == 2)
224 return mouseReleaseContainer(me, pos);
228 float mouseDragNexposee(entity me, vector pos)
230 if(me.animationState == 2)
231 return mouseDragContainer(me, pos);
235 float mouseMoveNexposee(entity me, vector pos)
238 me.mousePosition = pos;
239 e = me.mouseFocusedChild;
240 me.mouseFocusedChild = me.itemFromPoint(me, pos);
241 if(me.animationState == 2)
242 return mouseMoveContainer(me, pos);
243 if(me.animationState == 0)
245 if(me.mouseFocusedChild)
246 if(me.mouseFocusedChild != e)
247 me.selectedChild = me.mouseFocusedChild;
253 float keyUpNexposee(entity me, float scan, float ascii, float shift)
255 if(me.animationState == 2)
256 return keyUpContainer(me, scan, ascii, shift);
260 float keyDownNexposee(entity me, float scan, float ascii, float shift)
263 if(me.animationState == 2)
264 if(keyDownContainer(me, scan, ascii, shift))
268 if(me.animationState == 0)
273 me.selectedChild = me.selectedChild.prevSibling;
274 if not(me.selectedChild)
275 me.selectedChild = me.lastChild;
280 me.selectedChild = me.selectedChild.nextSibling;
281 if not(me.selectedChild)
282 me.selectedChild = me.firstChild;
286 switch(me.animationState)
290 nexposeeKey = ((scan == K_SPACE) || (scan == K_ENTER));
294 nexposeeKey = (scan == K_ESCAPE);
299 switch(me.animationState)
303 me.animationState = 1;
307 me.animationState = 3;
311 me.selectedChild = me.focusedChild;
312 if not(me.selectedChild)
313 me.animationState = 0;
314 setFocusContainer(me, NULL);
320 void addItemNexposee(entity me, entity other, vector theOrigin, vector theSize, float theAlpha)
322 addItemContainer(me, other, theOrigin, theSize, theAlpha);
323 other.Nexposee_initialSize = other.Container_size;
324 other.Nexposee_initialOrigin = other.Container_origin;
325 other.Nexposee_initialAlpha = other.Container_alpha;
328 void focusEnterNexposee(entity me)
330 if(me.animationState == 2)
331 setFocusContainer(me, me.selectedChild);