]> de.git.xonotic.org Git - voretournament/voretournament.git/blob - data/qcsrc/menu/item/inputcontainer.c
Initial checkout of Vore Tournament 0.1.alpha.
[voretournament/voretournament.git] / data / qcsrc / menu / item / inputcontainer.c
1 #ifdef INTERFACE\r
2 CLASS(InputContainer) EXTENDS(Container)\r
3         METHOD(InputContainer, keyDown, float(entity, float, float, float))\r
4         METHOD(InputContainer, mouseMove, float(entity, vector))\r
5         METHOD(InputContainer, mousePress, float(entity, vector))\r
6         METHOD(InputContainer, mouseRelease, float(entity, vector))\r
7         METHOD(InputContainer, mouseDrag, float(entity, vector))\r
8         METHOD(InputContainer, focusLeave, void(entity))\r
9         METHOD(InputContainer, resizeNotify, void(entity, vector, vector, vector, vector))\r
10 \r
11         METHOD(InputContainer, _changeFocusXY, float(entity, vector))\r
12         ATTRIB(InputContainer, mouseFocusedChild, entity, NULL)\r
13         ATTRIB(InputContainer, isTabRoot, float, 0)\r
14 ENDCLASS(InputContainer)\r
15 #endif\r
16 \r
17 #ifdef IMPLEMENTATION\r
18 void resizeNotifyInputContainer(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)\r
19 {\r
20         resizeNotifyContainer(me, relOrigin, relSize, absOrigin, absSize);\r
21         /*\r
22         if(me.parent.instanceOfInputContainer)\r
23                 me.isTabRoot = 0;\r
24         else\r
25                 me.isTabRoot = 1;\r
26         */\r
27 }\r
28 \r
29 void focusLeaveInputContainer(entity me)\r
30 {\r
31         focusLeaveContainer(me);\r
32         me.mouseFocusedChild = NULL;\r
33 }\r
34 \r
35 float keyDownInputContainer(entity me, float scan, float ascii, float shift)\r
36 {\r
37         entity f, ff;\r
38         if(keyDownContainer(me, scan, ascii, shift))\r
39                 return 1;\r
40         if(scan == K_ESCAPE)\r
41         {\r
42                 f = me.focusedChild;\r
43                 if(f)\r
44                 {\r
45                         me.setFocus(me, NULL);\r
46                         return 1;\r
47                 }\r
48                 return 0;\r
49         }\r
50         if(scan == K_TAB)\r
51         {\r
52                 f = me.focusedChild;\r
53                 if(shift & S_SHIFT)\r
54                 {\r
55                         if(f)\r
56                         {\r
57                                 for(ff = f.prevSibling; ff; ff = ff.prevSibling)\r
58                                 {\r
59                                         if not(ff.focusable)\r
60                                                 continue;\r
61                                         me.setFocus(me, ff);\r
62                                         return 1;\r
63                                 }\r
64                         }\r
65                         if(!f || me.isTabRoot)\r
66                         {\r
67                                 for(ff = me.lastChild; ff; ff = ff.prevSibling)\r
68                                 {\r
69                                         if not(ff.focusable)\r
70                                                 continue;\r
71                                         me.setFocus(me, ff);\r
72                                         return 1;\r
73                                 }\r
74                                 return 0; // AIIIIEEEEE!\r
75                         }\r
76                 }\r
77                 else\r
78                 {\r
79                         if(f)\r
80                         {\r
81                                 for(ff = f.nextSibling; ff; ff = ff.nextSibling)\r
82                                 {\r
83                                         if not(ff.focusable)\r
84                                                 continue;\r
85                                         me.setFocus(me, ff);\r
86                                         return 1;\r
87                                 }\r
88                         }\r
89                         if(!f || me.isTabRoot)\r
90                         {\r
91                                 for(ff = me.firstChild; ff; ff = ff.nextSibling)\r
92                                 {\r
93                                         if not(ff.focusable)\r
94                                                 continue;\r
95                                         me.setFocus(me, ff);\r
96                                         return 1;\r
97                                 }\r
98                                 return 0; // AIIIIEEEEE!\r
99                         }\r
100                 }\r
101         }\r
102         return 0;\r
103 }\r
104 \r
105 float _changeFocusXYInputContainer(entity me, vector pos)\r
106 {\r
107         entity e, ne;\r
108         e = me.mouseFocusedChild;\r
109         ne = me.itemFromPoint(me, pos);\r
110         if(ne)\r
111                 if not(ne.focusable)\r
112                         ne = NULL;\r
113         me.mouseFocusedChild = ne;\r
114         if(ne)\r
115                 if(ne != e)\r
116                 {\r
117                         me.setFocus(me, ne);\r
118                         if(ne.instanceOfInputContainer)\r
119                         {\r
120                                 ne.focusedChild = NULL;\r
121                                 ne._changeFocusXY(e, globalToBox(pos, ne.Container_origin, ne.Container_size));\r
122                         }\r
123                 }\r
124         return (ne != NULL);\r
125 }\r
126 \r
127 float mouseDragInputContainer(entity me, vector pos)\r
128 {\r
129         if(mouseDragContainer(me, pos))\r
130                 return 1;\r
131         if(pos_x >= 0 && pos_y >= 0 && pos_x < 1 && pos_y < 1)\r
132                 return 1;\r
133         return 0;\r
134 }\r
135 float mouseMoveInputContainer(entity me, vector pos)\r
136 {\r
137         if(me._changeFocusXY(me, pos))\r
138                 if(mouseMoveContainer(me, pos))\r
139                         return 1;\r
140         if(pos_x >= 0 && pos_y >= 0 && pos_x < 1 && pos_y < 1)\r
141                 return 1;\r
142         return 0;\r
143 }\r
144 float mousePressInputContainer(entity me, vector pos)\r
145 {\r
146         me.mouseFocusedChild = NULL; // force focusing\r
147         if(me._changeFocusXY(me, pos))\r
148                 if(mousePressContainer(me, pos))\r
149                         return 1;\r
150         if(pos_x >= 0 && pos_y >= 0 && pos_x < 1 && pos_y < 1)\r
151                 return 1;\r
152         return 0;\r
153 }\r
154 float mouseReleaseInputContainer(entity me, vector pos)\r
155 {\r
156         float r;\r
157         r = mouseReleaseContainer(me, pos);\r
158         if(me.focused) // am I still eligible for this? (UGLY HACK, but a mouse event could have changed focus away)\r
159                 if(me._changeFocusXY(me, pos))\r
160                         return 1;\r
161         if(pos_x >= 0 && pos_y >= 0 && pos_x < 1 && pos_y < 1)\r
162                 return 1;\r
163         return 0;\r
164 }\r
165 #endif\r