aboutsummaryrefslogtreecommitdiff
path: root/lib/input_screen.ml
diff options
context:
space:
mode:
Diffstat (limited to 'lib/input_screen.ml')
-rw-r--r--lib/input_screen.ml35
1 files changed, 35 insertions, 0 deletions
diff --git a/lib/input_screen.ml b/lib/input_screen.ml
new file mode 100644
index 0000000..3fae53c
--- /dev/null
+++ b/lib/input_screen.ml
@@ -0,0 +1,35 @@
+module Grep = Grep
+module Common = Common
+open Notty
+
+type state =
+ { user_input : string
+ ; on_enter : string -> unit
+ ; on_cancel : unit -> unit
+ ; prompt : string
+ ; screen : I.t
+ }
+
+let rec render t ({ user_input; on_enter; on_cancel; screen; prompt } as state) =
+ let _, size_y = Common.Term.size t in
+ Common.Term.cursor t (Some (String.length user_input + String.length prompt, size_y));
+ let img =
+ let open I in
+ I.strf "%s%s" prompt user_input |> I.pad ~l:0 ~t:(size_y - 1) </> screen
+ in
+ Common.Term.image t img;
+ match Common.Term.event t with
+ | `End | `Key (`ASCII 'G', [ `Ctrl ]) | `Key (`ASCII 'C', [ `Ctrl ]) -> on_cancel ()
+ | `Key (`Enter, []) -> on_enter user_input
+ | `Key (`Backspace, []) ->
+ let state =
+ { state with
+ user_input = String.sub user_input 0 (max (String.length user_input - 1) 0)
+ }
+ in
+ render t state
+ | `Resize _ -> render t state
+ | `Key (`ASCII c, []) ->
+ let state = { state with user_input = user_input ^ String.make 1 c } in
+ render t state
+ | _ -> render t state