open Utils open Property open TiContainer class tibox ~(dir : Gtk.Tags.orientation) ~(widget : GPack.box) ~name ~parent_tree ~pos ?(insert_evbox=true) parent_window = let class_name = match dir with `VERTICAL -> "GPack.vbox" | _ -> "GPack.hbox" in object(self) val box = widget inherit ticontainer ~name ~widget ~parent_tree ~pos ~insert_evbox parent_window as container method private class_name = class_name method private name_of_add_method = "#pack" (* removes the ::expand ::fill ::padding in the proplist of a box assumes that these are the only properties with a :: in the name *) method private save_clean_proplist = List.filter container#save_clean_proplist ~f:(fun (n,p) -> try let i = String.index n ':' in i = String.length n || n.[i+1] <> ':' with Not_found -> true) method private emit_clean_proplist = List.filter container#emit_clean_proplist ~f:(fun (n,p) -> try let i = String.index n ':' in i = String.length n || n.[i+1] <> ':' with Not_found -> true) method change_name_in_proplist oldn newn = proplist <- List.fold_left ~init:proplist ~f: (fun pl propname -> change_property_name (oldn ^ propname) (newn ^ propname) pl) [ "::expand"; "::fill"; "::padding" ]; Propwin.update self false method child_up child = let pos = list_pos ~item:child (List.map ~f:fst children) in if pos > 0 then begin box#reorder_child child#base ~pos:(pos-1); children <- list_reorder_up children ~pos; stree#item_up ~pos end method child_down child = let pos = list_pos ~item:child (List.map ~f:fst children) in if pos < (List.length children - 1) then begin box#reorder_child child#base ~pos:(pos+1); children <- list_reorder_down children ~pos; stree#item_up ~pos:(pos+1) end method private add child ~pos = box#pack child#base; if pos < 0 then begin children <- children @ [(child, `START)] end else begin children <- list_insert ~item:(child, `START) children ~pos; box#reorder_child child#base ~pos end; let n = child#name in let expand = new prop_bool ~name:"expand" ~init:"false" ~set: begin fun v -> box#set_child_packing (child#base) ~expand:v; Propwin.update child false; Propwin.update self false; true end and fill = new prop_bool ~name:"fill" ~init:"true" ~set: begin fun v -> box#set_child_packing (child#base) ~fill:v; Propwin.update child false; Propwin.update self false; true end and padding = new prop_int ~name:"padding" ~init:"0" ~set: begin fun v -> box#set_child_packing (child#base) ~padding:v; Propwin.update child false; Propwin.update self false; true end in proplist <- proplist @ [ (n ^ "::expand"), expand; (n ^ "::fill"), fill; (n ^ "::padding"), padding ]; child#add_to_proplist [ "expand", expand; "fill", fill; "padding", padding ]; Propwin.update self true method remove child = box#remove (child#base); children <- list_remove ~f:(fun (ch, _) -> ch = child) children; let n = child#name in proplist <- List.fold_left ~init:proplist ~f:(fun acc n -> List.remove_assoc n acc) [ (n ^ "::expand"); (n ^ "::fill"); (n ^ "::padding") ]; Propwin.update self true initializer classe <- (match dir with `VERTICAL -> "vbox" | _ -> "hbox"); proplist <- proplist @ [ "homogeneous", new prop_bool ~name:"homogeneous" ~init:"false" ~set:(ftrue box#set_homogeneous); "spacing", new prop_int ~name:"spacing" ~init:"0" ~set:(ftrue box#set_spacing) ] end class tihbox = tibox ~dir:`HORIZONTAL class tivbox = tibox ~dir:`VERTICAL let new_tihbox ~name ?(listprop = []) = new tihbox ~widget:(GPack.hbox ()) ~name let new_tivbox ~name ?(listprop = []) = new tivbox ~widget:(GPack.vbox ()) ~name class tibbox ~(dir : Gtk.Tags.orientation) ~(widget : GPack.button_box) ~name ~parent_tree ~pos ?(insert_evbox=true) parent_window = let class_name = match dir with `VERTICAL -> "GPack.button_box `VERTICAL" | _ -> "GPack.button_box `HORIZONTAL" in object(self) val bbox = widget inherit tibox ~dir ~widget:(widget :> GPack.box) ~name ~parent_tree ~pos ~insert_evbox parent_window method private class_name = class_name initializer classe <- (match dir with `VERTICAL -> "vbutton_box" | _ -> "hbutton_box"); proplist <- proplist @ [ "layout", new prop_button_box_style ~name:"layout" ~init:"DEFAULT_STYLE" ~set:(ftrue bbox#set_layout); "spacing", new prop_int ~name:"spacing" ~init:(match dir with `VERTICAL -> "10" | _ -> "30") (* donne -1 (defaut) (GtkPack.BBox.get_spacing bbox#as_button_box) *) ~set:(fun v -> bbox#set_spacing v; GtkBase.Widget.queue_resize bbox#as_widget; true); "child_width", new prop_int ~name:"child_width" ~init:"85" ~set:(fun v -> bbox#set_child_size ~width:v ~height:(int_of_string (self#get_property "child_height")) (); GtkBase.Widget.queue_resize bbox#as_widget; true); "child_height", new prop_int ~name:"child_height" ~init:"27" ~set:(fun v -> bbox#set_child_size ~height:v ~width:(int_of_string (self#get_property "child_width")) (); GtkBase.Widget.queue_resize bbox#as_widget; true); "child_ipad_x", new prop_int ~name:"child_ipad_x" ~init:"7" ~set:(fun v -> bbox#set_child_ipadding ~x:v ~y:(int_of_string (self#get_property "child_ipad_y")) (); GtkBase.Widget.queue_resize bbox#as_widget; true); "child_ipad_y", new prop_int ~name:"child_ipad_y" ~init:"0" ~set:(fun v -> bbox#set_child_ipadding ~y:v ~x:(int_of_string (self#get_property "child_ipad_x")) (); GtkBase.Widget.queue_resize bbox#as_widget; true); ] end (* TODO: pour proplist/spacing il faudrait implementer les fonctions get_spacing ... (voir dans gtkPack) *) class tihbutton_box = tibbox ~dir:`HORIZONTAL class tivbutton_box = tibbox ~dir:`VERTICAL let new_tihbutton_box ~name ?(listprop = []) = new tihbutton_box ~widget:(GPack.button_box `HORIZONTAL ()) ~name let new_tivbutton_box ~name ?(listprop = []) = new tivbutton_box ~widget:(GPack.button_box `VERTICAL ()) ~name let get_fixed_pos () = let rx = ref 0 and ry = ref 0 in let w = GWindow.window ~modal:true () in let v = GPack.vbox ~packing:w#add () in let l = GMisc.label ~text:"Enter position for child" ~packing:v#pack () in let h1 = GPack.hbox ~packing:v#pack () in let l1 = GMisc.label ~text:"x:" ~packing:h1#pack () in let e1 = GEdit.entry ~text:"0" ~packing:h1#pack () in let h2 = GPack.hbox ~packing:v#pack () in let l2 = GMisc.label ~text:"y" ~packing:h2#pack () in let e2 = GEdit.entry ~text:"0" ~packing:h2#pack () in let h7 = GPack.hbox ~packing:v#pack () in let b1 = GButton.button ~label:"OK" ~packing:h7#pack () in let b2 = GButton.button ~label:"Cancel" ~packing:h7#pack () in w#show (); b1#connect#clicked ~callback:(fun () -> begin try rx := int_of_string e1#text with _ -> () end; begin try ry := int_of_string e2#text with _ -> () end; w#destroy ()); b2#connect#clicked ~callback:w#destroy; w#connect#destroy ~callback:GMain.Main.quit; GMain.Main.main (); !rx, !ry class tifixed ~(widget : GPack.fixed) ~name ~parent_tree ~pos ?(insert_evbox=true) parent_window = object(self) val fixed = widget inherit ticontainer ~widget ~name ~parent_tree ~pos ~insert_evbox parent_window method private class_name = "GPack.fixed" method private add child ~pos = let x, y = get_fixed_pos () in fixed#put child#base ~x ~y; children <- children @ [(child, `START)] initializer classe <- "fixed" end let new_tifixed ~name ?(listprop = []) = new tifixed ~widget:(GPack.fixed ()) ~name class tinotebook ~(widget : GPack.notebook) ~name ~parent_tree ~pos ?(insert_evbox=true) parent_window = object(self) val notebook = widget inherit ticontainer ~name ~widget ~insert_evbox ~parent_tree ~pos parent_window as widget method private class_name = "GPack.notebook" method private add child ~pos = children <- children @ [child, `START]; notebook#insert_page child#base ~pos; child#add_to_proplist [ "tab_label", new prop_string ~name:"tab_label" ~init:"" ~set:(fun v -> notebook#set_page ~tab_label:((GMisc.label ~text:v())#coerce) child#base; true) ] initializer classe <- "notebook"; proplist <- proplist @ [ "tab_pos", new prop_position ~name:"tab_ pos" ~init:"TOP" ~set:(ftrue notebook#set_tab_pos); "show_tabs", new prop_bool ~name:"show_tabs" ~init:"true" ~set:(ftrue notebook#set_show_tabs); "homogeneous_tabs", new prop_bool ~name:"homogeneous_tabs" ~init:"true" ~set:(ftrue notebook#set_homogeneous_tabs); "show_border", new prop_bool ~name:"show_border" ~init:"true" ~set:(ftrue notebook#set_show_border); "scrollable", new prop_bool ~name:"scrollable" ~init:"false" ~set:(ftrue notebook#set_scrollable); "tab_border", new prop_int ~name:"tab_border" ~init:"2" ~set:(ftrue notebook#set_tab_border); "popup_enable", new prop_bool ~name:"popup_enable" ~init:"false" ~set:(ftrue notebook#set_popup) ] end let new_tinotebook ~name ?(listprop = []) = new tinotebook ~widget:(GPack.notebook ()) ~name