summaryrefslogtreecommitdiff
path: root/src/ui/textbox.moon
blob: bdb8e133cb654807d5444cb6f98d53364c8b14b6 (plain)
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
120
121
122
123
124
125
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\action(() =>
			if not @should_hide
				@hidden = math.floor(am.current_time! * 2) % 2 == 0
			else
				@hidden = true
		)
		@cursor.should_hide = 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_" .. 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.should_hide = false
		@text.color = color.am_color.foreground
	up: () =>
		super!
		@cursor.should_hide = true
		@text.color = color.am_color.shadow
	update_cursor_pos: () =>
		@.cursor("translate").x = @cursor_pos * 9
	fire: (e) =>
		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("Examining 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