
    G@d>O                         d Z ddlZddl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dlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ dZdZ G d dee          ZdS )zCompletion widget class.    N)QPointQtSignalSlot)QFontMetricsQFocusEvent)QListWidgetQListWidgetItemQToolTip)SpyderConfigurationAccessor)ima)CompletionItemKind)to_text_string)keyevent_to_keysequence_str)HTMLDelegate      c                   .    e Zd ZdZi ej        dej        dej        dej        dej	        dej
        dej        dej        d	ej        d
ej        dej        dej        dej        dej        dej        dej        dej        dej        diZi Z ee          Z eeee          Z fdZd Z d Z!d Z"d Z#d-dZ$d Z%d Z&ddde'e(fdZ)d-d Z*d! Z+d.d"Z,d# Z-d$ Z.d/d&Z/d' Z0d.d(Z1d) Z2d.d*Z3d+ Z4 e5e6          d,             Z7 xZ8S )0CompletionWidgetzCompletion list widget.textmethodfunctionconstructorfieldvariableclass	interfacemodulepropertyunitvalueenumkeywordsnippetcolorfile	referencec                    t          t          |                               |           || _        d | _        |                     t          j        t          j        z             | 	                                 | j
                            | j                   | j                            | j                   d| _        d | _        d | _        d| _        d | _        d | _        g | _        |                     t/          | d                     |                     t2                     t5          | j                                                  }|                                | _        |                                 | _        d S )NF   )margin) superr   __init__textedit	_languagesetWindowFlagsr   	SubWindowFramelessWindowHinthideitemActivatedconnectitem_selectedcurrentRowChangedrow_changedis_internal_consolecompletion_listcompletion_position	automaticcurrent_selected_item_labelcurrent_selected_item_pointdisplay_indexsetItemDelegater   setMinimumWidthDEFAULT_COMPLETION_ITEM_WIDTHr   fontheightitem_heightwidth
item_width)selfparentancestorfm	__class__s       Hlib/python3.11/site-packages/spyder/plugins/editor/widgets/completion.pyr,   zCompletionWidget.__init__?   s>   %%..x888BL2+AABBB		""4#5666&&t'7888#( ##' +/(+/( 	\$q999::::;;; $-,,..//99;;**,,    c                 D     | j         |  |                     |           dS )z-Setup size and font of the completion widget.N)resizesetFont)rG   sizerB   s      rL   setup_appearancez!CompletionWidget.setup_appearanceX   s)    TTrM   c                 :    |                                  dk    rdS dS )zCheck if widget is empty.r   TF)count)rG   s    rL   is_emptyzCompletionWidget.is_empty]   s    ::<<14urM   c                    d| _         d| _        |s|                                  dS || _        |1| j                                                                        | _        nL| j                                                                        |k     r|                                  dS || _        t          |d         t                    sd| _
        || _        |                     d           | j        sdS |                                 dk    }|rK| j        sD|                     |                     d                     | j                            |           dS |                                  |                                  |                                  | j                            |            | j
        sQ|                                                                 }|                     |          }| j        | j        D ]}||d<   |                     d           |                     d           | j                            |           dS )z$Show list corresponding to position.Nr   Tnew   point)r<   r=   r2   r;   r-   
textCursorpositionr:   
isinstancedictr8   r9   update_currentrT   r5   itemsig_show_completionsemitshowsetFocusraise_position_widget_at_cursorrecttopRightmapToGlobalsetCurrentRowr7   )rG   r9   r\   r;   single_matchtooltip_point
completions          rL   	show_listzCompletionWidget.show_listc   s9   +/(+/( 	IIKKKF" (,}'?'?'A'A'J'J'L'LD$$]%%''0022X==IIKKKF (0D$ /!,d33 	,'+D$. 	%%% # 	F zz||q( 	 	tyy||,,,%**?;;;F		//555' 	8 IIKK0022M ,,];;M#/"&"6 8 8J*7Jw'' 	1 	!&&77777rM   c                 8    |                                 | _        dS )zSet the completion language.N)lowerr.   )rG   languages     rL   set_languagezCompletionWidget.set_language   s    !))rM   Tc                    |                                   g | _        | j        }| j        }t	          | j                  D ]\  }}| j        s|sd|v r|d         }n|d         }|                     ||          s<t                      }| j        s:| 	                    ||||           |
                    t          j        |           nN|                     |d||          }	|
                    t          j        |           |                    |	           |                     |           | j                            |           
|                                 dk    r|                                  dS dS )a  
        Update the displayed list by filtering self.completion_list based on
        the current_word under the cursor (see check_can_complete).

        If we're not updating the list with new completions, we filter out
        textEdit completions, since it's difficult to apply them correctly
        after the user makes edits.

        If no items are left on the list the autocompletion should stop
        textEdit
