1 (* Copyright 2001, 2002 b8_bavard, b8_fee_carabine, INRIA *)
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. *)
25 module GO
= Gui_options
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
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 () =
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
50 ~f
: (fun s
-> GO.hostname
=:= s
)
51 (M.o_hostname
) !!GO.hostname
53 let gui_login = string
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
66 gui_port ; gui_hostname ; gui_login ; gui_password ;
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
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 *)
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
170 (List.map fst
GO.tb_styles
)
171 (GO.tbstyle_to_string
!!GO.toolbars_style
)
174 ~help
: (M.h_mini_toolbars
)
175 ~f
: (fun b
-> GO.mini_toolbars
=:= b
)
176 (M.o_mini_toolbars
) !!GO.mini_toolbars
181 ~help
: (M.h_tab_position
)
183 GO.notebook_tab
=:= GO.TabPosition.string_to_pos s
185 ~new_allowed
:false ~blank_allowed
:false
187 GO.TabPosition.values
188 (GO.TabPosition.pos_to_string
!!GO.notebook_tab
)
191 let layout_options = Section
201 let sel l f_string
() =
202 let menu = GMenu.menu () in
203 let choice = ref None
in
204 let entries = List.map
206 `I
(f_string ele
, fun () -> choice := Some ele
))
209 GToolbox.build_menu
menu ~
entries;
210 ignore
(menu#connect#deactivate
GMain.Main.quit
);
218 (** Columns options *)
219 let servers_cols = list
220 ~help
: (M.h_servers_columns
)
221 ~f
: (fun l
-> GO.servers_columns
=:= l
)
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
])
230 ~help
: (M.h_downloads_columns
)
231 ~f
: (fun l
-> GO.downloads_columns
=:= l
)
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
241 ~help: (M.h_downloaded_columns)
242 ~f: (fun l -> GO.downloaded_columns =:= l)
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
)
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
])
261 let file_locs_cols = list
262 ~help
: (M.h_file_locations_columns
)
263 ~f
: (fun l
-> GO.file_locations_columns
=:= l
)
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
)
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
])
281 let shared_cols = list
282 ~help
: (M.h_shared_files_up_columns
)
283 ~f
: (fun l
-> GO.shared_files_up_columns
=:= l
)
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
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
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
343 ~f
: (fun b
-> GO.use_icons =:= b
)
344 ~help
: (M.h_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
375 files_auto_expand_depth ;
377 use_availability_height ;
378 use_relative_availability ;
380 use_graphical_availability;
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
454 download_time_range ;
458 color_grid_download ;
462 color_fg_download_av ;
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
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;
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
) ->
522 List.fold_left
(fun list
(message
, optype
, option) ->
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
536 lprintf
"No option %s" option; lprint_newline
();
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
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
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
589 !!GO.color_bg_download
591 !!GO.color_grid_download
592 !!GO.color_grid_upload
593 !!GO.color_fg_download
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
602 let save_options gui
=
603 let module P
= GuiProto
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;
613 Gui_com.send
(P.SaveOptions_query
!list)
616 (fun (name, r) -> (name, !r))
617 Gui_options.client_options_assocs
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
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
643 Return_ok
| Return_apply
->
644 Gui_misc.save_gui_options gui
;
646 (* update_icons is placed here because #update
647 of GPattern will be called by #set_columns *)
649 gui#tab_servers#box_servers#set_columns
651 gui#tab_downloads#box_downloads#set_columns
652 GO.downloads_columns
;
653 gui#tab_friends#box_friends#set_columns
655 gui#tab_friends#box_files#box_results#set_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
;
664 gui#notebook#goto_page i
666 gui#notebook#goto_page
current;
667 (* update_list_bg is placed here because the
668 column_autosize is necessary after #set_columns *)
670 update_toolbars_style gui
;
672 update_availability_column gui
;
676 | Return_cancel
-> ()
678 lprintf
"Exception %s in edit_options" (Printexc2.to_string e
);