U
    Pe$                     @   s^   d Z ddlZejj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 )	a  
RecycleGridLayout
=================

.. 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.

The RecycleGridLayout is designed to provide a
:class:`~kivy.uix.gridlayout.GridLayout` type layout when used with the
:class:`~kivy.uix.recycleview.RecycleView` widget. Please refer to the
:mod:`~kivy.uix.recycleview` module documentation for more information.
    N)RecycleLayout)
GridLayoutGridLayoutExceptionnmaxnmin)defaultdict)RecycleGridLayoutc                       s`   e Zd ZdZdZ fddZdd Zdd Zdd	 Z fd
dZ	dd Z
dd Zdd Z  ZS )r   Nc                    s$   t t| jf | | d| j d S )Nchildren)superr   __init__ZfunbindZ_trigger_layout)selfkwargs	__class__ >/tmp/pip-unpacked-wheel-xzebddm3/kivy/uix/recyclegridlayout.pyr      s    zRecycleGridLayout.__init__c                 C   s   d S Nr   )r   instancevaluer   r   r   on_children#   s    zRecycleGridLayout.on_childrenc                 C   s  | j | j }}| j| j }}| j| j }}| j| j }}dd |D  | _}	dd |D  | _	}
| 
t|t|}d }}t| j|D ]V\}\}}|d |d  \}}\}}|d \}}|d \}}|d kr|	| |  d	7  < |d kr|
| |  d	7  < |d kr t|| |||< nRt|| |||< |d k	rRd
}t|| |||< |d k	rrd
}t|| |||< |d krt|| |||< qt|| |||< |d k	rd
}t|| |||< |d k	rd
}t|| |||< q|| _|| _d S )Nc                 S   s   g | ]}t tqS r   r   int.0_r   r   r   
<listcomp>+   s     z;RecycleGridLayout._fill_rows_cols_sizes.<locals>.<listcomp>c                 S   s   g | ]}t tqS r   r   r   r   r   r   r   ,   s     F	size_hintsizeZsize_hint_minZsize_hint_max   T)_cols_rowsZ_cols_shZ_rows_shZ_cols_sh_minZ_rows_sh_minZ_cols_sh_maxZ_rows_sh_max_cols_count_rows_countZ_create_idx_iterlenzip	view_optsr   r   Z_has_hint_bound_xZ_has_hint_bound_y)r   colsrowsZcols_shZrows_shZcols_sh_minZrows_sh_minZcols_sh_maxZrows_sh_max
cols_count
rows_countZidx_iterZhas_bound_yZhas_bound_xoptcolrowshwshhwhZshw_minZshh_minZshw_maxZshh_maxr   r   r   _fill_rows_cols_sizes&   sH    





z'RecycleGridLayout._fill_rows_cols_sizesc                 C   s  | j | j }}| j| j }}| j}t|}t|}| j}	|D ]\}
}\}}\}}}}}}}}}}||ksz||ksz||kr dS |d d k	r||kr||ks|d d k	s|d d k	r||kr||ks|d d k	r|||
 q<| |||
\}}||krh|| }|| |  d8  < || |  d7  < || | dk}|rH||ksR||krX dS |rh|| |= ||kr<|| }|| |  d8  < || |  d7  < || | dk}|r||ks||kr dS |r<|| |= q<dS )NTr   r   F)r!   r"   r   r    remove_viewr#   orientation_calculate_idx_from_a_view_idx)r   changedr(   r)   r&   r'   r2   n_colsn_rowsr3   indexwidgetr/   r0   ZwnZhnshZshnZsh_minZshn_minZsh_maxZshn_maxr   r+   r,   Zcol_wZ
was_last_wZrow_hZ
was_last_hr   r   r   _update_rows_cols_sizesT   sh        


  

z)RecycleGridLayout._update_rows_cols_sizesc                    s>  t t| || t|}|  }|r<||kr<td|| j}|d ksX|r\| |s\d S | 	  | 
|sd | _| j\}}}}	|| ||	 f| _d S |   |   |   | j}
| |D ]j\}}}}}|
|| d  }|d \}}||f|d< |d \}}|d kr|n||d kr |n|g|d< q| j\}}| j| j }}d gt|  }| _d gt|  }| _| j|d< |d | jd  |d  |d  }t|dd  dD ]\}}|||< ||| 7 }q| j| j | jd  |d  |d   }|d< t|}t|dd  dD ]&\}}||| 8 }|||d | < qd S )	Nz9Too many children ({}) in GridLayout. Increase rows/cols!r   r   posr   r   g       @)r
   r   compute_layoutr#   Zget_max_widgetsr   formatZ_changed_viewsr;   Zclear_layoutZ_init_rows_cols_sizes	_cols_pospaddingZminimum_sizer1   Z_update_minimum_sizeZ_finalize_rows_cols_sizesr%   Z_iterate_layoutspacingr   r    	_rows_posx	enumerateyheight)r   dataflagsnZsmaxr5   ltrbr%   r9   rD   rF   r/   r0   r*   r-   r.   ZwoZhoZ	spacing_xZ	spacing_yr&   r'   Zcols_posZrows_poslastivalr   r   r   r>      sb    



"$
z RecycleGridLayout.compute_layoutc                 C   s  | j d krdS |\}}| j }| j}| j| j }}|r8|s<dS ||d krVt|d }n*d}|dd  D ]}	||	k rv q|d7 }qf||d krt|d }
n*d}
|dd  D ]}	||	k r q|
d7 }
q| jst|| d }| jrt||
 d }
| jr|
t| | S |t| |
 S )Nr   r=   r   )r@   rC   r   r    r#   _fills_from_left_to_right_fills_from_top_to_bottom_fills_row_first)r   r<   rD   rF   Zcol_posZrow_posr&   r'   ixrQ   Ziyr   r   r   get_view_index_at   s:    


z#RecycleGridLayout.get_view_index_atc                    s   | j d krg S |\}}}}|| }|| }| j}	t|	||f|	||f|	||f|	||ff\}
}}}t| t|
|||hdk rtt |
t |d S g }| jrt| jnt| j}|r|| d t	 fddt|
|d |D }|S )N   r   c                 3   s(   | ] }t t| t | V  qd S r   )rangemin)r   srJ   Zx_slicer   r   	<genexpr>   s   z:RecycleGridLayout.compute_visible_views.<locals>.<genexpr>)
r@   rV   sortedr#   rX   rY   rT   r   r    chain_from_iterable)r   rH   ZviewportrD   rF   r/   r0   righttopZat_idxtltrblbrindicesZstrider   r[   r   compute_visible_views   s.    




z'RecycleGridLayout.compute_visible_viewsc                 C   sP   | j rt||\}}nt||\}}| js6|| d }| jsH|| d }||fS )z>returns a tuple of (column-index, row-index) from a view-indexr   )rT   divmodrR   rS   )r   r6   r7   Zview_idxZrow_idxZcol_idxr   r   r   r4      s    z0RecycleGridLayout._calculate_idx_from_a_view_idx)__name__
__module____qualname__r@   rC   r   r   r1   r;   r>   rV   rf   r4   __classcell__r   r   r   r   r      s   .+7$r   )__doc__	itertoolschainfrom_iterabler^   Zkivy.uix.recyclelayoutr   Zkivy.uix.gridlayoutr   r   r   r   collectionsr   __all__r   r   r   r   r   <module>   s   