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 METHOD(Button, playClickSound, void(entity))
12 ATTRIB(Button, onClick, void(entity, entity), func_null)
13 ATTRIB(Button, onClickEntity, entity, NULL)
14 ATTRIB(Button, src, string, string_null)
15 ATTRIB(Button, srcSuffix, string, string_null)
16 ATTRIB(Button, src2, string, string_null) // is centered, same aspect, and stretched to label size
17 ATTRIB(Button, src2scale, float, 1)
18 ATTRIB(Button, srcMulti, float, 1) // 0: button square left, text right; 1: button stretched, text over it
19 ATTRIB(Button, buttonLeftOfText, float, 0)
20 ATTRIB(Button, focusable, float, 1)
21 ATTRIB(Button, allowFocusSound, float, 1)
22 ATTRIB(Button, pressed, float, 0)
23 ATTRIB(Button, clickTime, float, 0)
24 ATTRIB(Button, disabled, float, 0)
25 ATTRIB(Button, disabledAlpha, float, 0.3)
26 ATTRIB(Button, forcePressed, float, 0)
27 ATTRIB(Button, color, vector, '1 1 1')
28 ATTRIB(Button, colorC, vector, '1 1 1')
29 ATTRIB(Button, colorF, vector, '1 1 1')
30 ATTRIB(Button, colorD, vector, '1 1 1')
31 ATTRIB(Button, color2, vector, '1 1 1')
32 ATTRIB(Button, alpha2, float, 1)
34 ATTRIB(Button, origin, vector, '0 0 0')
35 ATTRIB(Button, size, vector, '0 0 0')
40 void Button_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
45 me.keepspaceLeft = min(0.8, absSize.y / absSize.x);
46 SUPER(Button).resizeNotify(me, relOrigin, relSize, absOrigin, absSize);
48 void Button_configureButton(entity me, string txt, float sz, string gfx)
50 SUPER(Button).configureLabel(me, txt, sz, me.srcMulti ? 0.5 : 0);
53 float Button_keyDown(entity me, float key, float ascii, float shift)
55 if(key == K_ENTER || key == K_SPACE || key == K_KP_ENTER)
57 me.playClickSound(me);
58 me.clickTime = 0.1; // delayed for effect
63 float Button_mouseDrag(entity me, vector pos)
66 if(pos.x < 0) me.pressed = 0;
67 if(pos.y < 0) me.pressed = 0;
68 if(pos.x >= 1) me.pressed = 0;
69 if(pos.y >= 1) me.pressed = 0;
72 float Button_mousePress(entity me, vector pos)
74 me.mouseDrag(me, pos); // verify coordinates
77 float Button_mouseRelease(entity me, vector pos)
79 me.mouseDrag(me, pos); // verify coordinates
84 me.playClickSound(me);
86 me.onClick(me, me.onClickEntity);
92 void Button_showNotify(entity me)
94 me.focusable = !me.disabled;
96 void Button_draw(entity me)
98 vector bOrigin, bSize;
101 me.focusable = !me.disabled;
105 draw_alpha *= me.disabledAlpha;
114 draw_ButtonPicture(bOrigin, strcat(me.src, "_d", me.srcSuffix), bSize, me.colorD, 1);
115 else if(me.forcePressed || me.pressed || me.clickTime > 0)
116 draw_ButtonPicture(bOrigin, strcat(me.src, "_c", me.srcSuffix), bSize, me.colorC, 1);
118 draw_ButtonPicture(bOrigin, strcat(me.src, "_f", me.srcSuffix), bSize, me.colorF, 1);
120 draw_ButtonPicture(bOrigin, strcat(me.src, "_n", me.srcSuffix), bSize, me.color, 1);
124 if(me.realFontSize_y == 0)
131 bOrigin = eY * (0.5 * (1 - me.realFontSize.y)) + eX * (0.5 * (me.keepspaceLeft - me.realFontSize.x));
132 bSize = me.realFontSize;
135 draw_Picture(bOrigin, strcat(me.src, "_d", me.srcSuffix), bSize, me.colorD, 1);
136 else if(me.forcePressed || me.pressed || me.clickTime > 0)
137 draw_Picture(bOrigin, strcat(me.src, "_c", me.srcSuffix), bSize, me.colorC, 1);
139 draw_Picture(bOrigin, strcat(me.src, "_f", me.srcSuffix), bSize, me.colorF, 1);
141 draw_Picture(bOrigin, strcat(me.src, "_n", me.srcSuffix), bSize, me.color, 1);
146 bOrigin = me.keepspaceLeft * eX;
147 bSize = eY + eX * (1 - me.keepspaceLeft);
149 bOrigin += bSize * (0.5 - 0.5 * me.src2scale);
150 bSize = bSize * me.src2scale;
152 draw_Picture(bOrigin, me.src2, bSize, me.color2, me.alpha2);
157 if(me.clickTime > 0 && me.clickTime <= frametime)
159 // keyboard click timer expired? Fire the event then.
162 me.onClick(me, me.onClickEntity);
164 me.clickTime -= frametime;
166 SUPER(Button).draw(me);
168 void Dialog_Close(entity button, entity me);
169 void Button_playClickSound(entity me)
171 if(me.onClick == DialogOpenButton_Click)
172 m_play_click_sound(MENU_SOUND_OPEN);
173 else if(me.onClick == Dialog_Close)
174 m_play_click_sound(MENU_SOUND_CLOSE);
176 m_play_click_sound(MENU_SOUND_EXECUTE);