o
    tfm2                     @   sT   d Z ddlmZmZmZ ddlmZ dddZG dd	 d	eZ	G d
d dej
ZdS )z'A navigable completer for the qtconsole    )QtCoreQtGui	QtWidgets   )compute_item_matrixNc                    s   | sdS g }dd  dd } fdd| D }|r+|\}}d| | |  d || |< t |d	d
 |D }d}	d}
|rNddd| d t| d   d }	|rcddd| d t| d   d }
d|	 d| |
 d }|S )z# returnr a string for an html table c                 S      d|  d S )N<td>  </td> textr   r   b/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/qtconsole/completion_html.py<lambda>       zhtml_tableify.<locals>.<lambda>c                 S   r   )N<tr></tr>r   r   r   r   r   r      r   c                    s   g | ]	}t t |qS r   )listmap.0rowZtdsr   r   
<listcomp>   s    z!html_tableify.<locals>.<listcomp>z<td class="inverted">r
   c                 s   s    | ]}d  |V  qdS )r   N)joinr   r   r   r   	<genexpr>   s    z html_tableify.<locals>.<genexpr>r   r	   z</td>r   r   z?<table class="completion" style="white-space:pre"cellspacing=0>z</table>)r   r   len)Zitem_matrixselectheaderfooterZ	html_colsZtrsZ	tds_itemsr   colheadfoothtmlr   r   r   html_tableify   sL   
r$   c                   @   sp   e Zd ZdZdZdZdZdddZedd Z	e	j
d	d Z	ed
d Zedd Zedd Zedd ZdS )SlidingIntervalza bound interval that follows a cursor

    internally used to scoll the completion view when the cursor
    try to go beyond the edges, and show '...' when rows are hidden
    r   r      c                 C   s4   || _ || _d| _|| _| j| j d | _|| _dS )zCreate a new bounded interval

        any value return by this will be bound between maximum and
        minimum. usual width will be 'width', and sticky_length
        set when the return  interval should expand to max and min
        r   r   N)_min_max_start_width_stop_sticky_lenght)selfmaximumwidthminimumZsticky_lenghtr   r   r   __init__7   s   
zSlidingInterval.__init__c                 C      | j S )zcurrent cursor position)_currentr-   r   r   r   currentE      zSlidingInterval.currentc                 C   s   t t| j|| j}|| _|| jkr|| _|| j | _n|| jk r*|| _|| j | _t| j| j | j	kr9| j| _t| j| j | j	krJ| j| _dS dS )zset current cursor positionN)
minmaxr'   r(   r3   r+   r*   r)   absr,   )r-   valuer5   r   r   r   r5   J   s   

c                 C   r2   )zbegiiing of interval to show)r)   r4   r   r   r   start^   r6   zSlidingInterval.startc                 C   r2   )zend of interval to show)r+   r4   r   r   r   stopc   r6   zSlidingInterval.stopc                 C      | j | j S N)r+   r)   r4   r   r   r   r/   h      zSlidingInterval.widthc                 C   r=   r>   )r5   r;   r4   r   r   r   nthl   r?   zSlidingInterval.nthN)r   r&   r   r   )__name__
__module____qualname____doc__r'   r(   r3   r1   propertyr5   setterr;   r<   r/   r@   r   r   r   r   r%   -   s$    





r%   c                       s   e Zd ZdZdZdZdZdZdZdZ	dZ
dZd$ fd	d
	Z fddZdd Zdd Zedd Zdd Zdd Zdd Zdd Zd%ddZd&ddZd d! Zd"d# Z  ZS )'CompletionHtmlz7 A widget for tab completion,  navigable by arrow keys r   r   r   r   )r   r   N   
   c                    sj   t |jtjtjfsJ t   |j| _|| _|dkr|nd| _	| j
|  d| _d| _| | j dS )zg Create a completion widget that is attached to the specified Qt
            text edit widget.
        r   rJ   N)
isinstance_controlr   Z	QTextEditZQPlainTextEditsuperr1   
_text_edit_console_widget_rowsZinstallEventFilter_sliding_interval_justified_itemsZsetFocusProxy)r-   Zconsole_widgetrows	__class__r   r   r1      s   
zCompletionHtml.__init__c                    s  || j kr| }|tjjkr| }| jdkr!|tjjfv r!dS | jdkr9|tjjfv r9| jd | _| 	  dS | jdkr|tjj
tjjfv rN|   dS |tjjfv r_|   | 	  dS |tjjfv rp|   | 	  dS |tjjfv r|   | 	  dS |tjjfv r|   | 	  dS |tjjfv r|   | 	  dS |tjjfv r|   dS |   n|   n
|tjjkr|   t ||S )zm Reimplemented to handle keyboard input and to auto-hide when the
            text edit loses focus.
        r   Fr   T   )rN   typer   ZQEventZKeyPresskey_consecutive_tabZQtZKey_Tab_update_listZ
Key_ReturnZ	Key_Enter_complete_currentselect_rightZKey_Downselect_downZ	Key_RightZKey_Up	select_upZKey_Leftselect_leftZ
Key_Escapecancel_completionZFocusOutrM   eventFilter)r-   objeventetyperX   rT   r   r   ra      sT   



