o
    i6                     @  s   d Z ddlmZ ddlmZmZmZmZmZm	Z	 ddl
mZ ddlmZmZmZmZmZ ddlmZmZmZ g dZe	eeeef ZG d	d
 d
ZG dd deZddddZdS )z
Wrapper for the layout.
    )annotations)Dict	GeneratorIterableListOptionalUnion)Buffer   )AnyContainerConditionalContainer	ContainerWindowto_container)BufferControlSearchBufferControl	UIControl)LayoutInvalidLayoutErrorwalkc                   @  s@  e Zd ZdZ	dLdMd	d
ZdNddZdOddZdPddZdQddZdRddZ	e
dSddZejdTddZe
dUd!d"ZejdVd#d"Ze
dWd$d%Ze
dXd'd(ZdYd*d+ZdZd-d.Ze
d[d0d1Zd\d3d4Ze
dWd5d6Ze
dSd7d8Zd]d9d:Zd]d;d<Zd]d=d>Zd^d@dAZd^dBdCZd]dDdEZd]dFdGZd_dJdKZdS )`r   aL  
    The layout for a prompt_toolkit
    :class:`~prompt_toolkit.application.Application`.
    This also keeps track of which user control is focused.

    :param container: The "root" container for the layout.
    :param focused_element: element to be focused initially. (Can be anything
        the `focus` function accepts.)
    N	containerr   focused_elementFocusableElement | NonereturnNonec              
   C  st   t || _g | _i | _i | _|d u r0z| jt|   W n ty/ } zt	d|d }~ww | 
| g | _d S )Nz>Invalid layout. The layout does not contain any Window object.)r   r   _stacksearch_links_child_to_parentappendnextfind_all_windowsStopIterationr   focusvisible_windows)selfr   r   e r&   W/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/prompt_toolkit/layout/layout.py__init__'   s"   


zLayout.__init__strc                 C  s   d| j d| jdS )NzLayout(z, current_window=))r   current_windowr$   r&   r&   r'   __repr__I   s   zLayout.__repr__Generator[Window, None, None]c                 c  s$    |   D ]
}t|tr|V  qdS )zJ
        Find all the :class:`.UIControl` objects in this layout.
        N)r   
isinstancer   )r$   itemr&   r&   r'   r    L   s   
zLayout.find_all_windowsIterable[UIControl]c                 c  s    |   D ]}|jV  qd S N)r    contentr$   r   r&   r&   r'   find_all_controlsT   s   
zLayout.find_all_controlsvalueFocusableElementc                 C  s  t |tr'|  D ]}t |tr|jj|kr| |  dS q	td|dt |trM|  D ]}t |trD|j|krD| |  dS q0td|dt |t	ri||  vr\td|
 sdtd|| _dS t|}t |tr||  vrtd|f || _dS g }t|ddD ]}t |tr|j
 r|| qt| jD ]}||v r|| _ dS q|r|d	 | _dS td
|)a  
        Focus the given UI element.

        `value` can be either:

        - a :class:`.UIControl`
        - a :class:`.Buffer` instance or the name of a :class:`.Buffer`
        - a :class:`.Window`
        - Any container object. In this case we will focus the :class:`.Window`
          from this container that was focused most recent, or the very first
          focusable :class:`.Window` of the container.
        Nz,Couldn't find Buffer in the current layout: .z7Invalid value. Container does not appear in the layout.z*Invalid value. UIControl is not focusable.z7Invalid value. Window does not appear in the layout: %rTskip_hiddenr   z,Invalid value. Container cannot be focused: )r/   r)   r5   r   buffernamer"   
ValueErrorr	   r   is_focusablecurrent_controlr   r   r    r+   r   r3   r   reversedr   )r$   r6   controlwindowscwr&   r&   r'   r"   X   s^   









zLayout.focusboolc                 C  s   t |tr| jdu rdS | jj|kS t |tr| j|kS t |tr&| j|kS t|}t |tr4| j	|kS t
|D ]
}|| j	krB dS q8dS )z
        Check whether the given control has the focus.
        :param value: :class:`.UIControl` or :class:`.Window` instance.
        NFT)r/   r)   current_bufferr<   r	   r   r?   r   r   r+   r   )r$   r6   elementr&   r&   r'   	has_focus   s    








zLayout.has_focusr   c                 C  s   | j d jS )zI
        Get the :class:`.UIControl` to currently has the focus.
        )r   r3   r,   r&   r&   r'   r?      s   zLayout.current_controlrA   c                 C  s,   |   D ]}|j|kr|| _ dS qtd)zC
        Set the :class:`.UIControl` to receive the focus.
        Nz(Control not found in the user interface.)r    r3   r+   r=   )r$   rA   windowr&   r&   r'   r?      s   
r   c                 C  s
   | j d S )z=Return the :class:`.Window` object that is currently focused.rI   )r   r,   r&   r&   r'   r+      s   
zLayout.current_windowc                 C  s   | j | dS )z8Set the :class:`.Window` object to be currently focused.N)r   r   )r$   r6   r&   r&   r'   r+      s   c                 C  s   | j | jv S )z#True if we are searching right now.)r?   r   r,   r&   r&   r'   is_searching   s   zLayout.is_searchingBufferControl | Nonec                 C  s    | j }t|tr| j|S dS )zY
        Return the :class:`.BufferControl` in which we are searching or `None`.
        N)r?   r/   r   r   get)r$   rA   r&   r&   r'   search_target_buffer_control   s   
z#Layout.search_target_buffer_controlIterable[Window]c                 c  s.    |   D ]}t|tr|j r|V  qdS )zl
        Return all the :class:`.Window` objects which are focusable (in the
        'modal' area).
        N)walk_through_modal_arear/   r   r3   r>   )r$   rD   r&   r&   r'   get_focusable_windows   s   zLayout.get_focusable_windowslist[Window]c                   s   | j   fdd|  D S )zO
        Return a list of :class:`.Window` objects that are focusable.
        c                   s   g | ]}| v r|qS r&   r&   ).0rD   r#   r&   r'   
<listcomp>   s    z8Layout.get_visible_focusable_windows.<locals>.<listcomp>)r#   rQ   r,   r&   rT   r'   get_visible_focusable_windows   s   z$Layout.get_visible_focusable_windowsBuffer | Nonec                 C  s   | j }t|tr|jS dS )zD
        The currently focused :class:`~.Buffer` or `None`.
        N)r?   r/   r   r;   r$   
ui_controlr&   r&   r'   rF     s   
zLayout.current_bufferbuffer_namec                 C  sB   |   D ]}t|trt|jtr|jjj|kr|jj  S qdS )zt
        Look in the layout for a buffer with the given name.
        Return `None` when nothing was found.
        N)r   r/   r   r3   r   r;   r<   )r$   rZ   rD   r&   r&   r'   get_buffer_by_name  s   zLayout.get_buffer_by_namec                 C  s   | j }t|tS )z
        Return `True` if the currently focused control is a
        :class:`.BufferControl`. (For instance, used to determine whether the
        default key bindings should be active or not.)
        )r?   r/   r   rX   r&   r&   r'   buffer_has_focus  s   
zLayout.buffer_has_focusc                 C  s.   z| j d jW S  ty   | j d j Y S w )zJ
        Get the :class:`.UIControl` to previously had the focus.
        rI   )r   r3   
IndexErrorr,   r&   r&   r'   previous_control!  s
   zLayout.previous_controlc                 C  s&   t | jdkr| jdd | _dS dS )z=
        Give the focus to the last focused control.
        r
   NrI   )lenr   r,   r&   r&   r'   
focus_last+  s   zLayout.focus_lastc                 C  sb   |   }t|dkr/z|| j}W n ty   d}Y n	w |d t| }| ||  dS dS )z:
        Focus the next visible/focusable Window.
        r   r
   NrV   r`   indexr+   r=   r"   r$   rB   rc   r&   r&   r'   
