
    
8d2                     t    d Z ddlmZ ddlmZmZmZ d	dZ G d de          Z	 G d dej
                  ZdS )
z'A navigable completer for the qtconsole    N)QtCoreQtGui	QtWidgetsc                    | sdS g }d d }fd| D             }|r"|\  }}d| |         |         z   dz   ||         |<   t          |d |D                       }d}	d}
|r7dd                    d	|z   d
z   t          | d                   z            z   dz   }	|r7dd                    d	|z   d
z   t          | d                   z            z   dz   }
d|	z   d                    |          z   |
z   dz   }|S )z# returnr a string for an html table c                     d| z   dz   S )N<td>  </td> texts    9lib/python3.11/site-packages/qtconsole/completion_html.py<lambda>zhtml_tableify.<locals>.<lambda>   s    tI-     c                     d| z   dz   S )N<tr></tr>r   r   s    r   r   zhtml_tableify.<locals>.<lambda>   s    tG+ r   c                 J    g | ]}t          t          |                     S r   )listmap).0rowtdss     r   
<listcomp>z!html_tableify.<locals>.<listcomp>   s)    <<<c#smm$$<<<r   z<td class="inverted">r
   c              3   @   K   | ]}d                      |          V  dS )r   N)join)r   r   s     r   	<genexpr>z html_tableify.<locals>.<genexpr>   s,      <<3"''#,,<<<<<<r   r   r	   z</td>r   r   z?<table class="completion" style="white-space:pre"cellspacing=0>z</table>)r   r   len)item_matrixselectheaderfooter	html_colstrs	tds_itemsr   colheadfoothtmlr   s               @r   html_tableifyr*      se    rI
-
-C
+
+C<<<<<<<I S5S!#&'	#s C<<)<<<==IDD WWfVmG+SQ-@-@@AAB  WWfVmG+SQ-@-@@AABGGI&&(*./1;<D Kr   c                       e Zd ZdZdZdZdZddZed             Z	e	j
        d             Z	ed             Zed	             Zed
             Ze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         c                 z    || _         || _        d| _        || _        | j        | j        z   dz   | _        || _        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minimumsticky_lenghts        r   __init__zSlidingInterval.__init__6   sC     		[,Q.
+r   c                     | j         S )zcurrent cursor position)_currentr6   s    r   currentzSlidingInterval.currentD   s     }r   c                    t          t          | j        |          | j                  }|| _        || j        k    r|| _        || j        z
  | _        n!|| j        k     r|| _        || j        z   | _        t          | j        | j        z
            | j	        k    r| j        | _        t          | j        | j        z
            | j	        k    r| j        | _        dS dS )zset current cursor positionN)
minmaxr0   r1   r=   r4   r3   r2   absr5   )r6   valuer?   s      r   r?   zSlidingInterval.currentI   s     c$)U++TY77TZ DJ!$+-DKKt{""!DK 4;.DJt{TY&''4+>>>)DKtzDI%&&$*===DJJJ >=r   c                     | j         S )zbegiiing of interval to show)r2   r>   s    r   startzSlidingInterval.start]   s     {r   c                     | j         S )zend of interval to show)r4   r>   s    r   stopzSlidingInterval.stopb   s     zr   c                      | j         | j        z
  S N)r4   r2   r>   s    r   r8   zSlidingInterval.widthg   s    zDK''r   c                      | j         | j        z
  S rJ   )r?   rF   r>   s    r   nthzSlidingInterval.nthk   s    |dj((r   N)r-   r.   r   r-   )__name__
__module____qualname____doc__r0   r1   r=   r;   propertyr?   setterrF   rH   r8   rL   r   r   r   r,   r,   ,   s          DDH, , , ,   X ^# # ^#&   X   X ( ( X( ) ) X) ) )r   r,   c                        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		Z fd
Zd Zd Zed             Zd Zd Zd Zd ZddZddZd Zd Z xZS )CompletionHtmlz7 A widget for tab completion,  navigable by arrow keys r   r   r   r   )r-   r-   N   
   c                 j   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   rW   N)
isinstance_controlr   	QTextEditQPlainTextEditsuperr;   
_text_edit_console_widget_rowsinstallEventFilter_sliding_interval_justified_itemssetFocusProxy)r6   console_widgetrows	__class__s      r   r;   zCompletionHtml.__init__   s     .1I4GIa3bccccc(1-!AXXTT2
**4000!% $ 	4?+++++r   c                    || j         k    r|                                }|t          j        j        k    rI|                                }| j        dk    r|t          j        j        fv rdS | j        dk    r9|t          j        j        fv r%| j        dz   | _        | 	                                 dS | j        dk    r|t          j        j
        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 |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|                                  t1                                          ||          S )zm Reimplemented to handle keyboard input and to auto-hide when the
            text edit loses focus.
        r   Fr-   T   )r^   typer   QEventKeyPresskey_consecutive_tabQtKey_Tab_update_list
