U
    ouf(                     @  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 dddddg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ddZeddddd	d
dZdS )r   z&
    Base interface for a margin.
    Callable[[], UIContent]intget_ui_contentreturnc                 C  s   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   A/tmp/pip-unpacked-wheel-8milen2s/prompt_toolkit/layout/margins.py	get_width$   s    	zMargin.get_widthr   r	   window_render_info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_margin/   s    zMargin.create_marginN)__name__
__module____qualname____doc__r   r   r$   r   r   r   r   r      s
   
)	metaclassc                   @  sH   e Zd ZdZdddddddZdd	d
ddZdd	d	d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.
    Fr   None)relativedisplay_tildesr   c                 C  s   t || _t || _d S N)r   r+   r,   )r   r+   r,   r   r   r   __init__N   s    
zNumberedMargin.__init__r   r   r   c                 C  s   | j }tdtd| d S )N   z%sr   )
line_countmaxlen)r   r   r0   r   r   r   r   T   s    zNumberedMargin.get_widthr   r	   r   c                 C  s   |   }d}d}|jjj}g }d }	t|jD ]\}
}||	kr|d krFnr||kr|rj||d|d  f q||d|d  |f n0|rt|| d }||d|d  |f |}	|d q,| 	 r|
|j
k r|d |
d7 }
q|S )Nzclass:line-numberzclass:line-number.currentz%ir   z%i  
)zclass:tildez~
)r+   Z
ui_contentZcursor_positiony	enumeratedisplayed_linesappendrjustabsr,   window_height)r   r    r!   r"   r+   styleZstyle_currentZcurrent_linenoresultZlast_linenor6   linenor   r   r   r$   X   s4    



zNumberedMargin.create_marginN)FFr%   r&   r'   r(   r.   r   r$   r   r   r   r   r   D   s   
   c                   @  sF   e Zd ZdZddddddZdd	d
ddZdd	d	ddddZdS )r   zJ
    Wrapper around other :class:`.Margin` classes to show/hide them.
    r   r   r*   )marginfilterr   c                 C  s   || _ t|| _d S r-   )rA   r   rB   )r   rA   rB   r   r   r   r.      s    zConditionalMargin.__init__r   r   r   c                 C  s   |   r| j|S dS d S )Nr   )rB   rA   r   r   r   r   r   r      s    zConditionalMargin.get_widthr   r	   r   c                 C  s$   |r|   r| j|||S g S d S r-   )rB   rA   r$   r#   r   r   r   r$      s    zConditionalMargin.create_marginNr@   r   r   r   r   r      s   c                   @  sJ   e Zd ZdZddddddd	d
ZdddddZdddddddZdS )r   zc
    Margin displaying a scrollbar.

    :param display_arrows: Display scroll up/down arrows.
    F^vr   strr*   )display_arrowsup_arrow_symboldown_arrow_symbolr   c                 C  s   t || _|| _|| _d S r-   )r   rF   rG   rH   )r   rF   rG   rH   r   r   r   r.      s    
zScrollbarMargin.__init__r   r   r   c                 C  s   dS )Nr   r   r   r   r   r   r      s    zScrollbarMargin.get_widthr   r	   r   c                   s\  |j }|j}|  }|r |d8 }zHt|jt| }|jt| }tt|t	d||  t|| W n t
k
r   g  Y S X ddd fdd}	g }
|r|
d| jfd	g d
}d}d}d}t|D ]p}|	|r|	|d s|
|df n|
|df n,|	|d r$|
|df n|
|df |
d q|rT|
d| jf |
S d S )N   r   r   bool)rowr   c                   s   |   ko  kS   S )z/True if we should display a button on this row.r   )rK   Zscrollbar_heightZscrollbar_topr   r   is_scroll_button   s    z7ScrollbarMargin.create_margin.<locals>.is_scroll_buttonzclass:scrollbar.arrow)zclass:scrollbarr5   zclass:scrollbar.backgroundz*class:scrollbar.background,scrollbar.startzclass:scrollbar.buttonz$class:scrollbar.button,scrollbar.end r3   )content_heightr<   rF   r2   r8   floatZvertical_scrollr   minr1   ZeroDivisionErrorextendrG   ranger9   rH   )r   r    r!   r"   rO   r<   rF   Zfraction_visibleZfraction_aboverM   r>   Zscrollbar_backgroundZscrollbar_background_startZscrollbar_buttonZscrollbar_button_endir   rL   r   r$      sP    


zScrollbarMargin.create_marginN)FrC   rD   r@   r   r   r   r   r      s      
c                   @  sH   e Zd ZdZdddddddZd	d
dddZdd
d
d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.
    Nz Callable[[], StyleAndTextTuples]z5None | Callable[[int, int, bool], StyleAndTextTuples]r*   )
get_promptget_continuationr   c                 C  s   || _ || _d S r-   )rV   rW   )r   rV   rW   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
   rV   r   )r   r   textr   r   r   r     s    zPromptMargin.get_widthr   r	   r   c              	   C  sd   | j }g }|t|   |r`d }|jdd  D ],}|d |t|||||k |}q2|S )Nr   r3   )rW   rS   r   rV   r8   r9   )r   r    r!   r"   rW   r>   Zlast_yr6   r   r   r   r$     s    
zPromptMargin.create_margin)Nr@   r   r   r   r   r      s
    	N)r(   
__future__r   abcr   r   typingr   r   Zprompt_toolkit.filtersr   r   Zprompt_toolkit.formatted_textr	   r
   r   Zprompt_toolkit.utilsr   controlsr   Z
containersr   __all__r   r   r   r   r   r   r   r   r   <module>   s(   	%DV