U
    d                     @  s   d Z ddlmZ ddlmZ dddddd	gZeZdddddddZdddddddZdddddZ	dddddZ
ddddd	ZdddddZdddddZdddddZdS )z
Key bindings, for scrolling up and down through pages.

This are separate bindings, because GNU readline doesn't have them, but
they are very useful for navigating through long multiline buffers, like in
Vi, Emacs, etc...
    )annotations)KeyPressEventscroll_forwardscroll_backwardscroll_half_page_upscroll_half_page_downscroll_one_line_upscroll_one_line_downFEboolNone)eventhalfreturnc           
      C  s   | j jj}| j j}|r|jr|j}|j}|j}|r:|d }|jjd }d}||j	k r|
|}	||	 |k r||	7 }|d7 }qJqqJ|j|d|_dS )z
    Scroll window down.
          r   N)applayoutcurrent_windowcurrent_bufferrender_info
ui_contentwindow_heightdocumentcursor_position_row
line_countget_height_for_linetranslate_row_col_to_indexcursor_position)
r   r   wbinfor   scroll_heightyheightline_height r&   N/tmp/pip-unpacked-wheel-4x_7prb2/prompt_toolkit/key_binding/bindings/scroll.pyr      s"    




c           	      C  s   | j jj}| j j}|r|jr|j}|j}|r4|d }td|jjd }d}|dkr~|	|}|| |k r~||7 }|d8 }qJq~qJ|j
|d|_dS )z
    Scroll window up.
    r   r   r   N)r   r   r   r   r   r   maxr   r   r   r   r   )	r   r   r   r    r!   r"   r#   r$   r%   r&   r&   r'   r   7   s     



)r   r   c                 C  s   t | dd dS )z8
    Same as ControlF, but only scroll half a page.
    Tr   N)r   r   r&   r&   r'   r   U   s    c                 C  s   t | dd dS )z8
    Same as ControlB, but only scroll half a page.
    Tr)   N)r   r*   r&   r&   r'   r   \   s    c                 C  sj   | j jj}| j j}|rf|jrf|j}|j|j|j k rf|jj	|j
jkrX| j|j 7  _| jd7  _dS )z
    scroll_offset += 1
    r   N)r   r   r   r   r   vertical_scrollZcontent_heightr   r   r#   configured_scroll_offsetstopr   Zget_cursor_down_position)r   r   r    r!   r&   r&   r'   r	   c   s    
c                 C  s   | j jj}| j j}|r|jr|j}|jdkr|| }|jj	|j
d | |jj  }ttd|D ]}| j|j 7  _qf| jd8  _dS )z
    scroll_offset -= 1
    r   r   N)r   r   r   r   r   r+   r   first_visible_liner   r#   r   r,   Zbottomranger(   r   Zget_cursor_up_position)r   r   r    r!   Zfirst_line_heightZ	cursor_up_r&   r&   r'   r   v   s&    

	c                 C  sd   | j jj}| j j}|r`|jr`t|j |jd }||_|j	|d|_
| j
|jjdd7  _
dS )zX
    Scroll page down. (Prefer the cursor at the top of the page, after scrolling.)
    r   r   TZafter_whitespaceN)r   r   r   r   r   r(   Zlast_visible_liner+   r   r   r   get_start_of_line_positionr   r   r    Z
line_indexr&   r&   r'   scroll_page_down   s    

r4   c                 C  sl   | j jj}| j j}|rh|jrhtdt|j |jj	d }|j
|d|_| j|jjdd7  _d|_dS )zY
    Scroll page up. (Prefer the cursor at the bottom of the page, after scrolling.)
    r   r   Tr1   N)r   r   r   r   r   r(   minr.   r   r   r   r   r2   r+   r3   r&   r&   r'   scroll_page_up   s    


r6   N)F)F)__doc__
__future__r   Z(prompt_toolkit.key_binding.key_processorr   __all__r
   r   r   r   r   r	   r   r4   r6   r&   r&   r&   r'   <module>   s$   	