o
    ˷e(                     @   s   d Z ddlmZmZ ddlmZ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`.
    )ABCMetaabstractmethod)TYPE_CHECKINGCallableOptional)FilterOrBool	to_filter)StyleAndTextTuplesfragment_list_to_textto_formatted_text)
get_cwidth   )	UIContent)WindowRenderInfo)MarginNumberedMarginScrollbarMarginConditionalMarginPromptMarginc                	   @   sL   e Zd ZdZedeg ef defddZeddded	ede	fd
dZ
dS )r   z&
    Base interface for a margin.
    get_ui_contentreturnc                 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   T/var/www/ideatree/venv/lib/python3.10/site-packages/prompt_toolkit/layout/margins.py	get_width"   s   	zMargin.get_widthwindow_render_infor   widthheightc                 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_margin-   s   zMargin.create_marginN)__name__
__module____qualname____doc__r   r   r   intr   r	   r!   r   r   r   r   r      s    
r   )	metaclassc                   @   s^   e Zd ZdZ	ddededdfddZd	eg ef defd
dZ	dddedede
f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relativedisplay_tildesr   Nc                 C   s   t || _t || _d S N)r   r(   r)   )r   r(   r)   r   r   r   __init__L   s   
zNumberedMargin.__init__r   c                 C   s   | j }tdtd| d S )N   z%sr   )
line_countmaxlen)r   r   r-   r   r   r   r   S   s   zNumberedMargin.get_widthr   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_linenor5   linenor   r   r   r!   W   s6   



zNumberedMargin.create_margin)FF)r"   r#   r$   r%   r   r+   r   r   r&   r   r	   r!   r   r   r   r   r   B   s(    

r   c                   @   sZ   e Zd ZdZdededdfddZdeg ef de	fd	d
Z
ddde	de	defddZdS )r   zJ
    Wrapper around other :class:`.Margin` classes to show/hide them.
    marginfilterr   Nc                 C   s   || _ t|| _d S r*   )rB   r   rC   )r   rB   rC   r   r   r   r+      s   zConditionalMargin.__init__r   c                 C   s   |   r
| j|S dS )Nr   )rC   rB   r   r   r   r   r   r      s   zConditionalMargin.get_widthr   r   r   r   c                 C   s    |r|   r| j|||S g S r*   )rC   rB   r!   r    r   r   r   r!      s   zConditionalMargin.create_margin)r"   r#   r$   r%   r   r   r+   r   r   r&   r   r	   r!   r   r   r   r   r      s    r   c                	   @   sf   e Zd ZdZ			ddedededd	fd
dZdeg ef de	fddZ
ddde	de	defddZd	S )r   zc
    Margin displaying a scrollbar.

    :param display_arrows: Display scroll up/down arrows.
    F^vdisplay_arrowsup_arrow_symboldown_arrow_symbolr   Nc                 C   s   t || _|| _|| _d S r*   )r   rF   rG   rH   )r   rF   rG   rH   r   r   r   r+      s   

zScrollbarMargin.__init__r   c                 C   r   )Nr   r   r   r   r   r   r      s   zScrollbarMargin.get_widthr   r   r   r   c                    sR  |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tdtf fdd}	g }
|rZ|
d| jfdg d	}d
}d}d}t|D ]6}|	|r|	|d sz|
|df n|
|df n|	|d r|
|df n|
|df |
d qf|r|
d| jf |
S )N   r   rowr   c                    s   |   ko  kS   S )z/True if we should display a button on this row.r   )rJ   scrollbar_heightscrollbar_topr   r   is_scroll_button   s   z7ScrollbarMargin.create_margin.<locals>.is_scroll_buttonzclass:scrollbar.arrow)zclass:scrollbarr2   zclass:scrollbar.backgroundz*class:scrollbar.background,scrollbar.startzclass:scrollbar.buttonz$class:scrollbar.button,scrollbar.end r0   )content_heightr;   rF   r/   r7   floatvertical_scrollr&   minr.   ZeroDivisionErrorboolextendrG   ranger8   rH   )r   r   r   r   rP   r;   rF   fraction_visiblefraction_aboverN   r?   scrollbar_backgroundscrollbar_background_startscrollbar_buttonscrollbar_button_endir   rK   r   r!      sR   
zScrollbarMargin.create_margin)FrD   rE   )r"   r#   r$   r%   r   strr+   r   r   r&   r   r	   r!   r   r   r   r   r      s0    
r   c                	   @   sx   e Zd ZdZ	ddeg ef deeeeegef  ddfddZ	deg e
f defd	d
Zdddededef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get_continuationr   c                 C   s   || _ || _d S r*   )r`   ra   )r   r`   ra   r   r   r   r+     s   
zPromptMargin.__init__r   c                 C   s   t |  }t|S )z Width to report to the `Window`.)r
   r`   r   )r   r   textr   r   r   r     s   zPromptMargin.get_widthr   r   r   r   c              	   C   sd   | j }g }|t|   |r0d }|jdd  D ]}|d |t|||||k |}q|S )Nr   r0   )ra   rV   r   r`   r7   r8   )r   r   r   r   ra   r?   last_yr5   r   r   r   r!     s   
zPromptMargin.create_marginr*   )r"   r#   r$   r%   r   r	   r   r&   rU   r+   r   r   r!   r   r   r   r   r      s,    

r   N)r%   abcr   r   typingr   r   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    	%EW