broke focus, but rearranged for better save implementation

This commit is contained in:
cqc
2023-01-23 13:04:04 -06:00
parent d46c1de49d
commit d53f6687e5
3 changed files with 6739 additions and 6623 deletions

File diff suppressed because one or more lines are too long

View File

@ -90,8 +90,8 @@ let _ =
let gravity_crop = Gravity.make ~h:`Positive ~v:`Negative in let gravity_crop = Gravity.make ~h:`Positive ~v:`Negative in
let body = Lwd.var (Lwd.pure Ui.empty) in let body = Lwd.var (Lwd.pure Ui.empty) in
let wm = Widgets.window_manager (Lwd.join (Lwd.get body)) in let wm = Widgets.window_manager (Lwd.join (Lwd.get body)) in
Nav.test_pull () >>= fun test_tree -> Nav.test_pull () >>= fun test_store ->
Widgets.(tree_nav (test_tree, [])) >>= fun ui -> Widgets.(tree_nav (test_store, [])) >>= fun ui ->
let root = let root =
Lwd.set body Lwd.set body
(Lwd.map ~f:(Ui.resize ~pad:gravity_pad ~crop:gravity_crop) ui); (Lwd.map ~f:(Ui.resize ~pad:gravity_pad ~crop:gravity_crop) ui);

View File

