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)
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);
85 if (me.onClick) me.onClick(me, me.onClickEntity);
91 void Button_showNotify(entity me)
93 me.focusable = !me.disabled;
95 void Button_draw(entity me)
97 vector bOrigin, bSize;
100 me.focusable = !me.disabled;
103 if (me.disabled) draw_alpha *= me.disabledAlpha;
111 if (me.disabled) draw_ButtonPicture(bOrigin, strcat(me.src, "_d", me.srcSuffix), bSize, me.colorD, 1);
112 else if (me.forcePressed || me.pressed || me.clickTime > 0) draw_ButtonPicture(bOrigin, strcat(me.src, "_c", me.srcSuffix), bSize, me.colorC, 1);
113 else if (me.focused) draw_ButtonPicture(bOrigin, strcat(me.src, "_f", me.srcSuffix), bSize, me.colorF, 1);
114 else draw_ButtonPicture(bOrigin, strcat(me.src, "_n", me.srcSuffix), bSize, me.color, 1);
118 if (me.realFontSize_y == 0)
125 bOrigin = eY * (0.5 * (1 - me.realFontSize.y)) + eX * (0.5 * (me.keepspaceLeft - me.realFontSize.x));
126 bSize = me.realFontSize;
128 if (me.disabled) draw_Picture(bOrigin, strcat(me.src, "_d", me.srcSuffix), bSize, me.colorD, 1);
129 else if (me.forcePressed || me.pressed || me.clickTime > 0) draw_Picture(bOrigin, strcat(me.src, "_c", me.srcSuffix), bSize, me.colorC, 1);
130 else if (me.focused) draw_Picture(bOrigin, strcat(me.src, "_f", me.srcSuffix), bSize, me.colorF, 1);
131 else draw_Picture(bOrigin, strcat(me.src, "_n", me.srcSuffix), bSize, me.color, 1);
136 bOrigin = me.keepspaceLeft * eX;
137 bSize = eY + eX * (1 - me.keepspaceLeft);
139 bOrigin += bSize * (0.5 - 0.5 * me.src2scale);
140 bSize = bSize * me.src2scale;
142 draw_Picture(bOrigin, me.src2, bSize, me.color2, me.alpha2);
147 if (me.clickTime > 0 && me.clickTime <= frametime)
149 // keyboard click timer expired? Fire the event then.
151 if (me.onClick) me.onClick(me, me.onClickEntity);
153 me.clickTime -= frametime;
155 SUPER(Button).draw(me);
157 void Dialog_Close(entity button, entity me);
158 void Button_playClickSound(entity me)
160 if (me.onClick == DialogOpenButton_Click) m_play_click_sound(MENU_SOUND_OPEN);
161 else if (me.onClick == Dialog_Close) m_play_click_sound(MENU_SOUND_CLOSE);
162 else m_play_click_sound(MENU_SOUND_EXECUTE);