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