o
    Df(                     @  s   d Z ddlmZ ddlmZmZ ddlmZmZ ddl	m
Z
mZ ddlmZmZmZ ddlmZ dd	lmZ er>dd
lmZ g dZG dd dedZG dd deZG dd deZG dd deZG dd deZdS )zQ
Margin implementations for a :class:`~prompt_toolkit.layout.containers.Window`.
    )annotations)ABCMetaabstractmethod)TYPE_CHECKINGCallable)FilterOrBool	to_filter)StyleAndTextTuplesfragment_list_to_textto_formatted_text)
get_cwidth   )	UIContent)WindowRenderInfo)MarginNumberedMarginScrollbarMarginConditionalMarginPromptMarginc                   @  s,   e Zd ZdZedddZedddZdS )r   z&
    Base interface for a margin.
    get_ui_contentCallable[[], UIContent]returnintc                 C     dS )a  
        Return the width that this margin is going to consume.

        :param get_ui_content: Callable that asks the user control to create
            a :class:`.UIContent` instance. This can be used for instance to
            obtain the number of lines.
        r    selfr   r   r   V/home/ubuntu/webapp/venv/lib/python3.10/site-packages/prompt_toolkit/layout/margins.py	get_width%   s   	zMargin.get_widthwindow_render_infor   widthheightr	   c                 C  s   g S )a  
        Creates a margin.
        This should return a list of (style_str, text) tuples.

        :param window_render_info:
            :class:`~prompt_toolkit.layout.containers.WindowRenderInfo`
            instance, generated after rendering and copying the visible part of
            the :class:`~prompt_toolkit.layout.controls.UIControl` into the
            :class:`~prompt_toolkit.layout.containers.Window`.
        :param width: The width that's available for this margin. (As reported
            by :meth:`.get_width`.)
        :param height: The height that's available for this margin. (The height
            of the :class:`~prompt_toolkit.layout.containers.Window`.)
        r   r   r   r    r!   r   r   r   create_margin0   s   zMargin.create_marginNr   r   r   r   r   r   r    r   r!   r   r   r	   )__name__
__module____qualname____doc__r   r   r#   r   r   r   r   r       s    
r   )	metaclassc                   @  s2   e Zd ZdZ	dddd	ZdddZdddZdS )r   a  
    Margin that displays the line numbers.

    :param relative: Number relative to the cursor position. Similar to the Vi
                     'relativenumber' option.
    :param display_tildes: Display tildes after the end of the document, just
        like Vi does.
    Frelativer   display_tildesr   Nonec                 C  s   t || _t || _d S N)r   r+   r,   )r   r+   r,   r   r   r   __init__O   s   
zNumberedMargin.__init__r   r   r   c                 C  s   | j }tdt| d S )N   r   )
line_countmaxlen)r   r   r1   r   r   r   r   U   s   zNumberedMargin.get_widthr   r   r    r!   r	   c                 C  s   |   }d}d}|jjj}g }d }	t|jD ]M\}
}||	kr\|d u r#n9||krD|r5||d|d  f n'||d|d  |f n|rNt|| d }||d|d  |f |}	|d q| 	 r{|
|j
k r{|d |
d7 }
|
|j
k sm|S )Nzclass:line-numberzclass:line-number.currentz%ir   z%i  
)zclass:tildez~
)r+   
ui_contentcursor_positiony	enumeratedisplayed_linesappendrjustabsr,   window_height)r   r   r    r!   r+   stylestyle_currentcurrent_linenoresultlast_linenor9   linenor   r   r   r#   Y   s6   



zNumberedMargin.create_marginN)FF)r+   r   r,   r   r   r-   r$   r%   r&   r'   r(   r)   r/   r   r#   r   r   r   r   r   E   s    

r   c                   @  s.   e Zd ZdZddd	ZdddZdddZdS )r   zJ
    Wrapper around other :class:`.Margin` classes to show/hide them.
    marginr   filterr   r   r-   c                 C  s   || _ t|| _d S r.   )rG   r   rH   )r   rG   rH   r   r   r   r/      s   zConditionalMargin.__init__r   r   r   c                 C  s   |   r
| j|S dS )Nr   )rH   rG   r   r   r   r   r   r      s   zConditionalMargin.get_widthr   r   r    r!   r	   c                 C  s    |r|   r| j|||S g S r.   )rH   rG   r#   r"   r   r   r   r#      s   zConditionalMargin.create_marginN)rG   r   rH   r   r   r-   r$   r%   rF   r   r   r   r   r      s
    

