[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Mldonkey-commits] Changes to mldonkey/src/gtk2/gui/guiTemplates.ml
From: |
mldonkey-commits |
Subject: |
[Mldonkey-commits] Changes to mldonkey/src/gtk2/gui/guiTemplates.ml |
Date: |
Mon, 31 Oct 2005 13:34:32 -0500 |
Index: mldonkey/src/gtk2/gui/guiTemplates.ml
diff -u mldonkey/src/gtk2/gui/guiTemplates.ml:1.3
mldonkey/src/gtk2/gui/guiTemplates.ml:1.4
--- mldonkey/src/gtk2/gui/guiTemplates.ml:1.3 Mon May 2 12:57:59 2005
+++ mldonkey/src/gtk2/gui/guiTemplates.ml Mon Oct 31 18:34:02 2005
@@ -116,6 +116,7 @@
*)
+type key = string
module Gview(V:
@@ -144,7 +145,7 @@
open Column
type item
- type key
+ (* type key *)
val columns : (column * float) list Options.option_record
val get_key : item -> key
@@ -171,7 +172,7 @@
inherit GTree.model
method content : GTree.view_column -> column -> unit
method expanded_paths : int array list
- method get_item : Gtk.tree_iter -> item
+ method find_model_key : Gtk.tree_iter -> key
method set_view : g_view -> unit
method sort : column -> Gtk.Tags.sort_type option -> unit
method unset_view : g_view -> unit
@@ -185,14 +186,12 @@
method unset_model : unit -> unit
end
-
type item_tree =
{
- parent : int array; (* for compare_array and partition in g_tree *)
- level : int; (* should speed up sort / avoid rebuilding an int
array *)
- iter : Gtk.tree_iter; (* a pointer to a row *)
- mutable tree_item : item;
- mutable removed : bool; (* to manage easily the stamp *)
+ parent : int array; (* for compare_array and partition in
g_tree *)
+ level : int; (* should speed up sort / avoid
rebuilding an int array *)
+ iter : Gtk.tree_iter; (* a pointer to a row *)
+ mutable removed : bool; (* to manage easily the stamp *)
}
let parent_from_indices indices = Array.sub indices 0 (Array.length indices -
1)
@@ -209,8 +208,8 @@
[] -> res
| _ ->
begin
- let it_p = List.hd list in
- let (l', l'') = List.partition (fun it -> it.parent = it_p.parent)
list in
+ let it_p = snd (List.hd list) in
+ let (l', l'') = List.partition (fun (k, it) -> it.parent =
it_p.parent) list in
partition l'' (l' :: res)
end
@@ -232,67 +231,10 @@
in
iter 0
-(*
-type item =
- {
- value : string;
- level : int array;
- };;
-
-let items = [
- {value = "p1"; level = [|0|]};
- {value = "p2"; level = [|2|]};
- {value = "c21"; level = [|2;1|]};
- {value = "p3"; level = [|1|]};
- {value = "c22"; level = [|2;2|]};
- {value = "c23"; level = [|2;0|]};
- {value = "c11"; level = [|0;0|]};
- {value = "c12"; level = [|0;3|]};
- {value = "c13"; level = [|0;2|]};
- {value = "c14"; level = [|0;1|]};
- {value = "c31"; level = [|1;1|]};
- {value = "c31"; level = [|1;0|]};
- {value = "c111"; level = [|0;3;0|]};
- {value = "c112"; level = [|0;2;0|]};
-];;
-
-let compare_array a1 a2 =
- let len1 = Array.length a1 in
- let len2 = Array.length a2 in
- let len = min len1 len2 in
- let rec iter n =
- if n = len
- (* a1 a2 have a common node in the tree!
- * put the one with a lower height in the tree first.
- *)
- then compare len1 len2
- else if a1.(n) > a2.(n)
- then 1
- else if a1.(n) < a2.(n)
- then (-1)
- else iter (n + 1)
- in
- iter 0;;
-
-let parent a = Array.sub a 0 (Array.length a - 1);;
-
-let l = List.sort (fun it1 it2 -> compare_array it1.level it2.level) items;;
-
-let rec partition list res =
- let it_p = List.hd list in
- let (l', l'') = List.partition (fun it -> parent it.level = parent
it_p.level) list in
- match l'' with
- [] -> l' :: res
- | _ -> partition l'' (l' :: res);;
-
-let pl = partition items [];;
-
-*)
-
class virtual g_list (cols : GTree.column_list) =
(* one uses a Hashtbl because, the GTree.model is very bad for random access.
*)
let (table : (key, item_tree) Hashtbl.t) = Hashtbl.create 217 in
- let key_col = cols#add Gobject.Data.caml in
+ let key_col = cols#add Gobject.Data.string in
(*
* A bool GTree.column. If the value is true the row will be displayed.
* As g_list inherit from GTree.model_filter, it is initialized once the
object has
@@ -330,7 +272,7 @@
(* for public use *)
val store = store
(* allows to change, whenever necessary, the filter function of our g_list *)
- val mutable filter_func = (fun _ -> true)
+ val mutable filter_func = (fun (key : key) -> true)
(* the list of #g_view that currently use the g_list *)
val mutable gviews = ([] : g_view list)
(*
@@ -342,7 +284,7 @@
* connection/disconnection scheme proceeds.
*)
val mutable stamp = ([] : item_tree list)
- val mutable timerID = GMain.Timeout.add ~ms:6000 ~callback:(fun _ -> true)
+ val mutable timerID = GMain.Timeout.add ~ms:60000 ~callback:(fun _ -> true)
(* the number of rows. Includes filtered rows. *)
val mutable nitems = 0
@@ -359,27 +301,28 @@
*)
method virtual content : GTree.view_column -> column -> unit
(* defines how the data will be sorted on the #g_view request. *)
- method virtual sort_items : column -> item -> item -> int
+ method virtual sort_items : column -> key -> key -> int
(* the public method to add an item *)
method add_item i =
let key = get_key i in
let row = store#append () in
- store#set ~row ~column:filter_col (filter_func i);
+ store#set ~row ~column:filter_col (filter_func key);
store#set ~row ~column:key_col key;
self#from_item row i;
let indices = GTree.Path.get_indices (store#get_path row) in
let level = level_from_indices indices in
(* (if !!verbose_view then lprintf_g_list "in add_item new path %s\n"
(GTree.Path.to_string (store#get_path row))); *)
- Hashtbl.add table key {tree_item = i; parent = [||]; level = level.(0);
iter = row; removed = false};
+ Hashtbl.add table key {parent = [||]; level = level.(0); iter = row;
removed = false};
nitems <- nitems + 1;
row
(* the public method to retrieve all items stored in the g_list *)
method all_items () =
let l = ref [] in
- Hashtbl.iter (fun _ it ->
- l := it.tree_item :: !l
+ Hashtbl.iter (fun key it ->
+ if not it.removed
+ then l := key :: !l
) table;
!l
@@ -391,11 +334,32 @@
method expanded_paths = []
+ method private filter_removed key =
+ try
+ let it = Hashtbl.find table key in
+ it.removed
+ with _ -> false
+
+ method find_key row =
+ try
+ let key = store#get ~row ~column:key_col in
+ let it = Hashtbl.find table key in
+ if not it.removed
+ then key else raise Exit
+ with _ -> raise Not_found
+
+ method find_model_key row =
+ try
+ let store_row = self#convert_iter_to_child_iter row in
+ self#find_key store_row
+ with _ -> raise Not_found
+
(* the public method to retrieve an item by its [key] *)
- method find_item key =
+ method find_row key =
try
let it = Hashtbl.find table key in
- (it.iter, it.tree_item)
+ if not it.removed
+ then it.iter else raise Exit
with _ -> raise Not_found
(* the connection/disconnection scheme between the #g_list and a #g_view *)
@@ -408,20 +372,15 @@
List.iter (fun v -> v#unset_model ()) gl;
(* proceed ... *)
List.iter (fun it ->
- Hashtbl.remove table (get_key it.tree_item);
- if store#iter_is_valid it.iter then ignore (store#remove it.iter);
+ try
+ ignore (store#remove it.iter);
+ with _ -> ()
) stamp;
stamp <- [];
(* reconnect to all the #g_view *)
List.iter (fun v -> v#set_model self#gmodel) gl
end
- method get_item row =
- try
- let key = self#get ~row ~column:key_col in
- snd (self#find_item key)
- with _ -> raise Not_found
-
(* the g_model interface to connect to a #g_view *)
method gmodel = (self :> g_model)
@@ -434,30 +393,31 @@
(* disconnect from all the #g_view *)
List.iter (fun v -> v#unset_model ()) gl;
(* proceed ... *)
- Hashtbl.iter (fun _ it ->
- store#set ~row:it.iter ~column:filter_col (filter_func it.tree_item);
+ Hashtbl.iter (fun key it ->
+ store#set ~row:it.iter ~column:filter_col (filter_func key);
) table;
(* reconnect to all the #g_view *)
List.iter (fun v -> v#set_model self#gmodel) gl
(* the public method to remove an item from the g_list *)
- method remove_item i =
+ method remove_item key =
try
- let key = get_key i in
let it = Hashtbl.find table key in
if not it.removed
then begin
match gviews with
[] -> (* no #g_view connected, nothing to be disconnected
from *)
begin
- Hashtbl.remove table key;
ignore (store#remove it.iter);
+ Hashtbl.remove table key;
nitems <- nitems - 1
end
| _ ->
begin
it.removed <- true;
stamp <- it :: stamp;
+ store#set ~row:it.iter ~column:filter_col (filter_func
key);
+ Hashtbl.remove table key;
nitems <- nitems - 1
end
end
@@ -465,7 +425,7 @@
(* the public method to set the filter function *)
method set_filter f =
- filter_func <- f;
+ filter_func <- (fun key -> not (self#filter_removed key) && f key);
self#refresh_filter ()
(* the public method to connect a #g_view. *)
@@ -473,7 +433,7 @@
if not (List.memq view gviews)
then begin
(if gviews = []
- then timerID <- GMain.Timeout.add ~ms:700 ~callback:
+ then timerID <- GMain.Timeout.add ~ms:60000 ~callback:
(fun _ ->
self#flush_stamp ();
true)
@@ -485,20 +445,21 @@
* fast that even the filtered items are sorted :-)
*)
method private sort' c n =
- let items = ref [] in
- Hashtbl.iter (fun _ it ->
- items := it :: !items;
+ let l = ref [] in
+ Hashtbl.iter (fun key it ->
+ if not it.removed
+ then l := (key, it) :: !l;
) table;
let l' =
- List.sort (fun it1 it2 ->
- let comp' = self#sort_items c it1.tree_item it2.tree_item in
+ List.sort (fun (key1, it1) (key2, it2) ->
+ let comp' = self#sort_items c key1 key2 in
if comp' = 0
then compare it1.level it2.level
else comp'
- ) !items
+ ) !l
in
- let len = max 0 (List.length !items - 1) in
- List.iter (fun it ->
+ let len = max 0 (List.length !l - 1) in
+ List.iter (fun (_, it) ->
let pos = store#get_iter (path_from_indices [|len|]) in
ignore (store#move_after ~iter:it.iter ~pos)
) (if n < 0 then l' else List.rev l')
@@ -513,16 +474,17 @@
match order_opt with
None ->
begin
- let items = ref [] in
+ let l = ref [] in
Hashtbl.iter (fun _ it ->
- items := it :: !items
+ if not it.removed
+ then l := it :: !l;
) table;
- let l = List.sort (fun it1 it2 -> (-1) * (compare it1.level
it2.level)) !items in
- let len = max 0 (List.length !items - 1) in
+ let l' = List.sort (fun it1 it2 -> (-1) * (compare it1.level
it2.level)) !l in
+ let len = max 0 (List.length !l - 1) in
List.iter (fun it ->
let pos = store#get_iter (path_from_indices [|len|]) in
ignore (store#move_after ~iter:it.iter ~pos)
- ) l
+ ) l'
end
| Some `ASCENDING -> self#sort' c (-1)
| Some `DESCENDING -> self#sort' c 1
@@ -534,10 +496,8 @@
(* the public method to update an item in the g_list *)
method update_item row i i_new =
try
- let it = Hashtbl.find table (get_key i) in
- store#set ~row ~column:filter_col (filter_func i_new);
- self#from_new_item row i i_new;
- it.tree_item <- i_new
+ store#set ~row ~column:filter_col (filter_func (get_key i_new));
+ self#from_new_item row i i_new
with _ -> ()
@@ -556,7 +516,7 @@
class virtual g_tree (cols : GTree.column_list) =
(* one uses a Hashtbl because, the GTree.model is very bad for random access.
*)
let (table : (key, item_tree) Hashtbl.t) = Hashtbl.create 217 in
- let key_col = cols#add Gobject.Data.caml in
+ let key_col = cols#add Gobject.Data.string in
(*
* A bool GTree.column. If the value is true the row will be displayed.
* As g_tree inherits from GTree.model_filter, it is initialized once the
object has
@@ -595,7 +555,7 @@
val store = store
(* allows to change, whenever necessary, the filter function of the g_tree *)
- val mutable filter_func = (fun _ -> true)
+ val mutable filter_func = (fun (key : key) -> true)
(* the list of #g_view that currently use the g_tree *)
val mutable gviews = ([] : g_view list)
@@ -628,27 +588,28 @@
*)
method virtual content : GTree.view_column -> column -> unit
(* defines how the data will be sorted on the #g_view request. *)
- method virtual sort_items : column -> item -> item -> int
+ method virtual sort_items : column -> key -> key -> int
(* the public method to add an item *)
method add_item i ?(parent : Gtk.tree_iter option) () =
let key = get_key i in
let row = store#append ?parent () in
- store#set ~row ~column:filter_col (filter_func i);
+ store#set ~row ~column:filter_col (filter_func key);
store#set ~row ~column:key_col key;
self#from_item row i;
let indices = GTree.Path.get_indices (store#get_path row) in
let level = level_from_indices indices in
let parent = parent_from_indices indices in
- Hashtbl.add table key {tree_item = i; parent = parent; level =
level.(0); iter = row; removed = false};
+ Hashtbl.add table key {parent = parent; level = level.(0); iter = row;
removed = false};
nitems <- nitems + 1;
row
(* the public method to retrieve all items stored in the g_tree *)
method all_items () =
let l = ref [] in
- Hashtbl.iter (fun _ it ->
- l := it.tree_item :: !l;
+ Hashtbl.iter (fun key it ->
+ if not it.removed
+ then l := key :: !l;
)table;
!l
@@ -674,11 +635,35 @@
expanded_rows <- !l';
!l
+ method private filter_removed key =
+ try
+ let it = Hashtbl.find table key in
+ it.removed
+ with _ -> false
+
+ method find_key row =
+ if store#iter_is_valid row
+ then begin
+ try
+ let key = store#get ~row ~column:key_col in
+ let it = Hashtbl.find table key in
+ if not it.removed
+ then key else raise Exit
+ with _ -> raise Not_found
+ end else raise Not_found
+
+ method find_model_key row =
+ try
+ let store_row = self#convert_iter_to_child_iter row in
+ self#find_key store_row
+ with _ -> raise Not_found
+
(* the public method to retrieve an item by its [key] *)
- method find_item key =
+ method find_row key =
try
let it = Hashtbl.find table key in
- (it.iter, it.tree_item)
+ if not it.removed && store#iter_is_valid it.iter
+ then it.iter else raise Exit
with _ -> raise Not_found
(* the connection/disconnection scheme between the g_tree and a #g_view *)
@@ -692,23 +677,15 @@
List.iter (fun v -> v#unset_model ()) gl;
(* proceed ... *)
List.iter (fun it ->
- (if store#iter_is_valid it.iter then ignore (store#remove
it.iter));
- Hashtbl.remove table (get_key it.tree_item)
+ try
+ ignore (store#remove it.iter)
+ with _ -> ()
) stamp;
stamp <- [];
(* reconnect to all the #g_view *)
List.iter (fun v -> v#set_model self#gmodel) gl
end
-(* Becarefull !!! get_item uses Gtk.tree_iter related to the model_filter.
- * They are quite different from the store Gtk.tree_iter. Don't forget to
convert them before...
- *)
- method get_item row =
- try
- let key = self#get ~row ~column:key_col in
- snd (self#find_item key)
- with _ -> raise Not_found
-
(* the g_model interface to connect to a #g_view *)
method gmodel = (self :> g_model)
@@ -721,8 +698,8 @@
(* disconnect from all the #g_view *)
List.iter (fun v -> v#unset_model ()) gl;
(* proceed ... *)
- Hashtbl.iter (fun _ it ->
- store#set ~row:it.iter ~column:filter_col (filter_func it.tree_item);
+ Hashtbl.iter (fun key it ->
+ store#set ~row:it.iter ~column:filter_col (filter_func key);
) table;
(* reconnect to all the #g_view *)
List.iter (fun v -> v#set_model self#gmodel) gl
@@ -730,9 +707,8 @@
(* the public method to remove an item from the g_tree.
* removes the children when a parent is removed.
*)
- method remove_item i =
+ method remove_item key =
try
- let key = get_key i in
let it = Hashtbl.find table key in
if not it.removed
then begin
@@ -749,8 +725,7 @@
let child_path = GTree.Path.from_string
(Printf.sprintf "%s:%d" path_str i) in
let child_row = store#get_iter child_path in
let key = store#get ~row:child_row ~column:key_col
in
- let it_child = Hashtbl.find table key in
- self#remove_item it_child.tree_item;
+ self#remove_item key;
with _ -> (if !!verbose_view then lprintf_g_tree
"failed to find child\n");
done
end;
@@ -770,13 +745,15 @@
let child_path = GTree.Path.from_string
(Printf.sprintf "%s:%d" path_str i) in
let child_row = store#get_iter child_path in
let key = store#get ~row:child_row ~column:key_col
in
- let it_child = Hashtbl.find table key in
- self#remove_item it_child.tree_item;
+ self#remove_item key;
with _ -> (if !!verbose_view then lprintf_g_tree
"failed to find child\n");
done
end;
(* order is parent->children *)
stamp <- it :: stamp;
+ if store#iter_is_valid it.iter then begin
+ store#set ~row:it.iter ~column:filter_col (filter_func
key) end;
+ Hashtbl.remove table key;
nitems <- nitems - 1
end
end
@@ -785,7 +762,7 @@
(* the public method to set the filter function *)
method set_filter f =
- filter_func <- f;
+ filter_func <- (fun key -> not (self#filter_removed key) && f key);
self#refresh_filter ()
(* the public method to connect a #g_view. *)
@@ -793,7 +770,7 @@
if not (List.memq view gviews)
then begin
(if gviews = []
- then timerID <- GMain.Timeout.add ~ms:800 ~callback:
+ then timerID <- GMain.Timeout.add ~ms:60000 ~callback:
(fun _ ->
self#flush_stamp ();
true)
@@ -801,18 +778,18 @@
gviews <- view :: gviews
end
- method private sort' c n items =
- let pl = partition items [] in
+ method private sort' c n (l : (key * item_tree) list)=
+ let pl = partition l [] in
List.iter (fun l ->
let l' =
- List.sort (fun it1 it2 ->
- let comp' = self#sort_items c it1.tree_item it2.tree_item in
+ List.sort (fun (key1, it1) (key2, it2) ->
+ let comp' = self#sort_items c key1 key2 in
if comp' = 0
then compare_array it1.parent it2.parent
else comp'
) l
in
- List.iter (fun it ->
+ List.iter (fun (_, it) ->
let current_path = store#get_path it.iter in
let new_indices = GTree.Path.get_indices current_path in
let index = Array.length new_indices - 1 in
@@ -834,14 +811,14 @@
) expanded_rows
in
let store_paths = [||] :: store_paths in
- let items = ref [] in
- Hashtbl.iter (fun _ it ->
+ let l = ref [] in
+ Hashtbl.iter (fun key it ->
let current_path = store#get_path it.iter in
let current_indices = GTree.Path.get_indices current_path in
let current_parent = parent_from_indices current_indices in
- if List.mem current_parent store_paths
+ if List.mem current_parent store_paths && not it.removed
then begin
- items := it :: !items;
+ l := (key, it) :: !l;
end
) table;
(* proceed ... *)
@@ -850,23 +827,23 @@
None ->
begin
(* make sure !items are sorted
parent(1)->children(1)->...->parent(n)->children(n) !!! *)
- let l =
- List.sort (fun it1 it2 ->
+ let l' =
+ List.sort (fun (_, it1) (_, it2) ->
(-1) * (compare_array (Array.append it1.parent [|it1.level|])
(Array.append it2.parent
[|it2.level|]))
- ) !items
+ ) !l
in
- List.iter (fun it ->
+ List.iter (fun (_, it) ->
let current_path = store#get_path it.iter in
let new_indices = GTree.Path.get_indices current_path in
let index = Array.length new_indices - 1 in
new_indices.(index) <- 0;
let pos = store#get_iter (path_from_indices new_indices) in
ignore (store#move_before ~iter:it.iter ~pos)
- ) l
+ ) l'
end
- | Some `ASCENDING -> self#sort' c (-1) !items
- | Some `DESCENDING -> self#sort' c 1 !items
+ | Some `ASCENDING -> self#sort' c (-1) !l
+ | Some `DESCENDING -> self#sort' c 1 !l
in
(* reconnect all the #g_view *)
@@ -890,9 +867,8 @@
method update_item row i i_new =
try
let it = Hashtbl.find table (get_key i) in
- store#set ~row ~column:filter_col (filter_func i_new);
- self#from_new_item row i i_new;
- it.tree_item <- i_new
+ store#set ~row ~column:filter_col (filter_func (get_key i_new));
+ self#from_new_item row i i_new
with _ -> ()
initializer
@@ -1142,8 +1118,8 @@
* that shall be the GTree.model interface of the
current
* #g_model connected to us.
*)
- let i = m#get_item row in
- list := i :: !list
+ let key = m#find_model_key row in
+ list := key :: !list
with _ -> (if !!verbose_view then lprintf_g_view "in
connect_events selection_changed no item found\n")
) path_selected;
on_select !list
@@ -1157,8 +1133,8 @@
| Some m ->
try
let row = view#model#get_iter path in
- let i = m#get_item row in
- on_double_click i
+ let key = m#find_model_key row in
+ on_double_click key
with _ -> (if !!verbose_view then lprintf_g_view "in
connect_events row_activated no item found\n")
));
(* connect the test_expand_row signal *)
@@ -1168,8 +1144,8 @@
None -> true
| Some m ->
try
- let i = m#get_item row in
- on_expand path i
+ let key = m#find_model_key row in
+ on_expand path key
with _ ->
(if !!verbose_view then lprintf_g_view "in connect_events
test_expand_row no item found\n");
true
@@ -1181,8 +1157,8 @@
None -> true
| Some m ->
try
- let i = m#get_item row in
- on_collapse path i
+ let key = m#find_model_key row in
+ on_collapse path key
with _ ->
(if !!verbose_view then lprintf_g_view "in connect_events
test_collapse_row no item found\n");
true
@@ -1194,11 +1170,11 @@
None -> ()
| Some m ->
try
- let i = m#get_item row in
+ let key = m#find_model_key row in
let indices = GTree.Path.get_indices path in
(if not (List.mem indices expanded_paths)
then expanded_paths <- indices :: expanded_paths);
- on_expanded path i
+ on_expanded path key
with _ -> (if !!verbose_view then lprintf_g_view "in
connect_events row_expanded no item found\n")
));
(* connect the row_collapsed signal *)
@@ -1208,11 +1184,11 @@
None -> ()
| Some m ->
try
- let i = m#get_item row in
+ let key = m#find_model_key row in
let indices = GTree.Path.get_indices path in
(if (List.mem indices expanded_paths)
then expanded_paths <- List.filter (fun a -> indices <>
a) expanded_paths);
- on_collapsed path i
+ on_collapsed path key
with _ -> (if !!verbose_view then lprintf_g_view "in
connect_events row_collapsed no item found\n")
));
(* save automatically the column widths on a size change *)
@@ -1316,8 +1292,8 @@
* that shall be the GTree.model interface of the current
* #g_model connected to us.
*)
- let i = m#get_item row in
- list := i :: !list
+ let key = m#find_model_key row in
+ list := key :: !list
with _ -> (if !!verbose_view then lprintf_g_view "in
contextual_menu no item found\n")
) path_selected;
menu !list
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Mldonkey-commits] Changes to mldonkey/src/gtk2/gui/guiTemplates.ml,
mldonkey-commits <=