File: scroll_debug.ml

package info (click to toggle)
lambda-term 3.3.2-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,108 kB
  • sloc: ml: 14,981; ansic: 522; makefile: 32
file content (129 lines) | stat: -rw-r--r-- 3,794 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
(*
 * scroll_debug.ml
 * ----------
 * Copyright : (c) 2016, Andy Ray <andy.ray@ujamjar.com>
 * Licence   : BSD3
 *
 * This file is a part of Lambda-Term.
 *)

open Lwt
open LTerm_widget
open LTerm_geom

class scroll_label scroll = object
  inherit label "scroll"
  method! can_focus = false
  method! size_request = { rows=1; cols=0 }
  val style = LTerm_style.{none with foreground = Some red;
                                     background = Some green };
  method! draw ctx _focused =
    LTerm_draw.fill_style ctx style;
    LTerm_draw.draw_string_aligned ctx 0 H_align_center ~style
      (Zed_string.of_utf8 (Printf.sprintf "%i/%i" scroll#offset scroll#range))

end

let main () =
  let waiter, wakener = wait () in
  let exit = new button "exit" in
  exit#on_click (wakeup wakener);

  let vbox = new vbox in

  let add_scroll (vbox : vbox) ~range ~size =
    let adj = new scrollable in
    let hscroll = new hscrollbar adj in
    let label = new scroll_label adj in
    adj#set_range range;
    adj#set_mouse_mode `middle;
    adj#set_scroll_bar_mode (`fixed size);
    vbox#add ~expand:false (label :> t);
    vbox#add ~expand:false (new hline);
    vbox#add ~expand:false (hscroll :> t);
    vbox#add ~expand:false (new hline);
    adj
  in

  let scrolls = List.map
    (fun range -> add_scroll vbox ~range ~size:1)
    [ 0; 10; 30; 60; 100; 200; 1000 ]
  in

  let mouse_mode =
    let vbox = new vbox in
    let mouse_mode = new radiogroup in
    mouse_mode#on_state_change (function
      | None -> ()
      | Some(m) -> List.iter (fun h -> h#set_mouse_mode m) scrolls);
    vbox#add ~expand:false (new label "mouse mode");
    vbox#add ~expand:false (new radiobutton mouse_mode "middle" `middle);
    vbox#add ~expand:false (new radiobutton mouse_mode "ratio" `ratio);
    vbox#add ~expand:false (new radiobutton mouse_mode "auto" `auto);
    vbox#add ~expand:true (new spacing ());
    vbox
  in

  let scroll_mode =
    let vbox = new vbox in
    let scroll_mode = new radiogroup in

    let ranged_widget group name value range =
      let button = new radiobutton group name value in
      let scroll = new hslider range in
      button, scroll
    in

    vbox#add ~expand:false (new label "scroll mode");
    let f,fr = ranged_widget scroll_mode "fixed " `fixed 10 in
    let d,dr = ranged_widget scroll_mode "dynamic " `dynamic 10 in
    let sbox =
      let in_frame w = let f = new frame in f#set w; f in
      let v1 = new vbox in
      v1#add ~expand:true f;
      v1#add ~expand:true d;
      let v2 = new vbox in
      v2#add ~expand:false (in_frame fr);
      v2#add ~expand:false (in_frame dr);
      let h = new hbox in
      h#add ~expand:false v1;
      h#add ~expand:false v2;
      h
    in
    vbox#add ~expand:false sbox;

    let set_mode f o = List.iter (fun h -> h#set_scroll_bar_mode (f o)) scrolls in
    let fixed o = `fixed ((o*5)+1) in
    let dynamic o = `dynamic (o*50) in

    scroll_mode#on_state_change (function
      | None -> ()
      | Some(`fixed) -> set_mode fixed fr#offset
      | Some(`dynamic) -> set_mode dynamic dr#offset
    );

    fr#on_offset_change (fun o -> if f#state then set_mode fixed o);
    dr#on_offset_change (fun o -> if d#state then set_mode dynamic o);

    vbox
  in

  let hbox = new hbox in
  hbox#add (new spacing ());
  hbox#add ~expand:false mouse_mode;
  hbox#add (new spacing ());
  hbox#add ~expand:false scroll_mode;
  hbox#add (new spacing ());

  vbox#add ~expand:true (new spacing ());
  vbox#add ~expand:false hbox;
  vbox#add ~expand:true (new spacing ());
  vbox#add ~expand:false exit;

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

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