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')
29 ATTRIB(Button, origin, vector, '0 0 0')
30 ATTRIB(Button, size, vector, '0 0 0')
35 void resizeNotifyButton(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
40 me.keepspaceLeft = min(0.8, absSize_y / absSize_x);
41 resizeNotifyLabel(me, relOrigin, relSize, absOrigin, absSize);
42 me.origin = absOrigin;
45 void configureButtonButton(entity me, string txt, float sz, string gfx)
47 configureLabelLabel(me, txt, sz, me.srcMulti ? 0.5 : 0);
50 float keyDownButton(entity me, float key, float ascii, float shift)
52 if(key == K_ENTER || key == K_SPACE)
54 me.clickTime = 0.1; // delayed for effect
59 float mouseDragButton(entity me, vector pos)
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;
68 float mousePressButton(entity me, vector pos)
70 me.mouseDrag(me, pos); // verify coordinates
73 float mouseReleaseButton(entity me, vector pos)
75 me.mouseDrag(me, pos); // verify coordinates
79 me.onClick(me, me.onClickEntity);
84 void showNotifyButton(entity me)
86 me.focusable = !me.disabled;
88 void drawButton(entity me)
90 vector bOrigin, bSize;
92 me.focusable = !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);
107 draw_ButtonPicture(bOrigin, strcat(me.src, "_f", me.srcSuffix), bSize, me.colorF, 1);
109 draw_ButtonPicture(bOrigin, strcat(me.src, "_n", me.srcSuffix), bSize, me.color, 1);
113 if(me.realFontSize_y == 0)
120 bOrigin = eY * (0.5 * (1 - me.realFontSize_y)) + eX * (0.5 * (me.keepspaceLeft - me.realFontSize_x));
121 bSize = me.realFontSize;
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);
128 draw_Picture(bOrigin, strcat(me.src, "_f", me.srcSuffix), bSize, me.colorF, 1);
130 draw_Picture(bOrigin, strcat(me.src, "_n", me.srcSuffix), bSize, me.color, 1);
135 bOrigin = me.keepspaceLeft * eX;
136 bSize = eY + eX * (1 - me.keepspaceLeft);
137 draw_Picture(bOrigin, me.src2, bSize, me.color2, 1);
141 if(me.clickTime > 0 && me.clickTime < frametime)
143 // keyboard click timer expired? Fire the event then.
145 me.onClick(me, me.onClickEntity);
147 me.clickTime -= frametime;