diff options
author | Marc Coquand <marc@mccd.space> | 2024-05-15 11:17:48 -0500 |
---|---|---|
committer | Marc Coquand <marc@mccd.space> | 2024-05-15 11:17:48 -0500 |
commit | db4e445ee0f29c1179b5d0746217e5b5525ff3e2 (patch) | |
tree | 1f30d6f7d3305d7f8becbed3297b033899d9251f /lib/headlines.ml | |
parent | 47be0ea3eeb774102f02b5f85ee974afe6a8170e (diff) | |
download | stitch-db4e445ee0f29c1179b5d0746217e5b5525ff3e2.tar.gz stitch-db4e445ee0f29c1179b5d0746217e5b5525ff3e2.tar.bz2 stitch-db4e445ee0f29c1179b5d0746217e5b5525ff3e2.zip |
State handling done
Diffstat (limited to '')
-rw-r--r-- | lib/headlines.ml | 38 |
1 files changed, 26 insertions, 12 deletions
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 }) |