U
    Pe@                     @   sZ   d Z ddlmZ ddlmZ ddlmZmZmZm	Z	 ddl
mZ dZG dd deeZd	S )
z
RecycleLayout
=============

.. versionadded:: 1.10.0

.. warning::
    This module is highly experimental, its API may change in the future and
    the documentation is not complete at this time.
    )RecycleLayoutManagerBehavior)Layout)ObjectPropertyStringPropertyReferenceListPropertyNumericProperty)Factory)RecycleLayoutc                       s  e Zd ZdZedddZedddZeeeZedddZ	edddZ
ee	e
ZedddZedddZedddZedddZedddZeeeZedddZedddZedddZeeeZei ZedddZedZedZeeeZg ZdZg Zi Z  fddZ! fd	d
Z" fddZ#dddZ$dd Z%dd Z&dd Z'dd Z( fddZ) fddZ* fddZ+ fddZ,  Z-S ) r	   zE
    RecycleLayout provides the default layout for RecycleViews.
    d   T)Z	allownoneNFc                    s*   i | _ g | _| j| _tt| jf | d S N)view_indicesZ_updated_views_catch_layout_triggerZ_trigger_layoutsuperr	   __init__)selfkwargs	__class__ :/tmp/pip-unpacked-wheel-xzebddm3/kivy/uix/recyclelayout.pyr      s    zRecycleLayout.__init__c                    s   t t| | |r| j}|d|j |d|j |d|j |d|j |d|j |d|j |d|j |d|j |d	|j |d
|j d S Ndefault_sizekey_sizedefault_size_hintkey_size_hintdefault_size_hint_minkey_size_hint_mindefault_size_hint_maxkey_size_hint_maxdefault_pos_hintkey_pos_hint)r   r	   attach_recycleviewfbindrefresh_from_data)r   rvr"   r   r   r   r!      s    z RecycleLayout.attach_recycleviewc                    s   | j }|r| j}|d|j |d|j |d|j |d|j |d|j |d|j |d|j |d|j |d	|j |d
|j tt|   d S r   )recycleviewfunbindr#   r   r	   detach_recycleview)r   r$   r&   r   r   r   r'      s    z RecycleLayout.detach_recycleviewc                 C   s   | j }|d krd S | j|}|d k	r| jr0d S | j| }|j|d kr|j|d kr|j|d kr|j|d kr|j	|d krd S d| _|j
dd n|
  d S )Nsize	size_hintsize_hint_minsize_hint_maxpos_hintTZ	view_size)r%   r   get_size_needs_update	view_optsr(   r)   r*   r+   r,   refresh_from_layout)r   instancevaluer$   idxoptr   r   r   r      s*    
z#RecycleLayout._catch_layout_triggerc           $      C   sf  dd |D r,|    dd |D  }| _n| j}d}|D ]}| D ]\}}d}|dkrb||= qF|dkr|d g|j|j   qF|dkr||d  qF|d	kr|j|j|j  }}	}
|
d krt||	n
t||	|
}|D ]}d ||< qqFt	d

|qFq:|r
|    t|t|ks t| j}| j}| j}| j}| j}| j}| j}| j}| j}| j}| j}| j}| j\}}g }t|D ]\}}|| d k	rq~|d kr|n
|||}|d|}|d kr|n
|||}|d|}|d|d |d|d g}|d kr|n
|||}|d|}|d|d |d|d g}|d krZ|n
|||}|d|}|d|d |d|d g}|d kr|n
|||} |d| } |d| d |d| d f \}!}"} d }#|d k	r||}#|#d k	rtt|#}#|#d kr|}#|!d kr(|n|!|"d kr8|n|"g|||d ||#|!d k|"d kd	||< q~d S )Nc                 S   s   g | ]}|s|qS r   r   .0fr   r   r   
<listcomp>   s      z9RecycleLayout.compute_sizes_from_data.<locals>.<listcomp>c                 S   s   g | ]}d qS r   r   )r7   _r   r   r   r9      s     FTremovedZappendedZinsertedmodifiedzUnrecognized data flag {}r,   r)   Zsize_hint_xr   Zsize_hint_y   r*   Zsize_hint_min_xZsize_hint_min_yr+   Zsize_hint_max_xZsize_hint_max_yr(   widthheight)	r(   r)   r*   r+   posr,   	viewclass
width_noneheight_none)clear_layoutr0   itemsextendstopstartinsertsteprange	ExceptionformatlenAssertionErrorr    r   r   r   r   r   r   r   r   r   rA   Zkey_viewclassinitial_size	enumerater.   getattrr   )$r   dataflagsoptschangedflagkvrH   rG   rJ   riZph_keyZph_defZsh_keyZsh_defZ
sh_min_keyZ
sh_min_defZ
sh_max_keyZ
sh_max_defZs_keyZs_defZviewcls_defZviewcls_keyiwZihshitemphsh_minsh_maxswhZviewclsr   r   r   compute_sizes_from_data   s    

