a
    lc6                     @   s   d 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eeee dddZdS )z
Wrapper for the layout.
    )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d;eee ddddZedddZ	e
eddf dd	d
Zee dddZeddddZeedddZeedddZejeddddZeedddZejeddddZeedddZeee dddZee dddZee ddd Zeee dd!d"Zeee d#d$d%Zeedd&d'Z eedd(d)Z!ddd*d+Z"ddd,d-Z#ddd.d/Z$ee% dd0d1Z&ee% dd2d3Z'ddd4d5Z(ddd6d7Z)e%ee% d8d9d: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)	containerfocused_elementreturnc              
   C   s   t || _g | _i | _i | _|d u rnz| jt|   W qx tyj } zt	d|W Y d }~qxd }~0 0 n
| 
| 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#   X/var/www/html/django/DPS/env/lib/python3.9/site-packages/prompt_toolkit/layout/layout.py__init__%   s    

zLayout.__init__)r   c                 C   s   d| j d| jdS )NzLayout(z, current_window=))r   current_windowr!   r#   r#   r$   __repr__H   s    zLayout.__repr__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   K   s    
zLayout.find_all_windowsc                 c   s   |   D ]}|jV  qd S N)r   contentr!   r   r#   r#   r$   find_all_controlsS   s    zLayout.find_all_controls)valuer   c                 C   s  t |trR|  D ]*}t |tr|jj|kr| |  dS qtd|dn@t |tr|  D ](}t |trd|j|krd| |  dS qdtd|dnt |t	r||  vrtd|
 std|| _nt|}t |tr||  vrtd|f || _ng }t|ddD ](}t |tr|j
 r|| qt| jD ]}||v rR|| _ dS qR|r|d	 | _dS td
|dS )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*   strr/   r   buffernamer   
ValueErrorr   r   is_focusablecurrent_controlr   r   r   r'   r   r-   r   reversedr   )r!   r0   controlwindowscwr#   r#   r$   r   W   sV    







zLayout.focusc                 C   s   t |tr$| jdu rdS | jj|kS t |tr8| j|kS t |trL| j|kS t|}t |trh| j	|kS t
|D ]}|| j	krp dS qpdS dS )z
        Check whether the given control has the focus.
        :param value: :class:`.UIControl` or :class:`.Window` instance.
        NFT)r*   r4   current_bufferr6   r   r   r9   r   r   r'   r   )r!   r0   elementr#   r#   r$   	has_focus   s    








zLayout.has_focusc                 C   s   | j d jS )zI
        Get the :class:`.UIControl` to currently has the focus.
        )r   r-   r(   r#   r#   r$   r9      s    zLayout.current_control)r;   r   c                 C   s0   |   D ]}|j|kr|| _ dS qtddS )zC
        Set the :class:`.UIControl` to receive the focus.
        Nz(Control not found in the user interface.)r   r-   r'   r7   )r!   r;   Zwindowr#   r#   r$   r9      s
    
c                 C   s
   | j d S )z=Return the :class:`.Window` object that is currently focused.rB   )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!   r0   r#   r#   r$   r'      s    c                 C   s   | j | jv S )z#True if we are searching right now.)r9   r   r(   r#   r#   r$   is_searching   s    zLayout.is_searchingc                 C   s$   | j }t|tr| j|S dS dS )zY
        Return the :class:`.BufferControl` in which we are searching or `None`.
        N)r9   r*   r   r   get)r!   r;   r#   r#   r$   search_target_buffer_control   s    
z#Layout.search_target_buffer_controlc                 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   r-   r8   )r!   r>   r#   r#   r$   get_focusable_windows   s    zLayout.get_focusable_windowsc                    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#   ).0r>   r    r#   r$   
<listcomp>       z8Layout.get_visible_focusable_windows.<locals>.<listcomp>)r    rG   r(   r#   rI   r$   get_visible_focusable_windows   s    z$Layout.get_visible_focusable_windowsc                 C   s   | j }t|tr|jS dS )zD
        The currently focused :class:`~.Buffer` or `None`.
        N)r9   r*   r   r5   r!   Z
ui_controlr#   r#   r$   r?     s    
zLayout.current_buffer)buffer_namer   c                 C   sB   |   D ]4}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   r-   r   r5   r6   )r!   rN   r>   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.)
        )r9   r*   r   rM   r#   r#   r$   buffer_has_focus  s    zLayout.buffer_has_focusc                 C   s2   z| j d jW S  ty,   | j d j Y S 0 dS )zJ
        Get the :class:`.UIControl` to previously had the focus.
        rB   N)r   r-   
IndexErrorr(   r#   r#   r$   previous_control   s    zLayout.previous_controlc                 C   s"   t | jdkr| jdd | _dS )z=
        Give the focus to the last focused control.
        r	   NrB   )lenr   r(   r#   r#   r$   
focus_last*  s    zLayout.focus_lastc                 C   s^   |   }t|dkrZz|| j}W n ty:   d}Y n0 |d t| }| ||  dS )z:
        Focus the next visible/focusable Window.
        r   r	   NrL   rT   indexr'   r7   r   r!   r<   rW   r#   r#   r$   
focus_next1  s    
zLayout.focus_nextc                 C   s^   |   }t|dkrZz|| j}W n ty:   d}Y n0 |d t| }| ||  dS )z>
        Focus the previous visible/focusable Window.
        r   r	   NrV   rX   r#   r#   r$   focus_previousA  s    
zLayout.focus_previousc                 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   Q  s    zLayout.walkc                 c   s6   | j }| s$|| jv r$| j| }qt|E dH  dS )zn
        Walk through all the containers which are in the current 'modal' part
        of the layout.
        N)r'   Zis_modalr   r   )r!   rootr#   r#   r$   rF   W  s    zLayout.walk_through_modal_areac                    s.   i  t dd fdd| j  | _dS )z=
        Update child->parent relationships mapping.
        N)r"   r   c                    s"   |   D ]}|  |< | qd S r,   )get_children)r"   r=   parentsr   r#   r$   r   j  s    z-Layout.update_parents_relations.<locals>.walk)r   r   r   r(   r#   r]   r$   update_parents_relationsd  s    
zLayout.update_parents_relationsc                 C   s   | j   | j  d S r,   )r   clearr   resetr(   r#   r#   r$   ra   s  s    
zLayout.reset)r   r   c                 C   s&   z| j | W S  ty    Y dS 0 dS )zo
        Return the parent container for the given container, or ``None``, if it
        wasn't found.
        N)r   KeyErrorr.   r#   r#   r$   
get_parent|  s    zLayout.get_parent)N)+__name__
__module____qualname____doc__r
   r   FocusableElementr%   r4   r)   r   r   r   r   r   r/   r   boolrA   propertyr9   setterr'   rC   r   rE   rG   r   rL   r   r?   rO   rP   rS   rU   rY   rZ   r   r   rF   r_   ra   rc   r#   r#   r#   r$   r      sR    #O						r   c                   @   s   e Zd ZdS )r   N)rd   re   rf   r#   r#   r#   r$   r     s   r   F)r   r3   r   c                 c   sD   |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.
    Nr2   )r*   r   filterr\   r   )r   r3   r=   r#   r#   r$   r     s    r   N)F)rg   typingr   r   r   r   r   r   Zprompt_toolkit.bufferr   
containersr
   r   r   r   r   Zcontrolsr   r   r   __all__r4   rh   r   	Exceptionr   ri   r   r#   r#   r#   r$   <module>   s      o