lambda-term icon indicating copy to clipboard operation
lambda-term copied to clipboard

widget#can_focus is not evaluated when #set_focus is given

Open Chimrod opened this issue 5 years ago • 0 comments

In the following example :

open Lwt
open LTerm_widget

let main () =
  let waiter, wakener = wait () in

  let selected = ref 1 in

  let vbox = new vbox in
  let group_int = new radiogroup in
  let callback_int = function
    | Some n ->
        selected := n

    | None -> ()
  in
  group_int#on_state_change callback_int;

  let button = new button "exit" in
  button#on_click (wakeup wakener);
  vbox#add ~expand:false button;
  vbox#add ~expand:false (new hline);

  let button = object
    inherit button "reset radiobuttons"

    (* The button should be selectable only when the group_box value is set to 1 *)
    method! can_focus = !selected = 1
  end in

  let reset = fun () ->
    group_int#switch_to 1;
  in
  button#on_click reset;
  vbox#add ~expand:false button;
  vbox#add ~expand:false (new hline);

  let group_box = new vbox in
  let radio_1 = new radiobutton group_int "Allow reset" 1 in
  group_box#add radio_1;
  group_box#add (new radiobutton group_int "Disable reset" 2);


    (* Disable thoses lines to get the malfunctionning *)

    (*
  radio_1#set_focus LTerm_geom.({
      left = None;
      right = None;
      up = Some (button :> LTerm_widget.t);
      down = None
  });
    *)
  vbox#add group_box;

  let frame = new frame in
  frame#set vbox;

  Lazy.force LTerm.stdout >>= fun term ->
  LTerm.enable_mouse term >>= fun () ->
  Lwt.finalize
    (fun () -> run term frame waiter)
    (fun () -> LTerm.disable_mouse term)

let () = Lwt_main.run (main ())

The button "reset" as overriden the method get_focus for being disabled when the second radio button is selected.

But if you uncomment the lines 46-53 which define the focus rules for one radio button, the button becomes always enabled. The method can_focus is not evaluated at all.

Chimrod avatar May 09 '20 09:05 Chimrod