summaryrefslogtreecommitdiff
path: root/src/ui/textbox.moon
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/textbox.moon')
-rw-r--r--src/ui/textbox.moon119
1 files changed, 119 insertions, 0 deletions
diff --git a/src/ui/textbox.moon b/src/ui/textbox.moon
new file mode 100644
index 0000000..3c6151d
--- /dev/null
+++ b/src/ui/textbox.moon
@@ -0,0 +1,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