mirror of
https://github.com/chshersh/github-tui.git
synced 2024-10-26 19:10:04 +03:00
Add files list view
This commit is contained in:
parent
1a7618a5c5
commit
4c576beffa
8
lib/list_extra.ml
Normal file
8
lib/list_extra.ml
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
let in_between ~sep list =
|
||||||
|
let rec loop = function
|
||||||
|
| [] -> []
|
||||||
|
| x :: xs -> sep :: x :: loop xs
|
||||||
|
in
|
||||||
|
match list with
|
||||||
|
| [] | [_] -> list
|
||||||
|
| x :: xs -> x :: loop xs
|
@ -9,14 +9,8 @@ type doc =
|
|||||||
let (---) t b = Vertical (t, b)
|
let (---) t b = Vertical (t, b)
|
||||||
let (<|>) l r = Horizontal (l, r)
|
let (<|>) l r = Horizontal (l, r)
|
||||||
|
|
||||||
let graphemes_len =
|
|
||||||
Uuseg_string.fold_utf_8 `Grapheme_cluster (fun len _ -> len + 1) 0
|
|
||||||
|
|
||||||
let fill_right (n : int) (s : string) : string =
|
|
||||||
s ^ String.concat "" (List.init (n - graphemes_len s) (fun _ -> ""))
|
|
||||||
|
|
||||||
let zip_lines l r =
|
let zip_lines l r =
|
||||||
let max_len_l = List.map graphemes_len l |> List.fold_left max 0 in
|
let max_len_l = List.map String_extra.graphemes_len l |> List.fold_left max 0 in
|
||||||
let padding = String.make max_len_l ' ' in
|
let padding = String.make max_len_l ' ' in
|
||||||
let rec zip l r =
|
let rec zip l r =
|
||||||
match (l, r) with
|
match (l, r) with
|
||||||
@ -25,7 +19,7 @@ let zip_lines l r =
|
|||||||
| ([], r) ->
|
| ([], r) ->
|
||||||
List.map (fun s -> padding ^ s) r
|
List.map (fun s -> padding ^ s) r
|
||||||
| (hd_l :: tl_l, hd_r :: tl_r) ->
|
| (hd_l :: tl_l, hd_r :: tl_r) ->
|
||||||
(fill_right max_len_l hd_l ^ hd_r) :: zip tl_l tl_r
|
(String_extra.fill_right max_len_l hd_l ^ hd_r) :: zip tl_l tl_r
|
||||||
in
|
in
|
||||||
zip l r
|
zip l r
|
||||||
|
|
||||||
@ -42,4 +36,4 @@ let rec render_to_lines = function
|
|||||||
let render doc =
|
let render doc =
|
||||||
doc
|
doc
|
||||||
|> render_to_lines
|
|> render_to_lines
|
||||||
|> String.concat "\n"
|
|> String_extra.unlines
|
10
lib/string_extra.ml
Normal file
10
lib/string_extra.ml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
let unlines : string list -> string = String.concat "\n"
|
||||||
|
|
||||||
|
let graphemes_len =
|
||||||
|
Uuseg_string.fold_utf_8 `Grapheme_cluster (fun len _ -> len + 1) 0
|
||||||
|
|
||||||
|
let repeat_txt n txt =
|
||||||
|
String.concat "" (List.init n (fun _ -> txt))
|
||||||
|
|
||||||
|
let fill_right (n : int) (s : string) : string =
|
||||||
|
s ^ repeat_txt (n - graphemes_len s) " "
|
@ -6,10 +6,12 @@ type tab =
|
|||||||
type t =
|
type t =
|
||||||
{ repo: string ;
|
{ repo: string ;
|
||||||
tab: tab ;
|
tab: tab ;
|
||||||
|
files: string list ;
|
||||||
}
|
}
|
||||||
|
|
||||||
let initial_model repo: t =
|
let initial_model repo: t =
|
||||||
{
|
{
|
||||||
repo ;
|
repo ;
|
||||||
tab = Code;
|
tab = Code;
|
||||||
|
files = [ "src/"; "lib/"; "README.md" ]
|
||||||
}
|
}
|
@ -37,12 +37,34 @@ let tab_section cur_tab =
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
let file_widget ~max_name_len files =
|
||||||
|
(* Add two spaces for padding before and end of the file name *)
|
||||||
|
let max_len = max_name_len + 4 in
|
||||||
|
let top = "╭" ^ String_extra.repeat_txt (max_len - 2) "─" ^ "╮" in
|
||||||
|
let mid = "├" ^ String_extra.repeat_txt (max_len - 2) "─" ^ "┤" in
|
||||||
|
let bot = "╰" ^ String_extra.repeat_txt (max_len - 2) "─" ^ "╯" in
|
||||||
|
let fmt_line line =
|
||||||
|
"│ " ^ String_extra.fill_right max_name_len line ^ " │"
|
||||||
|
in
|
||||||
|
files
|
||||||
|
|> List.map fmt_line
|
||||||
|
|> List_extra.in_between ~sep:mid
|
||||||
|
|> (fun lines -> [top] @ lines @ [bot])
|
||||||
|
|> String_extra.unlines
|
||||||
|
|
||||||
|
let files_section files =
|
||||||
|
let max_name_len = files |> List.map String_extra.graphemes_len |> List.fold_left max 0 in
|
||||||
|
file_widget ~max_name_len files
|
||||||
|
|
||||||
let view (model: Model.t) =
|
let view (model: Model.t) =
|
||||||
let repo = fmt_repo model.repo in
|
let repo = fmt_repo model.repo in
|
||||||
let tabs = tab_section model.tab in
|
let tabs = tab_section model.tab in
|
||||||
|
let files = files_section model.files in
|
||||||
Format.sprintf
|
Format.sprintf
|
||||||
{|%s
|
{|%s
|
||||||
|
|
||||||
%s
|
%s
|
||||||
|
|
||||||
|} repo tabs
|
%s
|
||||||
|
|
||||||
|
|} repo tabs files
|
Loading…
Reference in New Issue
Block a user