(




"    z%RecycleLayout.compute_sizes_from_datac                 C   sv  d| _ | j}g }| j D ],\}}|| }|d }t|j \}	}
}|d }t|j \}}}|d }t|j}|d }t|j}|d }t	|j
}||ks||ks||ks||ks||kr|||||||||||||f |d kr|d kr||d< n|	|d g|d< n|d kr(|d |
g|d< ||d< ||d< ||d< ||d< qd	d
 |D rbg | _n|rl|nd | _d S )NFr(   r)   r*   r+   r,   r=   r   c                 S   s   g | ]}|s|qS r   r   r6   r   r   r   r9   h  s      z0RecycleLayout.compute_layout.<locals>.<listcomp>)r/   r0   r   rE   listr(   r)   r*   r+   dictr,   append_changed_views)r   rS   rT   rU   rV   widgetindexr5   rb   rc   rd   Zsnr]   ZshnwZshnhZshnr`   Zshn_minra   Zshn_maxr_   Zphnr   r   r   compute_layoutG  sJ    


    



zRecycleLayout.compute_layoutc                 G   s   dst d S NF)rO   )r   largsr   r   r   	do_layoutm  s    zRecycleLayout.do_layoutc                 C   s@  | j }| jj|||\}}}| j}| j}	|D ]\}
}|| |	|= q.| j}|D ].\}}||  }|d= |d= ||||| qP| j}|D ]"\}}||	|< |j	d kr|| qd}|D ]j\}}|| }|s|j
|d kr|j|d kr|j|d kr|j|d kr|j|d krqd	}q|r<d	| _| jjd	d
 d S )NrB   rC   Fr(   r)   r*   r+   r,   Tr-   )r0   r%   Zview_adapterset_visible_viewsremove_widgetr   refresh_view_layoutcopyZ
add_widgetparentr(   r)   r*   r+   r,   r/   r1   )r   indicesrS   viewportr0   new	remainingoldremover   r:   rj   rr   rk   r5   addrV   r   r   r   rp   p  sN      


zRecycleLayout.set_visible_viewsc                    s   | j |  }|d}|d}|| |d \}}	|d \}
}|
d krT|rTd }|d krd|rdd }	||	f|d< tt| |||| d S )NrB   rC   r(   r)   )r0   rs   popupdater   r	   rr   )r   rk   Zlayoutviewrv   r5   rB   rC   rc   rd   ZshwZshhr   r   r   rr     s"    



   z!RecycleLayout.refresh_view_layoutc                    s    t t|   |   i | _d S r   )r   r	   remove_viewsclear_widgetsr   r   r   r   r   r     s    zRecycleLayout.remove_viewsc                    s(   t t| || | | | j|= d S r   )r   r	   remove_viewrq   r   )r   r~   rk   r   r   r   r     s    
zRecycleLayout.remove_viewc                    s&   t t|   |   i | _d| _d S rm   )r   r	   rD   r   r   r/   r   r   r   r   rD     s    zRecycleLayout.clear_layout)NN).__name__
__module____qualname____doc__r   Zdefault_widthZdefault_heightr   r   Zdefault_size_hint_xZdefault_size_hint_yr   r   r   r   r   Zdefault_size_hint_x_minZdefault_size_hint_y_minr   r   Zdefault_size_hint_x_maxZdefault_size_hint_y_maxr   r   r   r    Zinitial_widthZinitial_heightrP   r0   r/   ri   r   r   r!   r'   r   re   rl   ro   rp   rr   r   r   rD   __classcell__r   r   r   r   r	      s^   
 


X&0r	   N)r   Zkivy.uix.recycleview.layoutr   Zkivy.uix.layoutr   Zkivy.propertiesr   r   r   r   Zkivy.factoryr   __all__r	   r   r   r   r   <module>   s   