r   c                   @  s6   e Zd ZdZ			ddddZdddZdddZdS )r   zc
    Margin displaying a scrollbar.

    :param display_arrows: Display scroll up/down arrows.
    F^vdisplay_arrowsr   up_arrow_symbolstrdown_arrow_symbolr   r-   c                 C  s   t || _|| _|| _d S r.   )r   rK   rL   rN   )r   rK   rL   rN   r   r   r   r/      s   

zScrollbarMargin.__init__r   r   r   c                 C  r   )Nr   r   r   r   r   r   r      s   zScrollbarMargin.get_widthr   r   r    r!   r	   c                   sJ  |j }|j}|  }|r|d8 }z$t|jt| }|jt| }tt|t	d||  t|| W n t
y?   g  Y S w d fdd}	g }
|rV|
d	| jfd
g d}d}d}d}t|D ]6}|	|r~|	|d sv|
|df n|
|df n|	|d r|
|df n|
|df |
d qb|r|
d	| jf |
S )N   r   rowr   r   boolc                   s   |   ko  kS   S )z/True if we should display a button on this row.r   )rP   scrollbar_heightscrollbar_topr   r   is_scroll_button   s   z7ScrollbarMargin.create_margin.<locals>.is_scroll_buttonzclass:scrollbar.arrow)zclass:scrollbarr6   zclass:scrollbar.backgroundz*class:scrollbar.background,scrollbar.startzclass:scrollbar.buttonz$class:scrollbar.button,scrollbar.end r4   )rP   r   r   rQ   )content_heightr?   rK   r3   r;   floatvertical_scrollr   minr2   ZeroDivisionErrorextendrL   ranger<   rN   )r   r   r    r!   rW   r?   rK   fraction_visiblefraction_aboverU   rC   scrollbar_backgroundscrollbar_background_startscrollbar_buttonscrollbar_button_endir   rR   r   r#      sR   
zScrollbarMargin.create_marginN)FrI   rJ   )rK   r   rL   rM   rN   rM   r   r-   r$   r%   rF   r   r   r   r   r      s    

r   c                   @  s2   e Zd ZdZ	ddd	d
ZdddZdddZdS )r   a  
    [Deprecated]

    Create margin that displays a prompt.
    This can display one prompt at the first line, and a continuation prompt
    (e.g, just dots) on all the following lines.

    This `PromptMargin` implementation has been largely superseded in favor of
    the `get_line_prefix` attribute of `Window`. The reason is that a margin is
    always a fixed width, while `get_line_prefix` can return a variable width
    prefix in front of every line, making it more powerful, especially for line
    continuations.

    :param get_prompt: Callable returns formatted text or a list of
        `(style_str, type)` tuples to be shown as the prompt at the first line.
    :param get_continuation: Callable that takes three inputs. The width (int),
        line_number (int), and is_soft_wrap (bool). It should return formatted
        text or a list of `(style_str, type)` tuples for the next lines of the
        input.
    N
get_prompt Callable[[], StyleAndTextTuples]get_continuation5None | Callable[[int, int, bool], StyleAndTextTuples]r   r-   c                 C  s   || _ || _d S r.   )re   rg   )r   re   rg   r   r   r   r/     s   
zPromptMargin.__init__r   r   r   c                 C  s   t |  }t|S )z Width to report to the `Window`.)r
   re   r   )r   r   textr   r   r   r     s   zPromptMargin.get_widthr   r   r    r!   r	   c              	   C  sd   | j }g }|t|   |r0d }|jdd  D ]}|d |t|||||k |}q|S )Nr   r4   )rg   r\   r   re   r;   r<   )r   r   r    r!   rg   rC   last_yr9   r   r   r   r#     s   
zPromptMargin.create_marginr.   )re   rf   rg   rh   r   r-   r$   r%   rF   r   r   r   r   r      s    
	r   N)r)   
__future__r   abcr   r   typingr   r   prompt_toolkit.filtersr   r   prompt_toolkit.formatted_textr	   r
   r   prompt_toolkit.utilsr   controlsr   
containersr   __all__r   r   r   r   r   r   r   r   r   <module>   s     	%DV