U
    Z+d(                     @  s   d Z ddlm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rd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Optional)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-blk8czbf/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   r1   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_linenor7   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.   )rB   r	   rC   )r   rB   rC   r   r   r   r/      s    zConditionalMargin.__init__r   r   r   c                 C  s   |   r| j|S dS d S )Nr   )rC   rB   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.   )rC   rB   r%   r$   r   r   r   r%      s    zConditionalMargin.create_marginNrA   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	   rG   rH   rI   )r   rG   rH   rI   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   )rL   Zscrollbar_heightZ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   )content_heightr=   rG   r3   r9   floatZvertical_scrollr   minr2   ZeroDivisionErrorextendrH   ranger:   rI   )r   r!   r"   r#   rP   r=   rG   Zfraction_visibleZfraction_aboverN   r?   Zscrollbar_backgroundZscrollbar_background_startZscrollbar_buttonZscrollbar_button_endir   rM   r   r%      sP    


zScrollbarMargin.create_marginN)FrD   rE   rA   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.   )rW   rX   )r   rW   rX   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   rW   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   r4   )rX   rT   r   rW   r9   r:   )r   r!   r"   r#   rX   r?   Zlast_yr7   r   r   r   r%     s    
zPromptMargin.create_margin)NrA   r   r   r   r   r      s
    	N)r)   
__future__r   abcr   r   typingr   r   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