
    Be$                       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rddlmZ ddlmZ ddlm Z  d Z!ddZ"ddZ#d Z$ G 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                    t          |                                           D ];}d|vrt          t          |                    }|                     |          | |<   <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)attrs	snake_key	camel_keys      1lib/python3.11/site-packages/panel/pane/deckgl.pylower_camel_case_keysr!      si     %**,,'' 0 0	i&}Y'?'?@@	 99Y//i	0 0    
snake_casestrreturnc                j    d}d}| D ]+}|dk    rd}|r||                                 z   n||z   }d},|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#   
output_strshould_upper_casecs       r    r   r   /   s`     J " "88 $/@TZ!''))++jSTn
!r"   sc                X    | r'| d d                                          | dd          z   ndS )Nr   r'   )lower)r,   s    r    r   r   C   s/    $%-1RaR5;;==1QRR5  2-r"   c                   t          | d          r| j        } t          | t                    r=t          |           } t	          |            d |                                 D             } n!t          | t                    rd | D             } | S )Nto_jsonc                D    i | ]\  }}||d k    rt          |          n|S datarecurse_data.0kvs      r    
<dictcomp>z recurse_data.<locals>.<dictcomp>M   s@     * * *Aq a6kk<???q * * *r"   c                ,    g | ]}t          |          S  r4   )r7   ds     r    
<listcomp>z recurse_data.<locals>.<listcomp>P   s    ...AQ...r"   )hasattr__dict__
isinstancedictr!   itemsr   r2   s    r    r5   r5   G   s    tY }$ /Dzzd###* * JJLL* * *	D$		 /.....Kr"   c                     e Zd ZU dZ ej        dd          Z ej        dee	fd          Z
 ej        i d          Z ej        i d	          Z ej        i d
          Z ej        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d5d            Zed              Zed!             Zed"             Zed#             Zd$ Zd6d&Z	 	 d7d8d/Zd9d4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)rF   class_rG   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.   )view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]priorityobjr   r%   float | bool | Nonec                p    |                      |          rdS t          |t          t          f          rdS dS )Ng?r   F)	is_pydeckrA   rB   r$   )clsrX   s     r    applieszDeckGL.applies   s;    == 	3dC[)) 	1ur"   c                h    dt           j        v r#dd l}t          ||j        j        j                  S dS )Npydeckr   F)sysmodulesr_   rA   bindingsdeckDeck)r\   rX   r_   s      r    r[   zDeckGL.is_pydeck   s5    s{""MMMc6?#7#<===ur"   c                    t          t                    }|D ]7}|                                D ] \  }}||                             |           !8d |                                D             S )Nc                >    i | ]\  }}|t          j        |          S r<   )npasarray)r7   colvalss      r    r:   z(DeckGL._process_data.<locals>.<dictcomp>   s(    GGG)#tRZ%%GGGr"   )r   r   rC   append)r\   r3   columnsr=   ri   vals         r    _process_datazDeckGL._process_data   su    d## 	) 	)AGGII ) )S##C(((()GGw}}GGGGr"   c                    |                     dg           }t          t                    }t          |          D ]U\  }}t	          t          |j                                                            }||                             ||f           Vg t          |          }	}|D ]w}
|
                     d          }t          |          rt          j        |          }nIt          |t                    r3|r1t          |d         t                    r|                     |          }nt	          t          |                                                    }|                     |          }|r|                                \  }}||
d<   i }|                                D ]0\  }}t#          j        ||         |j        |                   s|||<   1|r|j                            |           |	                    |           `|                    |
|f           y|D ]_\  }
}|	r|	                                }||_        n$t          |          }|                    |           |                    |          |
d<   `d S )Nlayersr3   r   )getr   r   	enumeratetuplesortedr3   r   rk   r   r   from_dfrA   rB   rn   r   rC   rg   array_equalupdateremoveindex)r\   	json_datasourcesrp   source_columnsisourcekeyunprocessedunusedlayerr3   existingry   cdsupdatesri   valuess                     r    _update_sourceszDeckGL._update_sources   ss   x,, %T**"7++ 	4 	4IAvv{//112233C3&&6{3333 !$w--V 	2 	2E99V$$DD!! '/55T4(( T  a$//((..tyy{{++,,C%))#..H 2%\\^^
s %f#'::<< . .KC>$s)SXc]CC .'- -HOOG,,,c""""""E4=1111& 	/ 	/KE4 $jjll&t,,s####MM#..E&MM	/ 	/r"   c                d    | j         sdt          j        vrd S ddlm} d }|t
          j        |<   d S )Nr_   r   )Stringc                    | j         S N)value)rX   
serializers     r    pydeck_string_encoderz:DeckGL._add_pydeck_encoders.<locals>.pydeck_string_encoder   s
    9r"   )rU   r`   ra   pydeck.typesr   r   	_encoders)r\   r   r   s      r    _add_pydeck_encoderszDeckGL._add_pydeck_encoders   sT    ) 	XS[-H-HF''''''	 	 	 (=
V$$$r"   c                   t          |j                  }|                    dd          p| j        }|                    dd           }t	          | j        t                     s|| j        }n|j        }d t          |                                          D             }d|v r'd |d                                         D             |d<   | 	                                 |||fS )N
mapbox_keyr'   deck_widgetc                    i | ]
\  }}|||S r   r<   r6   s      r    r:   z1DeckGL._transform_deck_object.<locals>.<dictcomp>   s    MMMAq}1}}}r"   initialViewStatec                    i | ]
\  }}|||S r   r<   r6   s      r    r:   z1DeckGL._transform_deck_object.<locals>.<dictcomp>   s&     & & &1AM!MMMr"   )
rB   r@   r   mapbox_api_keyrA   rS   rO   r5   rC   r   )selfrX   r3   r   r   rO   s         r    _transform_deck_objectzDeckGL._transform_deck_object   s    CL!!,33Jt7Jhh}d33dmT** 	*k.AmGG!)GMMd!3!3!9!9!;!;MMM%%& & $%7 8 > > @ @& & &D#$ 	!!###Wn,,r"   Dict[str, Any]c                   | j         i | j        | j        }}}nt          | j         t          t
          f          rzt          | j         t                    rt          j        | j                   }n7t          | j                   }d |                    dg           D             |d<   | j        }| j        }n| 	                    | j                   \  }}}|                    dg           D ]X}|                    dd          |
                    d           |                    dd          |
                    d           Yt          |||pd          S )	Nc                ,    g | ]}t          |          S r<   )rB   )r7   r   s     r    r>   z,DeckGL._transform_object.<locals>.<listcomp>   s    !R!R!R%$u++!R!R!Rr"   rp   viewswidthFheightr'   )r3   rO   r   )objectr   rS   rA   r$   rB   jsonloadsrq   r   r   )r   rX   r3   r   rO   rJ   s         r    _transform_objectzDeckGL._transform_object   sG   ;,.0CT]'.DDc4[11 		U$+s++ Sz$+..DK((!R!R488Hb;Q;Q!R!R!RX!0NmGG,0,G,G,T,T)D'> HHWb)) 	# 	#Dxx''/!!!xx%((0"""w~?SQSTTTTr"   rG   r   rootOptional[Model]parentcommOptional[Comm]r   c                   t          ddt          |t                    |          x| _        }|                     |          }|                    d          }g x|d<   }|                     ||           |                    dg           |d<   |                    di           |d<    |d	d|i|}	|p|	}|                     |	g d|||           |	|f| j        |j	        d         <   |	S )
