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