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, applyButton, entity, NULL)
27 ATTRIB(Button, disableOnClick, bool, false)
28 ATTRIB(Button, disabled, float, 0)
29 ATTRIB(Button, disabledAlpha, float, 0.3)
30 ATTRIB(Button, forcePressed, float, 0)
31 ATTRIB(Button, color, vector, '1 1 1')
32 ATTRIB(Button, colorC, vector, '1 1 1')
33 ATTRIB(Button, colorF, vector, '1 1 1')
34 ATTRIB(Button, colorD, vector, '1 1 1')
35 ATTRIB(Button, color2, vector, '1 1 1')
36 ATTRIB(Button, alpha2, float, 1)
38 ATTRIB(Button, origin, vector, '0 0 0')
39 ATTRIB(Button, size, vector, '0 0 0')
44 void Button_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
46 if (me.srcMulti) me.keepspaceLeft = 0;
47 else me.keepspaceLeft = min(0.8, absSize.x == 0 ? 0 : (absSize.y / absSize.x));
48 SUPER(Button).resizeNotify(me, relOrigin, relSize, absOrigin, absSize);
51 me.disabled = true; // initially disabled
53 void Button_configureButton(entity me, string txt, float sz, string gfx)
55 SUPER(Button).configureLabel(me, txt, sz, me.srcMulti ? 0.5 : 0);
58 float Button_keyDown(entity me, float key, float ascii, float shift)
60 if (key == K_ENTER || key == K_SPACE || key == K_KP_ENTER)
64 me.playClickSound(me);
65 me.clickTime = 0.1; // delayed for effect
71 float Button_mouseDrag(entity me, vector pos)
74 if (pos.x < 0) me.pressed = 0;
75 if (pos.y < 0) me.pressed = 0;
76 if (pos.x >= 1) me.pressed = 0;
77 if (pos.y >= 1) me.pressed = 0;
80 float Button_mousePress(entity me, vector pos)
82 me.mouseDrag(me, pos); // verify coordinates
85 float Button_mouseRelease(entity me, vector pos)
87 me.mouseDrag(me, pos); // verify coordinates
92 me.playClickSound(me);
96 me.applyButton.disabled = false;
97 me.onClick(me, me.onClickEntity);
106 void Button_showNotify(entity me)
108 me.focusable = !me.disabled;
110 void Button_draw(entity me)
112 vector bOrigin, bSize;
115 me.focusable = !me.disabled;
118 if (me.disabled) draw_alpha *= me.disabledAlpha;
126 if (me.disabled) draw_ButtonPicture(bOrigin, strcat(me.src, "_d", me.srcSuffix), bSize, me.colorD, 1);
127 else if (me.forcePressed || me.pressed || me.clickTime > 0) draw_ButtonPicture(bOrigin, strcat(me.src, "_c", me.srcSuffix), bSize, me.colorC, 1);
128 else if (me.focused) draw_ButtonPicture(bOrigin, strcat(me.src, "_f", me.srcSuffix), bSize, me.colorF, 1);
129 else draw_ButtonPicture(bOrigin, strcat(me.src, "_n", me.srcSuffix), bSize, me.color, 1);
133 if (me.realFontSize_y == 0)
140 bOrigin = eY * (0.5 * (1 - me.realFontSize.y)) + eX * (0.5 * (me.keepspaceLeft - me.realFontSize.x));
141 bSize = me.realFontSize;
143 if (me.disabled) draw_Picture(bOrigin, strcat(me.src, "_d", me.srcSuffix), bSize, me.colorD, 1);
144 else if (me.forcePressed || me.pressed || me.clickTime > 0) draw_Picture(bOrigin, strcat(me.src, "_c", me.srcSuffix), bSize, me.colorC, 1);
145 else if (me.focused) draw_Picture(bOrigin, strcat(me.src, "_f", me.srcSuffix), bSize, me.colorF, 1);
146 else draw_Picture(bOrigin, strcat(me.src, "_n", me.srcSuffix), bSize, me.color, 1);
151 bOrigin = me.keepspaceLeft * eX;
152 bSize = eY + eX * (1 - me.keepspaceLeft);
154 bOrigin += bSize * (0.5 - 0.5 * me.src2scale);
155 bSize = bSize * me.src2scale;
157 draw_Picture(bOrigin, me.src2, bSize, me.color2, me.alpha2);
162 if (me.clickTime > 0 && me.clickTime <= frametime)
164 // keyboard click timer expired? Fire the event then.
166 if (me.onClick) me.onClick(me, me.onClickEntity);
168 me.clickTime -= frametime;
170 SUPER(Button).draw(me);
172 void Dialog_Close(entity button, entity me);
173 void Button_playClickSound(entity me)
175 if (me.onClick == DialogOpenButton_Click) m_play_click_sound(MENU_SOUND_OPEN);
176 else if (me.onClick == Dialog_Close) m_play_click_sound(MENU_SOUND_CLOSE);
177 else m_play_click_sound(MENU_SOUND_EXECUTE);