stitch

Note taking for messy minimalists

git clone git://mccd.space/stitch

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