stitch
Note taking for messy minimalists
git clone git://mccd.space/stitch| Log | Files | Refs | README | LICENSE | Mail |
help_screen.ml (2819B)
1 module Common = Common
2 open Notty
3
4 type state = { go_back : unit -> unit }
5
6 let render_info =
7 let title = I.strf ~attr:A.(st bold) "%s" "Stitch - About" |> I.pad ~l:0 ~t:0 in
8 let description =
9 I.strf
10 ~attr:A.(st bold)
11 "%s"
12 "Minimal Note Composer. Run stitch --help for more info."
13 |> I.pad ~l:2 ~t:2
14 in
15 let license =
16 I.strf "%s" "Made by Marc Coquand (https://mccd.space). Licensed under EUPL-1.2."
17 |> I.pad ~l:2 ~t:4
18 in
19 let open I in
20 5, title </> description </> license
21
22
23 let general_help_menu =
24 [ "Toggle this menu", "?"
25 ; "Exit", "Ctrl-c, q, Esc"
26 ; "Down", "Ctrl-n, j"
27 ; "Up", "Ctrl-p, k"
28 ; "Half-screen down", "Ctrl-d, PgDn"
29 ; "Half-screen up", "Ctrl-u, PgUp"
30 ; "Regexp Search", "s"
31 ; "Notes", "1"
32 ; "Todo", "2"
33 ; "Done", "3"
34 ; "Run Shell Command", "!"
35 ; "Edit File in $EDITOR", "Enter, e"
36 ; "Toggle File Name", "h"
37 ]
38
39
40 let pad str n =
41 let padding = n - String.length str in
42 String.concat "" [ str; String.make padding ' ' ]
43
44
45 let render_menu ~menu ~title ~start_y =
46 let keybindings = I.strf ~attr:A.(st bold) "%s" title |> I.pad ~l:2 ~t:start_y in
47 let elements =
48 List.mapi
49 (fun i (explanation, keybinding) ->
50 let padding = pad explanation 27 in
51 I.strf "%s%s" padding keybinding |> I.pad ~l:2 ~t:(i + start_y + 1))
52 menu
53 in
54 let open I in
55 1 + List.length elements, List.fold_left (fun sum el -> el </> sum) keybindings elements
56
57
58 let note_view_menu = [ "Toggle Full-View Mode", "f"; "Export View", "o" ]
59 let todo_view_menu = [ "Toggle Done", "Ctrl-t"; "Refresh", "g" ]
60 let done_view_menu = [ "Toggle Todo", "Ctrl-t"; "Refresh", "g" ]
61
62 let rec render t ({ go_back } as state) =
63 let img =
64 let open I in
65 let info_length, info_img = render_info in
66 let general_length, general_img =
67 render_menu
68 ~menu:general_help_menu
69 ~title:"Keybindings (General)"
70 ~start_y:(info_length + 1)
71 in
72 let note_length, note_img =
73 render_menu
74 ~menu:note_view_menu
75 ~title:"Notes"
76 ~start_y:(general_length + info_length + 2)
77 in
78 let todo_length, todo_img =
79 render_menu
80 ~menu:todo_view_menu
81 ~title:"Todo"
82 ~start_y:(note_length + general_length + info_length + 3)
83 in
84 let _, done_img =
85 render_menu
86 ~menu:done_view_menu
87 ~title:"Done"
88 ~start_y:(todo_length + note_length + general_length + info_length + 4)
89 in
90 info_img </> general_img </> note_img </> todo_img </> done_img
91 in
92 Common.Term.image t img;
93 (* TODO: Add controls for scroll *)
94 match Common.Term.event t with
95 | `End | `Key (`Escape, []) | `Key (`ASCII 'q', []) | `Key (`ASCII 'C', [ `Ctrl ]) -> ()
96 | `Resize _ -> render t state
97 | `Key (`ASCII '?', []) -> go_back ()
98 | _ -> render t state