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