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/screen.ml | 64 ++++++++++++++++++++++++----------------------------------- 1 file changed, 26 insertions(+), 38 deletions(-) (limited to 'src/screen.ml') diff --git a/src/screen.ml b/src/screen.ml index c61efea..7888ba5 100755 --- a/src/screen.ml +++ b/src/screen.ml @@ -32,16 +32,14 @@ let get_cell screen (x, y) = begin Some (x', y') end -let center data screen height width = begin +let center data position screen height width = begin let height' = height - 3 and width' = (width - screen.left_margin) / cell_size in let end_x = (fst screen.start) + width' -1 in let end_y = (snd screen.start) + height' -2 in - let selected = Selection.extract data.Sheet.selected in - let center_axis f replace max_limit shift screen = begin - let selected_axis = f selected in + let selected_axis = f position in match (selected_axis >= f screen.start), (selected_axis > max_limit) with | true, false -> screen | _ -> { screen with start = replace (max 1 (selected_axis - shift)) screen.start } @@ -65,23 +63,20 @@ let status screen msg = begin end (** Draw the spreadsheet *) -let draw data screen = begin - - let selected = Selection.extract data.Sheet.selected in +let draw data selected screen = begin - let referenced = - Sheet.Raw.get_expr selected data.Sheet.data - |> Expression.collect_sources + let position = Selection.extract selected in - and sink = Sheet.Raw.get_sink selected data.Sheet.data in + let expr, _, sink = Sheet.get_cell position data in + let referenced = Expression.collect_sources expr in let height, width = screen.size in - let screen = center data screen height width in + let screen = center data position screen height width in for y = 1 to (height-2) do let pos_y = (y + (snd screen.start) - 1) in if (Curses.has_colors ()) then begin - if Selection.is_selected (Selection.Vertical pos_y) data.Sheet.selected then + if Selection.is_selected (Selection.Vertical pos_y) selected then Curses.wattrset screen.sheet (Attrs.color_pair 2 ) else Curses.wattrset screen.sheet (Attrs.color_pair 1 ) @@ -95,7 +90,7 @@ let draw data screen = begin for x = 0 to ((width - cell_size - screen.left_margin) / cell_size) do let pos_x = x + (fst screen.start) in if (Curses.has_colors ()) then begin - if Selection.is_selected (Selection.Horizontal pos_x) data.Sheet.selected then + if Selection.is_selected (Selection.Horizontal pos_x) selected then Curses.wattrset screen.sheet (Attrs.color_pair 2 ) else Curses.wattrset screen.sheet (Attrs.color_pair 1 ) @@ -112,7 +107,7 @@ let draw data screen = begin let pos_y = y + (snd screen.start) - 1 in if (Curses.has_colors ()) then begin - if Selection.is_selected (Selection.Cell (pos_x, pos_y)) data.Sheet.selected then + if Selection.is_selected (Selection.Cell (pos_x, pos_y)) selected then Curses.wattrset screen.sheet (Attrs.color_pair 3 ) else if Cell.Set.mem (pos_x, pos_y) referenced then Curses.wattrset screen.sheet (Attrs.color_pair 4 ) @@ -124,8 +119,9 @@ let draw data screen = begin (* Get the content from the cell *) - let content = Sheet.Raw.get_value (pos_x, pos_y) data.Sheet.data - |> Option.map (fun x -> UTF8.split ~sep:(u"\n") (ScTypes.Result.show x)) + + let _, value, _ = Sheet.get_cell (pos_x, pos_y) data in + let content = Option.map (fun x -> UTF8.split ~sep:(u"\n") (ScTypes.Result.show x)) value |> Option.default UTF8.empty in (* If the content is defined, try to encode it and print it*) @@ -143,8 +139,7 @@ let draw data screen = begin ) done done; - ignore @@ Curses.wrefresh screen.sheet; - screen + ignore @@ Curses.wrefresh screen.sheet end @@ -190,15 +185,13 @@ let close {window} = begin Curses.endwin() end -let draw_input t screen = begin +let draw_input t selected screen = begin let height, width = screen.size in - let expr = Sheet.Raw.get_expr (Selection.extract t.Sheet.selected) t.Sheet.data - |> Expression.show in + let expr, value, _ = Sheet.get_cell (Selection.extract selected) t in - let result = Sheet.Raw.get_value (Selection.extract t.Sheet.selected) t.Sheet.data - |> Option.map ScTypes.Result.show + let result = Option.map ScTypes.Result.show value |> Option.default UTF8.empty in UTF8.encode result |> Option.iter (fun encoded_result -> @@ -214,11 +207,14 @@ let draw_input t screen = begin && Curses.wrefresh screen.input) ); - status screen expr; - screen + status screen (Expression.show expr); + () end -(** Wait for an event and return the key pressed +(** Wait for an event and return the key pressed. + + Non blocking for other running Lwt thread. + If the key code contains more than one char, they are both returned *) let read_key {window} = begin @@ -238,7 +234,7 @@ let read_key {window} = begin Buffer.contents buff end -let resize data t = begin +let resize data selection t = begin let size = Curses.getmaxyx t.window in if (size <> t.size) then ( let height, width = size in @@ -253,7 +249,8 @@ let resize data t = begin && Curses.mvwin t.status (height - 1) 0); Curses.wclear t.status; ignore @@ Curses.wrefresh t.status; - draw data t + draw data selection t; + t ) else t end @@ -441,15 +438,6 @@ let editor ?position ?(prefix=UTF8.empty) ?(init=UTF8.empty) t = begin try _edit (UTF8.rev_explode init) [] @@ read_key t with _ -> None) (fun () -> ignore @@ Curses.curs_set 0) - -end - -let search screen = begin - let result = editor ~prefix:(u"/") screen in - begin match result with - | Some content -> content - | None -> UTF8.empty - end end let run f = -- cgit v1.2.3