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