B
    nôb\Z„  ã               @   s(  d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	m
Z
 ddlmZmZmZmZmZmZ ddlmZmZ ddlmZmZmZmZmZmZmZmZmZmZm Z m!Z!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, ddl-m.Z/ ddl0m1Z1 ddl2m3Z3m4Z4 ddl5m6Z6 ddl5m7Z7 ej8ej9ej:ej;ej<ej=ej>ej?iZ@dd„ eAddƒD ƒddg ZBdddddddddd d!d"d#d$d%d&gd'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6g d7d„ eAd8ƒD ƒ d9d:d;d<d=d>d?g d@d„ eAdAdBƒD ƒ dCdDdEdFdGdHdIdJg ZCdKd„ eBD ƒZDdLd„ eCeB D ƒZEdMZFdN GeF¡ZHe$dOƒe$dPƒdQœZIejJdRkrPe$dSƒeIdT< e$dUƒeIdI< G dVdW„ dWeƒZKG dXdY„ dYeƒZLdddZd[d\d]g\ZMZNZOZPZQZRG d^d_„ d_eƒZSG d`da„ daeTƒZUdddZd[g\ZVZWZXZYG dbdc„ dceƒZZG ddde„ deeƒZ[G dfdg„ dge!ƒZ\G dhdi„ die,ƒZ]djdk„ Z^e_dlkr$e^ƒ  dS )mzShortcut managementé    )Úprint_functionN)ÚPYQT5)Úfrom_qvariantÚto_qvariant)ÚQAbstractTableModelÚQModelIndexÚQRegExpÚQSortFilterProxyModelÚQtÚSlot)ÚQKeySequenceÚQRegExpValidator)ÚQAbstractItemViewÚQApplicationÚQDialogÚQDialogButtonBoxÚQGridLayoutÚQHBoxLayoutÚQLabelÚ	QLineEditÚQMessageBoxÚQPushButtonÚQSpacerItemÚ
QTableViewÚQVBoxLayout)Ú_Údebug_print)Úget_shortcutÚiter_shortcutsÚreset_shortcutsÚset_shortcut)ÚGeneralConfigPage)Úicon_manager)Úget_std_icon)Úget_search_scoresÚget_search_regex)ÚHTMLDelegate)ÚHelperToolButtonc             C   s   g | ]}d   |¡‘qS )zF{})Úformat)Ú.0Ú_i© r+   ú7lib/python3.7/site-packages/spyder/plugins/shortcuts.pyú
<listcomp>,   s    r-   é   é$   ZDeleteZEscapeZTabZBacktabZ	BackspaceZReturnZEnterZPauseZPrintZClearZHomeZEndZLeftZUpZRightZDownZPageUpZPageDownZSpaceZExclamZQuoteDblZ
NumberSignZDollarZPercentZ	AmpersandZ
ApostropheZ	ParenLeftZ
ParenRightZAsteriskZPlusZCommaZMinusZPeriodZSlashc             C   s   g | ]}t |ƒ‘qS r+   )Ústr)r)   r*   r+   r+   r,   r-   4   s    é
   ZColonZ	SemicolonZLessZEqualZGreaterZQuestionZAtc             C   s   g | ]}t |ƒ‘qS r+   )Úchr)r)   r*   r+   r+   r,   r-   6   s    éA   é[   ZBracketLeftZ	BackslashZBracketRightZ
UnderscoreZControlZAltÚShiftÚMetac             C   s   g | ]}t td  |¡ƒ‘qS )zKey_{0})Úgetattrr
   r(   )r)   Úkr+   r+   r,   r-   9   s    c             C   s   g | ]}t td  |¡ƒ‘qS )zKey_{0})r7   r
   r(   )r)   r8   r+   r+   r,   r-   :   s    uS   ÃÃ‰ÃOÃšÃ¡Ã©Ã­ÃºÃ³Ã Ã¨Ã¬Ã²Ã¹Ã€ÃˆÃŒÃ’Ã™Ã¢ÃªÃ®Ã´Ã»Ã‚ÃŠÃŽÃ”Ã›Ã¤Ã«Ã¯Ã¶Ã¼Ã„Ã‹ÃÃ–ÃœÃ±Ã‘z[A-Za-z\s{0}]z3Currently used to delete lines on editor/Cut a wordzCurrently used to paste a word)z	Shift+Delz	Shift+InsÚntz*We cannot support this shortcut on WindowszAlt+Backspacez8Shortcuts that use Shift and another key are unsupportedc                   s0   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚCustomLineEditz8QLineEdit that filters its key press and release events.c                s*   t t| ƒ |¡ |  d¡ |  tj¡ d S )NT)Úsuperr:   Ú__init__ZsetReadOnlyÚsetFocusPolicyr
   ÚNoFocus)ÚselfÚparent)Ú	__class__r+   r,   r<   O   s    