Key_Return	Key_Enter_complete_currentselect_rightKey_Downselect_down	Key_RightKey_Up	select_upKey_Leftselect_left
Key_Escapecancel_completionFocusOutr]   eventFilter)r6   objeventetyperm   rg   s        r   r   zCompletionHtml.eventFilter   s    $/!!JJLLE...iikk(A--#&):K9M2M2M 5*a//CFI<M;O4O4O,0,A!,CD)%%'''4*a//vy3VY5HIII..000#tvy0222))+++))+++#t&)"4 666((***))+++#t!4 666))+++))+++#t&)"2 444((())+++#t&)"4 666((***))+++#t&)"6 888..000#t..0000**,,,,&-000&&(((ww""3...r   c                     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   rU   N)rn   _slice_startr_   _clear_temporary_buffer_indexrb   r>   s    r   r~   z CompletionHtml.cancel_completion   sS     !"44666! 	*%)D"""	* 	*r   c                 d   | j         \  }}|dz
  }|dz
  }||k    r||k    s||k    r||k    r|                     dd           dS |dk    r|dk     s|dk     r|dk    r|                     ||           dS ||k    r|                     d|dz              dS |dk     r|                     ||dz
             dS ||k    r|                     |dz   d           dS |dk     r|                     |dz
  |           dS d|k    r||k    rd|k    r||k    r||f| _        dS t          d||||fz            )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_indexr   NotImplementedError)r6   r   r&   nrncs        r   r   zCompletionHtml._select_index   s   " BTT "HHr		cBhhq!$$$$$Qhh377qSAXXr2&&&&&2XXq#a%(((((1WWr3q5)))))2XXs1ua(((((1WWs1ub)))))#XX#))SSBYY*DKKK% '=>A3B=O'P R R Rr   c                 X    | j         | j        z   }|t          | j                  k    rd S |S rJ   )r   
_slice_lenr   _items)r6   ends     r   
_slice_endzCompletionHtml._slice_end  s0    /T[!!!!4
r   c                 L    | j         \  }}|                     |dz
  |           dS )zmove cursor upr-   Nr   r   r6   rcs      r   rz   zCompletionHtml.select_up  -    {11Q3"""""r   c                 L    | j         \  }}|                     |dz   |           dS )zmove cursor downr-   Nr   r   s      r   rw   zCompletionHtml.select_down  r   r   c                 L    | j         \  }}|                     ||dz
             dS )zmove cursor leftr-   Nr   r   s      r   r|   zCompletionHtml.select_left!  -    {11ac"""""r   c                 L    | j         \  }}|                     ||dz              dS )zmove cursor rightr-   Nr   r   s      r   ru   zCompletionHtml.select_right&  r   r   c                   	 |sdS |                     t          j        j        |           |                                | _        d| _        | j                                        	                                }| j
                                        }t          t          d||z  dz
                      }t          j        |d|          \  }	t!          t#          |          dz
  | j                  | _        || _        	d         	d	         f| _        || _        d
| _        	fd}t1          t3          ||                    | _        |                     d           dS )ze Shows the completion widget with 'items' at the position specified
            by 'cursor'.
        N)nr-   rW    )emptydisplaywidth)r8   rows_numberscolumns_numbersrU   c                 D    d t          | d                   D             S )Nc                 @    g | ]\  }}|                     |d           S )r   )ljust)r   yws      r   r   z?CompletionHtml.show_items.<locals>.<lambda>.<locals>.<listcomp>B  s(    UUUAQWWQ__UUUr   columns_width)zip)xcis    r   r   z+CompletionHtml.show_items.<locals>.<lambda>B  s%    UUQ?@S9T9TUUU r   F)hilight)movePositionr   QTextCursorLeftposition_start_positionrn   r^   document	textWidthr_   _get_font_widthintrB   r   compute_item_matrixr,   r   r`   rb   r   r   _old_cursorr   r   r   rc   rq   )
r6   cursoritemsprefix_lengthr8   
char_widthr   items_msjoinr   s
            @r   
show_itemszCompletionHtml.show_items+  sY     	F 	E-2mDDD%00 !((**4466)99;;
3rEJ$6!#;<<==.uC<HJ J J!0Watz!R!R!R("->*?@
!UUUU $S%8%8 9 9%(((((r   Tc                    | j         d         | j        _        d}d}| j        j        dk    rd}| j        j        | j        j        k     rd}| j        | j        j        | j        j        dz            }| j                                         |r| j        j	        | j         d         f}nd}t          ||||          }| j                            | j        |d           dS )zM update the list of completion and hilight the currently selected completion r   Nz...r-   )r    r!   r"   T)r)   )r   rb   r?   rF   rH   r1   rc   r_   r   rL   r*   _fill_temporary_bufferr   )r6   r   r'   r(   r   selstrngs          r   rq   zCompletionHtml._update_listI  s    )-Q&!'!++D!&)?)DDDD'-3-2145)
 	44666 	)-t{1~>CCCgc$tLLL33D4DeRV3WWWWWr   c                     | j         }| j        |d                  |d                  }|                                }|r'|                                                     |           |                                  dS )zB Perform the completion with the currently selected item.
        r   r-   N)r   r   strip_current_text_cursor
insertTextr~   )r6   iitems      r   rt   z CompletionHtml._complete_currente  sq     K{1Q4 1&zz|| 	9%%''224888     r   c                     | j                                         }|                                | j        k    r*|                    | j        t
          j        j                   |S )zn Returns a cursor with text between the start position and the
            current position selected.
        )r^   
textCursorr   r   setPositionr   r   
KeepAnchor)r6   r   s     r   r   z#CompletionHtml._current_text_cursoro  sZ     ++--?? 444t3$0;= = =r   )rW   )r   )T)rM   rN   rO   rP   r   r   rn   r   r   r   r   r   r;   r   r~   r   rQ   r   rz   rw   r|   ru   r   rq   rt   r   __classcell__)rg   s   @r   rT   rT   o   sK       AA FFEKOLJ, , , , , ,$2/ 2/ 2/ 2/ 2/n* * *4+R +R +R\   X# # #
# # #
# # #
# # #
) ) ) )<X X X X8! ! !      r   rT   )NNN)rP   ipython_genutils.textr   qtpyr   r   r   r*   objectr,   QWidgetrT   r   r   r   <module>r      s    - -
 % $ $ $ $ $ ) ) ) ) ) ) ) ) ) )
   >A) A) A) A) A)f A) A) A)FH H H H HY& H H H H Hr   