1    type TextEditControl @abstract =
2        inherit Wrapper
3    
4        def process_key (key : Key
5                         action : KeyAction
6                         mods : KeyModifiers)
7        def process_char (char : Char)
8    
9    begin@ text_box
10   
11   type TextBox @mut =
12       inherit TextEditControl
13   
14       var offset : i32 @[mut local] = 0
15       var obs cursor_index : u32 = 0
16       var obs background = Vector3.color "C8C8C8"
17       var obs text = ""
18       val display_text @[mut local] = obs/String.new
19       var obs selection : Option<(u32, u32)> = None
20       val os_window : OsWindow @auto
21       local offset_controls = List<Control>.new
22   
23       var on_enter : Option<String -> Unit> = None
24       var on_escape : Option<Unit -> Unit> = None
25   
26       is_focusable = true
27       align_v = AlignV/Up
28   
29       text@atom.subscribe { _ s ->
30           if not is_focused then
31               display_text.set s } |> push_token
32   
33       def clear =
34           display_text.clear
35           cursor_index = 0
36