1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
color = require("color")
Button = require("ui.button")
valid_chars = "abcdefghijklmnopqrstuvwxyz"
shifted_nums = "!@#$%^&*()"
class Textbox extends Button
new: (x,y,w,h,value,placeholder) =>
super(x,y,w,h,value)
if value == ""
@text.text = placeholder
@text.color = color.am_color.shadow
@cursor = am.group(
am.translate(@em,0)\append(
am.rect(0,0,@em/4,-@em,color.am_color.foreground)
))
@cursor.hidden = true
@text\append(@cursor)
@cursor_pos = #@text.text
@update_cursor_pos!
@valid_chars = {}
@max_chars = math.huge
for i = 1, #valid_chars
char = valid_chars\sub(i,i)
@valid_chars[char] = char
@valid_chars[char\upper] = char\upper
for i = 0,9
@valid_chars[tostring(i)] = tostring(i)
@valid_chars["kp_" .. tostring(i)] = tostring(i)
@valid_chars.kp_divide = "/"
@valid_chars.kp_multiply = "*"
@valid_chars.kp_minus = "-"
@valid_chars.kp_plus = "+"
@valid_chars.kp_period = "."
@valid_chars.space = " "
@valid_chars.minus = "-"
@valid_chars.MINUS = "_"
@valid_chars.equals = "="
@valid_chars.EQUALS = "+"
@valid_chars.leftbracket = "["
@valid_chars.LEFTBRACKET = "{"
@valid_chars.rightbracket = "]"
@valid_chars.RIGHTBRACKET = "}"
@valid_chars.semicolon = ";"
@valid_chars.SEMICOLON = ":"
@valid_chars.quote = "'"
@valid_chars.QUOTE = '"'
@valid_chars.backquote = "`"
@valid_chars.BACKQUOTE = "~"
@valid_chars.comma = ","
@valid_chars.COMMA = "<"
@valid_chars.period = "."
@valid_chars.PERIOD = ">"
@valid_chars.slash = "/"
@valid_chars.SLASH = "?"
@cursor
down: () =>
super!
@cursor.hidden = false
@text.color = color.am_color.foreground
up: () =>
super!
@cursor.hidden = true
@text.color = color.am_color.shadow
update_cursor_pos: () =>
@.cursor("translate").x = @cursor_pos * 9
fire: (e) =>
print("cursor pos is", @cursor_pos)
if e.event == "mouse_down"
@down!
if @on
@on(e)
add_key = e.event == "keys_pressed" and @depressed
if add_key
t = @text.text
for key in *e.data
print("analyzing key:",key)
if key == "delete" or key == "backspace"
@cursor_pos -=1
if @cursor_pos < 0
@cursor_pos = 0
t = t\sub(1,@cursor_pos) .. t\sub(@cursor_pos+2)
elseif key == "home"
@cursor_pos = 0
elseif key == "end"
@cursor_pos = #t
elseif key == "right"
@cursor_pos += 1
if @cursor_pos > #t
@cursor_pos = #t
elseif key == "left"
@cursor_pos -= 1
if @cursor_pos < 0
@cursor_pos = 0
elseif tonumber(key) and tonumber(key) >= 0 and tonumber(key) <= 9
kn = tonumber(key)
nd = key
if e.shift
nd = shifted_nums\sub(kn,kn)
@cursor_pos += 1
t = t\sub(1,@cursor_pos) .. nd .. t\sub(@cursor_pos)
elseif key == "kp_enter" or key == "enter"
if @on
@on(e)
elseif key == "escape"
@up!
else
if e.shift and key\sub(1,3) ~= "kp_"
key = key\upper!
if @valid_chars[key]
@cursor_pos += 1
t = t\sub(0,@cursor_pos) .. @valid_chars[key] .. t\sub(@cursor_pos)
if #t > @max_chars
t = t\sub(1,@max_chars)
@text.text = t
@update_cursor_pos!
add_key
Textbox
|