zCompletionHtml.eventFilterc                 C   s0   d| _ d| _| j  d| _| jrd| _dS dS )zCancel the completion

        should be called when the completer have to be dismissed

        This reset internal variable, clearing the temporary buffer
        of the console where the completion are shown.
        r   rH   N)rY   _slice_startrO   _clear_temporary_buffer_indexrQ   r4   r   r   r   r`      s   

z CompletionHtml.cancel_completionc                 C   s,  | j \}}|d }|d }||kr||ks||kr%||kr%| dd dS |dkr-|dk s5|dk r=|dkr=| || dS ||krK| d|d  dS |dk rY| ||d  dS ||krg| |d d dS |dk ru| |d | dS d|kr||krd|kr||kr||f| _dS td||||f )a  Change the selection index, and make sure it stays in the right range

        A little more complicated than just dooing modulo the number of row columns
        to be sure to cycle through all element.

        horizontaly, the element are maped like this :
        to r <-- a b c d e f --> to g
        to f <-- g h i j k l --> to m
        to l <-- m n o p q r --> to a

        and vertically
        a d g j m p
        b e h k n q
        c f i l o r
        r   r   zayou'r trying to go where no completion                           have gone before : %d:%d (%d:%d)N)_size_select_indexrg   NotImplementedError)r-   r   r    nrncr   r   r   ri      s(   
   
zCompletionHtml._select_indexc                 C   s"   | j | j }|t| jkrd S |S r>   )re   
_slice_lenr   _items)r-   endr   r   r   
_slice_end  s   zCompletionHtml._slice_endc                 C   s   | j \}}| |d | dS )zmove cursor upr   Nrg   ri   r-   rcr   r   r   r^        
zCompletionHtml.select_upc                 C   s   | j \}}| |d | dS )zmove cursor downr   Nrq   rr   r   r   r   r]     ru   zCompletionHtml.select_downc                 C   s   | j \}}| ||d  dS )zmove cursor leftr   Nrq   rr   r   r   r   r_   "  ru   zCompletionHtml.select_leftc                 C   s   | j \}}| ||d  dS )zmove cursor rightr   Nrq   rr   r   r   r   r\   '  ru   zCompletionHtml.select_rightc           	         s   |sdS |j tjj|d | | _d| _| j 	 }| j
 }ttd|| d }t|d|d\} tt|d | jd| _|| _ d  d	 f| _|| _d
| _ fdd}tt||| _| jdd dS )ze Shows the completion widget with 'items' at the position specified
            by 'cursor'.
        N)nr   rJ    )emptydisplaywidth)r/   Zrows_numbersZcolumns_numbersrH   c                    s   dd t |  d D S )Nc                 S   s   g | ]
\}}| |d qS )rw   )ljust)r   ywr   r   r   r   B  s    z?CompletionHtml.show_items.<locals>.<lambda>.<locals>.<listcomp>Zcolumns_width)zip)xcir   r   r   B  s    z+CompletionHtml.show_items.<locals>.<lambda>F)hilight)ZmovePositionr   QTextCursorZLeftposition_start_positionrY   rN   ZdocumentZ	textWidthrO   Z_get_font_widthintr8   r   r%   r   rP   rQ   rn   rh   _old_cursorrg   r   r   rR   rZ   )	r-   cursoritemsZprefix_lengthr/   
char_widthry   items_mZsjoinr   r   r   
show_items,  s"   

zCompletionHtml.show_itemsTc                 C   s   | j d | j_d}d}| jjdkrd}| jj| jjk rd}| j| jj| jjd  }| j  |r;| jj	| j d f}nd}t
||||d}| jj| j|dd dS )zM update the list of completion and hilight the currently selected completion r   Nz...r   )r   r   r   T)r#   )rg   rQ   r5   r;   r<   r(   rR   rO   rf   r@   r$   Z_fill_temporary_bufferr   )r-   r   r!   r"   r   selZstrngr   r   r   rZ   I  s$   

zCompletionHtml._update_listc                 C   sB   | j }| j|d  |d  }| }|r|  | |   dS )zB Perform the completion with the currently selected item.
        r   r   N)rg   rn   strip_current_text_cursorZ
insertTextr`   )r-   iitemr   r   r   r[   e  s   z CompletionHtml._complete_currentc                 C   s.   | j  }| | jkr|| jtjj |S )zn Returns a cursor with text between the start position and the
            current position selected.
        )rN   Z
textCursorr   r   ZsetPositionr   r   Z
KeepAnchor)r-   r   r   r   r   r   o  s   
z#CompletionHtml._current_text_cursor)rJ   )r   )T)rA   rB   rC   rD   rn   rg   rY   rh   r   r   re   rm   r1   ra   r`   ri   rE   rp   r^   r]   r_   r\   r   rZ   r[   r   __classcell__r   r   rT   r   rG   p   s0    7.



rG   )NNN)rD   Zqtpyr   r   r   utilr   r$   objectr%   ZQWidgetrG   r   r   r   r   <module>   s    
C