+++ /dev/null
-(* $Id$ *)
-
-open GObj
-
-open Common
-open Utils
-
-class type tiwidget_base = object
- method name : string
- method proplist : (string * prop) list
-end
-
-let prop_widget (prop : prop) =
- match prop#range with
- Enum l ->
- let w = GEdit.combo ~popdown_strings:l ~use_arrows:`ALWAYS () in
- w#entry#connect#changed ~callback:(fun () -> prop#set w#entry#text);
- w#entry#set_editable false;
- w#entry#set_text prop#get;
- w#coerce
- | String ->
- let w = GEdit.entry ~text:prop#get () in
- w#connect#activate ~callback:(fun () -> prop#set w#text);
- w#coerce
- | File ->
- let w = GPack.hbox () in
- let e = GEdit.entry ~text:prop#get ~editable:false ~packing:w#pack () in
- let b = GButton.button ~label:"..." ~packing:w#pack () in
- b#connect#clicked
- ~callback:(fun () -> get_filename
- ~callback:(fun name -> e#set_text name; prop#set name) (); ());
- w#coerce
- | Int ->
- let adjustment =
- GData.adjustment ~value:(float_of_string prop#get)
- ~lower:(-2.) ~upper:5000. ~step_incr:1. ~page_incr:10. ~page_size:0. ()
- in
- let w = GEdit.spin_button ~rate:0.5 ~digits:0 ~adjustment () in
- w#connect#activate
- ~callback:(fun () -> prop#set (string_of_int w#value_as_int));
- w#coerce
- | Float (lower, upper) ->
-(* let adjustment =
- GData.adjustment ~value:(float_of_string prop#get)
- ~lower ~upper ~step_incr:((upper-.lower)/.100.)
- ~page_incr:((upper-.lower)/.10.) ~page_size:0. ()
- in
- let w = GEdit.spin_button ~rate:0.5 ~digits:2 ~adjustment () in
- w#connect#activate
- ~callback:(fun () -> prop#set (string_of_float w#value));
- w#coerce
-*)
- let w = entry_float ~init:(float_of_string prop#get) () in
- w#connect#activate
- ~callback:(fun () -> prop#set (string_of_float w#value));
- w#coerce
-(* | Adjust ->
- let wpop = GWindow.window ~title:"Adjustment values" () in
- let vb = GPack.vbox ~packing:wpop#add() in
- let hb1 = GPack.hbox ~packing:vb#pack () in
- let l1 = GMisc.label ~text:"lower" ~packing:hb1#pack () in
- let e1 = entry_float ~packing:hb1#pack
- ~init:(float_of_string prop#get) ~set:prop#set in
-*)
- | CList_titles ->
- let wpop = GWindow.window ~title:"titles of the columns" () in
- let vb = GPack.vbox ~packing:wpop#add () in
- let titles = split_string prop#get ~sep:' ' in
- let n = List.length titles in
- let rtitles = ref titles in
- let rget = ref [] and rset = ref [] in
- for i = 1 to n do
- match !rtitles with
- | hd::tl ->
- let hb = GPack.hbox ~packing:vb#pack () in
- let _ = GMisc.label ~text:("column" ^ (string_of_int i))
- ~packing:hb#pack () in
- let e = GEdit.entry ~text:hd ~packing:hb#pack () in
- rtitles := tl;
- rget := (fun () -> e#text) :: !rget;
- rset := e#set_text :: !rset;
- | _ -> failwith "CList_titles: this cannot happen!!"
- done;
- rtitles := titles;
- rget := List.rev !rget;
- rset := List.rev !rset;
- let hb = GPack.hbox ~packing:vb#pack () in
- let ok = GButton.button ~label:"OK" ~packing:hb#pack () in
- let cancel = GButton.button ~label:"Cancel" ~packing:hb#pack () in
- ok#connect#pressed
- ~callback:(fun () ->
- let tit = List.map ~f:(fun f -> f ()) !rget in
- prop#set (String.concat ~sep:" " tit);
- rtitles := tit;
- wpop#misc#hide ());
- cancel#connect#pressed
- ~callback:(fun () ->
- wpop#misc#hide ();
- List.iter2 ~f:(fun f v -> f v) !rset !rtitles);
- let e = GEdit.entry ~text:"double click here" ~editable:false () in
- e#event#connect#button_press ~callback:
- (fun ev ->
- GdkEvent.get_type ev = `TWO_BUTTON_PRESS &&
- GdkEvent.Button.button ev = 1 &&
- begin
- wpop#misc#show ();
- GtkSignal.stop_emit ();
- true
- end);
- e#coerce
-
-let prop_box list =
- let vbox = GPack.vbox () in
- List.iter list ~f:
- begin fun (name, prop) ->
- let hbox =
- GPack.hbox ~homogeneous:true ~packing:(vbox#pack ~expand:false) () in
- GMisc.label ~text:name ~packing:hbox#pack ();
- hbox#pack ~fill:true (prop_widget prop);
- GMisc.separator `HORIZONTAL ~packing:(vbox#pack ~expand:false) ();
- ()
- end;
- vbox
-
-class ['a] frozen lz = object
- method get : 'a = Lazy.force lz
-end
-
-let vbox =
- new frozen (lazy (GWindow.window ~show:true ~title:"Properties" ()))
-
-let init () = vbox#get
-
-let widget_pool = Hashtbl.create 7
-
-let boxref = ref None
-let shown_widget = ref ""
-
-let show_prop_box vb =
- Gaux.may !boxref ~f:vbox#get#remove;
- vbox#get#add vb#coerce;
- boxref := Some vb#coerce
-
-let show (w : #tiwidget_base) =
- let name = w#name in
- let vb =
- try
- Hashtbl.find widget_pool name
- with Not_found ->
- let vb = prop_box w#proplist in
- Hashtbl.add widget_pool ~key:name ~data:vb;
- vb
- in
- show_prop_box vb;
- shown_widget := name
-
-let add (w : #tiwidget_base) =
- let vb = prop_box w#proplist in
- Hashtbl.add widget_pool ~key:w#name ~data:vb
-
-
-let remove name =
- Hashtbl.remove widget_pool name;
- if !shown_widget = name then begin
- shown_widget := "";
- show_prop_box (GMisc.label ~text:"No widget selected" ())
- end
-
-(*
-let change_name oldname newname =
- let vb = Hashtbl.find widget_pool oldname in
- Hashtbl.remove widget_pool oldname;
- Hashtbl.add widget_pool ~key:newname ~data:vb
-*)
-
-let update (w : #tiwidget_base) show_modif =
- let vb = prop_box w#proplist in
- Hashtbl.remove widget_pool w#name;
- Hashtbl.add widget_pool ~key:w#name ~data:vb;
- if show_modif && !shown_widget = w#name then show_prop_box vb