From db4e445ee0f29c1179b5d0746217e5b5525ff3e2 Mon Sep 17 00:00:00 2001 From: Marc Coquand Date: Wed, 15 May 2024 11:17:48 -0500 Subject: State handling done --- lib/headlines.ml | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) (limited to 'lib/headlines.ml') diff --git a/lib/headlines.ml b/lib/headlines.ml index 954d0e2..4565f5f 100644 --- a/lib/headlines.ml +++ b/lib/headlines.ml @@ -11,10 +11,11 @@ type state = ; scroll : int ; content : (string * string) array ; content_pretty : string array + ; todo_state : Todos.state option } (* TODO: Add page title *) -let rec render t ({ pos; scroll; content; content_pretty } as state) = +let rec render t ({ pos; scroll; content; content_pretty; todo_state } as state) = let x, y = pos in let img = let dot = I.string A.(st bold) ">" |> I.pad ~l:0 ~t:(y - scroll) @@ -51,15 +52,25 @@ let rec render t ({ pos; scroll; content; content_pretty } as state) = render t { state with pos = 0, min y content_length } | `Key (`ASCII '?', []) -> Help_screen.render t { go_back = (fun () -> render t state) } | `Key (`ASCII '2', []) -> - let todo_content = Grep.get_todos () |> Grep.parse_todo_string in - let todo_pretty = Grep.pretty_format_todo todo_content in - let todo_state = - Todos.init - ~goto_headlines:(fun () -> render t state) - ~content:(todo_content |> Array.of_list) - ~content_pretty:(todo_pretty |> Array.of_list) - in - Todos.render t todo_state + (match todo_state with + | Some todo_state -> + Todos.render + t + { todo_state with + goto_headlines = + (fun new_state -> render t { state with todo_state = Some new_state }) + } + | None -> + let todo_content = Grep.get_todos () |> Grep.parse_todo_string in + let todo_pretty = Grep.pretty_format_todo todo_content in + let todo_state = + Todos.init + ~goto_headlines:(fun new_state -> + render t { state with todo_state = Some new_state }) + ~content:(todo_content |> Array.of_list) + ~content_pretty:(todo_pretty |> Array.of_list) + in + Todos.render t todo_state) | `Key (`ASCII 's', []) -> let content = Array.map @@ -78,6 +89,7 @@ let rec render t ({ pos; scroll; content; content_pretty } as state) = ; content_pretty = full_content_pretty ; scroll = 0 ; go_back = (fun () -> render t state) + ; todo_state } | `Key (`ASCII 'r', []) -> let (input_state : Input_screen.state) = @@ -89,7 +101,7 @@ let rec render t ({ pos; scroll; content; content_pretty } as state) = let content = Grep.get_tagged_headlines tag () |> Grep.parse_headlines in let content_pretty = Grep.pretty_format content in Common.Term.cursor t None; - render t { content; content_pretty; pos = 0, 0; scroll = 0 }) + render t { state with content; content_pretty; pos = 0, 0; scroll = 0 }) ; on_cancel = (fun _ -> Common.Term.cursor t None; @@ -148,4 +160,6 @@ let start (tag : string) () = exit 0) else ( let content_pretty = content |> Grep.pretty_format in - render (Common.Term.create ()) { pos = 0, 0; scroll = 0; content; content_pretty }) + render + (Common.Term.create ()) + { pos = 0, 0; scroll = 0; content; content_pretty; todo_state = None }) -- cgit v1.2.3