Include gmqcc binaries for Windows and Linux
[voretournament/voretournament.git] / data / qcsrc / menu / item / button.c
1 #ifdef INTERFACE\r
2 CLASS(Button) EXTENDS(Label)\r
3         METHOD(Button, configureButton, void(entity, string, float, string))\r
4         METHOD(Button, draw, void(entity))\r
5         METHOD(Button, showNotify, void(entity))\r
6         METHOD(Button, resizeNotify, void(entity, vector, vector, vector, vector))\r
7         METHOD(Button, keyDown, float(entity, float, float, float))\r
8         METHOD(Button, mousePress, float(entity, vector))\r
9         METHOD(Button, mouseDrag, float(entity, vector))\r
10         METHOD(Button, mouseRelease, float(entity, vector))\r
11         ATTRIB(Button, onClick, void(entity, entity), func_null)\r
12         ATTRIB(Button, onClickEntity, entity, NULL)\r
13         ATTRIB(Button, src, string, string_null)\r
14         ATTRIB(Button, srcSuffix, string, string_null)\r
15         ATTRIB(Button, src2, string, string_null) // is centered, same aspect, and stretched to label size\r
16         ATTRIB(Button, src2scale, float, 1)\r
17         ATTRIB(Button, srcMulti, float, 1) // 0: button square left, text right; 1: button stretched, text over it\r
18         ATTRIB(Button, buttonLeftOfText, float, 0)\r
19         ATTRIB(Button, focusable, float, 1)\r
20         ATTRIB(Button, pressed, float, 0)\r
21         ATTRIB(Button, clickTime, float, 0)\r
22         ATTRIB(Button, disabled, float, 0)\r
23         ATTRIB(Button, disabledAlpha, float, 0.3)\r
24         ATTRIB(Button, forcePressed, float, 0)\r
25         ATTRIB(Button, color, vector, '1 1 1')\r
26         ATTRIB(Button, colorC, vector, '1 1 1')\r
27         ATTRIB(Button, colorF, vector, '1 1 1')\r
28         ATTRIB(Button, colorD, vector, '1 1 1')\r
29         ATTRIB(Button, color2, vector, '1 1 1')\r
30         ATTRIB(Button, alpha2, float, 1)\r
31 \r
32         ATTRIB(Button, origin, vector, '0 0 0')\r
33         ATTRIB(Button, size, vector, '0 0 0')\r
34 ENDCLASS(Button)\r
35 #endif\r
36 \r
37 #ifdef IMPLEMENTATION\r
38 void resizeNotifyButton(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)\r
39 {\r
40         if(me.srcMulti)\r
41                 me.keepspaceLeft = 0;\r
42         else\r
43                 me.keepspaceLeft = min(0.8, absSize_y / absSize_x);\r
44         resizeNotifyLabel(me, relOrigin, relSize, absOrigin, absSize);\r
45 }\r
46 void configureButtonButton(entity me, string txt, float sz, string gfx)\r
47 {\r
48         configureLabelLabel(me, txt, sz, me.srcMulti ? 0.5 : 0);\r
49         me.src = gfx;\r
50 }\r
51 float keyDownButton(entity me, float key, float ascii, float shift)\r
52 {\r
53         if(key == K_ENTER || key == K_SPACE)\r
54         {\r
55                 me.clickTime = 0.1; // delayed for effect\r
56                 return 1;\r
57         }\r
58         return 0;\r
59 }\r
60 float mouseDragButton(entity me, vector pos)\r
61 {\r
62         me.pressed = 1;\r
63         if(pos_x < 0) me.pressed = 0;\r
64         if(pos_y < 0) me.pressed = 0;\r
65         if(pos_x >= 1) me.pressed = 0;\r
66         if(pos_y >= 1) me.pressed = 0;\r
67         return 1;\r
68 }\r
69 float mousePressButton(entity me, vector pos)\r
70 {\r
71         me.mouseDrag(me, pos); // verify coordinates\r
72         if(cvar("menu_sounds"))\r
73                 localsound("sound/misc/menu2.wav");\r
74         return 1;\r
75 }\r
76 float mouseReleaseButton(entity me, vector pos)\r
77 {\r
78         me.mouseDrag(me, pos); // verify coordinates\r
79         if(me.pressed)\r
80         {\r
81                 if not(me.disabled)\r
82                         me.onClick(me, me.onClickEntity);\r
83                 me.pressed = 0;\r
84         }\r
85         return 1;\r
86 }\r
87 void showNotifyButton(entity me)\r
88 {\r
89         me.focusable = !me.disabled;\r
90 }\r
91 .float playedfocus;\r
92 void drawButton(entity me)\r
93 {\r
94         vector bOrigin, bSize;\r
95         float save;\r
96 \r
97         me.focusable = !me.disabled;\r
98 \r
99         save = draw_alpha;\r
100         if(me.disabled)\r
101                 draw_alpha *= me.disabledAlpha;\r
102 \r
103         if(me.src)\r
104         {\r
105                 if(me.srcMulti)\r
106                 {\r
107                         bOrigin = '0 0 0';\r
108                         bSize = '1 1 0';\r
109                         if(me.disabled)\r
110                                 draw_ButtonPicture(bOrigin, strcat(me.src, "_d", me.srcSuffix), bSize, me.colorD, 1);\r
111                         else if(me.forcePressed || me.pressed || me.clickTime > 0)\r
112                                 draw_ButtonPicture(bOrigin, strcat(me.src, "_c", me.srcSuffix), bSize, me.colorC, 1);\r
113                         else if(me.focused)\r
114                                 draw_ButtonPicture(bOrigin, strcat(me.src, "_f", me.srcSuffix), bSize, me.colorF, 1);\r
115                         else\r
116                                 draw_ButtonPicture(bOrigin, strcat(me.src, "_n", me.srcSuffix), bSize, me.color, 1);\r
117                 }\r
118                 else\r
119                 {\r
120                         if(me.realFontSize_y == 0)\r
121                         {\r
122                                 bOrigin = '0 0 0';\r
123                                 bSize = '1 1 0';\r
124                         }\r
125                         else\r
126                         {\r
127                                 bOrigin = eY * (0.5 * (1 - me.realFontSize_y)) + eX * (0.5 * (me.keepspaceLeft - me.realFontSize_x));\r
128                                 bSize = me.realFontSize;\r
129                         }\r
130                         if(me.disabled)\r
131                                 draw_Picture(bOrigin, strcat(me.src, "_d", me.srcSuffix), bSize, me.colorD, 1);\r
132                         else if(me.forcePressed || me.pressed || me.clickTime > 0)\r
133                                 draw_Picture(bOrigin, strcat(me.src, "_c", me.srcSuffix), bSize, me.colorC, 1);\r
134                         else if(me.focused)\r
135                                 draw_Picture(bOrigin, strcat(me.src, "_f", me.srcSuffix), bSize, me.colorF, 1);\r
136                         else\r
137                                 draw_Picture(bOrigin, strcat(me.src, "_n", me.srcSuffix), bSize, me.color, 1);\r
138                 }\r
139         }\r
140         if(me.src2)\r
141         {\r
142                 bOrigin = me.keepspaceLeft * eX;\r
143                 bSize = eY + eX * (1 - me.keepspaceLeft);\r
144 \r
145                 bOrigin += bSize * (0.5 - 0.5 * me.src2scale);\r
146                 bSize = bSize * me.src2scale;\r
147 \r
148                 draw_Picture(bOrigin, me.src2, bSize, me.color2, me.alpha2);\r
149         }\r
150 \r
151         draw_alpha = save;\r
152 \r
153         drawLabel(me);\r
154 \r
155         if(me.clickTime > 0 && me.clickTime <= frametime)\r
156         {\r
157                 // keyboard click timer expired? Fire the event then.\r
158                 if not(me.disabled)\r
159                         me.onClick(me, me.onClickEntity);\r
160         }\r
161         me.clickTime -= frametime;\r
162 \r
163         if(cvar("menu_sounds") > 1)\r
164                 if(me.focused && !me.playedfocus)\r
165                 {\r
166                         localsound("sound/misc/menu1.wav");\r
167                         me.playedfocus = 1;\r
168                 }\r
169                 else if(!me.focused && me.playedfocus)\r
170                         me.playedfocus = 0;\r
171 }\r
172 #endif\r