zCustomLineEdit.__init__c             C   s   |   ¡  |¡ dS )zQt OverrideN)r@   ÚkeyPressEvent)r?   Úer+   r+   r,   rB   T   s    zCustomLineEdit.keyPressEventc             C   s   |   ¡  |¡ dS )zQt OverrideN)r@   ÚkeyReleaseEvent)r?   rC   r+   r+   r,   rD   X   s    zCustomLineEdit.keyReleaseEvent)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r<   rB   rD   Ú__classcell__r+   r+   )rA   r,   r:   M   s   r:   c                   s6   e Zd ZdZd	‡ fdd„	Zdd„ Z‡ fdd„Z‡  ZS )
ÚShortcutFinderz4Textbox for filtering listed shortcuts in the table.Nc                sD   t t| ƒ |¡ || _ttd ƒ}|  t|ƒ¡ |r@| j 	|¡ d S )Nz{100})
r;   rJ   r<   Ú_parentr   ÚVALID_FINDER_CHARSZsetValidatorr   ZtextChangedÚconnect)r?   r@   ÚcallbackÚregex)rA   r+   r,   r<   _   s    zShortcutFinder.__init__c             C   s"   |  ¡ }|  ¡ | }|  |¡ dS )zSet the filter text.N)ÚstripÚtextÚsetText)r?   rQ   Znew_textr+   r+   r,   Úset_textk   s    zShortcutFinder.set_textc                sh   |  ¡ }|tjgkr | j ¡  nD|tjgkr8| j ¡  n,|tjtjgkrT| j 	¡  nt
t| ƒ |¡ dS )zQt Override.N)Úkeyr
   ÚKey_UprK   Úprevious_rowÚKey_DownÚnext_rowÚ	Key_EnterÚ
Key_ReturnÚshow_editorr;   rJ   rB   )r?   ÚeventrT   )rA   r+   r,   rB   q   s    zShortcutFinder.keyPressEvent)N)rE   rF   rG   rH   r<   rS   rB   rI   r+   r+   )rA   r,   rJ   ]   s   rJ   é   é   é   é   c                   sŠ   e Zd ZdZ‡ fdd„Zeƒ ‡ fdd„ƒZeƒ ‡ fdd„ƒZdd	„ Zd
d„ Z	dd„ Z
dd„ Zdd„ Zeg fdd„Zdd„ Zdd„ Z‡  ZS )ÚShortcutEditorz$A dialog for entering key sequences.c                sh  t t| ƒ |¡ || _|| _d| _tƒ | _tƒ | _t	ƒ | _
t	ƒ | _|| _d | _d| _|| _tƒ | _| j tdƒ¡ ttdƒƒ| _t|ƒ| _ttdƒƒ| _t| ƒ| _| j |¡ tƒ | _| j ¡  tƒ | _| j ¡  ttjtj B ƒ}| !tj¡| _"| !tj ¡| _#|  $tdƒ %|¡¡ | j" &t'j(¡ | j" )d¡ | j# &t'j(¡ | j *d¡ | j &t'j(¡ d	}| j +|¡ | j &t'j(¡ | j &t'j(¡ d
}t,ƒ }	|	 -| jdddd¡ |	 .t/||ƒdddd¡ |	 -| jdd¡ |	 -| jdd¡ |	 -| jdd¡ |	 -| jdd¡ |	 -| jdd¡ |	 -| jdddd¡ t0ƒ }
|
 1|	¡ |
 2|¡ |
 -|¡ |  3|
