o
    Zh@K                     @  s   d dl mZ d dlmZ d dlmZmZ d dlmZ d dl	m
Z
 ddlmZmZ ddlmZmZmZmZ dd	lmZmZ dd
lmZmZmZ dgZdZG dd deZdS )    )annotations)Point)FilterOrBool	to_filter)KeyBindingsBase)
MouseEvent   )	ContainerScrollOffsets)AnyDimension	Dimensionsum_layout_dimensionsto_dimension)MouseHandlerMouseHandlers)CharScreenWritePositionScrollablePanei'  c                
   @  s   e Zd ZdZdddeddddddf
dQddZdRddZdSddZdTd!d"ZdUd#d$Z	dVd0d1Z
dWd4d5ZdXd8d9ZdYd;d<ZdZd=d>Zd[d?d@Zd\dBdCZd]dEdFZd^dLdMZd_dOdPZdS )`r   aK  
    Container widget that exposes a larger virtual screen to its content and
    displays it in a vertical scrollbale region.

    Typically this is wrapped in a large `HSplit` container. Make sure in that
    case to not specify a `height` dimension of the `HSplit`, so that it will
    scale according to the content.

    .. note::

        If you want to display a completion menu for widgets in this
        `ScrollablePane`, then it's still a good practice to use a
        `FloatContainer` with a `CompletionsMenu` in a `Float` at the top-level
        of the layout hierarchy, rather then nesting a `FloatContainer` in this
        `ScrollablePane`. (Otherwise, it's possible that the completion menu
        is clipped.)

    :param content: The content container.
    :param scrolloffset: Try to keep the cursor within this distance from the
        top/bottom (left/right offset is not used).
    :param keep_cursor_visible: When `True`, automatically scroll the pane so
        that the cursor (of the focused window) is always visible.
    :param keep_focused_window_visible: When `True`, automatically scroll the
        pane so that the focused window is visible, or as much visible as
        possible if it doesn't completely fit the screen.
    :param max_available_height: Always constraint the height to this amount
        for performance reasons.
    :param width: When given, use this width instead of looking at the children.
    :param height: When given, use this height instead of looking at the children.
    :param show_scrollbar: When `True` display a scrollbar on the right.
    NT^vcontentr	   scroll_offsetsScrollOffsets | Nonekeep_cursor_visibler   keep_focused_window_visiblemax_available_heightintwidthr   heightshow_scrollbardisplay_arrowsup_arrow_symbolstrdown_arrow_symbolreturnNonec                 C  sh   || _ |p
tddd| _t|| _t|| _|| _|| _|| _t|| _	t|	| _
|
| _|| _d| _d S )Nr   )topbottomr   )r   r
   r   r   r   r   r   r   r   r    r!   r"   r$   vertical_scroll)selfr   r   r   r   r   r   r   r    r!   r"   r$    r+   \/var/www/html/lang_env/lib/python3.10/site-packages/prompt_toolkit/layout/scrollable_pane.py__init__4   s   




zScrollablePane.__init__c                 C  s   d| j dS )NzScrollablePane()r   r*   r+   r+   r,   __repr__P      zScrollablePane.__repr__c                 C  s   | j   d S N)r   resetr0   r+   r+   r,   r4   S   r2   zScrollablePane.resetmax_available_widthr   c                 C  s>   | j d ur
t| j S | j|}|  rttd|gS |S )Nr   )r   r   r   preferred_widthr    r   r   exact)r*   r5   Zcontent_widthr+   r+   r,   r6   V   s   

zScrollablePane.preferred_widthc                 C  sB   | j d ur
t| j S |  r|d8 }| j|| j}td|jdS )Nr   r   )min	preferred)r   r   r    r   preferred_heightr   r   r9   )r*   r   r   	dimensionr+   r+   r,   r:   d   s   

zScrollablePane.preferred_heightscreenr   mouse_handlersr   write_positionr   parent_styleerase_bgboolz_index
int | Nonec                 C  s(  |   }|r|jd }n|j}| j|| jj}	t|	|j}	t|	| j}	t	t
d|dd}
|j|
_tdd||	d}t }| j|
||||| |
  ddlm} | jj}z|
j| }W n	 tyf   Y nw | |j|	||
j| | ||
|| | |||| |j}|j}t|j|| |_t|j||j |_| ||
| |
jrd|_|
j D ]6\}}d|j  kr|jk rn q| j |j!  kr|j| j  k rn qt"|j| |j!| | j  d	|j|< q|
j# D ]\}}| $t"|j| |j!| | j  d	||j#|< q|r| %||	| d
S d
S )z
        Render scrollable pane content.

        This works by rendering on an off-screen canvas, and copying over the
        visible region.
        r    )charstyle)Zdefault_charr   )xposyposr   r   )get_appTxyN)&r    r   r   r:   r   r9   maxr   r8   r   r   show_cursorr   r   write_to_screenZdraw_all_floatsZprompt_toolkit.applicationrI   ZlayoutZcurrent_window"visible_windows_to_write_positionsKeyError_make_window_visibleZcursor_positionsget_copy_over_screen_copy_over_mouse_handlersrH   rG   _copy_over_write_positionsitemsrK   r)   rL   r   Zmenu_positions_clip_point_to_visible_area_draw_scrollbar)r*   r<   r=   r>   r?   r@   rB   r    virtual_widthvirtual_heighttemp_screenZtemp_write_positiontemp_mouse_handlersrI   Zfocused_windowvisible_win_write_posrH   rG   Zwindowpointr+   r+   r,   rO   s   s   



zScrollablePane.write_to_screenr_   r   c                 C  s   |j |jk r|j|jd}|j|jk r|j|jd}|j |j|j kr/|j|j|j d d}|j|j|j krD|j|j|j d d}|S )zV
        Ensure that the cursor and menu positions always are always reported
        )rK   )rL   r   )rK   rG   _replacerL   rH   r   r   )r*   r_   r>   r+   r+   r,   rX      s   z*ScrollablePane._clip_point_to_visible_arear\   rZ   c                 C  s   |j }|j}t|jD ];}|j|| j  }|j||  }	|j|| j  }
|j||  }t|D ]}|| |	|| < ||
v rE|
| ||| < q/qdS )zU
        Copy over visible screen content and "zero width escape sequences".
        N)rH   rG   ranger   data_bufferr)   zero_width_escapes)r*   r<   r\   r>   rZ   rH   rG   rL   Ztemp_rowrowZtemp_zero_width_escapesrc   rK   r+   r+   r,   rT      s    
z ScrollablePane._copy_over_screenr]   c                   s   |j |ji  d fdd}|j}|j}t|jD ](}||v rE||j  }	||  }
t|D ]}||	v rD||	| |
| < q4qdS )z
        Copy over mouse handlers from virtual screen to real screen.

        Note: we take `virtual_width` because we don't want to copy over mouse
              handlers that we possibly have behind the scrollbar.
        handlerr   r%   c                   s,    vrd fdd}| <   S )	z:Wrap mouse handler. Translate coordinates in `MouseEvent`.eventr   r%   r&   c                   s@   t t| jj | jjj  d| j| j| jd} | d S )NrJ   )position
event_typebutton	modifiers)	r   r   rg   rK   rL   r)   rh   ri   rj   )rf   Z	new_event)re   r*   rG   rH   r+   r,   new_handler.  s   
	zYScrollablePane._copy_over_mouse_handlers.<locals>.wrap_mouse_handler.<locals>.new_handlerN)rf   r   r%   r&   r+   )re   rk   Zmouse_handler_wrappersr*   rG   rH   )re   r,   wrap_mouse_handler*  s   zDScrollablePane._copy_over_mouse_handlers.<locals>.wrap_mouse_handlerN)re   r   r%   r   )rH   rG   r=   ra   r   r)   )r*   r=   r]   r>   rZ   rm   Zmouse_handlers_dictZtemp_mouse_handlers_dictrL   Ztemp_mouse_rowZ	mouse_rowrK   r+   rl   r,   rU     s   z(ScrollablePane._copy_over_mouse_handlersc                 C  sP   |j }|j}|j D ]\}}t|j| |j | | j |j|jd|j|< qdS )z3
        Copy over window write positions.
        )rG   rH   r   r   N)rH   rG   rP   rW   r   r)   r   r   )r*   r<   r\   r>   rH   rG   winZ	write_posr+   r+   r,   rV   I  s   z)ScrollablePane._copy_over_write_positionsc                 C  
   | j  S r3   )r   is_modalr0   r+   r+   r,   rp   \     
zScrollablePane.is_modalKeyBindingsBase | Nonec                 C  ro   r3   )r   get_key_bindingsr0   r+   r+   r,   rs   _  rq   zScrollablePane.get_key_bindingslist[Container]c                 C  s   | j gS r3   r/   r0   r+   r+   r,   get_childrenb  s   zScrollablePane.get_childrenvisible_heightr[   r^   cursor_positionPoint | Nonec                 C  s   d}|| }|   r.|dur.| j}|j| d |j }|j|j }	t||}tdt||	}|  rX|j|krC|j	|j | }
|j	}n|j	}
|j	|j | }t||
}t||}||kr^|}| j
|krf|| _
| j
|k rp|| _
dS dS )a  
        Scroll the scrollable pane, so that this window becomes visible.

        :param visible_height: Height of this `ScrollablePane` that is rendered.
        :param virtual_height: Height of the virtual, temp screen.
        :param visible_win_write_pos: `WritePosition` of the nested window on the
            temp screen.
        :param cursor_position: The location of the cursor position of this
            window on the temp screen.
        r   Nr   )r   r   rL   r(   r'   rM   r8   r   r   rH   r)   )r*   rv   r[   r^   rw   Z
min_scrollZ
max_scrolloffsetsZcpos_min_scrollZcpos_max_scrollZwindow_min_scrollZwindow_max_scrollr+   r+   r,   rR   e  sF   






z#ScrollablePane._make_window_visiblecontent_heightc                   sR  |j }|  }|r|d8 }z"|j t| }| jt| }tt|td||  t|| W n
 ty9   Y dS w d fdd	}|j|j	 d }	|j
}
|j}|r`t| jd
||
 |	< |