Nzpanel.models.deckgl
DeckGLPlotr3   data_sourcesrp   r   )rL   rM   rN   idr<   )
r   rA   r   _bokeh_model_get_propertiesr   r   _link_props_modelsref)
r   rG   r   r   r   r   
propertiesr3   r{   models
             r    
_get_modelzDeckGL._get_model   s    *3!<D+1N1NPT*
 *
 	
J ))#..
~~f%%/11
>"WT7+++#xx"55
8)-2Db)I)I
%&
333
33}u I I I3PTVZ[[[(-vTXd^$r"   r   r$   r   Nonec                "   |                      |j                  }|                    d          }|                     ||j                   ||d<   |                    dg           |d<   |                    di           |d<    |j        di | d S )Nr3   rp   r   r<   )r   documentr   r   r   rw   )r   r   r   r   r3   s        r    _updatezDeckGL._update  s    ))%.99
~~f%%T5#5666!
6#xx"55
8)-2Db)I)I
%&""z"""""r"   )rX   r   r%   rY   )r%   r   )NNN)
rG   r   r   r   r   r   r   r   r%   r   )r   r$   r   r   r%   r   )__name__
__module____qualname____doc__paramr   r   ClassSelectorboolrB   rS   r   rP   rQ   rR   throttlerT   __annotations__rU   rV   rW   classmethodr]   r[   rn   r   r   r   r   r   r   r<   r"   r    rE   rE   T   sG         $ "U\$ 5B C C CN #u"4t K& ' ' 'H %*R .= > > >K %*R .7 8 8 8K B -6 7 7 7J uz3"="= D* + + +H
 $L!y3 3G    
 276666#H####.2H2222   [   [ H H [H +/ +/ [+/Z = = [=- - -&U U U U0 6:?C    &# # # # # #r"   rE   )r#   r$   r%   r$   )r,   r$   r%   r$   )&r   
__future__r   r   r`   collectionsr   typingr   r   r   r   r	   r
   numpyrg   r   bokeh.core.serializationr   bokeh.modelsr   pyviz_commsr   utilr   r   baser   bokeh.documentr   bokeh.modelr   r   r!   r   r   r5   rE   r<   r"   r    <module>r      s    # " " " " "  



 # # # # # #                     / / / / / / ) ) ) ) ) ) # # # # # # * * * * * * * *       !''''''!!!!!!      0 0 0    (. . . .
 
 
E# E# E# E# E#Y E# E# E# E# E#r"   