5 METHOD(Button, configureButton, void(entity, string, float, string));
6 METHOD(Button, draw, void(entity));
7 METHOD(Button, showNotify, void(entity));
8 METHOD(Button, resizeNotify, void(entity, vector, vector, vector, vector));
9 METHOD(Button, keyDown, float(entity, float, float, float));
10 METHOD(Button, mousePress, float(entity, vector));
11 METHOD(Button, mouseDrag, float(entity, vector));
12 METHOD(Button, mouseRelease, float(entity, vector));
13 METHOD(Button, playClickSound, void(entity));
14 ATTRIB(Button, onClick, void(entity, entity), func_null)
15 ATTRIB(Button, onClickEntity, entity, NULL)
16 ATTRIB(Button, src, string, string_null)
17 ATTRIB(Button, srcSuffix, string, string_null)
18 ATTRIB(Button, src2, string, string_null) // is centered, same aspect, and stretched to label size
19 ATTRIB(Button, src2scale, float, 1)
20 ATTRIB(Button, srcMulti, float, 1) // 0: button square left, text right; 1: button stretched, text over it
21 ATTRIB(Button, buttonLeftOfText, float, 0)
22 ATTRIB(Button, focusable, float, 1)
23 ATTRIB(Button, allowFocusSound, float, 1)
24 ATTRIB(Button, pressed, float, 0)
25 ATTRIB(Button, clickTime, float, 0)
26 ATTRIB(Button, disabled, float, 0)
27 ATTRIB(Button, disabledAlpha, float, 0.3)
28 ATTRIB(Button, forcePressed, float, 0)
29 ATTRIB(Button, color, vector, '1 1 1')
30 ATTRIB(Button, colorC, vector, '1 1 1')
31 ATTRIB(Button, colorF, vector, '1 1 1')
32 ATTRIB(Button, colorD, vector, '1 1 1')
33 ATTRIB(Button, color2, vector, '1 1 1')
34 ATTRIB(Button, alpha2, float, 1)
36 ATTRIB(Button, origin, vector, '0 0 0')
37 ATTRIB(Button, size, vector, '0 0 0')
42 void Button_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
44 if (me.srcMulti) me.keepspaceLeft = 0;
45 else me.keepspaceLeft = min(0.8, absSize.x == 0 ? 0 : (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)
59 me.playClickSound(me);
60 me.clickTime = 0.1; // delayed for effect
66 float Button_mouseDrag(entity me, vector pos)
69 if (pos.x < 0) me.pressed = 0;
70 if (pos.y < 0) me.pressed = 0;
71 if (pos.x >= 1) me.pressed = 0;
72 if (pos.y >= 1) me.pressed = 0;
75 float Button_mousePress(entity me, vector pos)
77 me.mouseDrag(me, pos); // verify coordinates
80 float Button_mouseRelease(entity me, vector pos)
82 me.mouseDrag(me, pos); // verify coordinates
87 me.playClickSound(me);
88 if (me.onClick) me.onClick(me, me.onClickEntity);
94 void Button_showNotify(entity me)
96 me.focusable = !me.disabled;
98 void Button_draw(entity me)
100 vector bOrigin, bSize;
103 me.focusable = !me.disabled;
106 if (me.disabled) draw_alpha *= me.disabledAlpha;
114 if (me.disabled) draw_ButtonPicture(bOrigin, strcat(me.src, "_d", me.srcSuffix), bSize, me.colorD, 1);
115 else if (me.forcePressed || me.pressed || me.clickTime > 0) draw_ButtonPicture(bOrigin, strcat(me.src, "_c", me.srcSuffix), bSize, me.colorC, 1);
116 else if (me.focused) draw_ButtonPicture(bOrigin, strcat(me.src, "_f", me.srcSuffix), bSize, me.colorF, 1);
117 else draw_ButtonPicture(bOrigin, strcat(me.src, "_n", me.srcSuffix), bSize, me.color, 1);
121 if (me.realFontSize_y == 0)
128 bOrigin = eY * (0.5 * (1 - me.realFontSize.y)) + eX * (0.5 * (me.keepspaceLeft - me.realFontSize.x));
129 bSize = me.realFontSize;
131 if (me.disabled) draw_Picture(bOrigin, strcat(me.src, "_d", me.srcSuffix), bSize, me.colorD, 1);
132 else if (me.forcePressed || me.pressed || me.clickTime > 0) draw_Picture(bOrigin, strcat(me.src, "_c", me.srcSuffix), bSize, me.colorC, 1);
133 else if (me.focused) draw_Picture(bOrigin, strcat(me.src, "_f", me.srcSuffix), bSize, me.colorF, 1);
134 else draw_Picture(bOrigin, strcat(me.src, "_n", me.srcSuffix), bSize, me.color, 1);
139 bOrigin = me.keepspaceLeft * eX;
140 bSize = eY + eX * (1 - me.keepspaceLeft);
142 bOrigin += bSize * (0.5 - 0.5 * me.src2scale);
143 bSize = bSize * me.src2scale;
145 draw_Picture(bOrigin, me.src2, bSize, me.color2, me.alpha2);
150 if (me.clickTime > 0 && me.clickTime <= frametime)
152 // keyboard click timer expired? Fire the event then.
154 if (me.onClick) me.onClick(me, me.onClickEntity);
156 me.clickTime -= frametime;
158 SUPER(Button).draw(me);
160 void Dialog_Close(entity button, entity me);
161 void Button_playClickSound(entity me)
163 if (me.onClick == DialogOpenButton_Click) m_play_click_sound(MENU_SOUND_OPEN);
164 else if (me.onClick == Dialog_Close) m_play_click_sound(MENU_SOUND_CLOSE);
165 else m_play_click_sound(MENU_SOUND_EXECUTE);