o
    沪g;                     @  s   d dl mZ d dlZd dlZd dlmZ d dlZd dlZd dlZ	d dlm
Z
 d dlmZmZ d dlmZmZmZ eejZG dd dejZG d	d
 d
ejZdddZG dd dejZdddZdS )    )annotationsN)Any)TopLevelSpec)!compile_to_vegafusion_chart_stateusing_vegafusion)IndexSelectionIntervalSelectionPointSelectionc                      s(   e Zd ZdZ fddZdd Z  ZS )Paramsz/Traitlet class storing a JupyterChart's params.c                   s   t    | D ]B\}}t|ttfrt }n"t|tr#t	 }nt|t
r-t }nt|tr7t }nt }| jdi ||i t| || q	d S )N )super__init__items
isinstanceintfloat	traitletsFloatstrUnicodelistListdictDictr   
add_traitssetattr)selftrait_valueskeyvaluetraitlet_type	__class__r   X/var/www/html/chatdoc2/venv/lib/python3.10/site-packages/altair/jupyter/jupyter_chart.pyr      s   







zParams.__init__c                 C     d|    dS )NzParams()r   r   r   r   r#   __repr__-      zParams.__repr__)__name__
__module____qualname____doc__r   r(   __classcell__r   r   r!   r#   r
      s    r
   c                      s8   e Zd ZdZ fddZdd Zdd Zdd	 Z  ZS )

Selectionsz3Traitlet class storing a JupyterChart's selections.c                   s   t    | D ]H\}}t|trtt}n!t|tr#tt}nt|tr.tt}ndt	| }t
|| jdi ||i t| || | j| j|d q	d S )NzUnexpected selection type: namesr   )r   r   r   r   r   r   Instancer	   r   type
ValueErrorr   r   observe_make_read_only)r   r   r   r   r    msgr!   r   r#   r   4   s   



zSelections.__init__c                 C  r$   )NzSelections(r%   r&   r'   r   r   r#   r(   K   r)   zSelections.__repr__c                 C  sJ   |d |   v r|d |d kr| |d |d  d|d  }t|)zSWork around to make traits read-only, but still allow us to change them internally.nameoldnewz@Selections may not be set from Python.
Attempted to set select: )traits
_set_valuer4   )r   changer7   r   r   r#   r6   N   s    zSelections._make_read_onlyc                 C  s0   | j | j|d t| || | j| j|d d S )Nr0   )	unobserver6   r   r5   )r   r   r   r   r   r#   r<   X   s   zSelections._set_value)	r*   r+   r,   r-   r   r(   r6   r<   r.   r   r   r!   r#   r/   1   s    
r/   returnr   c                   C  s   t d d  S )Njszindex.js)_here	read_textr   r   r   r#   load_js_src^   r)   rC   c                      sx  e Zd Ze ZdZejeddZ	ej
ddjddZejddjddZejddjddZejdddjddZejd	dZej
dddjddZe
 Ze
 jddZe
 jddZejddZejddjddZejddjddZejddjddZd	Zed&d'ddZ					d(d) fddZ e!ddd Z"d*ddZ#e!d d!d" Z$e!d#d$d% Z%  Z&S )+JupyterChartzj
    .vega-embed {
        /* Make sure action menu isn't cut off */
        overflow: visible;
    }
    T)
allow_none)sync
   )default_valueN)rH   rE   Fofflineboolc                 C  s   ddl m}m} |rf| jrdS | }t d}|rQt|d  dks2|d ds2|d drQ|	d |rQt|d  dks2|d ds2|d ds2d
|}|j|| d}|| _d| _dS t | _d	| _dS )
a  
        Configure JupyterChart's offline behavior.

        Parameters
        ----------
        offline: bool
            If True, configure JupyterChart to operate in offline mode where JavaScript
            dependencies are loaded from vl-convert.
            If False, configure it to operate in online mode where JavaScript dependencies
            are loaded from CDN dynamically. This is the default behavior.
        r   )import_vl_convertvl_version_for_vl_convertN
importz//)
vl_versionTF)altair.utils._importersrK   rL   _is_offlinerC   splitlenstrip
startswithpopjoinjavascript_bundle_esm)clsrI   rK   rL   vlc	src_linessrcbundled_srcr   r   r#   enable_offline   s6   



zJupyterChart.enable_offlinechartr   debounce_waitr   max_waitdebugembed_optionsdict | Nonekwargsr   c                   s6   t i | _ti | _t jd|||||d| dS )a  
        Jupyter Widget for displaying and updating Altair Charts, and retrieving selection and parameter values.

        Parameters
        ----------
        chart: Chart
            Altair Chart instance
        debounce_wait: int
             Debouncing wait time in milliseconds. Updates will be sent from the client to the kernel
             after debounce_wait milliseconds of no chart interactions.
        max_wait: bool
             If True (default), updates will be sent from the client to the kernel every debounce_wait
             milliseconds even if there are ongoing chart interactions. If False, updates will not be
             sent until chart interactions have completed.
        debug: bool
             If True, debug messages will be printed
        embed_options: dict
             Options to pass to vega-embed.
             See https://github.com/vega/vega-embed?tab=readme-ov-file#options
        )r`   ra   rb   rc   rd   Nr   )r
   paramsr/   
selectionsr   r   )r   r`   ra   rb   rc   rd   rf   r!   r   r#   r      s   


