aboutsummaryrefslogtreecommitdiff
path: root/src/screen.ml
diff options
context:
space:
mode:
Diffstat (limited to 'src/screen.ml')
-rwxr-xr-xsrc/screen.ml64
1 files changed, 26 insertions, 38 deletions
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 =