@ -439,6 +439,7 @@ module Nav = struct
module Sync = Irmin.Sync.Make (S) module Sync = Irmin.Sync.Make (S)
type t = S.tree type t = S.tree
type store = S.t
type tree = t type tree = t
type step = S.step type step = S.step
type path = step list type path = step list
@ -451,7 +452,7 @@ module Nav = struct
>>= add [ "hello"; "daddy" ] "ily" >>= add [ "hello"; "daddy" ] "ily"
>>= add [ "beep"; "beep" ] "motherfucker" >>= add [ "beep"; "beep" ] "motherfucker"
let test_pull () : t Lwt.t = let test_pull () : store Lwt.t =
(* test_populate ()*) (* test_populate ()*)
S.Repo.v (Config.init "") >>= fun repo -> S.Repo.v (Config.init "") >>= fun repo ->
S.of_branch repo "current" >>= fun t -> S.of_branch repo "current" >>= fun t ->
@ -459,7 +460,7 @@ module Nav = struct
let upstream = let upstream =
S.remote ~ctx "https://localhost:8080/console/rootstore.git" S.remote ~ctx "https://localhost:8080/console/rootstore.git"
in in
Sync.fetch_exn t upstream >>= fun _ -> S.tree t Sync.fetch_exn t upstream >>= fun _ -> Lwt.return t
end end
module Input = struct module Input = struct
@ -2759,6 +2760,10 @@ module Widgets = struct
let row = Lwd_table.append table in let row = Lwd_table.append table in
Lwd_table.set row (line_make ?focus str) Lwd_table.set row (line_make ?focus str)
let string_of_line { state; _ } =
let str, _ = Lwd.peek state in
str
let copy_line_cursor (x : line) (y : line) = let copy_line_cursor (x : line) (y : line) =
let _, xi = Lwd.peek x.state in let _, xi = Lwd.peek x.state in
let ys, _ = Lwd.peek y.state in let ys, _ = Lwd.peek y.state in
@ -2917,17 +2922,31 @@ module Widgets = struct
(* TODO: view_metadata *) (* TODO: view_metadata *)
let rec node_edit_area ?(table = Lwd_table.make ()) let rec node_edit_area ?(table = Lwd_table.make ())
?(focus = Focus.make ()) ((tree, path) : Nav.tree * Nav.path) : ?(focus = Focus.make ()) ((store, path) : Nav.S.t * Nav.path) :
Ui.t Lwd.t Lwt.t = Ui.t Lwd.t Lwt.t =
let cursor = Lwd.var @@ Lwd_table.first table in let cursor = Lwd.var @@ Lwd_table.first table in
let open Lwt.Infix in let open Lwt.Infix in
Nav.S.tree store >>= fun tree ->
Nav.S.Tree.kind tree path >>= function Nav.S.Tree.kind tree path >>= function
| None -> | None ->
lwt_lwd_string lwt_lwd_string
("Nav.S.Tree.kind " ^ String.concat "/" path ("Nav.S.Tree.kind " ^ String.concat "/" path
^ " how'd you get here??") ^ " how'd you get here??")
| Some `Node -> tree_nav (tree, path) | Some `Node -> tree_nav (store, path)
| Some `Contents -> ( | Some `Contents -> (
let save_stream, save_push = Lwt_stream.create () in
Lwt.async (fun () ->
Lwt_stream.iter_s
(fun contents ->
Nav.S.Tree.add tree path contents >>= fun tree' ->
Nav.S.set_tree
~info:(fun () ->
Nav.S.Info.v ~message:"node_edit_area 'save'"
(Int64.of_float
((new%js Js.date_now)##getTime /. 1000.)))
store path tree'
>>= fun _ -> Lwt.return_unit)
save_stream);
Nav.S.Tree.find_all tree path >>= function Nav.S.Tree.find_all tree path >>= function
| None -> | None ->
lwt_lwd_string lwt_lwd_string
@ -3013,12 +3032,22 @@ module Widgets = struct
`Handled) `Handled)
else `Unhandled)) else `Unhandled))
| `Uchar u, [ `Ctrl ] when eq_uc_c u 'k' -> | `Uchar u, [ `Ctrl ] when eq_uc_c u 'k' ->
`Handled
| `Uchar u, [ `Ctrl ] when eq_uc_c u 'x' ->
let b = Buffer.create 1024 in
Lwd_table.iter
(fun line ->
Buffer.add_string b
@@ string_of_line line)
table;
save_push (Some (Buffer.contents b));
`Handled `Handled
| _ -> `Unhandled)) | _ -> `Unhandled))
(Focus.status focus))) (Focus.status focus)))
and tree_nav ?(focus = Focus.make ()) and tree_nav ?(focus = Focus.make ())
((tree, path) : Nav.tree * Nav.path) : Ui.t Lwd.t Lwt.t = ((store, path) : Nav.S.t * Nav.path) : Ui.t Lwd.t Lwt.t =
let table = Lwd_table.make () in let table = Lwd_table.make () in
let cursor_move cursor let cursor_move cursor
@ -3042,9 +3071,11 @@ module Widgets = struct
(* Build view of tree *) (* Build view of tree *)
let open Lwt.Infix in let open Lwt.Infix in
Nav.S.tree store >>= fun tree ->
Nav.S.Tree.list tree path >>= fun treelist -> Nav.S.Tree.list tree path >>= fun treelist ->
List.iter List.iter
(fun te -> Lwd_table.append' table (Focus.make (), te)) (fun (step, _tree) ->
Lwd_table.append' table (Focus.make (), step))
treelist; treelist;
let cursor = Lwd.var @@ Lwd_table.first table in let cursor = Lwd.var @@ Lwd_table.first table in
Option.iter Option.iter
@ -3069,19 +3100,11 @@ module Widgets = struct
@@ Lwd.map (Lwd.get cursor) ~f:(function @@ Lwd.map (Lwd.get cursor) ~f:(function
| Some cursor_row -> ( | Some cursor_row -> (
match Lwd_table.get cursor_row with match Lwd_table.get cursor_row with
| Some (_focus, (step, tree)) -> ( | Some (_focus, step) -> (
Nav.S.Tree.kind tree [] >>= function Nav.S.Tree.kind tree (path @ [ step ]) >>= function
| Some `Node -> lwt_lwd_string "Sub-node??" | Some `Node -> lwt_lwd_string "Sub-node??"
| Some `Contents -> ( | Some `Contents ->
Nav.S.Tree.find_all tree [] >>= function node_edit_area (store, path @ [ step ])
| Some (contents, _metadata) ->
Lwt.return
(edit_area
~table:(line_table_of_string contents)
())
| None ->
lwt_lwd_string
("could not find path: " ^ step))
| None -> | None ->
lwt_lwd_string lwt_lwd_string
("Nav.S.Tree.kind " ^ step ^ " -> None?")) ("Nav.S.Tree.kind " ^ step ^ " -> None?"))
@ -3100,7 +3123,7 @@ module Widgets = struct
push_cv (Some ()); push_cv (Some ());
Lwt.return Lwt.return
(Lwd_table.map_reduce (Lwd_table.map_reduce
(fun _ (f, (s, _)) -> (fun _ (f, s) ->
Lwd.map Lwd.map
~f:(fun focus_h -> ~f:(fun focus_h ->
if Focus.has_focus focus_h then string ~attr:A.cursor s if Focus.has_focus focus_h then string ~attr:A.cursor s