filterTextr   )rC   rE    N)clearr>   rD   rF   	enumerater9   r8   check_can_completer
   set_item_displaysetDatar   UserRoleget_html_item_representationsetTextaddItemappendrT   r2   )
rG   current_wordrX   rC   rE   irm   completion_labelr`   completion_texts
             rL   update_listzCompletionWidget.update_list   s    	

!&t';<< 	) 	)MAz+ 1 zZ77#-l#;  #-a= **+;\JJ "$$D+ .%%*V5 & B B BR[*5555"&"C"C$bu #D #F #FR[*:;;;_---LL%%a((((::<<1IIKKKKK rM   c                 f    || j         vrt          j        |          | j         |<   | j         |         S N)ICON_MAPr   icon)rG   names     rL   _get_cached_iconz!CompletionWidget._get_cached_icon   s0    t}$$"%(4..DM$}T""rM   c           	         | j                             |d         d          }|d         }d}|dz
  }|dz  }	|                    dd          \  }}
|1|}|
|z  }t          j        |          }t          j        |||          }|                     |||||	||
          }|                    |           |                    |                     |                     |	                    t          j        | d|            d	S )z/Set item text & icons using the info available.kindno_matchlabelz\iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII=   g?r   )NrY   N)icon_provider
img_height	img_widthrC   rE    )ITEM_TYPE_MAPgetr   r   base64_from_icon_objr}   r~   setIconr   r{   r   AccessibleTextRole)rG   item_widget	item_inforC   rE   	item_type
item_labelr   r   r   
icon_scaleicon_height
icon_width	item_texts                 rL   rz   z!CompletionWidget.set_item_display   s-   &**9V+<jII	w'
EaZ
$	$-MM&)$D$D!z$$K#k1JH]33M4z;8 8M 55	!Yv 6  	
 	I&&&D11)<<===
 	B1j3N3N93N3NOOOOOrM   Nr   c                    t          |          }t          |          }d|d|dddt          j        z   dz   t          j        |                              dd          dd	t          j        d|dg}|>t          |          }t          |          }|                    d|dd|d|d|ddg           |                    ddg           d                    |          S )z$Get HTML representation of and item.z<table width="z
" height="z">z<tr>z!<td valign="middle" style="color:r   z&nbsp;z</td>z=<td valign="middle" align="right" float="right" style="color:Nz4<td valign="top" align="right" float="right" width="z!<img src="data:image/png;base64, z	" width="z"/>z</tr>z</table>rv   )r   r   MAIN_FG_COLORhtmlescapereplaceextendjoin)	rG   item_completionr   r   r   r   rC   rE   partss	            rL   r}   z-CompletionWidget.get_html_item_representation   s     ''u%% e\64/#2CCdJK((00h??Kt
 $'
33J&y11ILLF43]j+y%    	Z
 	 	 	 wwu~~rM   c                 &   d| _         d| _        |                                  |r| j                                         t          | j        dd          }|r|                                 t          j        |            t          j	                     dS )Override Qt method.Ntooltip_widget)
r:   r9   rw   r-   rd   getattrr2   r	   r   hideText)rG   focus_to_parenttooltips      rL   r2   zCompletionWidget.hide&  s    #' #


  	%M""$$$$-)94@@ 	LLNNNrM   c                    |                                 |                                }}|                                t          j        z  }|                                t          j        z  }|                                t          j        z  }|                                o|t          j        k    }|dk    }|p|p|p|p|}	|t          j        t          j	        t          j
        fv r|                                 }
|
|                     d          }
|                     |
          r|                     |
           dS |                                  | j                            |           dS |t          j        k    r|                                  dS |t          j        t          j        fv s|dv r0|                                  | j                            |           dS |t          j        t          j        t          j        t          j        fv r|	sd| j        _        |t          j        k    rD|                                 dk    r,|                     |                                 dz
             dS |t          j        k    rD|                                 |                                 dz
  k    r|                     d           dS t;          j        | |           dS |t          j        t          j        fv r0|                                  | j                            |           dS |t          j         k    r2| j                            |           | !                    d           dS tE          |          r|	r^tG          |          }| $                    d	d
          }||k    r2| j        j%        &                                 |                                  | j                            |           | !                    d           dS |	r| j                            |           dS |                                  t;          j        | |           dS )z'Override Qt method to process keypress.r   N)r`   ).:TrY   FrW   zeditor/save file	shortcuts)section)'r   key	modifiersr   AltModifierShiftModifierControlModifier	Key_AltGr
