From bb48738c4111f5f4e2faa40fe67ae1b8b9d7c2eb Mon Sep 17 00:00:00 2001 From: Sébastien Dailly Date: Wed, 29 Nov 2017 15:51:39 +0100 Subject: Rework on the Sheet.ml API : removed low level functions, made the sheet mutable --- src/main.ml | 201 ++++++++++++++++++++++++++++++------------------------------ 1 file changed, 100 insertions(+), 101 deletions(-) (limited to 'src/main.ml') diff --git a/src/main.ml b/src/main.ml index 8e557ce..4e49aa3 100755 --- a/src/main.ml +++ b/src/main.ml @@ -2,17 +2,15 @@ module E:Sym_expr.SYM_EXPR = Evaluate let u = UTF8.from_utf8string -let redraw t screen = - let screen' = - Screen.draw t screen - |> Screen.draw_input t in - t, screen' - -let action f msg (t, screen) = begin - let t', count = f t in - let t', screen' = redraw t' screen in - Screen.status screen' @@ UTF8.from_utf8string (Printf.sprintf msg count); - t', screen' +let redraw t screen selection = + Screen.draw t selection screen; + Screen.draw_input t selection screen + +let action f msg (t, screen, selection) = begin + let count = f t in + redraw t screen selection; + Screen.status screen @@ UTF8.from_utf8string (Printf.sprintf msg count); + t, screen, selection end let catalog = Functions.C.compile @@ Functions.built_in Functions.C.empty @@ -67,187 +65,188 @@ let parser screen = begin menhirParser get_value end -let rec normal_mode (t, screen) = begin +let rec normal_mode (t, screen, selection) = begin match (parser screen) with - | exception x -> normal_mode (t, screen) + | exception x -> normal_mode (t, screen, selection) | Actions.Visual -> Screen.status screen @@ u"-- Selection --"; - selection_mode (t, screen) + selection_mode (t, screen, selection) | Actions.Move direction -> - begin match Sheet.move direction t with - | Some t' -> normal_mode @@ redraw t' screen - | None -> normal_mode (t, screen) + begin match Selection.move direction selection with + | Some selection -> + redraw t screen selection; + normal_mode (t, screen, selection) + | None -> normal_mode (t, screen, selection) end - | Actions.Resize -> normal_mode (t, Screen.resize t screen) + | Actions.Resize -> normal_mode (t, Screen.resize t selection screen, selection) | Actions.Delete -> - let yank_before_delete = fun x -> Sheet.delete (fst (Sheet.yank x)) in - normal_mode @@ action yank_before_delete "Deleted %d cells" (t, screen) + let yank_before_delete = fun x -> + ignore @@ Sheet.yank selection x; + Sheet.delete selection x in + normal_mode @@ action yank_before_delete "Deleted %d cells" (t, screen, selection) | Actions.Yank -> - normal_mode @@ action Sheet.yank "Yanked %d cells" (t, screen) + normal_mode @@ action (Sheet.yank selection) "Yanked %d cells" (t, screen, selection) | Actions.Paste -> - normal_mode @@ action Sheet.paste "Pasted %d cells" (t, screen) + let paste = Sheet.paste @@ Selection.extract selection in + normal_mode @@ action paste "Pasted %d cells" (t, screen, selection) | Actions.Undo -> begin match Sheet.undo t with - | Some t' -> normal_mode @@ redraw t' screen - | None -> normal_mode (t, screen) + | true -> + redraw t screen selection; + normal_mode (t, screen, selection) + | false -> normal_mode (t, screen, selection) end (* Edit a content *) | Actions.Edit -> - let position = Selection.extract t.Sheet.selected in - let expr = Sheet.Raw.get_expr position t.Sheet.data - |> Expression.show in - begin match Screen.editor ~position ~prefix:(u"-> ") ~init:expr screen with + let position = Selection.extract selection in + let expr, _, _ = Sheet.get_cell position t in + let expr_repr = Expression.show expr in + begin match Screen.editor ~position ~prefix:(u"-> ") ~init:expr_repr screen with | None -> (* Restore the previous value *) - Screen.status screen expr; - normal_mode (t, screen) + Screen.status screen expr_repr; + normal_mode (t, screen, selection) | Some content -> let expr' = Expression.load content in - let _, t' = Sheet.add expr' t in - normal_mode @@ redraw t' screen + ignore @@ Sheet.add ~history:true expr' position t; + redraw t screen selection; + normal_mode (t, screen, selection) end (* Insert a new formula, the actual value will be erased *) | Actions.InsertFormula -> - let position = Selection.extract t.Sheet.selected in + let position = Selection.extract selection in begin match Screen.editor ~position ~init:(u"=") screen with | None -> (* Restore the previous value *) - let expr = Sheet.Raw.get_expr position t.Sheet.data - |> Expression.show in - Screen.status screen expr; - normal_mode (t, screen) + let expr, _, _ = Sheet.get_cell position t in + Screen.status screen (Expression.show expr); + normal_mode (t, screen, selection) | Some content -> let expr = Expression.load content in - let _, t' = Sheet.add expr t in - normal_mode @@ redraw t' screen + ignore @@ Sheet.add ~history:true expr position t; + redraw t screen selection; + normal_mode (t, screen, selection) end -(* - | Actions.Search -> - let expr = Screen.search screen - |> Expression.load in - (*let pattern = Expression.eval expr (fun _ -> ScTypes.Refs.Single None) in*) - let pattern = Expression.eval' expr catalog in - begin match Sheet.search (`Pattern (Some pattern)) t with - | Some t' -> normal_mode @@ redraw t' screen - | None -> normal_mode (t, screen) - end -*) - | Actions.Button1_clicked coord -> begin match Screen.get_cell screen coord with - | None -> normal_mode (t, screen) - | Some (x,y) -> begin match Sheet.move (Actions.Absolute (x,y)) t with - | Some t' -> normal_mode @@ redraw t' screen - | None -> normal_mode (t, screen) + | None -> normal_mode (t, screen, selection) + | Some (x,y) -> begin match Selection.move (Actions.Absolute (x,y)) selection with + | Some selection' -> + redraw t screen selection'; + normal_mode (t, screen, selection') + | None -> normal_mode (t, screen, selection) end end | Actions.Button1_released coord -> begin match Screen.get_cell screen coord with - | Some (x,y) when (x,y) <> (Selection.extract t.Sheet.selected) -> + | Some (x,y) when (x,y) <> (Selection.extract selection) -> Screen.status screen @@ u"-- Selection -- "; - let t' = { t with - Sheet.selected = Selection.extends (Actions.Absolute (x,y)) t.Sheet.selected - } in - let screen' = Screen.draw t' screen in - selection_mode (t', screen') - | _ -> normal_mode (t, screen) + let selection = Selection.extends (Actions.Absolute (x,y)) selection in + Screen.draw t selection screen; + selection_mode (t, screen, selection) + | _ -> normal_mode (t, screen, selection) end | Actions.Command -> begin match Screen.editor ~prefix:(u":") screen with | None -> - normal_mode (t, screen) + normal_mode (t, screen, selection) | Some content -> let args = try UTF8.to_utf8string content |> Tools.String.split ~by:' ' with Not_found -> (UTF8.to_utf8string content, "") in - command (t, screen) args + command (t, screen, selection) args end - | _ -> normal_mode (t, screen) + | _ -> normal_mode (t, screen, selection) end -and selection_mode (t, screen) = begin +and selection_mode (t, screen, selection) = begin match (parser screen) with - | exception x -> selection_mode (t, screen) + | exception x -> selection_mode (t, screen, selection) - | Actions.Resize -> selection_mode (t, Screen.resize t screen) + | Actions.Resize -> selection_mode (t, Screen.resize t selection screen, selection) | Actions.Delete -> - let yank_before_delete = fun x -> Sheet.delete (fst (Sheet.yank x)) in - normal_mode @@ action yank_before_delete "Deleted %d cells" (t, screen) + let yank_before_delete = fun x -> + ignore @@ Sheet.yank selection x; + Sheet.delete selection x in + normal_mode @@ action yank_before_delete "Deleted %d cells" (t, screen, selection) | Actions.Yank -> - normal_mode @@ action Sheet.yank "Yanked %d cells" (t, screen) + normal_mode @@ action (Sheet.yank selection) "Yanked %d cells" (t, screen, selection) | Actions.Escape -> - let t' = { t with Sheet.selected = Selection.create (Selection.extract t.Sheet.selected) } in - let screen' = Screen.draw t' screen - |> Screen.draw_input t' in - Screen.status screen UTF8.empty; - normal_mode (t', screen') + let selection = Selection.create (Selection.extract selection) in + Screen.draw t selection screen; + Screen.draw_input t selection screen; + Screen.status screen UTF8.empty; + normal_mode (t, screen, selection) | Actions.Move m -> - let t' = { t with Sheet.selected = Selection.extends m t.Sheet.selected } in - let screen' = Screen.draw t' screen in - selection_mode (t', screen') + let selection = Selection.extends m selection in + Screen.draw t selection screen; + selection_mode (t, screen, selection) | Actions.Button1_clicked coord -> begin match Screen.get_cell screen coord with - | None -> normal_mode (t, screen) - | Some (x,y) -> begin match Sheet.move (Actions.Absolute (x,y)) t with - | Some t' -> + | None -> normal_mode (t, screen, selection) + | Some (x,y) -> begin match Selection.move (Actions.Absolute (x,y)) selection with + | Some selection -> Screen.status screen UTF8.empty; - normal_mode @@ redraw t' screen - | None -> normal_mode (t, screen) + redraw t screen selection; + normal_mode (t, screen, selection) + | None -> normal_mode (t, screen, selection) end end - | _ -> selection_mode (t, screen) + | _ -> selection_mode (t, screen, selection) end -and command (t, screen) action = begin +and command (t, screen, selection) action = begin match action with | ("w", file) -> (* Save the file *) - Odf.save t.Sheet.data file; - normal_mode @@ redraw t screen -(* - | ("repr", file) -> (* Save the file *) - let out_gv = open_out_bin file in - let form = Format.formatter_of_out_channel out_gv in - Evaluator.repr form (Evaluator.get_catalog ()); - close_out out_gv; - normal_mode @@ redraw t screen -*) + Odf.save t file; + redraw t screen selection; + normal_mode (t, screen, selection) | ("enew", _) -> (* Start a new spreadsheet *) - normal_mode @@ redraw (Sheet.create catalog Sheet.Raw.empty) screen + let selection = Selection.create (1, 1) + and sheet = Sheet.create catalog in + redraw sheet screen selection; + normal_mode (sheet, screen, selection) | ("q", _) -> (* Quit *) t - | _ -> normal_mode @@ redraw t screen + | _ -> + redraw t screen selection; + normal_mode (t, screen, selection) end let () = begin let sheet = if Array.length Sys.argv = 1 then - Sheet.Raw.empty + Sheet.create catalog else - Odf.load catalog Sys.argv.(1) in + Odf.load catalog Sys.argv.(1) + + and selection = Selection.create (1, 1) in Screen.run (fun window -> - ignore @@ normal_mode @@ redraw (Sheet.create catalog sheet) window) + redraw sheet window selection; + ignore @@ normal_mode (sheet, window, selection) + ) end -- cgit v1.2.3