Compare commits

...

4 Commits

Author SHA1 Message Date
Reynir Björnsson 3f43398866 Cleanup, reduce Lwd.set calls 2023-05-12 14:39:02 +02:00
Reynir Björnsson 1724e5c994 Minor changes to Window
We don't use position, and we don't calculate width yet.
2023-05-12 14:37:54 +02:00
Reynir Björnsson fdbc198939 Implement broken quit:wq 2023-05-12 14:37:35 +02:00
Reynir Björnsson 8598f7011f Rope: Fix negative index
Not 100% sure if this is correct :/
2023-05-12 14:27:27 +02:00
4 changed files with 30 additions and 20 deletions

View File

@ -2,13 +2,14 @@ open Nottui
open Notty
type t = {
quit : unit -> unit;
message : string -> unit;
cursor : Rp.Cursor.cursor;
}
let make message =
let make quit message =
let cursor = Rp.Cursor.create Rp.empty 0 in
{ message; cursor }
{ quit; message; cursor }
let map_cursor f state =
{ state with cursor = f state.cursor }
@ -63,7 +64,9 @@ module User_prompt = struct
let text, position =
Utils.render_cursor ~width:(max 0 (w - 3)) state.cursor
in
Lwd.set cursor (position + 1, y);
let new_cursor = (position + 1, y) in
if new_cursor <> (Lwd.peek cursor) then
Lwd.set cursor new_cursor;
I.hcat [ I.char A.empty ' ' 1 1 ; text ]
end
@ -104,15 +107,21 @@ let handler ~hook state = function
state.message msg;
hook { state with cursor = Rp.Cursor.create Rp.empty 0 };
`Handled
| `ASCII ('C'..'D'), [`Ctrl] ->
state.quit ();
`Handled
| _ -> `Unhandled
let make ~message cursor =
let make ~quit ~message cursor =
let ( let* ) x f = Lwd.bind x ~f in
let ( let+ ) x f = Lwd.map ~f x in
let ( and+ ) = Lwd.map2 ~f:(fun x y -> (x, y)) in
let state = Lwd.var (make message) in
let state = Lwd.var (make quit message) in
let position = Lwd.var (0, 0) in
let hook = Lwd.set state in
let hook state' =
if (Lwd.peek state).cursor != state'.cursor then
Lwd.set state state'
in
let update_prompt state (y, w) =
let user = User_prompt.render ~cursor ~y ~w state in
Ui.keyboard_area (handler ~hook state) (Ui.atom user)

View File

@ -162,7 +162,7 @@ module Make (S : STRING) (C : CONTROL) = struct
if len = 0 then empty else mksub ofs stop t
let rec safe_iter_range f i n = function
| Str (s, ofs, _) -> S.iter_range f s (ofs + i) n
| Str (s, ofs, _) -> S.iter_range f s (max 0 (ofs + i)) n
| App (t1, t2, _, _) ->
let n1 = length t1 in
if i + n <= n1 then safe_iter_range f i n t1

View File

@ -43,10 +43,15 @@ module Main (_ : Mirage_random.S) (T : Mirage_time.S) (M : Mirage_clock.MCLOCK)
let msg = Message.make ~nickname:username m in
Lwd.set buffer_var (Rb.push buffer msg; buffer);
in
Rb.push buffer (Message.msgf "Welcome, %s!" username);
let quit () =
let msg = Message.msgf "%s tried to quit, but it is not implemented" username in
Lwd.set buffer_var (Rb.push buffer msg; buffer);
in
Lwd.set buffer_var
(Rb.push buffer (Message.msgf "Welcome, %s!" username); buffer);
let ui =
let ( let* ) x f = Lwd.bind x ~f in
let* prompt = Prompt.make ~message cursor in
let* prompt = Prompt.make ~quit ~message cursor in
let* window = Window.make buffer_var in
Lwd.return (Nottui.Ui.vcat [window; prompt])
in

View File

@ -1,7 +1,7 @@
open Nottui
open Notty
type t = { w : int; h : int; p : int }
type t = { w : int; h : int; }
let render_message ~width ~width_nicknames msg =
(* (* FIXME: split doesn't work *)
@ -9,6 +9,7 @@ let render_message ~width ~width_nicknames msg =
max 1 (width - width_nicknames - 1)
in
let message = Message.split_at ~len:width_message msg in *)
let _ = width in
let message = [Message.message msg] in
let color = A.white in
let rest =
@ -33,8 +34,8 @@ let width_nicknames msgs =
let f msg acc = max (String.length (Message.nickname msg)) acc in
Rb.iter ~f msgs 0
let render { w; h; p } msgs =
let idx = ref (Rb.length msgs - 1 - p) in
let render { w; h } msgs =
let idx = ref (Rb.length msgs - 1) in
let image = ref I.empty in
let message = ref I.empty in
let width_nicknames = width_nicknames msgs in
@ -50,27 +51,22 @@ let render { w; h; p } msgs =
done;
Ui.atom (I.vsnap ~align:`Bottom h !image)
let handler ~hook:_ _state _buffer _key = `Unhandled
let make w =
let ( let* ) x f = Lwd.bind ~f x in
let ( let+ ) x f = Lwd.map ~f x in
let ( and+ ) = Lwd.map2 ~f:(fun x y -> (x, y)) in
let state = Lwd.var { w = 0; h = 0; p = 0 } in
let hook = Lwd.set state in
let state = Lwd.var { w = 0; h = 0 } in
let* document =
let+ state = Lwd.get state
and+ buffer = Lwd.get w in
Ui.keyboard_area
(handler ~hook state buffer)
(render state buffer)
render state buffer
in
let update_size ~w ~h =
let state' = Lwd.peek state in
if state'.w <> w || state'.h <> h then Lwd.set state { state' with w; h }
if state'.w <> w || state'.h <> h then Lwd.set state { w; h }
in
let measure_size document =