2 CLASS(InputBox) EXTENDS(Label)
3 METHOD(InputBox, configureInputBox, void(entity, string, float, float, string))
4 METHOD(InputBox, draw, void(entity))
5 METHOD(InputBox, setText, void(entity, string))
6 METHOD(InputBox, enterText, void(entity, string))
7 METHOD(InputBox, keyDown, float(entity, float, float, float))
8 METHOD(InputBox, mouseMove, float(entity, vector))
9 METHOD(InputBox, mouseRelease, float(entity, vector))
10 METHOD(InputBox, mousePress, float(entity, vector))
11 METHOD(InputBox, mouseDrag, float(entity, vector))
12 METHOD(InputBox, showNotify, void(entity))
13 METHOD(InputBox, resizeNotify, void(entity, vector, vector, vector, vector))
15 ATTRIB(InputBox, src, string, string_null)
17 ATTRIB(InputBox, cursorPos, float, 0) // characters
18 ATTRIB(InputBox, scrollPos, float, 0) // widths
20 ATTRIB(InputBox, focusable, float, 1)
21 ATTRIB(InputBox, allowFocusSound, float, 1)
22 ATTRIB(InputBox, disabled, float, 0)
23 ATTRIB(InputBox, lastChangeTime, float, 0)
24 ATTRIB(InputBox, dragScrollTimer, float, 0)
25 ATTRIB(InputBox, dragScrollPos, vector, '0 0 0')
26 ATTRIB(InputBox, pressed, float, 0)
27 ATTRIB(InputBox, editColorCodes, float, 1)
28 ATTRIB(InputBox, forbiddenCharacters, string, "")
29 ATTRIB(InputBox, color, vector, '1 1 1')
30 ATTRIB(InputBox, colorF, vector, '1 1 1')
31 ATTRIB(InputBox, maxLength, float, 255) // if negative, it counts bytes, not chars
33 ATTRIB(InputBox, enableClearButton, float, 1)
34 ATTRIB(InputBox, clearButton, entity, NULL)
35 ATTRIB(InputBox, cb_width, float, 0)
36 ATTRIB(InputBox, cb_pressed, float, 0)
37 ATTRIB(InputBox, cb_focused, float, 0)
38 ATTRIB(InputBox, cb_color, vector, '1 1 1')
39 ATTRIB(InputBox, cb_colorF, vector, '1 1 1')
40 ATTRIB(InputBox, cb_colorC, vector, '1 1 1')
45 void InputBox_configureInputBox(entity me, string theText, float theCursorPos, float theFontSize, string gfx)
47 SUPER(InputBox).configureLabel(me, theText, theFontSize, 0.0);
49 me.cursorPos = theCursorPos;
51 void InputBox_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
53 SUPER(InputBox).resizeNotify(me, relOrigin, relSize, absOrigin, absSize);
54 if (me.enableClearButton)
56 me.cb_width = absSize.y / absSize.x;
57 me.cb_offset = bound(-1, me.cb_offset, 0) * me.cb_width; // bound to range -1, 0
58 me.keepspaceRight = me.keepspaceRight - me.cb_offset + me.cb_width;
62 void InputBox_setText(entity me, string txt)
66 SUPER(InputBox).setText(me, strzone(txt));
69 float over_ClearButton(entity me, vector pos)
71 if (pos.x >= 1 + me.cb_offset - me.cb_width)
72 if (pos.x < 1 + me.cb_offset)
79 float InputBox_mouseMove(entity me, vector pos)
81 if (me.enableClearButton)
83 if (over_ClearButton(me, pos))
93 float InputBox_mouseDrag(entity me, vector pos)
98 me.dragScrollPos = pos;
99 p = me.scrollPos + pos.x - me.keepspaceLeft;
100 me.cursorPos = draw_TextLengthUpToWidth(me.text, p, 0, me.realFontSize);
101 me.lastChangeTime = time;
103 else if (me.enableClearButton)
105 if (over_ClearButton(me, pos))
115 float InputBox_mousePress(entity me, vector pos)
117 if (me.enableClearButton)
118 if (over_ClearButton(me, pos))
123 me.dragScrollTimer = time;
125 return InputBox_mouseDrag(me, pos);
128 float InputBox_mouseRelease(entity me, vector pos)
131 if (over_ClearButton(me, pos))
133 m_play_click_sound(MENU_SOUND_CLEAR);
138 float r = InputBox_mouseDrag(me, pos);
139 //reset cb_pressed after mouseDrag, mouseDrag could set cb_pressed in this case:
140 //mouse press out of the clear button, drag and then mouse release over the clear button
146 void InputBox_enterText(entity me, string ch)
149 for(i = 0; i < strlen(ch); ++i)
150 if(strstrofs(me.forbiddenCharacters, substring(ch, i, 1), 0) > -1)
154 if(strlen(ch) + strlen(me.text) > me.maxLength)
157 else if(me.maxLength < 0)
159 if(u8_strsize(ch) + u8_strsize(me.text) > -me.maxLength)
162 me.setText(me, strcat(substring(me.text, 0, me.cursorPos), ch, substring(me.text, me.cursorPos, strlen(me.text) - me.cursorPos)));
163 me.cursorPos += strlen(ch);
166 float InputBox_keyDown(entity me, float key, float ascii, float shift)
168 me.lastChangeTime = time;
169 me.dragScrollTimer = time;
170 if(ascii >= 32 && ascii != 127)
172 me.enterText(me, chr(ascii));
181 case K_KP_RIGHTARROW:
191 me.cursorPos = strlen(me.text);
197 me.setText(me, strcat(substring(me.text, 0, me.cursorPos), substring(me.text, me.cursorPos + 1, strlen(me.text) - me.cursorPos - 1)));
204 m_play_click_sound(MENU_SOUND_CLEAR);
208 me.setText(me, strcat(substring(me.text, 0, me.cursorPos), substring(me.text, me.cursorPos + 1, strlen(me.text) - me.cursorPos - 1)));
214 void InputBox_draw(entity me)
217 float cursorPosInWidths, totalSizeInWidths;
220 me.mouseDrag(me, me.dragScrollPos); // simulate mouseDrag event
223 me.recalcPositionWithText(me, me.text);
225 me.focusable = !me.disabled;
227 draw_alpha *= me.disabledAlpha;
231 if(me.focused && !me.disabled)
232 draw_ButtonPicture('0 0 0', strcat(me.src, "_f"), '1 1 0', me.colorF, 1);
234 draw_ButtonPicture('0 0 0', strcat(me.src, "_n"), '1 1 0', me.color, 1);
237 me.cursorPos = bound(0, me.cursorPos, strlen(me.text));
238 cursorPosInWidths = draw_TextWidth(substring(me.text, 0, me.cursorPos), 0, me.realFontSize);
239 totalSizeInWidths = draw_TextWidth(strcat(me.text, CURSOR), 0, me.realFontSize);
241 if(me.dragScrollTimer < time)
245 me.scrollPos = bound(cursorPosInWidths - (0.875 - me.keepspaceLeft - me.keepspaceRight), me.scrollPos, cursorPosInWidths - 0.125);
246 if(me.scrollPos != save)
247 me.dragScrollTimer = time + 0.2;
249 me.scrollPos = min(me.scrollPos, totalSizeInWidths - (1 - me.keepspaceRight - me.keepspaceLeft));
250 me.scrollPos = max(0, me.scrollPos);
252 draw_SetClipRect(eX * me.keepspaceLeft, eX * (1 - me.keepspaceLeft - me.keepspaceRight) + eY);
253 if(me.editColorCodes)
258 float theAlpha; //float theVariableAlpha;
263 p = me.realOrigin - eX * me.scrollPos;
265 theAlpha = 1; //theVariableAlpha = 1; // changes when ^ax found
268 for(i = 0; i < n; ++i)
270 ch = substring(me.text, i, 1);
274 ch2 = substring(me.text, i+1, 1);
275 w = draw_TextWidth(strcat(ch, ch2), 0, me.realFontSize);
278 draw_Fill(p, eX * w + eY * me.realFontSize.y, '1 1 1', 0.5);
279 draw_Text(p + eX * 0.25 * w, "^", me.realFontSize, theColor, theAlpha, 0);
281 else if(ch2 == "0" || stof(ch2)) // digit?
285 case 0: theColor = '0 0 0'; theAlpha = 1; break;
286 case 1: theColor = '1 0 0'; theAlpha = 1; break;
287 case 2: theColor = '0 1 0'; theAlpha = 1; break;
288 case 3: theColor = '1 1 0'; theAlpha = 1; break;
289 case 4: theColor = '0 0 1'; theAlpha = 1; break;
290 case 5: theColor = '0 1 1'; theAlpha = 1; break;
291 case 6: theColor = '1 0 1'; theAlpha = 1; break;
292 case 7: theColor = '1 1 1'; theAlpha = 1; break;
293 case 8: theColor = '1 1 1'; theAlpha = 0.5; break;
294 case 9: theColor = '0.5 0.5 0.5'; theAlpha = 1; break;
296 draw_Fill(p, eX * w + eY * me.realFontSize.y, '1 1 1', 0.5);
297 draw_Text(p, strcat(ch, ch2), me.realFontSize, theColor, theAlpha, 0);
299 else if(ch2 == "x") // ^x found
303 component = HEXDIGIT_TO_DEC(substring(me.text, i+2, 1));
304 if (component >= 0) // ^xr found
306 theTempColor.x = component/15;
308 component = HEXDIGIT_TO_DEC(substring(me.text, i+3, 1));
309 if (component >= 0) // ^xrg found
311 theTempColor.y = component/15;
313 component = HEXDIGIT_TO_DEC(substring(me.text, i+4, 1));
314 if (component >= 0) // ^xrgb found
316 theTempColor.z = component/15;
317 theColor = theTempColor;
318 w = draw_TextWidth(substring(me.text, i, 5), 0, me.realFontSize);
320 draw_Fill(p, eX * w + eY * me.realFontSize.y, '1 1 1', 0.5);
321 draw_Text(p, substring(me.text, i, 5), me.realFontSize, theColor, 1, 0); // theVariableAlpha instead of 1 using alpha tags ^ax
327 w = draw_TextWidth(substring(me.text, i, 4), 0, me.realFontSize);
328 draw_Fill(p, eX * w + eY * me.realFontSize.y, eZ, 0.5);
329 draw_Text(p, substring(me.text, i, 4), me.realFontSize, '1 1 1', theAlpha, 0);
336 w = draw_TextWidth(substring(me.text, i, 3), 0, me.realFontSize);
337 draw_Fill(p, eX * w + eY * me.realFontSize.y, eY, 0.5);
338 draw_Text(p, substring(me.text, i, 3), me.realFontSize, '1 1 1', theAlpha, 0);
345 //w = draw_TextWidth(substring(me.text, i, 2), 0) * me.realFontSize_x;
346 draw_Fill(p, eX * w + eY * me.realFontSize.y, eX, 0.5);
347 draw_Text(p, substring(me.text, i, 2), me.realFontSize, '1 1 1', theAlpha, 0);
352 draw_Fill(p, eX * w + eY * me.realFontSize.y, '1 1 1', 0.5);
353 draw_Text(p, strcat(ch, ch2), me.realFontSize, theColor, theAlpha, 0);
359 draw_Text(p, ch, me.realFontSize, theColor, theAlpha, 0); // TODO theVariableAlpha
360 p += eX * draw_TextWidth(ch, 0, me.realFontSize);
364 draw_Text(me.realOrigin - eX * me.scrollPos, me.text, me.realFontSize, '1 1 1', 1, 0);
366 if(!me.focused || (time - me.lastChangeTime) < floor(time - me.lastChangeTime) + 0.5)
367 draw_Text(me.realOrigin + eX * (cursorPosInWidths - me.scrollPos), CURSOR, me.realFontSize, '1 1 1', 1, 0);
371 if (me.enableClearButton)
374 if(me.focused && me.cb_pressed)
375 draw_Picture(eX * (1 + me.cb_offset - me.cb_width), strcat(me.cb_src, "_c"), eX * me.cb_width + eY, me.cb_colorC, 1);
376 else if(me.focused && me.cb_focused)
377 draw_Picture(eX * (1 + me.cb_offset - me.cb_width), strcat(me.cb_src, "_f"), eX * me.cb_width + eY, me.cb_colorF, 1);
379 draw_Picture(eX * (1 + me.cb_offset - me.cb_width), strcat(me.cb_src, "_n"), eX * me.cb_width + eY, me.cb_color, 1);
382 // skipping SUPER(InputBox).draw(me);
386 void InputBox_showNotify(entity me)
388 me.focusable = !me.disabled;