]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/menu/item/button.c
support for pointer warping
[divverent/nexuiz.git] / data / 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), SUB_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, pressed, float, 0)
21         ATTRIB(Button, clickTime, float, 0)
22         ATTRIB(Button, disabled, float, 0)
23         ATTRIB(Button, disabledAlpha, float, 0.3)
24         ATTRIB(Button, forcePressed, float, 0)
25         ATTRIB(Button, color, vector, '1 1 1')
26         ATTRIB(Button, colorC, vector, '1 1 1')
27         ATTRIB(Button, colorF, vector, '1 1 1')
28         ATTRIB(Button, colorD, vector, '1 1 1')
29         ATTRIB(Button, color2, vector, '1 1 1')
30         ATTRIB(Button, alpha2, float, 1)
31
32         ATTRIB(Button, origin, vector, '0 0 0')
33         ATTRIB(Button, size, vector, '0 0 0')
34 ENDCLASS(Button)
35 #endif
36
37 #ifdef IMPLEMENTATION
38 void resizeNotifyButton(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
39 {
40         if(me.srcMulti)
41                 me.keepspaceLeft = 0;
42         else
43                 me.keepspaceLeft = min(0.8, absSize_y / absSize_x);
44         resizeNotifyLabel(me, relOrigin, relSize, absOrigin, absSize);
45 }
46 void configureButtonButton(entity me, string txt, float sz, string gfx)
47 {
48         configureLabelLabel(me, txt, sz, me.srcMulti ? 0.5 : 0);
49         me.src = gfx;
50 }
51 float keyDownButton(entity me, float key, float ascii, float shift)
52 {
53         if(key == K_ENTER || key == K_SPACE)
54         {
55                 me.clickTime = 0.1; // delayed for effect
56                 return 1;
57         }
58         return 0;
59 }
60 float mouseDragButton(entity me, vector pos)
61 {
62         me.pressed = 1;
63         if(pos_x < 0) me.pressed = 0;
64         if(pos_y < 0) me.pressed = 0;
65         if(pos_x >= 1) me.pressed = 0;
66         if(pos_y >= 1) me.pressed = 0;
67         return 1;
68 }
69 float mousePressButton(entity me, vector pos)
70 {
71         me.mouseDrag(me, pos); // verify coordinates
72         return 1;
73 }
74 float mouseReleaseButton(entity me, vector pos)
75 {
76         me.mouseDrag(me, pos); // verify coordinates
77         if(me.pressed)
78         {
79                 if not(me.disabled)
80                         me.onClick(me, me.onClickEntity);
81                 me.pressed = 0;
82         }
83         return 1;
84 }
85 void showNotifyButton(entity me)
86 {
87         me.focusable = !me.disabled;
88 }
89 void drawButton(entity me)
90 {
91         vector bOrigin, bSize;
92         float save;
93
94         me.focusable = !me.disabled;
95
96         save = draw_alpha;
97         if(me.disabled)
98                 draw_alpha *= me.disabledAlpha;
99
100         if(me.src)
101         {
102                 if(me.srcMulti)
103                 {
104                         bOrigin = '0 0 0';
105                         bSize = '1 1 0';
106                         if(me.disabled)
107                                 draw_ButtonPicture(bOrigin, strcat(me.src, "_d", me.srcSuffix), bSize, me.colorD, 1);
108                         else if(me.forcePressed || me.pressed || me.clickTime > 0)
109                                 draw_ButtonPicture(bOrigin, strcat(me.src, "_c", me.srcSuffix), bSize, me.colorC, 1);
110                         else if(me.focused)
111                                 draw_ButtonPicture(bOrigin, strcat(me.src, "_f", me.srcSuffix), bSize, me.colorF, 1);
112                         else
113                                 draw_ButtonPicture(bOrigin, strcat(me.src, "_n", me.srcSuffix), bSize, me.color, 1);
114                 }
115                 else
116                 {
117                         if(me.realFontSize_y == 0)
118                         {
119                                 bOrigin = '0 0 0';
120                                 bSize = '1 1 0';
121                         }
122                         else
123                         {
124                                 bOrigin = eY * (0.5 * (1 - me.realFontSize_y)) + eX * (0.5 * (me.keepspaceLeft - me.realFontSize_x));
125                                 bSize = me.realFontSize;
126                         }
127                         if(me.disabled)
128                                 draw_Picture(bOrigin, strcat(me.src, "_d", me.srcSuffix), bSize, me.colorD, 1);
129                         else if(me.forcePressed || me.pressed || me.clickTime > 0)
130                                 draw_Picture(bOrigin, strcat(me.src, "_c", me.srcSuffix), bSize, me.colorC, 1);
131                         else if(me.focused)
132                                 draw_Picture(bOrigin, strcat(me.src, "_f", me.srcSuffix), bSize, me.colorF, 1);
133                         else
134                                 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         drawLabel(me);
151
152         if(me.clickTime > 0 && me.clickTime <= frametime)
153         {
154                 // keyboard click timer expired? Fire the event then.
155                 if not(me.disabled)
156                         me.onClick(me, me.onClickEntity);
157         }
158         me.clickTime -= frametime;
159 }
160 #endif