focus_next2     zLayout.focus_nextc                 C  sb   |   }t|dkr/z|| j}W n ty   d}Y n	w |d t| }| ||  dS dS )z>
        Focus the previous visible/focusable Window.
        r   r
   Nrb   rd   r&   r&   r'   focus_previousB  rf   zLayout.focus_previousIterable[Container]c                 c  s    t | jE dH  dS )zX
        Walk through all the layout nodes (and their children) and yield them.
        N)r   r   r,   r&   r&   r'   r   R  s   zLayout.walkc                 c  sH    | j }| s|| jv r| j| }| s|| jv st|E dH  dS )zn
        Walk through all the containers which are in the current 'modal' part
        of the layout.
        N)r+   is_modalr   r   )r$   rootr&   r&   r'   rP   X  s   
zLayout.walk_through_modal_areac                   s(   i  d fdd| j   | _dS )	z=
        Update child->parent relationships mapping.
        r%   r   r   r   c                   s"   |   D ]
}|  |< | qd S r2   )get_children)r%   rC   parentsr   r&   r'   r   k  s   
z-Layout.update_parents_relations.<locals>.walkN)r%   r   r   r   )r   r   r,   r&   rl   r'   update_parents_relationse  s   

zLayout.update_parents_relationsc                 C  s   | j   | j  d S r2   )r   clearr   resetr,   r&   r&   r'   rp   t  s   
zLayout.resetr   Container | Nonec                 C  s"   z| j | W S  ty   Y dS w )zo
        Return the parent container for the given container, or ``None``, if it
        wasn't found.
        N)r   KeyErrorr4   r&   r&   r'   
get_parent}  s
   zLayout.get_parentr2   )r   r   r   r   r   r   )r   r)   )r   r.   )r   r1   )r6   r7   r   r   )r6   r7   r   rE   )r   r   )rA   r   r   r   )r   r   )r6   r   r   r   )r   rE   )r   rL   )r   rO   )r   rR   )r   rW   )rZ   r)   r   rW   )r   r   )r   rh   )r   r   r   rq   )__name__
__module____qualname____doc__r(   r-   r    r5   r"   rH   propertyr?   setterr+   rK   rN   rQ   rV   rF   r[   r\   r_   ra   re   rg   r   rP   rn   rp   rs   r&   r&   r&   r'   r      sL    
"



O

		
		
	





	r   c                   @  s   e Zd ZdS )r   N)rt   ru   rv   r&   r&   r&   r'   r     s    r   Fr   r   r:   rE   r   rh   c                 c  sF    |rt | tr|  sdS | V  |  D ]}t||dE dH  qdS )z:
    Walk through layout, starting at this container.
    Nr9   )r/   r   filterrk   r   )r   r:   rC   r&   r&   r'   r     s   r   N)F)r   r   r:   rE   r   rh   )rw   
__future__r   typingr   r   r   r   r   r   prompt_toolkit.bufferr	   
containersr   r   r   r   r   controlsr   r   r   __all__r)   r7   r   	Exceptionr   r   r&   r&   r&   r'   <module>   s       n