# # add_file "glib/ocaml-gdate.c" # # patch "Makefile" # from [5022302e2303a2ca76de75f1106651a939f85cb4] # to [0ff8d912f1d8fccbf896c95fb21722949580010b] # # patch "glib/ocaml-gdate.c" # from [] # to [a20231c006a23e9ee1ab58f7f1fc53e493bedcbb] # # patch "glib/viz_gmisc.ml" # from [25603720726699c4e8ea48961f4676f5b5f9761e] # to [be5659e5968cf65e891a1c0f9d6e98a5149bdbc7] # # patch "view.ml" # from [80d4521aa9ca2c89b47e7acee54aa862f2a7d380] # to [2efcf10cb926f58aa21e9c30c5eddaa806a2261e] # ======================================================================== --- Makefile 5022302e2303a2ca76de75f1106651a939f85cb4 +++ Makefile 0ff8d912f1d8fccbf896c95fb21722949580010b @@ -27,7 +27,7 @@ C_OBJ = mlsqlite/ocaml-sqlite3.o \ glib/ocaml-gspawn.o glib/ocaml-giochannel.o \ - glib/ocaml-misc.o glib/ocaml-gpattern.o \ + glib/ocaml-misc.o glib/ocaml-gdate.o glib/ocaml-gpattern.o \ crypto/ocaml-openssl.o \ gnomecanvas_hack.o @@ -52,7 +52,7 @@ glib/gspawn.ml glib/gspawn.mli glib/giochannel.ml glib/giochannel.mli \ glib/viz_gmisc.ml glib/gpattern.ml \ glib/ocaml-gspawn.c glib/ocaml-giochannel.c \ - glib/ocaml-misc.c glib/ocaml-gpattern.c \ + glib/ocaml-misc.c glib/ocaml-gdate.c glib/ocaml-gpattern.c \ glib/gspawn_tags.var glib/giochannel_tags.var \ crypto/ocaml-openssl.c crypto/crypto.ml crypto/crypto.mli ======================================================================== --- glib/ocaml-gdate.c +++ glib/ocaml-gdate.c a20231c006a23e9ee1ab58f7f1fc53e493bedcbb @@ -0,0 +1,59 @@ +#include + +#include + +CAMLprim value +_ml_g_date_current_time (value unit) +{ + GDate date, *p; + GTimeVal current; + value v; + g_get_current_time (¤t); + g_date_clear (&date, 1); + g_date_set_time (&date, current.tv_sec); + v = caml_alloc_small (sizeof (GDate) / sizeof (value), Abstract_tag); + p = (GDate *) v; + *p = date; + return v; +} + +CAMLprim value +_ml_g_date_set_dmy (value d, value m, value y) +{ + GDate date, *p; + value v; + g_date_clear (&date, 1); + g_date_set_dmy (&date, Int_val(d), Int_val(m), Int_val(y)); + v = caml_alloc_small (sizeof (GDate) / sizeof (value), Abstract_tag); + p = (GDate *) v; + *p = date; + return v; +} + +#define GDate_val(v) (GDate *) (v) + +CAMLprim value +_ml_g_date_strftime (value d, value fmt, value buff) +{ + GDate *date = (GDate *)(d); + gsize n; + n = g_date_strftime (String_val(buff), caml_string_length(buff) + 1, + String_val(fmt), date); + return Val_int (n); +} + +CAMLprim value +_ml_g_date_add_months (value d, value n) +{ + GDate *date = GDate_val (d); + g_date_add_months (date, Int_val(n)); + return Val_unit; +} + +CAMLprim value +_ml_g_date_subtract_months (value d, value n) +{ + GDate *date = GDate_val (d); + g_date_subtract_months (date, Int_val(n)); + return Val_unit; +} ======================================================================== --- glib/viz_gmisc.ml 25603720726699c4e8ea48961f4676f5b5f9761e +++ glib/viz_gmisc.ml be5659e5968cf65e891a1c0f9d6e98a5149bdbc7 @@ -5,3 +5,13 @@ external tree_view_expand_to_path : Gtk.tree_view Gtk.obj -> Gtk.tree_path -> unit = "_ml_gtk_tree_view_expand_to_path" + +module Date = struct + type t + + external make_dmy : int -> int -> int -> t = "_ml_g_date_set_dmy" + external current_time : unit -> t = "_ml_g_date_current_time" + external strftime : t -> string -> string -> int = "_ml_g_date_strftime" + external add_months : t -> int -> unit = "_ml_g_date_add_months" + external subtract_months : t -> int -> unit = "_ml_g_date_subtract_months" +end ======================================================================== --- view.ml 80d4521aa9ca2c89b47e7acee54aa862f2a7d380 +++ view.ml 2efcf10cb926f58aa21e9c30c5eddaa806a2261e @@ -390,7 +390,6 @@ toggle_renderer : GTree.cell_renderer_toggle ; radio_buttons : GButton.radio_button array ; entries : GEdit.entry array ; - span_kind : GEdit.combo_box GEdit.text_combo ; mutable selected_b : int ; mutable limit_kind : int ; } @@ -486,27 +485,6 @@ tooltips#set_tip ~text:date_entry_tooltip_text e2#coerce ; ignore (e1#connect#activate (fun () -> e2#misc#grab_focus ())) ; (button, e1, e2) in - let b3, entry_dur, kind, entry_id = - let button = - GButton.radio_button ~group - ~label:"_Span limit" ~use_mnemonic:true - ~packing:(tbl#attach ~left:0 ~top:2) () in - let hb = GPack.hbox ~packing:(tbl#attach ~left:1 ~top:2 ~expand:`X) () in - let packing = hb#pack ~padding:4 in -(* - ignore (button#connect#toggled (fun () -> - hb#misc#set_sensitive button#active)) ; -*) - hb#misc#set_sensitive false ; - let e1 = GEdit.entry ~packing () in - let tc = - GEdit.combo_box_text - ~strings:[ "before" ; "around" ; "after" ] - ~packing () in - (fst tc)#set_active 1 ; - let e2 = GEdit.entry ~packing ~activates_default:true () in - ignore (e1#connect#activate (fun () -> e2#misc#grab_focus ())) ; - (button, e1, tc, e2) in { button = button ; store = model ; @@ -517,9 +495,8 @@ select_buttons = select_buttons ; toggle_renderer = toggle_renderer ; w = w ; - radio_buttons = [| b1 ; b2 ; b3 |] ; - entries = [| entry_from ; entry_to ; entry_dur ; entry_id |] ; - span_kind = kind ; + radio_buttons = [| b1 ; b2 |] ; + entries = [| entry_from ; entry_to |] ; selected_b = 0 ; limit_kind = 0 } @@ -580,16 +557,17 @@ then QUERY_ALL else QUERY_BRANCHES !acc + let future = "9999-12" + let past = "0001-01" + let make_query_limit_interval ctrl domain s_from s_to = - let t_from = Complete.complete_date ctrl domain s_from in - let t_to = Complete.complete_date ctrl domain s_to in + let t_from = Complete.complete_date ctrl domain + (if s_from = "" then past else s_from) in + let t_to = Complete.complete_date ctrl domain + (if s_to = "" then future else s_to) in QUERY_BETWEEN (t_from, t_to) - let make_query_limit_span ctrl domain s_dur s_kind s_id = - let t_ref = Complete.complete_date ctrl domain s_id in - QUERY_NO_LIMIT - let make_query ctrl ?id s = try let query_domain = get_query_domain s in @@ -597,14 +575,9 @@ match s.limit_kind with | 0 -> QUERY_NO_LIMIT - | 1 -> - make_query_limit_interval ctrl query_domain - s.entries.(0)#text s.entries.(1)#text | _ -> - make_query_limit_span ctrl query_domain - s.entries.(2)#text - (GEdit.text_combo_get_active s.span_kind) - s.entries.(3)#text in + make_query_limit_interval ctrl query_domain + s.entries.(0)#text s.entries.(1)#text in Some { query = (query_domain, query_limit) ; preselect = id } with @@ -738,21 +711,19 @@ s.selected_b <- 0 ; adjust_view_button_sensitivity s ; s.radio_buttons.(0)#set_active true ; (* should update s.limit_kind *) - Array.iter (fun e -> e#set_text "") s.entries ; - (fst s.span_kind)#set_active 1 + Array.iter (fun e -> e#set_text "") s.entries - type state = Viz_types.query_domain * int * string array * int + type state = Viz_types.query_domain * int * string array let get_state s = let domain = get_query_domain s in let limit_kind = s.limit_kind in let entries_text = Array.map (fun e -> e#text) s.entries in - let span_kind = (fst s.span_kind)#active in - (domain, limit_kind, entries_text, span_kind) + (domain, limit_kind, entries_text) let set_state s ctrl ?id state = s.w#misc#hide () ; - let (domain, limit_kind, entries_text, span_kind) = state in + let (domain, limit_kind, entries_text) = state in let in_domain v = match domain with | QUERY_ALL -> true @@ -772,12 +743,22 @@ Array.iteri (fun i e -> e#set_text entries_text.(i)) s.entries ; - (fst s.span_kind)#set_active span_kind ; may ctrl#query (make_query ctrl ?id s) + let string_of_date d = + let b = String.create 10 in + let l = Viz_gmisc.Date.strftime d "%Y-%m-%d" b in + assert (l = 10) ; + b + + let two_months_ago () = + let d = Viz_gmisc.Date.current_time () in + Viz_gmisc.Date.subtract_months d 2 ; + string_of_date d + let set_branch s ctrl ?id br = s.selected_b <- 0 ; s.store#foreach @@ -790,6 +771,36 @@ if sel then s.selected_b <- 1 ; false) ; adjust_view_button_sensitivity s ; + begin + match id with + | None -> + s.radio_buttons.(1)#set_active true ; + s.entries.(0)#set_text (two_months_ago ()) ; + s.entries.(1)#set_text "" + | Some id -> + match + Database.fetch_cert_value + (some ctrl#get_db) id "date" + with + | [] -> + s.radio_buttons.(0)#set_active true + | d :: _ -> + s.radio_buttons.(1)#set_active true ; + let p o l = int_of_string (String.sub d o l) in + let d = p 8 2 in + let m = p 5 2 in + let y = p 0 4 in + let d_from = + let date = Viz_gmisc.Date.make_dmy d m y in + Viz_gmisc.Date.subtract_months date 2 ; + string_of_date date in + let d_to = + let date = Viz_gmisc.Date.make_dmy d m y in + Viz_gmisc.Date.add_months date 2 ; + string_of_date date in + s.entries.(0)#set_text d_from ; + s.entries.(1)#set_text d_to + end ; may ctrl#query (make_query ctrl ?id s)