¡ |j4 5| j6¡ |j7 5| j8¡ d S )Nr   Tz€Press the new shortcut and select 'Ok': 
(Press 'Tab' once to switch focus between the shortcut entry 
and the buttons below it)zCurrent shortcut:zNew shortcut:zShortcut: {0}FÚ z¥
            QToolButton {
              margin:1px;
              border: 0px solid grey;
              padding:0px;
              border-radius: 0px;
            }r`   r.   r^   r]   r_   )9r;   ra   r<   rK   ÚcontextÚnpressedÚsetÚkeysÚkey_modifiersÚlistÚkey_non_modifiersÚkey_textÚsequenceÚnew_sequenceÚ
edit_stateÚ	shortcutsr   Z
label_inforR   r   Zlabel_current_sequenceZtext_current_sequenceZlabel_new_sequencer:   Útext_new_sequenceZsetPlaceholderTextr'   Úhelper_buttonÚhideÚlabel_warningr   ÚOkZCancelZbuttonÚ	button_okÚbutton_cancelZsetWindowTitler(   r=   r
   r>   Ú
setEnabledZ
setToolTipZsetStyleSheetr   Ú	addWidgetZaddItemr   r   Ú	addLayoutZ
addSpacingÚ	setLayoutZacceptedrM   ÚacceptZrejectedÚreject)r?   r@   rc   Únamerk   rn   ZbboxZstyleZspacingZlayout_sequenceZlayout)rA   r+   r,   r<   …   sj    







zShortcutEditor.__init__c                s   | j  ¡  tt| ƒ ¡  dS )zSlot for rejected signal.N)ru   ÚsetFocusr;   ra   r{   )r?   )rA   r+   r,   r{   Ï   s    
zShortcutEditor.rejectc                s   | j  ¡  tt| ƒ ¡  dS )zSlot for accepted signal.N)rt   r}   r;   ra   rz   )r?   )rA   r+   r,   rz   Ø   s    
zShortcutEditor.acceptc             C   s.  |  ¡ }|tkrd| _dS |  jd7  _| j |¡ | j |¡ | j | 	¡ ¡ d| _t
d || j¡ƒ |tjkrvdS |tjksž|tjksž|tjksž|tjkr¢dS | ¡ }|tj@ r¾|tj7 }|tj@ rò|tj7 }tjdkrê|  jd8  _t
dƒ |tj@ r|tj7 }|tj@ r|tj7 }| j |¡ dS )zQt override.TNr.   Fzkey {0}, npressed: {1}ÚdarwinZdecrementing)rT   Ú
VALID_KEYSÚinvalid_key_flagrd   ri   Úappendrg   Úaddrj   rQ   r   r(   r
   ZKey_unknownÚKey_ControlÚ	Key_ShiftÚKey_AltÚKey_MetaÚ	modifiersZShiftModifierÚSHIFTZControlModifierÚCTRLÚsysÚplatformZAltModifierÚALTZMetaModifierÚMETArf   )r?   rC   rT   r‡   r+   r+   r,   rB   á   s<    











zShortcutEditor.keyPressEventc             C   sX   | j  | _ | j s>| j d¡ | j ¡ r2| j ¡  qT| j ¡  n| j d¡ | j ¡  dS )z>Switch between shortcut entry and Accept/Cancel shortcut mode.FTN)rm   ro   rv   rt   Z	isEnabledr}   ru   )r?   r+   r+   r,   Útoggle_state  s    

zShortcutEditor.toggle_statec             C   s\   |  ¡ }|tjgkr |  ¡  dS |tjtjtjtjgkrX| j 	¡ rN| j
 ¡  n
| j ¡  dS )z%Key release event for non-edit state.N)rT   r
   Ú
Key_EscapeÚcloseÚKey_LeftÚ	Key_RightrU   rW   rt   ZhasFocusru   r}   )r?   rC   rT   r+   r+   r,   Únonedit_keyrelease  s    

z!ShortcutEditor.nonedit_keyreleasec             C   s  |  j d8  _ | j dkr| ¡ }t| jƒdkrF|tjkrF|  ¡  dS t| jƒdkrx|tjkrx|  d¡ | j	 
tdƒ¡ t| jƒdkr¢|tjtjgkr¢|  ¡  dS | js´|  |¡ nNtd | j¡ƒ | jrÜ|tjkrÜ|  ¡  tƒ | _tƒ | _tƒ | _tƒ | _d| _ dS )zQt override.r.   r   Nrb   z%Please introduce a different shortcutzkeys: {})rd   rT   Úlenrf   r
   ÚKey_TabrŽ   r   Úset_sequencerr   rR   r   rZ   rY   rm   r“   r   r(   Úvalidate_sequencere   rg   rh   ri   rj   )r?   rC   rT   r+   r+   r,   rD   '  s,    
zShortcutEditor.keyReleaseEventc             C   s^   g }xTt | jƒD ]F\}}t|jƒ}|| jkr|j| jksL|jdksL| jdkr| |¡ qW |S )zCheck shortcuts for conflicts.r   )Ú	enumeratern   r0   rT   rl   rc   r   )r?   Ú	conflictsÚindexÚshortcutrk   r+   r+   r,   Úcheck_conflictsF  s    


zShortcutEditor.check_conflictsc       
      C   s”  |t krd}d}n(|tkrpd}tdƒd }d}x |D ]}|d |j|j¡7 }q6W |dd	… }| ||¡}d
}nÌ|tkr´d}tdƒd }d}t| j }	|	dk	r¢|	}| ||¡}d
}nˆ|t	kröd}tdƒd }d}td }	|	dk	rä|	}| ||¡}d
}nF|t
krd}tdƒjf ddiŽ}d
}n|tkr<d}tdƒd }d
}| j ¡  |rt| j ¡  | j tdƒ¡ | j d¡ n| j tdƒ¡ | j |¡ dS )z?Update warning label to reflect conflict status of new shortcutFzThis shortcut is correct!z<i>{0}<b>{1}</b></i>z The new shortcut conflicts with:z<br>rb   z - {0}: {1}<br>NéüÿÿÿTzForbidden key sequence!r5   z
<i>{0}</i>zHA compound sequence can have {break} a maximum of 4 subsequences.{break}ÚbreakzInvalid key enteredZMessageBoxWarningZDialogApplyButton)Ú
NO_WARNINGÚSEQUENCE_CONFLICTr   r(   rc   r|   ÚIN_BLACKLISTÚ	BLACKLISTrl   ÚSHIFT_BLACKLISTÚSEQUENCE_LENGTHÚINVALID_KEYrp   Úshowrr   ZsetIconr#   rt   rv   rR   )
r?   Úwarning_typer™   ÚwarnZtipÚtemplateZ	tip_titleZtip_bodyÚsZuser+   r+   r,   Úupdate_warningQ  s\    







zShortcutEditor.update_warningc             C   s  |r| j |kr | j d¡ d}n| j d¡ d}tjdkr˜d|krP| dd¡}qœd|krf| dd¡}qœd|kr|| dd	¡}qœd
|kr’| d
d¡}qœ|}n|}| j |¡ || _|  	¡ }| jt
k}| j d¡}|rÚ|rÚt}n0|rät}n&t|ƒdkr|d dkrt}nt}| j||d dS )z(Set the new shortcut and update buttons.FTr~   z	Meta+CtrlzCtrl+Cmdz	Ctrl+MetazCmd+CtrlZCtrlZCmdr6   ú+r]   r   r5   )r§   r™   N)rk   rt   rv   rŠ   r‹   Úreplacero   rR   rl   rœ   r¢   Úsplitr    r¡   r”   r£   rŸ   r«   )r?   rk   Zdifferent_sequenceZshown_sequencer™   Z	blacklistZindividual_keysr§   r+   r+   r,   r–   ‡  s:    

zShortcutEditor.set_sequencec       	      C   sr  | j r| jtd dS x6tD ].}t| jƒ}| |¡ || jkr| j |¡ qW | j| | _xd| j	krt| j	 d¡ q\W dd„ | j	D ƒ| _	t
j| jkr®| j t
j¡}t
j| j|< t| jƒdkrà| jd tkrÎdS t| jƒdkràdS t| jƒdkr | jtd dS g }xRtt| jƒƒD ]@}d}x| jD ]}|t| 7 }q$W || j| 7 }| |¡ qW t|Ž }|  | ¡ ¡ dS )	z?Provide additional checks for accepting or rejecting shortcuts.)r§   Nrb   c             S   s   g | ]}|  ¡ ‘qS r+   )Úupper)r)   r8   r+   r+   r,   r-   ¿  s    z4ShortcutEditor.validate_sequence.<locals>.<listcomp>r   r.   r_   )r€   r«   r¥   Ú	MODIFIERSre   ri   ÚdiscardÚremoverg   rj   r
   ÚKey_Backtabrš   r•   r”   ÚVALID_SINGLE_KEYSrf   r¤   Úranger   r   r–   ÚtoString)	r?   ÚmodZnon_modÚidxrf   ÚiZkey_seqÚmrk   r+   r+   r,   r—   ®  s@    



z ShortcutEditor.validate_sequence)rE   rF   rG   rH   r<   r   r{   rz   rB   rŽ   r“   rD   rœ   rŸ   r«   r–   r—   rI   r+   r+   )rA   r,   ra   ƒ   s   J		*6'ra   c               @   s2   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ ZdS )ÚShortcutz’Shortcut convenience class for holding shortcut context, name,
    original ordering index, key sequence for the shortcut and localized text.
    Nc             C   s   d| _ || _|| _|| _d S )Nr   )rš   rc   r|   rT   )r?   rc   r|   rT   r+   r+   r,   r<   å  s    zShortcut.__init__c             C   s   d  | j| j| j¡S )Nz{0}/{1}: {2})r(   rc   r|   rT   )r?   r+   r+   r,   Ú__str__ë  s    zShortcut.__str__c             C   s   t | j| jƒ| _d S )N)r   rc   r|   rT   )r?   r+   r+   r,   Úloadî  s    zShortcut.loadc             C   s   t | j| j| jƒ d S )N)r    rc   r|   rT   )r?   r+   r+   r,   Úsaveñ  s    zShortcut.save)N)rE   rF   rG   rH   r<   r¼   r½   r¾   r+   r+   r+   r,   r»   á  s
   
r»   c               @   s’   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zejfd	d
„Z	ejfdd„Z
eƒ fdd„Zeƒ fdd„Zejfdd„Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚShortcutsModelc             C   sl   t  | ¡ || _g | _g | _g | _g | _d| _tƒ | _	g | _
| ¡ }| ¡  ¡  ¡ | _| ¡  ¡  ¡ | _d S )Nrb   )r   r<   rK   rn   ÚscoresÚ	rich_textÚnormal_textÚlettersr   ZlabelZwidthsÚpaletterQ   Úcolorr|   Ú
text_colorZhighlightedTextÚtext_color_highlight)r?   r@   rÄ   r+   r+   r,   r<   ù  s    
zShortcutsModel.__init__c             C   s   | j j | j  ¡ ¡}|S )z:Get the currently selected index in the parent table view.)rK   Úproxy_modelÚmapToSourceÚcurrentIndex)r?   r¹   r+   r+   r,   Úcurrent_index
  s    zShortcutsModel.current_indexc             C   s    t | jdd„ d| _|  ¡  dS )zQt Override.c             S   s   | j d | j S )Nú/)rc   r|   )Úxr+   r+   r,   Ú<lambda>  s    z+ShortcutsModel.sortByName.<locals>.<lambda>)rT   N)Úsortedrn   Úreset)r?   r+   r+   r,   Ú
sortByName  s    zShortcutsModel.sortByNamec             C   s    |  ¡ stjS t t | |¡¡S )zQt Override.)ÚisValidr
   ZItemIsEnabledZ	ItemFlagsr   Úflags)r?   rš   r+   r+   r,   rÓ     s    zShortcutsModel.flagsc       	      C   s  |  ¡ }| ¡ r,d|  kr*t| jƒk s2n tƒ S | j| }|j}| ¡ }|tjkrö|t	krft|j
ƒS |tkr¾| j}| jt ¡ kr |  ¡   ¡ |krš| j}n| j}| j| }d ||¡}t|ƒS |tkrÞt|ƒ tj¡}t|ƒS |tkrôt| j| ƒS n |tjkrtttjtjB ƒƒS tƒ S )zQt Override.r   z<p style="color:{0}">{1}</p>)ÚrowrÒ   r”   rn   r   rT   Úcolumnr
   ÚDisplayRoleÚCONTEXTrc   ÚNAMErÆ   rK   r   ZfocusWidgetrË   rÇ   rÁ   r(   ÚSEQUENCEr   r¶   Z
NativeTextÚSEARCH_SCORErÀ   ÚTextAlignmentRoleÚintÚAlignHCenterÚAlignVCenter)	r?   rš   ÚrolerÔ   r›   rT   rÕ   rÅ   rQ   r+   r+   r,   Údata  s4    $



zShortcutsModel.datac             C   s¬   |t jkr<|t jkr(ttt jt jB ƒƒS ttt jt jB ƒƒS |t jkrLtƒ S |t jkr¦|t	krjtt
dƒƒS |tkr~tt
dƒƒS |tkr’tt
dƒƒS |tkr¦tt
dƒƒS tƒ S )zQt Override.ZContextÚNamer»   ZScore)r
   rÛ   Z
Horizontalr   rÜ   rÝ   rÞ   Z
AlignRightrÖ   r×   r   rØ   rÙ   rÚ   )r?   ZsectionZorientationrß   r+   r+   r,   Ú
headerData?  s     



zShortcutsModel.headerDatac             C   s
   t | jƒS )zQt Override.)r”   rn   )r?   rš   r+   r+   r,   ÚrowCountR  s    zShortcutsModel.rowCountc             C   s   dS )zQt Override.r_   r+   )r?   rš   r+   r+   r,   ÚcolumnCountV  s    zShortcutsModel.columnCountc             C   sn   |  ¡ rjd| ¡   kr&t| jƒk rjn n@| j| ¡  }| ¡ }t|tƒ}|tkrX||_| j	 
||¡ dS dS )zQt Override.r   TF)rÒ   rÔ   r”   rn   rÕ   r   r0   rÙ   rT   ÚdataChangedÚemit)r?   rš   Úvaluerß   r›   rÕ   rQ   r+   r+   r,   ÚsetDataZ  s    *
zShortcutsModel.setDatac             C   sD   || _ dd„ | jD ƒ}t||dd}t|Ž \| _| _| _|  ¡  dS )z4Update search letters with text input in search box.c             S   s   g | ]
}|j ‘qS r+   )r|   )r)   r›   r+   r+   r,   r-   i  s    z8ShortcutsModel.update_search_letters.<locals>.<listcomp>z
<b>{0}</b>)r©   N)rÃ   rn   r$   ÚziprÂ   rÁ   rÀ   rÐ   )r?   rQ   ÚnamesZresultsr+   r+   r,   Úupdate_search_lettersf  s
    z$ShortcutsModel.update_search_lettersc             C   s   |   |  ¡ ¡ dS )z3Update active row to update color in selected text.N)rà   rË   )r?   r+   r+   r,   Úupdate_active_rown  s    z ShortcutsModel.update_active_rowc             C   s
   | j | S )z@Get row based on model index. Needed for the custom proxy model.)rn   )r?   Úrow_numr+   r+   r,   rÔ   r  s    zShortcutsModel.rowc             C   s   |   ¡  |  ¡  dS )z5"Reset model to take into account new search letters.N)ZbeginResetModelZendResetModel)r?   r+   r+   r,   rÐ   v  s    zShortcutsModel.resetN)rE   rF   rG   r<   rË   rÑ   rÓ   r
   rÖ   rà   râ   r   rã   rä   ZEditRolerè   rë   rì   rÔ   rÐ   r+   r+   r+   r,   r¿   ø  s   $r¿   c                   s2   e Zd ZdZd	‡ fdd„	Zdd„ Zdd„ Z‡  ZS )
ÚCustomSortFilterProxyz$Custom column filter based on regex.Nc                s&   t t| ƒ |¡ || _t d¡| _d S )Nrb   )r;   rî   r<   rK   ÚreÚcompileÚpattern)r?   r@   )rA   r+   r,   r<   ~  s    zCustomSortFilterProxy.__init__c             C   s6   t |ƒ| _| jr| j d¡ n| j d¡ |  ¡  dS )z"Set regular expression for filter.FTN)r%   rñ   rK   ÚsetSortingEnabledZinvalidateFilter)r?   rQ   r+   r+   r,   Ú
set_filterƒ  s
    
z CustomSortFilterProxy.set_filterc             C   s6   |   ¡ }| |¡j}t | j|¡}|dkr.dS dS dS )zbQt override.

        Reimplemented from base class to allow the use of custom filtering.
        NFT)ZsourceModelrÔ   r|   rï   Úsearchrñ   )r?   rí   r@   Zmodelr|   Úrr+   r+   r,   ÚfilterAcceptsRowŒ  s    z&CustomSortFilterProxy.filterAcceptsRow)N)rE   rF   rG   rH   r<   ró   rö   rI   r+   r+   )rA   r,   rî   |  s   	rî   c                   s   e Zd Zddd„Z‡ fdd„Z‡ fdd„Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zd dd„Zdd„ Zdd„ Z‡ fdd„Zdd„ Z‡  ZS )!ÚShortcutsTableNc             C   sè   t  | |¡ || _d | _t| ƒ| _t| ƒ| _d| _| j 	| j¡ | j 
d¡ | j t¡ | j tj¡ |  | j¡ |  t¡ |  tt| dd¡ |  tj¡ |  tj¡ |  d¡ |  tj¡ |  ¡ j | j ¡ |  !¡  "¡  |  #¡  d S )Nrb   Té	   )Zmargin)$r   r<   rK   Úfinderr¿   Úsource_modelrî   rÈ   Ú
last_regexZsetSourceModelZsetDynamicSortFilterZsetFilterKeyColumnrØ   ZsetFilterCaseSensitivityr
   ZCaseInsensitiveZsetModelZ
hideColumnrÚ   ZsetItemDelegateForColumnr&   ZsetSelectionBehaviorr   Z
SelectRowsZsetSelectionModeZSingleSelectionrò   ZsetEditTriggersZAllEditTriggersZselectionModelZselectionChangedrM   Ú	selectionZverticalHeaderrq   Úload_shortcuts)r?   r@   r+   r+   r,   r<   œ  s(    



zShortcutsTable.__init__c                s   | j  ¡  tt| ƒ |¡ dS )zQt Override.N)rú   rì   r;   r÷   ÚfocusOutEvent)r?   rC   )rA   r+   r,   rþ   ¶  s    
zShortcutsTable.focusOutEventc                s&   t t| ƒ |¡ |  |  ¡  ¡ ¡ dS )zQt Override.N)r;   r÷   ÚfocusInEventÚ	selectRowrÊ   rÔ   )r?   rC   )rA   r+   r,   rÿ   »  s    zShortcutsTable.focusInEventc             C   s   |   ¡  |  ¡  dS )zUpdate selected row.N)ÚupdateZisActiveWindow)r?   rš   r+   r+   r,   rü   À  s    zShortcutsTable.selectionc                sT   |   ¡  |  ¡  |  ¡  ¡ ‰ ‡ fdd„| jjD ƒ}|  tt|ƒ¡ |  ¡  	d¡ dS )z%Adjust column size based on contents.c                s   g | ]}ˆ   |jd  ¡‘qS )z	         )Úwidthr|   )r)   rª   )Úfmr+   r,   r-   Ê  s    z/ShortcutsTable.adjust_cells.<locals>.<listcomp>TN)
ZresizeRowsToContentsZresizeColumnsToContentsZhorizontalHeaderZfontMetricsrú   rn   ZsetColumnWidthrØ   ÚmaxZsetStretchLastSection)r?   rê   r+   )r  r,   Úadjust_cellsÅ  s    zShortcutsTable.adjust_cellsc             C   s¬   g }x*t ƒ D ] \}}}t|||ƒ}| |¡ qW t|dd„ d}xt|ƒD ]\}}||_qJW || j_dgt|ƒ | j_	dd„ |D ƒ| j_
| j ¡  |  ¡  |  ttj¡ dS )z)Load shortcuts and assign to table model.c             S   s   | j | j S )N)rc   r|   )rÍ   r+   r+   r,   rÎ   Ô  s    z/ShortcutsTable.load_shortcuts.<locals>.<lambda>)rT   r   c             S   s   g | ]
}|j ‘qS r+   )r|   )r)   rª   r+   r+   r,   r-   Ú  s    z1ShortcutsTable.load_shortcuts.<locals>.<listcomp>N)r   r»   r   rÏ   r˜   rš   rú   rn   r”   rÀ   rÁ   rÐ   r  ÚsortByColumnr×   r
   ÚAscendingOrder)r?   rn   rc   r|   Zkeystrr›   r¹   r+   r+   r,   rý   Î  s    

zShortcutsTable.load_shortcutsc             C   sê   g }x˜t | jjƒD ]ˆ\}}|t| jjƒd kr0P xh| jj|d d… D ]P}||krTqFt|jƒt|jƒkrF|j|jksˆ|jdksˆ|jdkrF| ||f¡ qFW qW |ræ|  ¡ j	 
¡  d dd„ |D ƒ¡}t | tdƒtdƒd | tj¡ dS )	zCheck shortcuts for conflicts.r.   Nr   Ú
c             S   s   g | ]\}}d ||f ‘qS )z%s <---> %sr+   )r)   Úsh1Úsh2r+   r+   r,   r-   î  s   z2ShortcutsTable.check_shortcuts.<locals>.<listcomp>Z	Conflictsz+The following conflicts have been detected:)r˜   rú   rn   r”   r0   rT   rc   r   r@   Zshow_this_pageræ   Újoinr   Úwarningr   rs   )r?   r™   rš   r	  r
  Zcstrr+   r+   r,   Úcheck_shortcutsß  s"    


zShortcutsTable.check_shortcutsc             C   s&   |   ¡  x| jjD ]}| ¡  qW dS )z Save shortcuts from table model.N)r  rú   rn   r¾   )r?   r›   r+   r+   r,   Úsave_shortcutsô  s    zShortcutsTable.save_shortcutsc             C   s„   | j  |  ¡ ¡}| ¡ | ¡  }}| jj}|| j}|| j}| j 	|t
¡}| ¡ }t| ||||ƒ}	|	 ¡ r€|	j}
| j ||
¡ dS )z5Create, setup and display the shortcut editor dialog.N)rÈ   rÉ   rÊ   rÔ   rÕ   rú   rn   rc   r|   rš   rÙ   rà   ra   Úexec_rl   rè   )r?   rš   rÔ   rÕ   rn   rc   r|   Zsequence_indexrk   Zdialogrl   r+   r+   r,   r[   ú  s    

zShortcutsTable.show_editorFc             C   sd   |r
d}n| j  ¡  dd¡ ¡ }| j |¡ | j |¡ |  t	t
j¡ | j|krZ|  d¡ || _dS )z.Update the regex text for the shortcut finder.rb   ú r   N)rù   rQ   r­   ÚlowerrÈ   ró   rú   rë   r  rÚ   r
   r  rû   r   )r?   rO   rÐ   rQ   r+   r+   r,   Ú	set_regex  s    

zShortcutsTable.set_regexc             C   s8   |   ¡  ¡ }| j ¡ }|d |kr&d}|  |d ¡ dS )z-Move to next row from currently selected row.r.   éÿÿÿÿN)rÊ   rÔ   rÈ   rã   r   )r?   rÔ   Úrowsr+   r+   r,   rX     s
    
zShortcutsTable.next_rowc             C   s4   |   ¡  ¡ }| j ¡ }|dkr"|}|  |d ¡ dS )z1Move to previous row from currently selected row.r   r.   N)rÊ   rÔ   rÈ   rã   r   )r?   rÔ   r  r+   r+   r,   rV   "  s
    
zShortcutsTable.previous_rowc                sà   |  ¡ }|tjtjgkr"|  ¡  nº|tjgkr:| j ¡  n¢|tjgkrV|  	¡ j
 ¡  n†|tjtjtjtjgkr€tt| ƒ |¡ n\|tjtjgkrÄ| ¡ }|rÜt t|¡dk	rÜ| j ¡  | j |¡ n|tjgkrÜ| j |¡ dS )zQt Override.N)rT   r
   rY   rZ   r[   r•   rù   r}   r³   r@   Ú	reset_btnrU   rW   r‘   r’   r;   r÷   rB   r   Z	Key_SpacerQ   rï   rô   rL   rS   )r?   r\   rT   rQ   )rA   r+   r,   rB   *  s"    

zShortcutsTable.keyPressEventc             C   s   |   ¡  dS )zQt Override.N)r[   )r?   r\   r+   r+   r,   ÚmouseDoubleClickEvent>  s    z$ShortcutsTable.mouseDoubleClickEvent)N)NF)rE   rF   rG   r<   rþ   rÿ   rü   r  rý   r  r  r[   r  rX   rV   rB   r  rI   r+   r+   )rA   r,   r÷   ›  s   
	
r÷   c               @   sB   e Zd ZdZedƒZe d¡Zdd„ Z	dd„ Z
dd	„ Zd
d„ ZdS )ÚShortcutsConfigPagern   zKeyboard shortcutsZkeyboardc                s   t ˆ ƒˆ _tˆ jˆ jjƒˆ _ˆ jˆ j_ttdƒƒˆ _ttdƒƒˆ _	t
ƒ }tƒ }| ˆ j¡ | ˆ j¡ | ˆ j¡ | |¡ | ˆ j	¡ ˆ  |¡ ˆ  ˆ jˆ j¡ ˆ  ˆ jˆ j	¡ trÒˆ jjj d‡ fdd„	¡ nˆ jjj d‡ fdd„	¡ ˆ j	j ˆ j¡ d S )	NzSearch: zReset to default valuesrb   c                s
   ˆ   |¡S )N)Úhas_been_modified)Úi1Úi2ZrolesÚopt)r?   r+   r,   rÎ   b  s    z0ShortcutsConfigPage.setup_page.<locals>.<lambda>c                s
   ˆ   |¡S )N)r  )r  r  r  )r?   r+   r,   rÎ   e  s    )rb   )rb   )r÷   ÚtablerJ   r  rù   r   r   Zlabel_finderr   r  r   r   rw   rx   ry   ZsetTabOrderr   rÈ   rå   rM   ZclickedÚreset_to_default)r?   ZhlayoutZvlayoutr+   )r?   r,   Ú
setup_pageI  s*    





zShortcutsConfigPage.setup_pagec             C   s   | j  ¡  d S )N)r  r  )r?   r+   r+   r,   Úcheck_settingsh  s    z"ShortcutsConfigPage.check_settingsc             C   s^   t  | tdƒtdƒt jt jB ¡}|t jkr.dS tƒ  | j ¡  | j 	¡  |  
¡  |  d¡ dS )z?Reset to default values of the shortcuts making a confirmation.zShortcuts resetz'Do you want to reset to default values?NF)r   r  r   ZYesZNor   ÚmainÚapply_shortcutsr  rý   Zload_from_confZset_modified)r?   rÐ   r+   r+   r,   r  k  s    


z$ShortcutsConfigPage.reset_to_defaultc             C   s   | j  ¡  | j ¡  d S )N)r  r  r   r!  )r?   Zoptionsr+   r+   r,   Úapply_settingsy  s    
z"ShortcutsConfigPage.apply_settingsN)rE   rF   rG   ZCONF_SECTIONr   rØ   ÚimaZiconZICONr  r  r  r"  r+   r+   r+   r,   r  C  s   
r  c              C   sJ   ddl m}  | ƒ }tƒ }| ¡  | ¡  tdd„ |jjD ƒƒ | ¡  d S )Nr   )Úqapplicationc             S   s   g | ]}t |ƒ‘qS r+   )r0   )r)   rª   r+   r+   r,   r-   „  s    ztest.<locals>.<listcomp>)	Úspyder.utils.qthelpersr$  r÷   r¦   r  Úprintrú   rn   r  )r$  Zappr  r+   r+   r,   Útest~  s    r'  Ú__main__)`rH   Z
__future__r   Úosrï   rŠ   Zqtpyr   Zqtpy.compatr   r   Zqtpy.QtCorer   r   r   r	   r
   r   Z
qtpy.QtGuir   r   Zqtpy.QtWidgetsr   r   r   r   r   r   r   r   r   r   r   r   r   Zspyder.config.baser   r   Zspyder.config.guir   r   r   r    Zspyder.plugins.configdialogr!   Zspyder.utilsr"   r#  r%  r#   Zspyder.utils.stringmatchingr$   r%   Zspyder.widgets.helperwidgetsr&   r'   r„   rˆ   rƒ   r‰   r…   rŒ   r†   r   r°   rµ   ZSINGLE_KEYSZ
KEYSTRINGSr´   r   ZVALID_ACCENT_CHARSr(   rL   r¢   r|   r:   rJ   rŸ   r¤   r    r¥   r¡   r£   ra   Úobjectr»   r×   rØ   rÙ   rÚ   r¿   rî   r÷   r  r'  rE   r+   r+   r+   r,   Ú<module>   sf    <
~
#  `  );	
