diff --git a/src/layer.ml b/src/layer.ml index b1e8977..beef402 100644 --- a/src/layer.ml +++ b/src/layer.ml @@ -6,6 +6,12 @@ type _ t = | Marker : Jv.t -> [> `Marker ] t | Tile : Jv.t -> [> `Tile ] t +type _ sub = + | Basic : [> `Basic ] sub + | Geojson : [> `Geojson ] sub + | Marker : [> `Marker ] sub + | Tile : [> `Tile ] sub + (** Basic layers *) let add_to : type kind. Map.t -> kind t -> unit = @@ -25,10 +31,10 @@ let remove_from : type kind. Map.t -> kind t -> unit = let (_ : Jv.t) = Jv.call l "removeFrom" [| Map.to_jv map |] in () -let bind_popup : type kind. Brr.El.t -> kind t -> unit = - fun el -> function +let bind_popup : type kind. Brr.El.t -> ?options:Jv.t -> kind t -> unit = + fun el ?(options = Jv.null) -> function | Basic l | Geojson l | Marker l | Tile l -> - let (_ : Jv.t) = Jv.call l "bindPopup" [| Brr.El.to_jv el |] in + let (_ : Jv.t) = Jv.call l "bindPopup" [| Brr.El.to_jv el; options |] in () let unbind_popup : type kind. kind t -> unit = function @@ -53,6 +59,23 @@ let get_popup : type kind. kind t -> Popup.t = function let to_jv : type kind. kind t -> Jv.t = function | Basic l | Geojson l | Marker l | Tile l -> l +let of_jv : type kind. kind sub -> Jv.t -> kind t = + fun tag l -> + match tag with + | Basic -> Basic l + | Geojson -> Geojson l + | Marker -> Marker l + | Tile -> Tile l + +let on : type kind. kind Event.sub -> (kind Event.t -> 'b) -> 'c t -> unit = + fun event handler layer -> + let name = Event.sub_to_string event in + let handler v = handler @@ Event.of_jv event v in + let (_ : Jv.t) = + Jv.call (to_jv layer) "on" [| Jv.of_string name; Jv.repr handler |] + in + () + (** Geojson layers *) let create_geojson : ?options:Jv.t -> Jv.t -> [ `Geojson ] t = diff --git a/src/layer.mli b/src/layer.mli index d049182..309d1f5 100644 --- a/src/layer.mli +++ b/src/layer.mli @@ -6,6 +6,12 @@ type _ t = | Marker : Jv.t -> [> `Marker ] t | Tile : Jv.t -> [> `Tile ] t +type _ sub = + | Basic : [> `Basic ] sub + | Geojson : [> `Geojson ] sub + | Marker : [> `Marker ] sub + | Tile : [> `Tile ] sub + (** Basic layers *) (** [add_to map layer] adds [layer] to [map] *) @@ -18,7 +24,7 @@ val remove : _ t -> unit val remove_from : Map.t -> _ t -> unit (** [bind_popup popup layer] binds [popup] to [layer] *) -val bind_popup : Brr.El.t -> _ t -> unit +val bind_popup : Brr.El.t -> ?options:Jv.t -> _ t -> unit (** [unbind_popup layer] unbinds the popup bound to [layer] *) val unbind_popup : _ t -> unit @@ -35,6 +41,13 @@ val get_popup : _ t -> Popup.t (** [to_jv o] is [o] as a {!Jv.t} *) val to_jv : _ t -> Jv.t +(** [of_jv tag o] is [o] as a [tag t] *) +val of_jv : 'a sub -> Jv.t -> 'a t + +(** [on event handler layer] add an event listener on [layer] for event [event] + with handler [handler] *) +val on : 'a Event.sub -> ('a Event.t -> 'b) -> 'c t -> unit + (** Geojson layers *) (** [create_geojson geojson] is a new geojson layer *)