a
    Df                     @  s   d Z ddlmZ ddlmZ ddlmZmZmZm	Z	m
Z
 ddlZddlmZmZ ddlmZ dd	lmZ d
dlmZ erddlmZ G dd deZdS )z7
Layout component to lay out objects in a set of tabs.
    )annotations)defaultdict)TYPE_CHECKINGClassVarListMappingTypeN)SpacerTabPanel   )Tabs)
Layoutable   )NamedListPanel)Modelc                      s@  e Zd ZU dZejdddZejdddZejdg ddd	Z	ej
d
ddZej
d
ddZeZded< d
Zded< ddiZded< dgZded< d
d
d
ddZded< d
d
dZded<  fddZ fdd Zd6d!d"d# fd$d%Zed&d' Zd(d) Z fd*d+Z fd,d-Zd.d/ Z fd0d1Zd2d3 Zd7d4d5Z   Z!S )8r   un  
    The `Tabs` layout allows switching between multiple objects by clicking
    on the corresponding tab header.

    Tab labels may be defined explicitly as part of a tuple or will be
    inferred from the `name` parameter of the tab’s contents.

    Like `Column` and `Row`, `Tabs` has a list-like API with methods to
    `append`, `extend`, `clear`, `insert`, `pop`, `remove` and `__setitem__`,
    which make it possible to interactively update and modify the tabs.

    Reference: https://panel.holoviz.org/reference/layouts/Tabs.html

    :Example:

    >>> pn.Tabs(('Scatter', plot1), some_pane_with_a_name)
    Fz5
        Whether it should be possible to close tabs.)defaultdocz2
        Dynamically populate only the active tab.above)r   Zbelowleftrightz?
        The location of the tabs relative to the tab contents.)r   objectsr   N)r   N)r   boundszClassVar[Type[Model]]_bokeh_modelzClassVar[str | None]
_directiontabsz[
    var ids = [];
    for (var t of value) {{ ids.push(t.id) }};
    var value = ids;
    zClassVar[Mapping[str, str]]_js_transformsclosablezClassVar[List[str]]_manual_params)r   dynamicnamer   z"ClassVar[Mapping[str, str | None]]_rename)r   r   _source_transformsc                   sJ   t  j|i | tt| _dt| d f| jj_| j	| j
ddg d S )Nr   r   active)super__init__r   dict	_renderedlenparamr#   r   Zwatch_update_active)selfr   params	__class__ ^/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/panel/layout/tabs.pyr%   L   s    
zTabs.__init__c                   s(   dt |jd f| jj_t | d S )Nr"   r   )r(   newr)   r#   r   r$   _update_names)r+   eventr-   r/   r0   r2   R   s    zTabs._update_nameszModel | NoneNone)rootreturnc                   sP   t  | |rL|jd | jv r.| j|jd = |jd | jv rL| j|jd = d S )Nid)r$   _cleanupref_panelsr'   )r+   r5   r-   r/   r0   r8   W   s    zTabs._cleanupc                 C  s   t j| jrdgng  S )Nr#   )r   _preprocess_paramsr   )r+   r/   r/   r0   r;   _   s    zTabs._preprocess_paramsc                   sf   | j |\}}|r^z fdd|D }W n tyD    df Y S 0 | j  fdd|D } |fS )z%
        Handle closed tabs.
        c                   s   g | ]}  |qS r/   )index).0taboldr/   r0   
<listcomp>n       z'Tabs._process_close.<locals>.<listcomp>Nc                   s   g | ]} | qS r/   r/   )r=   ir?   r/   r0   rA   r   rB   )Z_modelsget	Exceptionr   )r+   r9   attrr@   r1   model_Zindsr/   r?   r0   _process_closeg   s    zTabs._process_closec              	     sj   || j |g v r&| j | | d S |dkrN| ||||\}}|d u rNd S t ||||||| d S Nr   )	_changingrD   removerI   r$   _comm_change)r+   r   r9   commsubpathrF   r@   r1   r-   r/   r0   rM   u   s    zTabs._comm_changec                   sh   || j |g v r&| j | | d S |dkrN| ||||\}}|d u rNd S t |||||| d S rJ   )rK   rD   rL   rI   r$   _server_change)r+   r   r9   rO   rF   r@   r1   r-   r/   r0   rP      s    zTabs._server_changec                 G  s:   |D ]0}|j dks"| jr|j dkr| jd  d S qd S )Nr   r#   r   )r   r   r)   trigger)r+   eventsr3   r/   r/   r0   r*      s    zTabs._update_activec                   s   dd |D }t  ||S )Nc                 S  s   g | ]
}|j qS r/   )child)r=   rS   r/   r/   r0   rA      rB   z-Tabs._compute_sizing_mode.<locals>.<listcomp>)r$   _compute_sizing_mode)r+   childrenpropsr-   r/   r0   rT      s    zTabs._compute_sizing_modec           	      C  s,   |D ]"}|j dkr|jD ]}|j|_qqd S )Nr   )r   r   r1   r   )	r+   rR   rG   r   r5   parentrN   r3   rS   r/   r/   r0   _manual_update   s    

zTabs._manual_updatec                 C  s  ddl m}m} g g  }}	t| jt| krFtdt| jt| f tt| j| D ]"\}
\}}|||d}|| j|
< qV|j	d }| j
| }| j| }|D ]:}|| jv rq|| |t|d |t|d qt| }tt| j| D ]\}
\}}t|}| jo|
| jk}||}t|doHt|jtoH|jjdgk}||v r||v r||A rv| js|s|| q|r|s||v r|| }|	| n|rtf i d	d
 |j  D }dg|_nz||||| ||< }W nf |y` } zL|jdur(|j| ur(|d|_| ||d|
 |||W  Y d}~  S d}~0 0 t||j || j!d }||< || q||	fS )z
        Returns new child models for the layout while reusing unchanged
        models and cleaning up any dropped objects.
        r   )RerenderErrorpanelztTab names do not match objects, ensure that the Tabs.objects are not modified directly. Found %d names, expected %d.)r   r7   NrS   hiddenc                 S  s0   i | ](\}}|t jv r|d ur|dvr||qS )N)r   Zdesign)r   r)   )r=   kvr/   r/   r0   
<dictcomp>   s   z%Tabs._get_objects.<locals>.<dictcomp>)titler   rS   r   )"Z	pane.baserY   rZ   r(   Z_names
ValueError	enumeratezipr   r9   r:   r'   r8   popr7   listr   r#   rD   hasattr
isinstancerS   BkSpacertagsappendr)   valuesitemsZ
_get_modelZlayout_get_objects
BkTabPanelr   r   )r+   rG   Zold_objectsr   r5   rN   rY   rZ   Z
new_modelsZ
old_modelsrC   r   Zpaner9   ZpanelsrenderedobjZcurrent_objectsZprefr[   Zprev_hiddenrS   er/   r/   r0   rl      sj    







"
4zTabs._get_objects)N)N)"__name__
__module____qualname____doc__r)   Booleanr   r   ZObjectSelectorZtabs_locationZIntegerheightwidthBkTabsr   __annotations__r   r   r   r    r!   r%   r2   r8   propertyr;   rI   rM   rP   r*   rT   rX   rl   __classcell__r/   r/   r-   r0   r      s8   




r   )rt   
__future__r   collectionsr   typingr   r   r   r   r   r)   Zbokeh.modelsr	   rg   r
   rm   Zmodels.tabsr   rx   Zviewabler   baser   Zbokeh.modelr   r/   r/   r/   r0   <module>   s   