d7 }
d}d}d}d}t|D ],}d}||r||d s}|}n|}n||d r|}n|}td|||
 |	< |
d7 }
ql|rt| jd
||
 |	< dS dS )z
        Draw the scrollbar on the screen.

        Note: There is some code duplication with the `ScrollbarMargin`
              implementation.
           r   Nrd   r   r%   rA   c                   s   |   ko  kS   S )z/True if we should display a button on this row.r+   )rd   Zscrollbar_heightZscrollbar_topr+   r,   is_scroll_button  s   z8ScrollablePane._draw_scrollbar.<locals>.is_scroll_buttonzclass:scrollbar.arrowzclass:scrollbar.backgroundz*class:scrollbar.background,scrollbar.startzclass:scrollbar.buttonz$class:scrollbar.button,scrollbar.end rD   )rd   r   r%   rA   )r   r!   floatr)   r   r8   rM   ZeroDivisionErrorrG   r   rH   rb   r   r"   ra   r$   )r*   r>   rz   r<   Zwindow_heightr!   Zfraction_visibleZfraction_abover}   rG   rH   rb   Zscrollbar_backgroundZscrollbar_background_startZscrollbar_buttonZscrollbar_button_endirF   r+   r|   r,   rY     sV   

zScrollablePane._draw_scrollbar)r   r	   r   r   r   r   r   r   r   r   r   r   r   r   r    r   r!   r   r"   r#   r$   r#   r%   r&   )r%   r#   )r%   r&   )r5   r   r%   r   )r   r   r   r   r%   r   )r<   r   r=   r   r>   r   r?   r#   r@   rA   rB   rC   r%   r&   )r_   r   r>   r   r%   r   )
r<   r   r\   r   r>   r   rZ   r   r%   r&   )
r=   r   r]   r   r>   r   rZ   r   r%   r&   )r<   r   r\   r   r>   r   r%   r&   )r%   rA   )r%   rr   )r%   rt   )
rv   r   r[   r   r^   r   rw   rx   r%   r&   )r>   r   rz   r   r<   r   r%   r&   )__name__
__module____qualname____doc__MAX_AVAILABLE_HEIGHTr-   r1   r4   r6   r:   rO   rX   rT   rU   rV   rp   rs   ru   rR   rY   r+   r+   r+   r,   r      s6    #





w


3



BN)
__future__r   Zprompt_toolkit.data_structuresr   Zprompt_toolkit.filtersr   r   Zprompt_toolkit.key_bindingr   Zprompt_toolkit.mouse_eventsr   
containersr	   r
   r;   r   r   r   r   r=   r   r   r<   r   r   r   __all__r   r   r+   r+   r+   r,   <module>   s    