Key_Return	Key_EnterKey_TabcurrentItemr`   is_up_to_dater5   r2   r-   keyPressEvent
Key_EscapeKey_Left	Key_RightKey_UpKey_Down
Key_PageUpKey_PageDown_completions_hint_idle
currentRowrj   rT   r	   Key_HomeKey_EndKey_Backspacer_   lenr   get_confsig_save_requestedrb   )rG   eventr   r   altshiftctrlaltgrneo2_level4modifierr`   key_sequencesave_shortcuts                rL   r   zCompletionWidget.keyPressEvent9  s   JJLL%))++coo".0!!B$44  2#55!!;sbl': ax?D?C?5?K2=",
;;; ##%%D|yy||!!t!,, 3"""-----		++E22222BM!!IIKKKKKR[",///4:3E3EIIKKKM''.....BIr{BM2?KKK L 48DM0biDOO$5$5$:$:""4::<<!#344444##(9(9TZZ\\!^(K(K""1%%%%%)$66666R["*--- IIKKKM''.....B$$$M''...E*****YY 	3   :5AA !%& !. != !==00M499;;; IIKKKM''...E***** 	3M''.....IIKKK%dE22222rM   c                 f   |                                  rdS |                                 sdS ||                                 }| j                            d          }|                    t          j                  }t          |t                    r	|d         }n|}| 
                    ||          S )z7
        Check if the selection is up to date.
        FNTrm   ru   )rU   is_position_correctr   r-   get_current_worddatar   r|   r]   r^   ry   )rG   r`   r   rm   filter_texts        rL   r   zCompletionWidget.is_up_to_date  s     ==?? 	5'')) 	5<##%%D}555FFYYr{++
j$'' 	%$\2KK$K&&{LAAArM   c                     |sdS |sdS t          |                                                              t          |                                                    S )z*Check if current_word matches filter_text.T)r   rp   
startswith)rG   r   r   s      rL   ry   z#CompletionWidget.check_can_complete  s_     	4 	4k**0022==|,,22446 6 	6rM   c                 T   | j         dS | j                                                                        }|| j         k     rdS | j                            d          }|| j         |k    rdS dS |\  }}t          |          }|| j         cxk    r|t          |          z   k    sn dS dS )z!Check if the position is correct.NFTr   )r:   r-   r[   r\   get_current_word_and_positionr   r   )rG   cursor_positionr   text_positions       rL   r   z$CompletionWidget.is_position_correct  s     #+5-2244==?? T5555-EE F   "'?::tu)8&(99  8 6 6 6 6O 4 446 6 6 65trM   Fc                     |                                  s|                                  dS | j                            d          }|                     ||           dS )z,
        Update the displayed list.
        NTr   rW   )r   r2   r-   r   r   )rG   rX   r   s      rL   r_   zCompletionWidget.update_current  sa     '')) 	IIKKKF}555FF3/////rM   c                 >   t          |          t          urdS |                                 t          j        dk    r:|                                t          j        k    r|                                  dS dS 	 |                                  dS # t          $ r Y dS w xY w)r   Ndarwin)
typer   ignoresysplatformreasonr   ActiveWindowFocusReasonr2   RuntimeError)rG   r   s     rL   focusOutEventzCompletionWidget.focusOutEvent  s    
 ;;k))F <8##||~~!;;;		 <;
		   s   8B 
BBc                     ||                                  }|D| j        =| j                            |                    t
          j                  | j                   |                                  dS )z!Perform the item selected action.N)r   r:   r-   insert_completionr   r   r|   r2   )rG   r`   s     rL   r5   zCompletionWidget.item_selected  sj    <##%%D 8 DM++DIIbk,B,B,0,DF F F		rM   c                     d|v r|d         d         }nK|d         }dg}| j         dk    r|                    d           |D ]}|                    |          d         }|S )Nrt   newText
