Merge remote-tracking branch 'origin/divVerent/allow-override-item-model'
[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         METHOD(Button, focusEnter, void(entity))
12         ATTRIB(Button, onClick, void(entity, entity), SUB_Null)
13         ATTRIB(Button, onClickEntity, entity, NULL)
14         ATTRIB(Button, src, string, string_null)
15         ATTRIB(Button, srcSuffix, string, string_null)
16         ATTRIB(Button, src2, string, string_null) // is centered, same aspect, and stretched to label size
17         ATTRIB(Button, src2scale, float, 1)
18         ATTRIB(Button, srcMulti, float, 1) // 0: button square left, text right; 1: button stretched, text over it
19         ATTRIB(Button, buttonLeftOfText, float, 0)
20         ATTRIB(Button, focusable, 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 not(me.disabled)
81                 {
82                         if(cvar("menu_sounds"))
83                                 localsound("sound/misc/menu2.wav");
84                         me.onClick(me, me.onClickEntity);
85                 }
86                 me.pressed = 0;
87         }
88         return 1;
89 }
90 void Button_showNotify(entity me)
91 {
92         me.focusable = !me.disabled;
93 }
94 void Button_focusEnter(entity me)
95 {
96         if(cvar("menu_sounds") > 1)
97                 localsound("sound/misc/menu1.wav");
98         SUPER(Button).focusEnter(me);
99 }
100 void Button_draw(entity me)
101 {
102         vector bOrigin, bSize;
103         float save;
104
105         me.focusable = !me.disabled;
106
107         save = draw_alpha;
108         if(me.disabled)
109                 draw_alpha *= me.disabledAlpha;
110
111         if(me.src)
112         {
113                 if(me.srcMulti)
114                 {
115                         bOrigin = '0 0 0';
116                         bSize = '1 1 0';
117                         if(me.disabled)
118                                 draw_ButtonPicture(bOrigin, strcat(me.src, "_d", me.srcSuffix), bSize, me.colorD, 1);
119                         else if(me.forcePressed || me.pressed || me.clickTime > 0)
120                                 draw_ButtonPicture(bOrigin, strcat(me.src, "_c", me.srcSuffix), bSize, me.colorC, 1);
121                         else if(me.focused)
122                                 draw_ButtonPicture(bOrigin, strcat(me.src, "_f", me.srcSuffix), bSize, me.colorF, 1);
123                         else
124                                 draw_ButtonPicture(bOrigin, strcat(me.src, "_n", me.srcSuffix), bSize, me.color, 1);
125                 }
126                 else
127                 {
128                         if(me.realFontSize_y == 0)
129                         {
130                                 bOrigin = '0 0 0';
131                                 bSize = '1 1 0';
132                         }
133                         else
134                         {
135                                 bOrigin = eY * (0.5 * (1 - me.realFontSize_y)) + eX * (0.5 * (me.keepspaceLeft - me.realFontSize_x));
136                                 bSize = me.realFontSize;
137                         }
138                         if(me.disabled)
139                                 draw_Picture(bOrigin, strcat(me.src, "_d", me.srcSuffix), bSize, me.colorD, 1);
140                         else if(me.forcePressed || me.pressed || me.clickTime > 0)
141                                 draw_Picture(bOrigin, strcat(me.src, "_c", me.srcSuffix), bSize, me.colorC, 1);
142                         else if(me.focused)
143                                 draw_Picture(bOrigin, strcat(me.src, "_f", me.srcSuffix), bSize, me.colorF, 1);
144                         else
145                                 draw_Picture(bOrigin, strcat(me.src, "_n", me.srcSuffix), bSize, me.color, 1);
146                 }
147         }
148         if(me.src2)
149         {
150                 bOrigin = me.keepspaceLeft * eX;
151                 bSize = eY + eX * (1 - me.keepspaceLeft);
152
153                 bOrigin += bSize * (0.5 - 0.5 * me.src2scale);
154                 bSize = bSize * me.src2scale;
155
156                 draw_Picture(bOrigin, me.src2, bSize, me.color2, me.alpha2);
157         }
158
159         draw_alpha = save;
160
161         SUPER(Button).draw(me);
162
163         if(me.clickTime > 0 && me.clickTime <= frametime)
164         {
165                 // keyboard click timer expired? Fire the event then.
166                 if not(me.disabled)
167                         me.onClick(me, me.onClickEntity);
168         }
169         me.clickTime -= frametime;
170 }
171 #endif