zJupyterChart.__init__c                   s|  |j }g }i }i }i }i }|du r4   d _| _| _| _W d   dS 1 s-w   Y  dS t|dg }|tjur|j	D ]}	t
|	jtjrT|	j d}
n|	j}
t|	dtj}|tjkrt
|tsl| }|d }|dkr|dds|ddsd	||
< t|
g g d
||
< n*d||
< t|
g g d
||
< n|dkrd||
< t|
i g d
||
< n
d|j }t|||
 dg d||
< qB|	jtjkr|	jnd}|||
< qBt|D ]}d||< qt| _	 fdd} j	| t| _  9 t r jdu rd _ fdd} |dg n   j n|  _| _| _| _W d   dS 1 s7w   Y  dS )zRUpdates the JupyterChart's internal state when the wrapped Chart instance changes.Nrg   "selectr3   pointfields	encodingsindex)r8   r   storeintervalzUnexpected selection type )r   ro   c                   s$   t  j}| d || d < | _d S )Nr:   r8   )r   _params)param_change
new_paramsr'   r   r#   on_param_traitlet_changed"  s   

z@JupyterChart._on_change_chart.<locals>.on_param_traitlet_changedc                   s     | d  d S )Nr:   )_init_with_vegafusion)r=   r'   r   r#   on_local_tz_change2  s   z9JupyterChart._on_change_chart.<locals>.on_local_tz_changelocal_tz)!r:   	hold_syncspec_selection_types_vl_selectionsrq   getattralt	Undefinedrg   r   r8   ParameterNameto_jsonrT   r   to_dictgetr   r	   r   r3   r4   appendr   collect_transform_paramsr
   r5   r/   rh   r   rw   ru   )r   r=   	new_chartselection_watchesselection_typesinitial_paramsinitial_vl_selectionsempty_selectionsrg   param
clean_namerj   select_typer7   clean_value
param_namert   rv   r   r'   r#   _on_change_chart   s   














$zJupyterChart._on_change_chartrw   r   c                   s    j d urF j jddid}  * t|| _ j d  _ j  _ fdd} 	|dg W d    d S 1 s?w   Y  d S d S )Npre_transformF)contextclient_to_serverc                   sb    j rtj| d dd}td|   j| d } j r,tj|dd}td|  | _d S )Nr:      )indentz*JavaScript to Python VegaFusion updates:
 z*Python to JavaScript VegaFusion updates:
 )rc   jsondumpsprint_chart_stateupdate_py_to_js_updates)r=   updates_strupdatesr'   r   r#   on_js_to_py_updatesK  s   
z?JupyterChart._init_with_vegafusion.<locals>.on_js_to_py_updates_js_to_py_updates)
r`   r   rx   r   r   get_watch_plan_js_watch_planget_transformed_specry   r5   )r   rw   vegalite_specr   r   r'   r#   ru   >  s   

"z"JupyterChart._init_with_vegafusionrq   c                 C  s&   |j  D ]\}}t| j|| qd S )N)r:   r   r   rg   )r   r=   r   r   r   r   r#   _on_change_params[  s   zJupyterChart._on_change_paramsr{   c              	   C  s   |j  D ]F\}}|d }|d }| j| }|dkr(| j|tj|||d q|dkr:| j|tj|||d q|dkrK| j|tj|||d qdS )zUpdates the JupyterChart's public selections traitlet in response to changes that the JavaScript logic makes to the internal _selections traitlet.r   ro   rn   )signalro   rk   rp   N)	r:   r   rz   rh   r<   r   	from_vegar	   r   )r   r=   selection_nameselection_dictr   ro   selection_typer   r   r#   _on_change_selections`  s.   
z"JupyterChart._on_change_selections)T)rI   rJ   )rG   TFN)r`   r   ra   r   rb   rJ   rc   rJ   rd   re   rf   r   )rw   r   )'r*   r+   r,   rC   rY   _cssr   r2   r   r`   r   tagry   r   ra   Boolrb   r   rw   rc   rd   rz   r{   rq   r   r   r   r   r   rQ   classmethodr_   r   r5   r   ru   r   r   r.   r   r   r!   r#   rD   b   s@    2(

a
rD   r`   r   set[str]c                 C  sr   t  }dD ]}t| |g D ]	}|t| qqt| dg }|tjkr%|ng }|D ]}t|dr6||j q)|S )z
    Collect the names of params that are defined by transforms.

    Parameters
    ----------
    chart: Chart from which to extract transform params

    Returns
    -------
    set of param names
    )layerconcathconcatvconcat	transformr   )	setr|   r   r   r}   r~   hasattraddr   )r`   transform_paramspropchild
transformstxr   r   r#   r   z  s   
r   )r?   r   )r`   r   r?   r   )
__future__r   r   pathlibtypingr   	anywidgetr   altairr}   r   altair.utils._vegafusion_datar   r   altair.utils.selectionr   r   r	   Path__file__parentrA   	HasTraitsr
   r/   rC   	AnyWidgetrD   r   r   r   r   r#   <module>   s$    
-  