insertText$python(r   )r.   r   split)rG   r`   insert_textcharschs        rL   _get_insert_textz!CompletionWidget._get_insert_text  s    z*95KK|,K EE~))S!!! 7 7)//33A6rM   c                    d | _         d | _        | j        sd S ||                                 }|dk     st	          | j                  |k    rd S | j        |         }d|vrd S |d         | _         |d         | _        |                     |          }t          | j        d          rn|                    dd          rX|	                                }|
                    d           |
                    d           | j                            |           t          |d         t                    r|d         d         |d<   | j                            ||d         |d                    d S )	Nr   rZ   r   resolve_completion_itemresolveFdocumentationr!   )r<   r=   r9   r   r   r   hasattrr-   r   copypopr   r]   r^   sig_completion_hintrb   )rG   rowr`   r   
to_resolves        rL   trigger_completion_hintz(CompletionWidget.trigger_completion_hint  sx   +/(+/(# 	F;//##C77c$.//366F#C($F+/=(+/=(++D114=";<< 	Bxx	5)) B!YY[[
w'''y)))55jAAAd?+T22 	C$($9'$BD! %%!M	 	 	 	 	rM   c                     | j         |d         k    rj|                     |          }t          |d         t                    r|d         d         |d<   | j                            ||d         | j                   d S d S )Nr   r  r!   )r<   r   r]   r^   r  rb   r=   )rG   r`   r   s      rL   augment_completion_infoz(CompletionWidget.augment_completion_info"  s    +tG}<<//55K$/66 G(,_(=g(F_%$))_%02 2 2 2 2 =<rM   c                 0    |                      |           dS )z%Set completion hint info and show it.N)r	  )rG   r  s     rL   r7   zCompletionWidget.row_changed.  s     	$$S)))))rM   )Tr   )F)9__name__
__module____qualname____doc__r   TEXTMETHODFUNCTIONCONSTRUCTORFIELDVARIABLECLASS	INTERFACEMODULEPROPERTYUNITVALUEENUMKEYWORDSNIPPETCOLORFILE	REFERENCEr   r   r   objectra   strr   r  r,   rR   rU   rn   rr   r   r   rz   DEFAULT_COMPLETION_ITEM_HEIGHTrA   r}   r2   r   r   ry   r   r_   r   r5   r   r	  r  r   intr7   __classcell__)rK   s   @rL   r   r      s       !!!8 	#Z 	&	
 	 ' 	#Z 	 ' 	$k 	!8 	#Z 	 	 ' 	 	"I 	"I  	 '!" 	#$ 	$k% M( H!6&>> !&c622' ' ' ' '2  
  @8 @8 @8D* * *+ + + +Z# # #
P P P> 4801/0,J+H+ + + +Z   &L3 L3 L3\B B B B$	6 	6 	6  @	0 	0 	0 	0  .     ! ! ! !F
2 
2 
2 
T#YY* * Y* * * * *rM   r   )r  r   r   qtpy.QtCorer   r   r   r   
qtpy.QtGuir   r   qtpy.QtWidgetsr	   r
   r   spyder.api.config.mixinsr   spyder.utils.icon_managerr   spyder.plugins.completion.apir   spyder.py3compatr   spyder.utils.qthelpersr   spyder.widgets.helperwidgetsr   r%  rA   r    rM   rL   <module>r2     s;      



 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 A A A A A A A A A A A @ @ @ @ @ ) ) ) ) ) ) < < < < < < + + + + + + > > > > > > 5 5 5 5 5 5 "$  # R* R* R* R* R*{$? R* R* R* R* R*rM   