a
    Df$                     @  s  d Z ddlmZ ddlZddlZddlmZ ddlmZm	Z	m
Z
mZmZmZ ddlZddlZddlmZ ddlmZ ddlmZ d	d
lmZmZ ddlmZ erddlmZ ddlmZ ddlm Z  dd Z!dddddZ"dddddZ#dd Z$G dd deZ%dS )zS
Defines a PyDeck Pane which renders a PyDeck plot using a PyDeckPlot
bokeh model.
    )annotationsN)defaultdict)TYPE_CHECKINGAnyClassVarDictMappingOptional)
Serializer)ColumnDataSource)JupyterComm   )is_dataframe	lazy_load   )	ModelPane)Document)Model)Commc                 C  s:   t |  D ](}d|vrqtt|}| || |< qdS )z
    Makes all the keys in a dictionary camel-cased and lower-case

    Parameters
    ----------
    attrs : dict
        Dictionary for which all the keys should be converted to camel-case
    _N)listkeyslower_first_letterto_camel_casepop)attrsZ	snake_keyZ	camel_key r   ^/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/panel/pane/deckgl.pylower_camel_case_keys   s
    	r   str)
snake_casereturnc                 C  s@   d}d}| D ].}|dkrd}q|r.||   n|| }d}q|S )z
    Makes a snake case string into a camel case one

    Parameters
    -----------
    snake_case : str
        Snake-cased string (e.g., "snake_cased") to be converted to camel-case (e.g., "camelCase")
     Fr   T)upper)r    Z
output_strZshould_upper_casecr   r   r   r   /   s    	r   )sr!   c                 C  s$   | r | d d   | dd   S dS )Nr   r"   )lower)r%   r   r   r   r   C   s    r   c                 C  sZ   t | dr| j} t| tr>t| } t|  dd |  D } nt| trVdd | D } | S )Nto_jsonc                 S  s&   i | ]\}}||d krt |n|qS datarecurse_data.0kvr   r   r   
<dictcomp>M   s   z recurse_data.<locals>.<dictcomp>c                 S  s   g | ]}t |qS r   r*   )r-   dr   r   r   
<listcomp>P       z recurse_data.<locals>.<listcomp>)hasattr__dict__
isinstancedictr   itemsr   r(   r   r   r   r+   G   s    


r+   c                   @  s0  e Zd ZU dZejdddZejdee	fddZ
eji ddZeji d	dZeji d
dZejdddddZdddddZded< dZded< dZded< dZded< edddddZed d! Zed"d# Zed$d% Zed&d' Zd(d) Zd*d+d,d-Zd:d.d/d/d0d1d2d3d4Zd5d1d6d7d8d9ZdS );DeckGLa  
    The `DeckGL` pane renders the Deck.gl
    JSON specification as well as PyDeck plots inside a panel.

    Deck.gl is a very powerful WebGL-powered framework for visual exploratory
    data analysis of large datasets.

    Reference: https://panel.holoviz.org/reference/panes/DeckGL.html

    :Example:

    >>> pn.extension('deckgl')
    >>> DeckGL(
    ...    some_deckgl_dict_or_pydeck_object,
    ...    mapbox_api_key=MAPBOX_KEY, height=600
    ... )
    Nz?
        The MapBox API key if not supplied by a PyDeck object.)defaultdocTz#
        Whether to enable tooltips)r:   class_r;   z:
        Contains the last click event on the DeckGL plot.z4
        The current hover state of the DeckGL plot.z3
        The current view state of the DeckGL plot.   )viewZhoverzm
        Throttling timeout (in milliseconds) for view state and hover
        events sent from the frontend.
clickState
hoverState	viewStatetooltip)click_statehover_state
view_statetooltipsz"ClassVar[Mapping[str, str | None]]_renameFzClassVar[bool]_pydeck_encoders_are_added_updateszClassVar[float | bool | None]priorityr   zfloat | bool | None)objr!   c                 C  s$   |  |rdS t|ttfr dS dS )Ng?r   F)	is_pydeckr6   r7   r   )clsrK   r   r   r   applies   s
    
zDeckGL.appliesc                 C  s&   dt jv r"dd l}t||jjjS dS )Npydeckr   F)sysmodulesrO   r6   ZbindingsZdeckZDeck)rM   rK   rO   r   r   r   rL      s    
zDeckGL.is_pydeckc                 C  sD   t t}|D ]$}| D ]\}}|| | qqdd | D S )Nc                 S  s   i | ]\}}|t |qS r   )npZasarray)r-   colvalsr   r   r   r0      r3   z(DeckGL._process_data.<locals>.<dictcomp>)r   r   r8   append)rM   r)   columnsr1   rS   valr   r   r   _process_data   s
    zDeckGL._process_datac                 C  s  | dg }tt}t|D ],\}}tt|j }|| ||f qg t| }}	|D ]}
