U
    祡c{6                     @   st  d dl mZmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
mZmZmZmZmZmZmZm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dlmZ ddl m!Z! ddl"m#Z# ddl$m%Z%m&Z& ddl'm(Z( ddl)m*Z* e
rd dl+m,Z, G dd deZ-ede#f Z.ede-f Z/G dd de0Z1G dd de1Z2G dd dZ3G dd deZ4G dd de4Z5G dd  d e4Z6e&G d!d dZ7e8d"krpd d#l9mZ e Ze7 Z:e:;e7d$d%d&e7dd'd(e7d)d*d+ e:d' <e7d,d-e7d.d/d0 e:d. <e7d1d/d0e7d2d- e:d2 ;e7d3d-e7d4d-e7d5d- e:d, ;e7e:j=d6d-e7d7d- e:d1 >d8 e?e: d9S ):    )ABCabstractmethod)islice)
itemgetter)RLock)	TYPE_CHECKINGDictIterableList
NamedTupleOptionalSequenceTupleUnion   )ratio_resolve)Align)ConsoleConsoleOptionsRenderableTypeRenderResult)ReprHighlighter)Panel)Pretty)Region)Result	rich_repr)Segment)	StyleTypeTreec                   @   s*   e Zd ZU dZeed< eee  ed< dS )LayoutRenderzAn individual layout render.regionrenderN)__name__
__module____qualname____doc__r   __annotations__r
   r    r)   r)   //tmp/pip-unpacked-wheel-qkhzhrww/rich/layout.pyr!       s   
r!   Layoutc                   @   s   e Zd ZdZdS )LayoutErrorzLayout related error.Nr$   r%   r&   r'   r)   r)   r)   r*   r,   +   s   r,   c                   @   s   e Zd ZdZdS )
NoSplitterz"Requested splitter does not exist.Nr-   r)   r)   r)   r*   r.   /   s   r.   c                   @   s<   e Zd ZdZe ZddeddddZee	e
dd	d
ZdS )_Placeholderz4An internal renderable used as a Layout placeholder. r+   N)layoutstylereturnc                 C   s   || _ || _d S N)r1   r2   )selfr1   r2   r)   r)   r*   __init__8   s    z_Placeholder.__init__consoleoptionsr3   c                 c   sx   |j }|jp|jj}| j}|jr8|jd| d| dnd| d| d}ttjt|dd| j	| 
|d|dV  d S )	Nz (z x )(middle)ZverticalZblue)r2   titleZborder_styleheight)	max_widthr>   sizer1   namer   r   centerr   r2   highlighter)r5   r8   r9   widthr>   r1   r=   r)   r)   r*   __rich_console__<   s    z_Placeholder.__rich_console__)r0   )r$   r%   r&   r'   r   rC   r   r6   r   r   r   rE   r)   r)   r)   r*   r/   3   s    r/   c                   @   sV   e Zd ZU dZdZeed< eedddZee	d e
eede
f  dd	d
ZdS )SplitterzBase class for a splitter.r0   rA   r3   c                 C   s   dS )z(Get the icon (emoji) used in layout.treeNr)   r5   r)   r)   r*   get_tree_iconU   s    zSplitter.get_tree_iconr+   childrenr"   r3   c                 C   s   dS )zDivide a region amongst several child layouts.

        Args:
            children (Sequence(Layout)): A number of child layouts.
            region (Region): A rectangular region to divide.
        Nr)   )r5   rK   r"   r)   r)   r*   divideY   s    zSplitter.divideN)r$   r%   r&   r'   rA   strr(   r   rI   r   r   r	   r   rL   r)   r)   r)   r*   rF   P   s   
 rF   c                   @   sD   e Zd ZdZdZedddZed ee	e
def  ddd	Zd
S )RowSplitterz!Split a layout region in to rows.rowrG   c                 C   s   dS )Nu   [layout.tree.row]⬌r)   rH   r)   r)   r*   rI   j   s    zRowSplitter.get_tree_iconr+   rJ   c                 c   sV   |\}}}}t ||}d}t}	t||D ](\}
}|
|	|| |||fV  ||7 }q(d S Nr   r   r   zip)r5   rK   r"   xyrD   r>   Zrender_widthsoffset_RegionchildZchild_widthr)   r)   r*   rL   m   s    
zRowSplitter.divideNr$   r%   r&   r'   rA   rM   rI   r   r   r	   r   rL   r)   r)   r)   r*   rN   e   s    rN   c                   @   sD   e Zd ZdZdZedddZed ee	e
def  ddd	Zd
S )ColumnSplitterz$Split a layout region in to columns.columnrG   c                 C   s   dS )Nu   [layout.tree.column]⬍r)   rH   r)   r)   r*   rI   ~   s    zColumnSplitter.get_tree_iconr+   rJ   c                 c   sV   |\}}}}t ||}d}t}	t||D ](\}
}|
|	||| ||fV  ||7 }q(d S rP   rQ   )r5   rK   r"   rS   rT   rD   r>   Zrender_heightsrU   rV   rW   Zchild_heightr)   r)   r*   rL      s    
zColumnSplitter.divideNrX   r)   r)   r)   r*   rY   y   s    rY   c                
   @   s  e Zd ZdZeedZd8ddddddee ee	 ee
 e
