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