]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/menu/item/button.qc
Increase Hagar and Crylink damage
[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) me.keepspaceLeft = 0;
45                 else me.keepspaceLeft = min(0.8, absSize.x == 0 ? 0 : (absSize.y / absSize.x));
46                 SUPER(Button).resizeNotify(me, relOrigin, relSize, absOrigin, absSize);
47         }
48         void Button_configureButton(entity me, string txt, float sz, string gfx)
49         {
50                 SUPER(Button).configureLabel(me, txt, sz, me.srcMulti ? 0.5 : 0);
51                 me.src = gfx;
52         }
53         float Button_keyDown(entity me, float key, float ascii, float shift)
54         {
55                 if (key == K_ENTER || key == K_SPACE || key == K_KP_ENTER)
56                 {
57                         if(!me.disabled)
58                         {
59                                 me.playClickSound(me);
60                                 me.clickTime = 0.1;  // delayed for effect
61                         }
62                         return 1;
63                 }
64                 return 0;
65         }
66         float Button_mouseDrag(entity me, vector pos)
67         {
68                 me.pressed = 1;
69                 if (pos.x < 0) me.pressed = 0;
70                 if (pos.y < 0) me.pressed = 0;
71                 if (pos.x >= 1) me.pressed = 0;
72                 if (pos.y >= 1) me.pressed = 0;
73                 return 1;
74         }
75         float Button_mousePress(entity me, vector pos)
76         {
77                 me.mouseDrag(me, pos);  // verify coordinates
78                 return 1;
79         }
80         float Button_mouseRelease(entity me, vector pos)
81         {
82                 me.mouseDrag(me, pos);  // verify coordinates
83                 if (me.pressed)
84                 {
85                         if (!me.disabled)
86                         {
87                                 me.playClickSound(me);
88                                 if (me.onClick) 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) draw_alpha *= me.disabledAlpha;
107
108                 if (me.src)
109                 {
110                         if (me.srcMulti)
111                         {
112                                 bOrigin = '0 0 0';
113                                 bSize = '1 1 0';
114                                 if (me.disabled) draw_ButtonPicture(bOrigin, strcat(me.src, "_d", me.srcSuffix), bSize, me.colorD, 1);
115                                 else if (me.forcePressed || me.pressed || me.clickTime > 0) draw_ButtonPicture(bOrigin, strcat(me.src, "_c", me.srcSuffix), bSize, me.colorC, 1);
116                                 else if (me.focused) draw_ButtonPicture(bOrigin, strcat(me.src, "_f", me.srcSuffix), bSize, me.colorF, 1);
117                                 else draw_ButtonPicture(bOrigin, strcat(me.src, "_n", me.srcSuffix), bSize, me.color, 1);
118                         }
119                         else
120                         {
121                                 if (me.realFontSize_y == 0)
122                                 {
123                                         bOrigin = '0 0 0';
124                                         bSize = '1 1 0';
125                                 }
126                                 else
127                                 {
128                                         bOrigin = eY * (0.5 * (1 - me.realFontSize.y)) + eX * (0.5 * (me.keepspaceLeft - me.realFontSize.x));
129                                         bSize = me.realFontSize;
130                                 }
131                                 if (me.disabled) draw_Picture(bOrigin, strcat(me.src, "_d", me.srcSuffix), bSize, me.colorD, 1);
132                                 else if (me.forcePressed || me.pressed || me.clickTime > 0) draw_Picture(bOrigin, strcat(me.src, "_c", me.srcSuffix), bSize, me.colorC, 1);
133                                 else if (me.focused) draw_Picture(bOrigin, strcat(me.src, "_f", me.srcSuffix), bSize, me.colorF, 1);
134                                 else draw_Picture(bOrigin, strcat(me.src, "_n", me.srcSuffix), bSize, me.color, 1);
135                         }
136                 }
137                 if (me.src2)
138                 {
139                         bOrigin = me.keepspaceLeft * eX;
140                         bSize = eY + eX * (1 - me.keepspaceLeft);
141
142                         bOrigin += bSize * (0.5 - 0.5 * me.src2scale);
143                         bSize = bSize * me.src2scale;
144
145                         draw_Picture(bOrigin, me.src2, bSize, me.color2, me.alpha2);
146                 }
147
148                 draw_alpha = save;
149
150                 if (me.clickTime > 0 && me.clickTime <= frametime)
151                 {
152                         // keyboard click timer expired? Fire the event then.
153                         if (!me.disabled)
154                                 if (me.onClick) me.onClick(me, me.onClickEntity);
155                 }
156                 me.clickTime -= frametime;
157
158                 SUPER(Button).draw(me);
159         }
160         void Dialog_Close(entity button, entity me);
161         void Button_playClickSound(entity me)
162         {
163                 if (me.onClick == DialogOpenButton_Click) m_play_click_sound(MENU_SOUND_OPEN);
164                 else if (me.onClick == Dialog_Close) m_play_click_sound(MENU_SOUND_CLOSE);
165                 else m_play_click_sound(MENU_SOUND_EXECUTE);
166         }
167 #endif