e
edddd	Zed
ddZeed
ddZeed  d
ddZeed
ddZe	ed  dddZe	d dddZedd
ddZdded ef eee	f ddddZed ef dd d!d"Zed ef dd d#d$Zed ef dd d%d&Zdd
d'd(Zedd)d*d+Zd,e	dd-d.d/Z e
e
e!d0d1d2Z"e#e$ed3d4d5Z%e#e$e&d3d6d7Z'dS )9r+   aB  A renderable to divide a fixed height in to rows or columns.

    Args:
        renderable (RenderableType, optional): Renderable content, or None for placeholder. Defaults to None.
        name (str, optional): Optional identifier for Layout. Defaults to None.
        size (int, optional): Optional fixed size of layout. Defaults to None.
        minimum_size (int, optional): Minimum size of layout. Defaults to 1.
        ratio (int, optional): Optional ratio for flexible layout. Defaults to 1.
        visible (bool, optional): Visibility of layout. Defaults to True.
    )rO   rZ   Nr   T)rA   r@   minimum_sizeratiovisible)
renderablerA   r@   r[   r\   r]   r3   c                C   sR   |p
t | | _|| _|| _|| _|| _|| _| jd  | _g | _	i | _
t | _d S )NrZ   )r/   _renderabler@   r[   r\   rA   r]   	splitterssplitter	_children_render_mapr   _lock)r5   r^   rA   r@   r[   r\   r]   r)   r)   r*   r6      s    
zLayout.__init__rG   c                 c   s<   d| j d fV  d| jd fV  d| jdfV  d| jdfV  d S )NrA   r@   r[   r   r\   )rA   r@   r[   r\   rH   r)   r)   r*   __rich_repr__   s    zLayout.__rich_repr__c                 C   s   | j r
| S | jS )zLayout renderable.)rb   r_   rH   r)   r)   r*   r^      s    zLayout.renderablec                 C   s   dd | j D S )zGets (visible) layout children.c                 S   s   g | ]}|j r|qS r)   )r]   ).0rW   r)   r)   r*   
<listcomp>   s      z#Layout.children.<locals>.<listcomp>rb   rH   r)   r)   r*   rK      s    zLayout.childrenc                 C   s   | j S )zGet a map of the last render.)rc   rH   r)   r)   r*   map   s    z
Layout.map)rA   r3   c                 C   s8   | j |kr| S | jD ]}||}|dk	r|  S qdS )zGet a named layout, or None if it doesn't exist.

        Args:
            name (str): Name of layout.

        Returns:
            Optional[Layout]: Layout instance or None if no layout was found.
        N)rA   rb   get)r5   rA   rW   Znamed_layoutr)   r)   r*   rj      s    	



z
Layout.getc                 C   s$   |  |}|d kr td||S )NzNo layout with name )rj   KeyError)r5   rA   r1   r)   r)   r*   __getitem__   s    
zLayout.__getitem__r    c                    s   ddl m  ddlm ddlm} dd fdd| }||d	|jj d
d}ddddfdd||  |S )z/Get a tree renderable to show layout structure.r   )Styled)Tabler   r+   )r1   r3   c                    sF   | j  }jdd}| jr$t| n t| d}||| |}|S )N)r   r   r   r   )paddingZdim)ra   rI   Zgridr]   r   Zadd_row)r1   ZicontabletextZ_summary)rm   rn   r)   r*   summary   s    
zLayout.tree.<locals>.summarylayout.tree.T)guide_styleZ	highlightr    N)treer1   r3   c                    s2   |j D ]&} | j|d|jj d| qd S )Nrs   )rt   )rb   addra   rA   )ru   r1   rW   )recurserr   r)   r*   rw      s    
zLayout.tree.<locals>.recurse)Zrich.styledrm   Z
rich.tablern   	rich.treer    ra   rA   )r5   r    r1   ru   r)   )rm   rn   rw   rr   r*   ru      s    

zLayout.treerZ   )ra   )layoutsra   r3   c                G   sd   dd |D }z t |tr|n
| j|  | _W n" tk
rP   td|Y nX || jdd< dS )zSplit the layout in to multiple sub-layouts.

        Args:
            *layouts (Layout): Positional arguments should be (sub) Layout instances.
            splitter (Union[Splitter, str]): Splitter instance or name of splitter.
        c                 S   s"   g | ]}t |tr|nt|qS r)   
