let slicing_panel (main_ui:Design.main_window_extension_points) =
let w = GPack.vbox () in
let hbox1 = GPack.hbox
~packing:w#pack () in
let activate_button =
let b = GButton.button ~label:"Activate"
~packing:hbox1#pack () in
main_ui#help_message b "%s" msg_help_compute_values ;
ignore (b#connect#pressed
(fun () -> gui_compute_values main_ui ));
b
in
let combo_box_text =
let ((combo_box, (_model, column)) as combo_box_text) =
GEdit.combo_box_text ~strings:[ none_text ] ~wrap_width:3 ~use_markup:true
~packing:(hbox1#pack ~expand:true ~fill:true) () in
combo_box#set_active 0 ;
ignore (combo_box#connect#changed
(fun () ->
match combo_box#active_iter with
| None -> ()
| Some row ->
let slicing_project_name =
Extlib.may_map !Db.Slicing.Project.get_name ~dft:none_text (!Db.Slicing.Project.get_project ())
and selected_name = combo_box#model#get ~row ~column in
if (selected_name != slicing_project_name) then
let proj_opt =
try Some (List.find (fun proj -> selected_name = !Db.Slicing.Project.get_name proj) (!Db.Slicing.Project.get_all ()))
with Not_found -> None
in
gui_set_project main_ui proj_opt));
combo_box_text
in
let table = GPack.table ~columns:2 ~rows:2 ~homogeneous:true ~packing:w#pack () in
let hbox2 = GPack.hbox ~packing:(table#attach ~left:1 ~top:0) () in
let enable_refresh () =
gui_compute_values main_ui ;
main_ui#rehighlight ()
in
let enabled_button =
let b = GButton.check_button
~label:"Enable"
~active:(Enable.get ())
~packing:(table#attach ~left:0 ~top:0) () in
main_ui#help_message b "%s" msg_help_enable_gui ;
ignore (b#connect#toggled
~callback:(fun () ->
Enable.set b#active;
enable_refresh ()));
b
in
let verbose_refresh = Gtk_helper.on_int ~lower:0 ~upper:3
hbox2
"Verbosity"
~sensitive:Enable.get
SlicingParameters.Verbose.get
(gui_set_slicing_debug main_ui)
in
let hbox3 = GPack.hbox ~packing:(table#attach ~left:1 ~top:1) () in
let slice_undef_button =
let b = GButton.check_button
~label:"Libraries"
~active:(Enable.get ())
~packing:(table#attach ~left:0 ~top:1) () in
main_ui#help_message b "%s" msg_help_libraries ;
ignore (b#connect#toggled
(fun () ->
gui_set_slicing_undef_functions main_ui b#active));
b
in
let level_refresh = Gtk_helper.on_int ~lower:0 ~upper:3
hbox3
"Level"
~sensitive:Enable.get
SlicingParameters.Mode.Calls.get
(gui_set_slicing_level main_ui)
in
Project.register_after_set_current_hook
~user_only:true
(fun _ -> rebuild_model combo_box_text);
let refresh () =
let value_is_computed = Db.Value.is_computed () in
let slicing_project = !Db.Slicing.Project.get_project () in
let enabled = Enable.get () in
activate_button#misc#set_sensitive (not value_is_computed) ;
enabled_button#misc#set_sensitive value_is_computed ;
slice_undef_button#misc#set_sensitive enabled ;
verbose_refresh ();
level_refresh ();
if enabled_button#active <> enabled then
begin
enabled_button#set_active enabled ;
enable_refresh ();
end;
slice_undef_button#set_active (SlicingParameters.Mode.SliceUndef.get());
ignore (refresh_combo_box combo_box_text slicing_project (enabled && value_is_computed))
in
refresh () ;
"Slicing",w#coerce,Some refresh