refactored navigation and displays contents

This commit is contained in:
cqc
2021-09-14 11:24:23 -05:00
parent 79af294f51
commit 1d99823d44

139
main.ml
View File

@ -965,69 +965,62 @@ module Store = struct
type storeview = type storeview =
{ store: Istore.t { store: Istore.t
; mutable view: string list ; mutable view: Istore.key
; mutable selected: int list ; mutable selection: Istore.key
(* values of offset to Istore.Tree.list because ugh *) ; mutable editmode: bool }
; mutable edit: bool }
let make_storeview ?(path = []) storepath branch = let make_storeview ?(path = []) storepath branch =
{ store=
Lwt_main.run Lwt_main.run
(Istore.of_branch ( Istore.Repo.v (Irmin_git.config storepath)
(Lwt_main.run >>= fun repo ->
(Istore.Repo.v (Irmin_git.config storepath)) ) Istore.of_branch repo branch
branch ) >>= fun store ->
; view= path let view = Istore.Key.v path in
; selected= [1] Istore.list store view
; edit= false } >>= fun viewlist ->
Lwt.return
{ store
; view
; selection= Istore.Key.v [fst (List.hd viewlist)]
; editmode= false } )
let navigate sv action = let navigate sv action =
let rec nodecount (ipath : int list) tree = let rec findi value = function
match ipath with | [] -> 0
| [] -> | a :: b -> (if a = value then -1 else findi value b) + 1 in
Istore.Tree.list tree []
>>= fun l -> Lwt.return (List.length l)
| a :: b ->
Istore.Tree.list tree []
>>= fun l -> nodecount b (snd (List.nth l a)) in
let removelast l = List.rev (List.tl (List.rev l)) in
let last l = List.nth l (List.length l - 1) in
fun () -> fun () ->
Lwt_main.run Lwt_main.run
( Istore.get_tree sv.store sv.view ( Istore.get_tree sv.store sv.view
>>= fun top -> >>= fun top ->
nodecount (removelast sv.selected) top match Istore.Key.rdecons sv.selection with
>>= fun seln -> | Some (ppath, step) ->
nodecount sv.selected top Istore.Tree.list top ppath
>>= fun subn -> >>= fun neighbors ->
let steplist = fst (List.split neighbors) in
let stepi = findi step steplist in
Istore.Tree.list (snd (List.nth neighbors stepi)) []
>>= fun subtreelist ->
Lwt.return Lwt.return
( ( match action with ( match action with
| `Next -> | `Next ->
F.epr let stepi = findi step steplist in
"navigate `Next: (last sv.selected)=%d seln=%d@." if List.length steplist - 1 > stepi then
(last sv.selected) seln ; sv.selection <-
if last sv.selected < seln - 1 then Istore.Key.rcons ppath
sv.selected <- (List.nth steplist (stepi + 1))
List.mapi
(fun i a ->
if i >= List.length sv.selected - 1 then a + 1
else a )
sv.selected
| `Prev -> | `Prev ->
if last sv.selected > 0 then if stepi > 0 then
sv.selected <- sv.selection <-
List.mapi Istore.Key.rcons ppath
(fun i a -> (List.nth steplist (stepi - 1))
if i >= List.length sv.selected - 1 then a - 1 | `Sub ->
else a ) if List.length subtreelist > 0 then
sv.selected sv.selection <-
| `Sub -> if subn > 0 then sv.selected <- sv.selected @ [0] sv.selection @ [fst (List.hd subtreelist)]
| `Sup -> | `Sup ->
if List.length sv.selected > 1 then if List.length ppath > 0 then sv.selection <- ppath
sv.selected <- removelast sv.selected ) ;
F.epr "Store.editor selected: %d@."
(List.nth sv.selected (List.length sv.selected - 1)) )
) )
| None -> Lwt.return_unit )
let editor ?(branch = "current") storepath : Panel.t = let editor ?(branch = "current") storepath : Panel.t =
let sv = make_storeview storepath branch in let sv = make_storeview storepath branch in
@ -1036,8 +1029,10 @@ module Store = struct
let open Input.Bind in let open Input.Bind in
add [([], Char 'n')] [Custom (navigate sv `Next)] add [([], Char 'n')] [Custom (navigate sv `Next)]
@@ add [([], Char 'p')] [Custom (navigate sv `Prev)] @@ add [([], Char 'p')] [Custom (navigate sv `Prev)]
@@ add [([], Char 'w')] [Custom (navigate sv `Prev)]
@@ add [([], Char 's')] [Custom (navigate sv `Next)]
@@ add [([], Char 'd')] [Custom (navigate sv `Sub)] @@ add [([], Char 'd')] [Custom (navigate sv `Sub)]
@@ add [([], Char 'u')] [Custom (navigate sv `Sup)] empty in @@ add [([], Char 'a')] [Custom (navigate sv `Sup)] empty in
let bindstate = Input.Bind.init keybinds in let bindstate = Input.Bind.init keybinds in
{ act= { act=
(fun panel events -> (fun panel events ->
@ -1046,40 +1041,54 @@ module Store = struct
(Event.actions_of_events bindstate events) ; (Event.actions_of_events bindstate events) ;
(Panel.vbox panel.subpanels).act panel events ) (Panel.vbox panel.subpanels).act panel events )
; subpanels= ; subpanels=
[ Panel.hbox
[ Panel.prettyprint (fun pp -> [ Panel.prettyprint (fun pp ->
let indent = ref 0 in let indent = ref 0 in
let rec draw_levels tree sel = let rec draw_levels (tree : Istore.tree)
indent := !indent + 1 ; (sel : Istore.key) =
List.iteri List.iteri
(fun i (step, node) -> (fun _i (step, node) ->
Format.pp_open_vbox pp 0 ; Format.pp_open_vbox pp 0 ;
Format.pp_open_hbox pp () ; Format.pp_open_hbox pp () ;
for _ = 0 to !indent do for _ = 0 to !indent do
Format.pp_print_space pp () Format.pp_print_space pp ()
done ; done ;
if sel = [i] then if sel = [step] then
Format.pp_open_stag pp Format.pp_open_stag pp
Display.( Display.(
Panel.Color_bg Panel.Color_bg
(Wall.Color.v 0.99 0.99 0.125 0.3)) ; (Wall.Color.v 0.99 0.99 0.125 0.3)) ;
Format.fprintf pp "%d-%s@." !indent step ; Format.fprintf pp "%d-%s@." !indent step ;
if sel = [i] then Format.pp_close_stag pp () ; if sel = [step] then
Format.pp_close_stag pp () ;
Format.pp_close_box pp () ; Format.pp_close_box pp () ;
let subtree =
Lwt_main.run (Istore.Tree.list node []) in
let subsel = let subsel =
if List.length sel > 0 && List.hd sel = i then match Istore.Key.decons sel with
List.tl sel | Some (_tstep, subkey) -> subkey
else [] in | None -> [] in
draw_levels subtree subsel ; indent := succ !indent ;
draw_levels node subsel ;
indent := pred !indent ;
Format.pp_close_box pp () ) Format.pp_close_box pp () )
tree ; (Lwt_main.run (Istore.Tree.list tree [])) in
indent := !indent - 1 in
let root = let root =
Lwt_main.run (Istore.get_tree sv.store sv.view)
in
draw_levels root sv.selection )
; Panel.prettyprint (fun pp ->
let contents =
Lwt_main.run Lwt_main.run
( Istore.get_tree sv.store sv.view ( Istore.get_tree sv.store sv.view
>>= fun n -> Istore.Tree.list n [] ) in >>= fun t ->
draw_levels root sv.selected ) Istore.Tree.kind t sv.selection
>>= function
| Some a -> (
match a with
| `Contents -> Istore.Tree.get t sv.selection
| `Node -> Lwt.return "Node..." )
| None -> Lwt.return "Invalid Selection..." )
in
Format.fprintf pp "%s @." contents ) ]
; Panel.bindingstate bindstate ] ; Panel.bindingstate bindstate ]
; tag= "store-editor" } ; tag= "store-editor" }
end end