From 7effdcc5773c0acf65e13434d9bb3af7b8ef61c1 Mon Sep 17 00:00:00 2001 From: Swrup Date: Sun, 26 Jun 2022 05:07:45 +0200 Subject: [PATCH] better popups --- src/map.ml | 8 ++++++-- src/map.mli | 4 ++-- src/popup.ml | 41 +++++++++++++++++++++++++++++++++++------ src/popup.mli | 20 ++++++++++++++------ 4 files changed, 57 insertions(+), 16 deletions(-) diff --git a/src/map.ml b/src/map.ml index 235510c..9dec8d6 100644 --- a/src/map.ml +++ b/src/map.ml @@ -50,5 +50,9 @@ let wrap_latlng latlng map = let open_popup popup map = ignore @@ Jv.call map "openPopup" [| Popup.to_jv popup |] -let close_popup popup map = - ignore @@ Jv.call map "closePopup" [| Popup.to_jv popup |] +let close_popup ~popup map = + ignore + @@ + match popup with + | None -> Jv.call map "closePopup" [||] + | Some popup -> Jv.call map "closePopup" [| Popup.to_jv popup |] diff --git a/src/map.mli b/src/map.mli index db91af9..d1bf3e4 100644 --- a/src/map.mli +++ b/src/map.mli @@ -51,5 +51,5 @@ val to_jv : t -> Jv.t (* [open_popup popup map] opens [popup] on [map] *) val open_popup : Popup.t -> t -> unit -(* [close_popup popup map] closes [popup] on [map] *) -val close_popup : Popup.t -> t -> unit +(* [close_popup opt map] if [opt] is [Some popup] closes [popup] else closes previously opened popup *) +val close_popup : popup:Popup.t option -> t -> unit diff --git a/src/popup.ml b/src/popup.ml index b2a5072..2792e23 100644 --- a/src/popup.ml +++ b/src/popup.ml @@ -2,16 +2,18 @@ type t = Jv.t -let popup = Jv.call Global.leaflet "popup" [||] - -let set_latlng latlng = +let set_latlng latlng popup = let (_ : Jv.t) = Jv.call popup "setLatLng" [| Latlng.to_jv latlng |] in () -let set_content content = +let set_content content popup = let (_ : Jv.t) = Jv.call popup "setContent" [| Jv.of_string content |] in () +let set_content_to_el el popup = + let (_ : Jv.t) = Jv.call popup "setContent" [| Brr.El.to_jv el |] in + () + let of_jv = Fun.id let to_jv = Fun.id @@ -66,8 +68,35 @@ let opt_to_jv = function Jv.of_bool b | Pane s | Class_name s -> Jv.of_string s -let create options = +let create content_opt ~latlng options = let l = Array.of_list @@ List.map (fun o -> (opt_to_string o, opt_to_jv o)) options in - Jv.call Global.leaflet "popup" [| Jv.obj l |] + let popup = Jv.call Global.leaflet "popup" [| Jv.obj l |] in + let popup = + match latlng with + | None -> popup + | Some latlng -> + set_latlng latlng popup; + popup + in + match content_opt with + | None -> popup + | Some content -> + set_content content popup; + popup + +let create_from_el el ~latlng options = + let l = + Array.of_list @@ List.map (fun o -> (opt_to_string o, opt_to_jv o)) options + in + let popup = Jv.call Global.leaflet "popup" [| Jv.obj l |] in + let popup = + match latlng with + | None -> popup + | Some latlng -> + set_latlng latlng popup; + popup + in + set_content_to_el el popup; + popup diff --git a/src/popup.mli b/src/popup.mli index 6391cee..dae1db8 100644 --- a/src/popup.mli +++ b/src/popup.mli @@ -20,11 +20,14 @@ type opt = | Close_on_click of bool | Class_name of string -(** [set_latlng latlng] changes the popup position to the given point*) -val set_latlng : Latlng.t -> unit +(** [set_latlng latlng popup] sets [popup] position to the given point*) +val set_latlng : Latlng.t -> t -> unit -(** [set_content s] changes the popup content to [s]*) -val set_content : string -> unit +(** [set_content s popup] sets [popup] content to [s]*) +val set_content : string -> t -> unit + +(** [set_content_to_el el s] sets [popup] content to [el]*) +val set_content_to_el : Brr.El.t -> t -> unit (** [of_jv jv] is [jv] as {!t} *) val of_jv : Jv.t -> t @@ -38,5 +41,10 @@ val opt_to_string : opt -> string (** [opt_to_jv opt] is [opt] as {!Jv.t} *) val opt_to_jv : opt -> Jv.t -(** [create options] is a new popup setup withs [options] *) -val create : opt list -> t +(** [create s latlng options] is a new popup setup with [options], position set + to [latlng] and content to [s] *) +val create : string option -> latlng:Latlng.t option -> opt list -> t + +(** [create_from_el el latlng options] is a new popup setup with [options], + position set to [latlng] and content to [el] *) +val create_from_el : Brr.El.t -> latlng:Latlng.t option -> opt list -> t