a
    Df.                     @  sb   d Z ddlmZ ddlmZmZ ddlZddlmZ ddl	m
Z
 dd	lmZ G d
d dee
ZdS )z<
The Swipe layout enables you to quickly compare two panels
    )annotations)ClassVarListN   )CDN_DIST)ReactiveHTML   )ListLikec                      s  e Zd ZU dZejg ddddZejdddd	Zej	d
ddZ
ejdddd	Ze Ze ZdZded< dZdddddddZe dgZded<  fddZejd d!d!d"d#d$ Zed%d& Zejd'd& Zed(d) Zejd*d) Zd. fd,d-	Z  ZS )/Swipez
    The Swipe layout enables you to quickly compare two panels laid
    out on top of each other with a part of the *before* panel shown
    on one side of a slider and a part of the *after* panel shown on
    the other side.
    )r   r   z;
        The list of child objects that make up the layout.)defaultboundsdoc
precedence   )r      z*
        The width of the slider in pixels)r   r   r   Zblackz 
        The color of the slider)r   r   2   )r   d   z5
        The percentage of the *after* panel to show.ZverticalzClassVar[str | None]
_directiona  
    <div id="container" class="swipe-container">
      <div id="before" class="outer">
        <div id="before-inner" class="inner">${_before}</div>
      </div>
      <div id="after" class="outer" style="overflow: hidden;">
        <div id="after-inner" class="inner">${_after}</div>
      </div>
      <div id="slider" class="slider" onmousedown="${script('drag')}"
           style="background: ${slider_color}; width: ${slider_width}px;">
      </div>
    </div>
    z'
          self.adjustSlider()
        z 
          self.value()
        a  
          function endDrag() {
             document.removeEventListener('mouseup', endDrag);
             document.removeEventListener('mousemove', handleDrag);
           }
           function handleDrag(e) {
             e = e || window.event;
             e.preventDefault();
             current = e.clientX
             start = view.el.getBoundingClientRect().left
             value = parseInt(((current-start)/ container.clientWidth)*100)
             data.value = Math.max(0, Math.min(value, 100))
           }
           let e = event || window.event;
           e.preventDefault();
           document.addEventListener('mouseup', endDrag);
           document.addEventListener('mousemove', handleDrag);
        a%  
           before.style.clipPath = `polygon(0% 0%, calc(${data.value}% + 5px) 0%, calc(${data.value}% + 5px) 100%, 0% 100%)`
           after.style.clipPath = `polygon(calc(${data.value}% + 5px) 0%, 100% 0%, 100% 100%, calc(${data.value}% + 5px) 100%)`
           self.adjustSlider()
        zself.adjustSlider()z
           halfWidth = parseInt(data.slider_width/2)
           slider.style.marginLeft = `calc(${data.value}% + 5px - ${halfWidth}px)`
        )renderZafter_layoutZdragvalueslider_widthZadjustSliderzcss/swipe.csszClassVar[List[str]]_stylesheetsc                   s`   d|v r|rt dddlm  |d|}|s8d d g}t jf d fdd|D i| d S )NobjectszSEither supply objects as an positional argument or as a keyword argument, not both.r   panelc                   s   g | ]} |qS  r   ).0objr   r   _/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/panel/layout/swipe.py
<listcomp>j       z"Swipe.__init__.<locals>.<listcomp>)
ValueErrorZ	pane.baser   popsuper__init__)selfr   params	__class__r   r   r%   `   s    zSwipe.__init__r   T)ZwatchZon_initc                 C  s   | j | _| j| _d S )N)before_beforeafter_afterr&   r   r   r   _update_layoutl   s    zSwipe._update_layoutc                 C  s   t | r| d S d S Nr   lenr.   r   r   r   r*   q   s    zSwipe.beforec                 C  s   || d< d S r0   r   )r&   r*   r   r   r   r*   u   s    c                 C  s   t | dkr| d S d S Nr   r1   r.   r   r   r   r,   y   s    zSwipe.afterc                 C  s   || d< d S r3   r   )r&   r,   r   r   r   r,   }   s    Nc                   s(   t  |}| D ]}|||7 }q|S )a  
        Iterates over the Viewable and any potential children in the
        applying the Selector.

        Arguments
        ---------
        selector: type or callable or None
          The selector allows selecting a subset of Viewables by
          declaring a type or callable function to filter by.

        Returns
        -------
        viewables: list(Viewable)
        )r$   select)r&   selectorr   r   r(   r   r   r4      s    zSwipe.select)N)__name__
__module____qualname____doc__paramr   r   ZIntegerr   ZColorZslider_colorr   	Parameterr+   r-   r   __annotations__	_templateZ_scriptsr   r   r%   dependsr/   propertyr*   setterr,   r4   __classcell__r   r   r(   r   r
      s@   

&




r
   )r9   
__future__r   typingr   r   r:   Zio.resourcesr   Zreactiver   baser	   r
   r   r   r   r   <module>   s   