patch #7318
[mldonkey.git] / src / gtk / newgui / gui_config.ml
blobda671045d6d338a05cffda5577a335d2fbba9735
1 (* Copyright 2001, 2002 b8_bavard, b8_fee_carabine, INRIA *)
2 (*
3 This file is part of mldonkey.
5 mldonkey is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 mldonkey is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with mldonkey; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 (** Configuration panel. *)
22 open Printf2
23 open Gettext
24 open Gui_global
25 module GO = Gui_options
26 open Configwin
28 module M = Gui_messages
30 let (!!) = Options.(!!)
31 let (=:=) = Options.(=:=)
33 let safe_int_of_string option s =
34 try option =:= int_of_string s
35 with _ -> ()
37 let use_graphical_availability_ref = ref !!GO.use_graphical_availability
38 let use_icons_ref = ref !!GO.use_icons
40 let create_gui_params () =
41 (** Server options *)
43 let gui_port = string
44 ~help: (M.h_gui_port)
45 ~f: (fun s -> safe_int_of_string GO.port s)
46 (M.o_gui_port) (string_of_int !!GO.port)
48 let gui_hostname = string
49 ~help: (M.h_hostname)
50 ~f: (fun s -> GO.hostname =:= s)
51 (M.o_hostname) !!GO.hostname
53 let gui_login = string
54 ~help: (M.h_login)
55 ~f: (fun s -> GO.login =:= s)
56 (M.o_login) !!GO.login
58 let gui_password = password
59 ~help: (M.h_gui_password)
60 ~f: (fun s -> GO.password =:= s)
61 (M.o_password) !!GO.password
63 let server_options = Section
64 ((M.o_gui_server),
66 gui_port ; gui_hostname ; gui_login ; gui_password ;
71 (** Colors *)
72 let color_default = color
73 ~help: (M.h_col_default)
74 ~f: (fun s -> GO.color_default =:= s)
75 (M.o_col_default) !!GO.color_default
77 let color_downloaded = color
78 ~help: (M.h_col_downloaded)
79 ~f: (fun s -> GO.color_downloaded =:= s)
80 (M.o_col_downloaded) !!GO.color_downloaded
82 let color_downloading = color
83 ~help: (M.h_col_downloading)
84 ~f: (fun s -> GO.color_downloading =:= s)
85 (M.o_col_downloading) !!GO.color_downloading
87 let color_available = color
88 ~help: (M.h_col_avail)
89 ~f: (fun s -> GO.color_available =:= s)
90 (M.o_col_avail) !!GO.color_available
92 let color_not_available = color
93 ~help: (M.h_col_not_avail)
94 ~f: (fun s -> GO.color_not_available =:= s)
95 (M.o_col_not_avail) !!GO.color_not_available
97 let color_connected = color
98 ~help: (M.h_col_connected)
99 ~f: (fun s -> GO.color_connected =:= s)
100 (M.o_col_connected) !!GO.color_connected
102 let color_not_connected = color
103 ~help: (M.h_col_not_connected)
104 ~f: (fun s -> GO.color_not_connected =:= s)
105 (M.o_col_not_connected) !!GO.color_not_connected
107 let color_connecting = color
108 ~help: (M.h_col_connecting)
109 ~f: (fun s -> GO.color_connecting =:= s)
110 (M.o_col_connecting) !!GO.color_connecting
112 let color_files_listed = color
113 ~help: (M.h_col_files_listed)
114 ~f: (fun s -> GO.color_files_listed =:= s)
115 (M.o_col_files_listed) !!GO.color_files_listed
117 let color_files_result = color
118 ~help: (M.h_col_files_result)
119 ~f: (fun s -> GO.color_files_result =:= s)
120 (M.o_col_files_result) !!GO.color_files_result
122 let color_tab_selected = color
123 ~help: (M.h_col_tab_selected)
124 ~f: (fun s -> GO.color_tab_selected =:= s)
125 (M.o_col_tab_selected) !!GO.color_tab_selected
127 let color_tab_not_selected = color
128 ~help: (M.h_col_tab_not_selected)
129 ~f: (fun s -> GO.color_tab_not_selected =:= s)
130 (M.o_col_tab_not_selected) !!GO.color_tab_not_selected
132 let color_list_bg = color
133 ~help: (M.h_col_list_bg)
134 ~f: (fun s -> GO.color_list_bg =:= s)
135 (M.o_col_list_bg) !!GO.color_list_bg
137 let color_network_enabled = color
138 ~help: (M.h_col_network_enabled)
139 ~f: (fun s -> GO.color_network_enabled =:= s)
140 (M.o_col_network_enabled) !!GO.color_network_enabled
142 let color_network_disabled = color
143 ~help: (M.h_col_network_disabled)
144 ~f: (fun s -> GO.color_network_disabled =:= s)
145 (M.o_col_network_disabled) !!GO.color_network_disabled
147 let colors_options = Section
148 ((M.o_colors),
150 color_default ; color_downloaded ;
151 color_downloading ; color_available ;
152 color_not_available ;
153 color_connected ; color_not_connected ;
154 color_connecting ; color_files_listed ;
155 color_files_result ; color_tab_selected ;
156 color_tab_not_selected ; color_list_bg ;
157 color_network_enabled ; color_network_disabled ;
162 (** Layout options *)
164 let tb_style = combo
165 ~expand:false
166 ~help: (M.h_toolbars_style)
167 ~f:(fun s -> GO.toolbars_style =:= GO.string_to_tbstyle s)
168 ~new_allowed:false ~blank_allowed:false
169 (M.o_toolbars_style)
170 (List.map fst GO.tb_styles)
171 (GO.tbstyle_to_string !!GO.toolbars_style)
173 let tb_icons = bool
174 ~help: (M.h_mini_toolbars)
175 ~f: (fun b -> GO.mini_toolbars =:= b)
176 (M.o_mini_toolbars) !!GO.mini_toolbars
179 let tab_pos = combo
180 ~expand:false
181 ~help: (M.h_tab_position)
182 ~f:(fun s ->
183 GO.notebook_tab =:= GO.TabPosition.string_to_pos s
185 ~new_allowed:false ~blank_allowed:false
186 (M.o_tab_position)
187 GO.TabPosition.values
188 (GO.TabPosition.pos_to_string !!GO.notebook_tab)
191 let layout_options = Section
192 ((M.o_layout),
194 tb_style ;
195 tb_icons;
196 tab_pos;
201 let sel l f_string () =
202 let menu = GMenu.menu () in
203 let choice = ref None in
204 let entries = List.map
205 (fun ele ->
206 `I (f_string ele, fun () -> choice := Some ele))
209 GToolbox.build_menu menu ~entries;
210 ignore (menu#connect#deactivate GMain.Main.quit);
211 menu#popup 0 0;
212 GMain.Main.main ();
213 match !choice with
214 None -> []
215 | Some c -> [c]
218 (** Columns options *)
219 let servers_cols = list
220 ~help: (M.h_servers_columns)
221 ~f: (fun l -> GO.servers_columns =:= l)
222 ~add: (sel
223 (List.map (fun (c,_,_) -> c ) Gui_columns.server_column_strings)
224 Gui_columns.Server.string_of_column)
226 (fun c -> [Gui_columns.Server.string_of_column c])
227 !!GO.servers_columns
229 let dls_cols = list
230 ~help: (M.h_downloads_columns)
231 ~f: (fun l -> GO.downloads_columns =:= l)
232 ~add: (sel
233 (List.map (fun (c,_,_) -> c ) Gui_columns.file_column_strings)
234 Gui_columns.File.string_of_column)
236 (fun c -> [Gui_columns.File.string_of_column c])
237 !!GO.downloads_columns
240 let dled_cols = list
241 ~help: (M.h_downloaded_columns)
242 ~f: (fun l -> GO.downloaded_columns =:= l)
243 ~add: (sel
244 (List.map fst Gui_columns.file_column_strings)
245 Gui_columns.File.string_of_column)
247 (fun c -> [Gui_columns.File.string_of_column c])
248 !!GO.downloaded_columns
251 let friends_cols = list
252 ~help: (M.h_friends_columns)
253 ~f: (fun l -> GO.friends_columns =:= l)
254 ~add: (sel
255 (List.map (fun (c,_,_) -> c ) Gui_columns.client_column_strings)
256 Gui_columns.Client.string_of_column)
258 (fun c -> [Gui_columns.Client.string_of_column c])
259 !!GO.friends_columns
261 let file_locs_cols = list
262 ~help: (M.h_file_locations_columns)
263 ~f: (fun l -> GO.file_locations_columns =:= l)
264 ~add: (sel
265 (List.map (fun (c,_,_) -> c ) Gui_columns.client_column_strings)
266 Gui_columns.Client.string_of_column)
268 (fun c -> [Gui_columns.Client.string_of_column c])
269 !!GO.file_locations_columns
271 let results_cols = list
272 ~help: (M.h_results_columns)
273 ~f: (fun l -> GO.results_columns =:= l)
274 ~add: (sel
275 (List.map (fun (c,_,_) -> c ) Gui_columns.result_column_strings)
276 Gui_columns.Result.string_of_column)
278 (fun c -> [Gui_columns.Result.string_of_column c])
279 !!GO.results_columns
281 let shared_cols = list
282 ~help: (M.h_shared_files_up_columns)
283 ~f: (fun l -> GO.shared_files_up_columns =:= l)
284 ~add: (sel
285 (List.map (fun (c,_,_) -> c ) Gui_columns.shared_file_up_column_strings)
286 Gui_columns.Shared_files_up.string_of_column)
288 (fun c -> [Gui_columns.Shared_files_up.string_of_column c])
289 !!GO.shared_files_up_columns
291 let columns_options = Section_list
292 ((M.o_columns),
294 Section ((M.o_servers_columns) ,[servers_cols]) ;
295 Section ((M.o_downloads_columns) ,[dls_cols]);
296 Section ((M.o_results_columns) ,[results_cols]);
297 Section ((M.o_friends_columns) ,[friends_cols]) ;
298 Section ((M.o_file_locations_columns) ,[file_locs_cols]) ;
299 Section ((M.o_shared_files_up_colums) ,[shared_cols]) ;
304 let columns_options = Section_list
305 ((M.o_columns),
307 Section ((M.o_servers_columns) ,[servers_cols]) ;
308 Section ((M.o_downloads_columns) ,[dls_cols]);
309 Section ((M.o_downloaded_columns) ,[dled_cols]);
310 Section ((M.o_results_columns) ,[results_cols]);
311 Section ((M.o_friends_columns) ,[friends_cols]) ;
312 Section ((M.o_file_locations_columns) ,[file_locs_cols]) ;
313 Section ((M.o_shared_files_up_colums) ,[shared_cols]) ;
318 let files_auto_expand_depth = string
319 ~f: (safe_int_of_string GO.files_auto_expand_depth)
320 ~help: (M.h_files_auto_expand_depth)
321 (M.o_files_auto_expand_depth)
322 (string_of_int !!GO.files_auto_expand_depth)
324 let use_size_suffixes = bool
325 ~f: (fun b -> GO.use_size_suffixes =:= b)
326 ~help: (M.h_use_size_suffixes)
327 (M.o_use_size_suffixes)
328 !!GO.use_size_suffixes
330 let use_availability_height = bool
331 ~f: (fun b -> GO.use_availability_height =:= b)
332 ~help: (M.h_use_availability_height)
333 (M.o_use_availability_height)
334 !!GO.use_availability_height
336 let use_relative_availability = bool
337 ~f: (fun b -> GO.use_relative_availability =:= b)
338 ~help: (M.h_use_relative_availability)
339 (M.o_use_relative_availability)
340 !!GO.use_relative_availability
342 let use_icons = bool
343 ~f: (fun b -> GO.use_icons =:= b)
344 ~help: (M.h_use_icons)
345 (M.o_use_icons)
346 !!GO.use_icons
348 let use_graphical_availability = bool
349 ~f: (fun b -> GO.use_graphical_availability =:= b)
350 ~help: (M.h_use_graphical_availability)
351 (M.o_use_graphical_availability)
352 !!GO.use_graphical_availability
354 let max_file_name_len = string
355 ~f: (safe_int_of_string GO.max_file_name_len)
356 ~help: (M.h_max_file_name_len)
357 (M.o_max_file_name_len)
358 (string_of_int !!GO.max_file_name_len)
360 let max_client_name_len = string
361 ~f: (safe_int_of_string GO.max_client_name_len)
362 ~help: (M.h_max_client_name_len)
363 (M.o_max_client_name_len)
364 (string_of_int !!GO.max_client_name_len)
366 let max_result_name_len = string
367 ~f: (safe_int_of_string GO.max_result_name_len)
368 ~help: (M.h_max_result_name_len)
369 (M.o_max_result_name_len)
370 (string_of_int !!GO.max_result_name_len)
372 let misc_options = Section
373 ((M.o_misc),
375 files_auto_expand_depth ;
376 use_size_suffixes ;
377 use_availability_height ;
378 use_relative_availability ;
379 use_icons;
380 use_graphical_availability;
381 max_file_name_len;
382 max_client_name_len;
383 max_result_name_len;
388 (** Graph options *)
389 let max_download_rate = string
390 ~help: (M.h_max_download_rate)
391 ~f: (safe_int_of_string GO.max_download_rate)
392 (M.o_max_download_rate) (string_of_int !!GO.max_download_rate)
394 let max_upload_rate = string
395 ~help: (M.h_max_upload_rate)
396 ~f: (safe_int_of_string GO.max_upload_rate)
397 (M.o_max_upload_rate) (string_of_int !!GO.max_upload_rate)
399 let download_time_range = string
400 ~help: (M.h_download_time_range)
401 ~f: (fun s -> GO.download_time_range =:= s)
402 (M.o_download_time_range) (!!GO.download_time_range)
404 let upload_time_range = string
405 ~help: (M.h_upload_time_range)
406 ~f: (fun s -> GO.upload_time_range =:= s)
407 (M.o_upload_time_range) (!!GO.upload_time_range)
409 let color_bg_download = color
410 ~help: (M.h_col_bg_download)
411 ~f: (fun s -> GO.color_bg_download =:= s)
412 (M.o_col_bg_download) !!GO.color_bg_download
414 let color_bg_upload = color
415 ~help: (M.h_col_bg_upload)
416 ~f: (fun s -> GO.color_bg_upload =:= s)
417 (M.o_col_bg_upload) !!GO.color_bg_upload
419 let color_grid_download = color
420 ~help: (M.h_col_grid_download)
421 ~f: (fun s -> GO.color_grid_download =:= s)
422 (M.o_col_grid_download) !!GO.color_grid_download
424 let color_grid_upload = color
425 ~help: (M.h_col_grid_upload)
426 ~f: (fun s -> GO.color_grid_upload =:= s)
427 (M.o_col_grid_upload) !!GO.color_grid_upload
429 let color_fg_download = color
430 ~help: (M.h_col_fg_download)
431 ~f: (fun s -> GO.color_fg_download =:= s)
432 (M.o_col_fg_download) !!GO.color_fg_download
434 let color_fg_upload = color
435 ~help: (M.h_col_fg_upload)
436 ~f: (fun s -> GO.color_fg_upload =:= s)
437 (M.o_col_fg_upload) !!GO.color_fg_upload
439 let color_fg_download_av = color
440 ~help: (M.h_col_fg_download_av)
441 ~f: (fun s -> GO.color_fg_download_av =:= s)
442 (M.o_col_fg_download_av) !!GO.color_fg_download_av
444 let color_fg_upload_av = color
445 ~help: (M.h_col_fg_upload_av)
446 ~f: (fun s -> GO.color_fg_upload_av =:= s)
447 (M.o_col_fg_upload_av) !!GO.color_fg_upload_av
449 let graph_options = Section
450 ((M.o_graph),
452 max_download_rate ;
453 max_upload_rate ;
454 download_time_range ;
455 upload_time_range ;
456 color_bg_download ;
457 color_bg_upload ;
458 color_grid_download ;
459 color_grid_upload ;
460 color_fg_download ;
461 color_fg_upload ;
462 color_fg_download_av ;
463 color_fg_upload_av ;
468 (** Fonts *)
469 let font_list = font
470 ~help: (M.h_font_list)
471 ~f: (fun s -> GO.font_list =:= s)
472 (M.o_font_list) !!GO.font_list
474 let font_main_tab = font
475 ~help: (M.h_font_main_tab)
476 ~f: (fun s -> GO.font_main_tab =:= s)
477 (M.o_font_main_tab) !!GO.font_main_tab
479 let font_networks = font
480 ~help: (M.h_font_networks)
481 ~f: (fun s -> GO.font_networks =:= s)
482 (M.o_font_networks) !!GO.font_networks
484 let font_graphic = font
485 ~help: (M.h_font_graphic)
486 ~f: (fun s -> GO.font_graphic =:= s)
487 (M.o_font_graphic) !!GO.font_graphic
489 let fonts_options = Section
490 ((M.o_fonts),
492 font_list ;
493 font_main_tab ;
494 font_networks ;
495 font_graphic ;
499 [ server_options ; colors_options ; layout_options ; columns_options ; misc_options ; graph_options ; fonts_options ]
501 let create_string_option ?help label ref = string ?help ~f: (fun s -> ref := s) label !ref
503 let create_file_option ?help label ref = filename ?help ~f: (fun s -> ref := s) label !ref
505 let create_bool_option ?help label ref = bool ?help ~f: (fun s -> ref := string_of_bool s) label (bool_of_string !ref)
507 let add_option_value option value =
509 let o = Hashtbl.find options_values option in
510 o.option_value := !value;
511 o.option_old_value <- !value;
513 with _ ->
514 Hashtbl.add options_values option {
515 option_value = value;
516 option_old_value = !value;
519 let create_sections_params sections =
520 List.map (fun (name, options) ->
521 Section (name,
522 List.fold_left (fun list (message, optype, option) ->
524 (match optype with
525 | GuiTypes.StringEntry ->
526 create_string_option message
527 (Hashtbl.find options_values option).option_value
528 | GuiTypes.BoolEntry ->
529 create_bool_option message
530 (Hashtbl.find options_values option).option_value
531 | GuiTypes.FileEntry ->
532 create_file_option message
533 (Hashtbl.find options_values option).option_value
534 ) :: list
535 with Not_found ->
536 lprintf "No option %s" option; lprint_newline ();
537 list
538 ) [] !options)
539 ) sections
541 let update_toolbars_style gui =
542 gui#tab_downloads#set_tb_style !!GO.toolbars_style;
543 gui#tab_servers#set_tb_style !!GO.toolbars_style ;
544 gui#tab_friends#set_tb_style !!GO.toolbars_style ;
545 gui#tab_queries#set_tb_style !!GO.toolbars_style ;
546 gui#tab_rooms#set_tb_style !!GO.toolbars_style ;
547 gui#tab_uploads#set_tb_style !!GO.toolbars_style
550 let update_list_bg gui =
551 gui#tab_servers#set_list_bg (`NAME !!GO.color_list_bg)
552 (Gdk.Font.load_fontset !!GO.font_list) ;
553 gui#tab_downloads#set_list_bg (`NAME !!GO.color_list_bg)
554 (Gdk.Font.load_fontset !!GO.font_list) ;
555 gui#tab_friends#set_list_bg (`NAME !!GO.color_list_bg)
556 (Gdk.Font.load_fontset !!GO.font_list) ;
557 gui#tab_queries#set_list_bg (`NAME !!GO.color_list_bg)
558 (Gdk.Font.load_fontset !!GO.font_list) ;
559 gui#tab_rooms#set_list_bg (`NAME !!GO.color_list_bg)
560 (Gdk.Font.load_fontset !!GO.font_list) ;
561 gui#tab_uploads#set_list_bg (`NAME !!GO.color_list_bg)
562 (Gdk.Font.load_fontset !!GO.font_list) ;
563 gui#tab_console#set_list_bg (`NAME !!GO.color_list_bg)
564 (Gdk.Font.load_fontset !!GO.font_list)
567 let update_icons gui =
568 if !!GO.use_icons <> !use_icons_ref then
569 begin
570 use_icons_ref := !!GO.use_icons;
571 gui#tab_servers#c_update_icons !!GO.use_icons;
572 gui#tab_downloads#c_update_icons !!GO.use_icons;
573 gui#tab_friends#c_update_icons !!GO.use_icons;
574 gui#tab_queries#c_update_icons !!GO.use_icons;
575 gui#tab_rooms#c_update_icons !!GO.use_icons;
576 gui#tab_uploads#c_update_icons !!GO.use_icons
579 let update_availability_column gui =
580 if !!GO.use_graphical_availability <> !use_graphical_availability_ref then
581 begin
582 use_graphical_availability_ref := !!GO.use_graphical_availability;
583 gui#tab_downloads#c_update_availability_column !!GO.use_graphical_availability
586 let update_graphs gui =
587 gui#tab_graph#set_graph_properties
588 !!GO.font_graphic
589 !!GO.color_bg_download
590 !!GO.color_bg_upload
591 !!GO.color_grid_download
592 !!GO.color_grid_upload
593 !!GO.color_fg_download
594 !!GO.color_fg_upload
595 !!GO.color_fg_download_av
596 !!GO.color_fg_upload_av
597 !!GO.download_time_range
598 !!GO.max_download_rate
599 !!GO.upload_time_range
600 !!GO.max_upload_rate
602 let save_options gui =
603 let module P = GuiProto in
606 let list = ref [] in
607 Hashtbl.iter (fun option o ->
608 if !(o.option_value) <> o.option_old_value then begin
609 o.option_old_value <- !(o.option_value);
610 list := (option, o.option_old_value) :: !list;
611 end)
612 options_values;
613 Gui_com.send (P.SaveOptions_query !list)
615 (List.map
616 (fun (name, r) -> (name, !r))
617 Gui_options.client_options_assocs
621 with _ ->
622 lprintf "ERROR SAVING OPTIONS (but port/password/host correctly set for GUI)"; lprint_newline ()
625 let edit_options gui =
627 lprintf "edit_options\n";
628 let gui_params = create_gui_params () in
629 let client_params = create_sections_params !client_sections in
630 let plugins_params = create_sections_params
631 (List.sort (fun (n1,_) (n2,_) ->
632 compare (String.lowercase n1) (String.lowercase n2)
633 ) !plugins_sections) in
634 let structure = [
635 Section_list ((M.o_gui), gui_params) ;
636 Section_list ((M.o_client), client_params) ;
637 Section_list ((M.o_plugins), plugins_params) ;
640 match Configwin.get ~height:600 ~width:400
641 (M.o_options) structure
642 with
643 Return_ok | Return_apply ->
644 Gui_misc.save_gui_options gui;
645 save_options gui ;
646 (* update_icons is placed here because #update
647 of GPattern will be called by #set_columns *)
648 update_icons gui;
649 gui#tab_servers#box_servers#set_columns
650 GO.servers_columns;
651 gui#tab_downloads#box_downloads#set_columns
652 GO.downloads_columns;
653 gui#tab_friends#box_friends#set_columns
654 GO.friends_columns;
655 gui#tab_friends#box_files#box_results#set_columns
656 GO.results_columns;
657 gui#tab_uploads#box_upstats#set_columns
658 GO.shared_files_up_columns;
659 gui#tab_uploads#box_uploaders#set_columns
660 GO.file_locations_columns;
661 let current = gui#current_page in
662 gui#tab_networks#update_style;
663 for i = 0 to 8 do
664 gui#notebook#goto_page i
665 done;
666 gui#notebook#goto_page current;
667 (* update_list_bg is placed here because the
668 column_autosize is necessary after #set_columns *)
669 update_list_bg gui;
670 update_toolbars_style gui;
671 update_graphs gui;
672 update_availability_column gui;
676 | Return_cancel -> ()
677 with e ->
678 lprintf "Exception %s in edit_options" (Printexc2.to_string e);
679 lprint_newline ();