isinstancer+   rf   r1   r)   r)   r*   rg     s   z Layout.split.<locals>.<listcomp>zNo splitter called N)r{   rF   r`   ra   rk   r.   rb   )r5   ra   ry   _layoutsr)   r)   r*   split  s    
zLayout.split)ry   r3   c                 G   s   dd |D }| j | dS )zAdd a new layout(s) to existing split.

        Args:
            *layouts (Union[Layout, RenderableType]): Positional arguments should be renderables or (sub) Layout instances.

        c                 s   s$   | ]}t |tr|nt|V  qd S r4   rz   r|   r)   r)   r*   	<genexpr>&  s   z#Layout.add_split.<locals>.<genexpr>N)rb   extend)r5   ry   r}   r)   r)   r*   	add_split  s    zLayout.add_splitc                 G   s   | j |ddi dS )zSplit the layout in to a row (layouts side by side).

        Args:
            *layouts (Layout): Positional arguments should be (sub) Layout instances.
        ra   rO   Nr~   r5   ry   r)   r)   r*   	split_row,  s    zLayout.split_rowc                 G   s   | j |ddi dS )zSplit the layout in to a column (layouts stacked on top of each other).

        Args:
            *layouts (Layout): Positional arguments should be (sub) Layout instances.
        ra   rZ   Nr   r   r)   r)   r*   split_column4  s    zLayout.split_columnc                 C   s   | j dd= dS )zReset splits to initial state.Nrh   rH   r)   r)   r*   unsplit<  s    zLayout.unsplit)r^   r3   c              	   C   s   | j  || _W 5 Q R X dS )zjUpdate renderable.

        Args:
            renderable (RenderableType): New renderable object.
        N)rd   r_   )r5   r^   r)   r)   r*   update@  s    zLayout.updater   )r8   layout_namer3   c              	   C   sl   | j \ | | }| j| \}}|\}}}}	|||j||	}
t||
| j|< ||
|| W 5 Q R X dS )zRefresh a sub-layout.

        Args:
            console (Console): Console instance where Layout is to be rendered.
            layout_name (str): Name of layout.
        N)rd   rc   render_linesr9   update_dimensionsr!   Zupdate_screen_lines)r5   r8   r   r1   r"   _linesrS   rT   rD   r>   linesr)   r)   r*   refresh_screenI  s     zLayout.refresh_screen)rD   r>   r3   c                 C   s   | t dd||fg}|j}|j}g }|j}|rl||  |d \}}	|j}
|
r*|j|
|	D ]}|| q\q*dd t|tddD }|S )z,Create a dict that maps layout on to Region.r   c                 S   s   i | ]\}}||qS r)   r)   rf   r1   r"   r)   r)   r*   
<dictcomp>i  s    z+Layout._make_region_map.<locals>.<dictcomp>r   )key)r   appendpoprK   ra   rL   sortedr   )r5   rD   r>   stackpushr   layout_regionsZappend_layout_regionr1   r"   rK   Zchild_and_region
region_mapr)   r)   r*   _make_region_mapZ  s     
zLayout._make_region_mapr7   c                 C   sv   |j }|jp|j}| ||}dd | D }i }|j}|j}	|D ],\}
}||
j|	|j|j}t||||
< qD|S )zRender the sub_layouts.

        Args:
            console (Console): Console instance.
            options (ConsoleOptions): Console options.

        Returns:
            RenderMap: A dict that maps Layout on to a tuple of Region, lines
        c                 S   s   g | ]\}}|j s||fqS r)   )rK   r   r)   r)   r*   rg   |  s   z!Layout.render.<locals>.<listcomp>)	r?   r>   r   itemsr   r   r^   rD   r!   )r5   r8   r9   Zrender_widthZrender_heightr   r   
render_mapr   r   r1   r"   r   r)   r)   r*   r#   o  s     
 zLayout.renderc              	   c   s   | j  |jp|j}|jp|j}| ||||}|| _dd t|D }t}|	 D ]>\}}	|\}
}}}t
||||| |	D ]\}}|| qqXt }|D ]}|E d H  |V  qW 5 Q R X d S )Nc                 S   s   g | ]}g qS r)   r)   )rf   _r)   r)   r*   rg     s     z+Layout.__rich_console__.<locals>.<listcomp>)rd   r?   rD   r>   r#   r   rc   ranger   valuesrR   r   r   line)r5   r8   r9   rD   r>   r   Zlayout_lines_islicer"   r   _xrT   Z_layout_widthZlayout_heightrO   r   new_lineZ
layout_rowr)   r)   r*   rE     s$     
zLayout.__rich_console__)N)(r$   r%   r&   r'   rN   rY   r`   r   r   rM   intboolr6   r   re   propertyr^   r
   rK   	RenderMapri   rj   rl   ru   r   rF   r~   r   r   r   r   r   r   	RegionMapr   r   r   r#   r   rE   r)   r)   r)   r*   r+      s^   
 *

	 __main__)r   header   )rA   r@   main)r\   rA   
   footer)r@   rA   Zside)rA   body   )rA   r\   contents2topr<   ZbottomZleft1Zleft2ZfooN)@abcr   r   	itertoolsr   operatorr   	threadingr   typingr   r   r	   r
   r   r   r   r   r   Z_ratior   Zalignr   r8   r   r   r   r   rC   r   Zpanelr   prettyr   r"   r   reprr   r   segmentr   r2   r   rx   r    r!   r   r   	Exceptionr,   r.   r/   rF   rN   rY   r+   r$   Zrich.consoler1   r   r   ru   r   printr)   r)   r)   r*   <module>   s`   ,  



   