|
 d}t	|r~t
|}n*t|tr\|r\t|d tr\| |}nq\tt| }| |}|r.| \}}||
d< i }| D ]&\}}t|| |j| s|||< q|r"|j| |	| q\||
|f q\|D ]@\}
}|	r`|	 }||_nt
|}|| |||
d< qBd S )Nlayersr)   r   )getr   r   	enumeratetuplesortedr)   r   rU   r   r   Zfrom_dfr6   r7   rX   r   r8   rR   Zarray_equalupdateremoveindex)rM   Z	json_datasourcesrY   Zsource_columnsisourcekeyZunprocessedZunusedlayerr)   existingr`   ZcdsZupdatesrS   valuesr   r   r   _update_sources   sF    



zDeckGL._update_sourcesc                 C  s6   | j sdtjvrd S ddlm} dd }|tj|< d S )NrO   r   )Stringc                 S  s   | j S N)value)rK   
serializerr   r   r   pydeck_string_encoder   s    z:DeckGL._add_pydeck_encoders.<locals>.pydeck_string_encoder)rH   rP   rQ   Zpydeck.typesri   r
   Z	_encoders)rM   ri   rm   r   r   r   _add_pydeck_encoders   s
    zDeckGL._add_pydeck_encodersc                 C  s   t |j}|ddp| j}|dd }t| jt s<|d u rD| j}n|j}dd t| D }d|v rdd |d  D |d< | 	  |||fS )NZ
mapbox_keyr"   deck_widgetc                 S  s   i | ]\}}|d ur||qS rj   r   r,   r   r   r   r0      r3   z1DeckGL._transform_deck_object.<locals>.<dictcomp>initialViewStatec                 S  s   i | ]\}}|d ur||qS rj   r   r,   r   r   r   r0      s   )
r7   r5   r   mapbox_api_keyr6   rF   rB   r+   r8   rn   )selfrK   r)   rq   ro   rB   r   r   r   _transform_deck_object   s    


zDeckGL._transform_deck_objectzDict[str, Any])r!   c                 C  s   | j d u r i | j| j  }}}nnt| j ttfr|t| j trJt| j }n$t| j }dd |dg D |d< | j}| j}n| 	| j \}}}|dg D ]8}|ddd u r|
d |ddd u r|
d qt|||pdd	S )
Nc                 S  s   g | ]}t |qS r   )r7   )r-   re   r   r   r   r2      r3   z,DeckGL._transform_object.<locals>.<listcomp>rY   ZviewswidthFheightr"   )r)   rB   rq   )objectrq   rF   r6   r   r7   jsonloadsrZ   rs   r   )rr   rK   r)   rq   rB   r>   r   r   r   _transform_object   s     


zDeckGL._transform_objectr   zOptional[Model]zOptional[Comm]r   )r;   rootparentcommr!   c           
      C  s   t ddt|t| | _}| |}|d}g  |d< }| || |dg |d< |di |d< |f d|i|}	|p~|	}| |	g d||| |	|f| j|j	d < |	S )	Nzpanel.models.deckgl
DeckGLPlotr)   data_sourcesrY   rp   )r?   r@   rA   id)
r   r6   r   Z_bokeh_model_get_propertiesr   rh   Z_link_propsZ_modelsref)
rr   r;   rz   r{   r|   r}   
propertiesr)   ra   modelr   r   r   
_get_model   s    


zDeckGL._get_modelr   None)r   r   r!   c                 C  s`   |  |j}|d}| ||j ||d< |dg |d< |di |d< |jf i | d S )Nr)   rY   rp   )r   documentr   rh   r~   r^   )rr   r   r   r   r)   r   r   r   _update  s    
zDeckGL._update)NNN)__name__
__module____qualname____doc__paramri   rq   ZClassSelectorboolr7   rF   r   rC   rD   rE   ZthrottlerG   __annotations__rH   rI   rJ   classmethodrN   rL   rX   rh   rn   rs   ry   r   r   r   r   r   r   r9   T   s:   



-

  r9   )&r   
__future__r   rw   rP   collectionsr   typingr   r   r   r   r   r	   numpyrR   r   Zbokeh.core.serializationr
   Zbokeh.modelsr   Zpyviz_commsr   utilr   r   baser   Zbokeh.documentr   Zbokeh.modelr   r   r   r   r   r+   r9   r   r   r   r   <module>   s*    