
    Jeh                     \   d Z ddl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 ddlm Z  dd	l!m"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-  e.dd      D  cg c]  } dj_                  |        c} ddgz   Z0e0g dz   Z1i Z2dZ3dZ4dZ5dZ6dZ7 G d de      Z8 G d de      Z9 G d de+      Z: G d de      Z; G d de<      Z=g d \  Z>Z?Z@ZA G d! d"e      ZB G d# d$e      ZC G d% d&e	      ZDd' ZEd( ZFd) ZGeHd*k(  r eG        yyc c} w )+zShortcut management widgets.    N)from_qvariantto_qvariant)QAbstractTableModelQEventQModelIndexQSortFilterProxyModelQtSlot)QIconQKeySequence)QAbstractItemViewQApplicationQDialogQGridLayoutQHBoxLayoutQKeySequenceEditQLabel	QLineEditQMessageBoxQPushButtonQSpacerItem
QTableViewQVBoxLayout)_)CONF)ima)create_toolbutton)get_search_regexget_search_scores)VALID_FINDER_CHARSCustomSortFilterProxyFinderLineEditHelperToolButtonHTMLDelegate   $   zF{}DelEsc)HomeEndInsEnterReturn	BackspaceTabPageUpPageDownClearPauseLeftUpRightDown         c                   :     e Zd ZdZ fdZd Zd Zd Zd Z xZ	S )ShortcutTranslatora  
    A QKeySequenceEdit that is not meant to be shown and is used only
    to convert QKeyEvent into QKeySequence. To our knowledge, this is
    the only way to do this within the Qt framework, because the code that does
    this in Qt is protected. Porting the code to Python would be nearly
    impossible because it relies on low level and OS-dependent Qt libraries
    that are not public for the most part.
    c                 J    t         t        |           | j                          y N)superr<   __init__hideself	__class__s    H/usr/lib/python3/dist-packages/spyder/plugins/shortcuts/widgets/table.pyr@   zShortcutTranslator.__init__>   s     $02		    c                 d    | j                  |       |j                          | j                         S )z?Return a QKeySequence representation of the provided QKeyEvent.)keyPressEventacceptkeySequencerC   events     rE   keyevent_to_keyseqz%ShortcutTranslator.keyevent_to_keyseqB   s(    5!!!rF   c                      yQt OverrideF rK   s     rE   keyReleaseEventz"ShortcutTranslator.keyReleaseEventH       rF   c                      yrO   rQ   rK   s     rE   
timerEventzShortcutTranslator.timerEventL   rS   rF   c                      yrO   rQ   rK   s     rE   rL   zShortcutTranslator.eventP   rS   rF   )
__name__
__module____qualname____doc__r@   rM   rR   rU   rL   __classcell__rD   s   @rE   r<   r<   4   s!    "rF   r<   c                   8     e Zd ZdZ fdZd Zd Z fdZ xZS )ShortcutLineEditz8QLineEdit that filters its key press and release events.c                 .   t         t        |   |       | j                  d       | j	                         j                  d      }| j                         j                  | j                         j                        }| j                  |d|z  z   dz          y )NTz2Ctrl+Shift+Alt+Backspace, Ctrl+Shift+Alt+Backspacer8   r:   )
r?   r^   r@   setReadOnlyfontMetricswidthstylepixelMetricPM_DefaultFrameWidthsetMinimumWidth)rC   parenttwfwrD   s       rE   r@   zShortcutLineEdit.__init__X   s{    .v6%%@BZZ\%%djjl&G&GHR1r6]Q./rF   c                 B    | j                         j                  |       yrP   N)rg   rH   rC   es     rE   rH   zShortcutLineEdit.keyPressEventc   s    ##A&rF   c                 B    | j                         j                  |       yrk   )rg   rR   rl   s     rE   rR   z ShortcutLineEdit.keyReleaseEventg   s    %%a(rF   c                 N    | j                  |       t        t        |   |       y)zQt method extension.N)
setToolTipr?   r^   setText)rC   sequencerD   s     rE   rq   zShortcutLineEdit.setTextk   s    !-h7rF   )	rW   rX   rY   rZ   r@   rH   rR   rq   r[   r\   s   @rE   r^   r^   U   s    B0')8 8rF   r^   c                   "     e Zd ZdZ fdZ xZS )ShortcutFinderz4Textbox for filtering listed shortcuts in the table.c                 ~   |j                         }|t        j                  fv r| j                  j	                          y|t        j
                  fv r| j                  j                          y|t        j                  t        j                  fv r| j                  j                          yt        t        | 3  |       y)zQt and FilterLineEdit Override.N)keyr	   Key_Up_parentprevious_rowKey_Downnext_row	Key_Enter
Key_Returnshow_editorr?   rt   rH   )rC   rL   rv   rD   s      rE   rH   zShortcutFinder.keyPressEventt   s~    iik299+LL%%'R[[M!LL!!#R\\2==11LL$$&.$5e<rF   )rW   rX   rY   rZ   rH   r[   r\   s   @rE   rt   rt   q   s    >
= 
=rF   rt   c                        e Zd ZdZ fdZed        Zed        Zd Z e	        fd       Z
 e	        fd       Z fdZd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Z xZS )ShortcutEditorz$A dialog for entering key sequences.c                 L   t         t        |   |       || _        | j	                  | j                         t        j                   z         || _        || _	        || _
        |xs t        d      | _        t               | _        | j                          | j!                          y )Nz<None>)r?   r   r@   rx   setWindowFlagswindowFlagsr	   WindowContextHelpButtonHintcontextname	shortcutsr   current_sequencelist_qsequencessetupupdate_warning)rC   rg   r   r   rr   r   rD   s         rE   r@   zShortcutEditor.__init__   s    nd,V4D,,.;;;< 	= 	" ( 7AhK6

rF   c                 8    dj                  | j                        S )z7Return a string representation of the new key sequence., )joinr   rC   s    rE   new_sequencezShortcutEditor.new_sequence   s     yy))**rF   c                 ,    t        | j                        S )z7Return the QKeySequence object of the new key sequence.)r   r   r   s    rE   new_qsequencezShortcutEditor.new_qsequence   s     D--..rF   c           	         t               }|j                  t        j                  d             t	               }|j                  dddd       |j                  d       |j                  |       |j                  d       t               | _
        | j                  j                  t        d             | j                  j                  t        j                  t        j                   z         | j                  j#                  d       t%               }|j                  dddd       |j'                  |       |j                  | j                         |j)                  dd       t        t        d            | _        t        | j,                        | _        t        t        d            | _        t3        |       | _        | j4                  j7                  t        d	             t               | _        | j8                  j                  t;                      t               | _        | j<                  j#                  d       | j<                  j                  t        j                  t        j                   z         t?        t        d
            | _         t?        t        d            | _!        | jB                  jE                  d       t?        t        d            | _#        t?        t        d            | _$        t%               }|j                  | j@                         |j                  d       |j                  | jB                         |j                  | jF                         |j                  | jH                         tK        | t        jL                  d      t        d      | jN                        | _(        tK        | t        jL                  d      t        d      | jR                        | _*        t%               }|j                  d       |j                  dddd       |j                  | jT                         |j                  | jP                         | jW                  t        d      jY                  | jZ                               | j8                  j]                  d       d}| j8                  j_                  |       |j]                  d       |j_                  |       ta               }|j                  dddd       |j'                  |dddd       |jc                  te        dd      dddd       |j                  | j*                  dd       |j                  | j.                  dd       |j                  | j0                  dd       |j                  | j8                  dd       |j                  | j4                  dd       |j'                  |dd       |j                  | j<                  dddd       |jg                  dd       |ji                  dd       t	        |       }|j'                  |       |jk                  d       |j'                  |       |jm                  |jn                         | jB                  jp                  js                  | jt                         | jF                  jp                  js                  | jv                         | jH                  jp                  js                  | jx                         | j@                  jp                  js                  | jz                         | j<                  | j8                  | j4                  | jF                  | j@                  | jH                  | jB                  | jP                  | jT                  f	}	|	D ]1  }
|
j}                  t        j~                         |
j                          3 y)z5Setup the ShortcutEditor with the provided arguments.MessageBoxInformationr   d   zPress the new shortcut and select 'Ok' to confirm, click 'Cancel' to revert to the previous state, or use 'Clear' to unbind the command from a shortcut.Tr%   zCurrent shortcut:zNew shortcut:zPress shortcut.DefaultOkFr2   Cancel	editclearzClear all entered key sequences)icontip	triggeredpreviousz Remove last key sequence enteredzShortcut: {0} z
            QToolButton {
              margin:1px;
              border: 0px solid grey;
              padding:0px;
              border-radius: 0px;
            }r:      r8   r9   
   N)Ar#   setIconr   get_std_iconr   setContentsMargins
setSpacing	addWidget
addStretchr   
label_inforq   r   setAlignmentr	   AlignTop	AlignLeftsetWordWrapr   	addLayout
setStretchlabel_current_sequencer   text_current_sequencelabel_new_sequencer^   text_new_sequencesetPlaceholderTexthelper_buttonr   label_warningr   button_default	button_ok
setEnabledbutton_clearbutton_cancelr   r   clear_new_sequencebtn_clear_sequenceback_new_sequencebutton_back_sequencesetWindowTitleformatr   rp   setStyleSheetr   addItemr   setColumnStretchsetRowStretch
addSpacingsetSizeConstraintSetFixedSizeclickedconnectaccept_overrideunbind_shortcutrejectset_sequence_to_defaultsetFocusPolicyNoFocus
clearFocus)rC   	icon_infolayout_icon_infolayout_info
button_boxnewseq_btnbarrc   layout_sequencelayoutwidgetsws              rE   r   zShortcutEditor.setup   s
    %&	#**+BCD&=++Aq!Q7##A&""9-##C( ( F G	H 	$$R[[2<<%?@##D)!m&&q!Q2./doo.q#&&,Q/B-C&D#%+D,A,A%B""(?);"<!1$!711!4E2FG-/""57+#X&&t,''bll(BC)!I,7$QtW-!!%(''
3(85 ]
T001c"T^^,T../T//0 #4sxx,34--#/ %6sxx
+45,,%.!
 $  #((Aq!4 9 9: 7 78 	Ao.55dii@A%%b) 	((/R & &-**1aA6!!+q!Q:B 3Q1a@!!$"="=q!D!!$"<"<aC!!$"9"91a@!!$"4"4a;!!$"8"8!Q?!!-A6!!$"4"4aAqA((C0%%a-T")"$  !4!45 	&&t';';<!!))$*>*>?""**4;;7##++D,H,HI
  2 2D4J4Jt22D4F4FNND33T5N5NP  	ARZZ(LLN	rF   c                 ^    | j                   j                          t        t        |           y)zSlot for rejected signal.N)r   setFocusr?   r   r   rB   s    rE   r   zShortcutEditor.reject  s$     	##%nd*,rF   c                 ^    | j                   j                          t        t        |           y)zSlot for accepted signal.N)r   r   r?   r   rI   rB   s    rE   rI   zShortcutEditor.accept  s"     	!nd*,rF   c                     |j                         t        j                  k(  r| j                  |       y|j                         t        j                  t        j
                  fv ryt        t        | #  |      S )Qt method override.T)	typer   ShortcutOverriderH   KeyPressShortcutr?   r   rL   )rC   rL   rD   s     rE   rL   zShortcutEditor.event#  sZ     ::<6222u%ZZ\foov??4U;;rF   c                    |j                         }|r|t        j                  k(  ryt        | j                        dk(  ry|t        j
                  t        j                  t        j                  t        j                  fv ryt               }|j                  |      }|j                  t        j                        }| j                  j                  |       | j                          y)r   Nr:   )rv   r	   Key_unknownlenr   Key_Control	Key_ShiftKey_AltKey_Metar<   rM   toStringr   PortableTextappendr   )rC   rL   	event_key
translatorevent_keyseqevent_keystrs         rE   rH   zShortcutEditor.keyPressEvent1  s    IIK	I7t A%R[[2 2 ')
!44U;#,,\-F-FG-rF   c                 
   g }t        | j                        dk(  r|S | j                  }| j                  D ]  }t	        j
                  t        |j                              }|j                         r<|j                  |j                  f| j                  | j                  fk(  rn|j                  | j                  dfv s| j                  dk(  s|j                  |      s|j                  |      s|j                  |        |S )Check shortcuts for conflicts.r   r   )r   r   r   r   r   
fromStringstrrv   isEmptyr   r   matchesr   )rC   	conflictsr   shortcutshortcut_qsequences        rE   check_conflictszShortcutEditor.check_conflictsD  s    	t A%** 		/H!-!8!8X\\9J!K!))+  (--0T\\4994MMDLL##66$,,#:M&..}=%--.@A$$X.		/ rF   c                 Z    	 | j                   j                  d       y# t        $ r Y yw xY w)zu
        Check that all characters in the new sequence are ascii or else the
        shortcut will not work.
        asciiTF)r   encodeUnicodeEncodeErrorr   s    rE   check_asciizShortcutEditor.check_asciiW  s4    
	$$W-  " 		s    	**c                    t        | j                        dk(  ry| j                  d   | j                  dk(  rt        nt        }t        fddD              ry| j                  dk(  rt        nt        }t        fd|D              ryy)zACheck if the first sub-sequence of the new key sequence is valid.r   Teditorc              3   &   K   | ]  }|v  
 y wr>   rQ   ).0mkeystrs     rE   	<genexpr>z1ShortcutEditor.check_singlekey.<locals>.<genexpr>k  s     JAAKJs   )CtrlAltShiftMetac              3   (   K   | ]	  }|k(    y wr>   rQ   )r  kr  s     rE   r  z1ShortcutEditor.check_singlekey.<locals>.<genexpr>r  s     ?V?s   F)r   r   r   EDITOR_SINGLE_KEYSSINGLE_KEYSany)rC   valid_single_keysr  s     @rE   check_singlekeyzShortcutEditor.check_singlekeyc  s    t A%%%a(F!%!9 "4?J J)IJK
 &*\\X%= &8CN "?->?@ rF   c                    | j                   }| j                  }| j                  j                  |j	                  t
        j                               | j                         }t        | j                        dk(  rt        }d}t               }n]|rt        }d}t        d      }d}	|D ]0  }
|	dz  }	|	dj                  |
j                  |
j                         z  }	2 |	dz  }	t        |      dk(  rt        d	      }nt        d
      }|dj                  | j                         z  }|j                  ||	|      }t#        j$                  d      }n|t&        v r't(        }t        d      }t#        j$                  d      }nq| j+                         du s| j-                         du r't.        }t        d      }t#        j$                  d      }n&t0        }t        d      }t#        j$                  d      }|| _        || _        | j6                  j9                  |       | j:                  j=                  | j2                  t0        t        fv        | j>                  j                  |       y)z:Update the warning label, buttons state and sequence text.r   r   z-<p style="margin-bottom: 0.3em">{0}</p>{1}{2}z!This key sequence conflicts with:z&nbsp;&nbsp;z - {0}: <b>{1}</b><br>z<br>r%   z(Press 'Ok' to unbind it and assign it toz*Press 'Ok' to unbind them and assign it toz <b>{}</b>.MessageBoxWarningzThis key sequence is forbidden.FzThis key sequence is invalid.zThis key sequence is valid.DialogApplyButtonN) r   r   r   rq   r   r   
NativeTextr   r   r   SEQUENCE_EMPTYr   SEQUENCE_CONFLICTr   r   r   r   r   r   	BLACKLISTIN_BLACKLISTr  r   INVALID_KEY
NO_WARNINGwarningr   r   r   r   r   r   )rC   r   r   r   r  r   r   template	tip_titletip_bodystip_overrides               rE   r   zShortcutEditor.update_warningw  s   **((&&""<#:#:;	= ((*	t A%$GC7D'GFH=>IH OL(4;;AIIqvvNNO H9~" !KL !MNM00;;L//)X|DC##$78DY&"G56C##$78D!!#u,0@0@0Be0K!G34C##$78D G12C##$78D"""4(!!LLZ):;;	=""3'rF   c                     |j                  d      D cg c]  }t        |       c}| _        | j                          yc c}w )zx
        This is a convenience method to set the new QKeySequence of the
        shortcut editor from a string.
        r   N)splitr   r   r   )rC   rr   r   s      rE   set_sequence_from_strz$ShortcutEditor.set_sequence_from_str  s6    
 6>^^D5IJLOJ Ks   ?c                     t        j                  ddj                  | j                  | j                              }|r'|j                  d      | _        | j                          y| j                          y)z@Set the new sequence to the default value defined in the config.r   z{}/{}r   N)	r   get_defaultr   r   r   r#  r   r   r   )rC   rr   s     rE   r   z&ShortcutEditor.set_sequence_to_default  sW    ##dii@B'~~d3D!  "rF   c                 L    | j                   dd | _         | j                          y)z7Remove the last subsequence from the sequence compound.Nr   r   r   s    rE   r   z ShortcutEditor.back_new_sequence  s#    ++CR0rF   c                 2    g | _         | j                          y)zClear the new sequence.Nr)  r   s    rE   r   z!ShortcutEditor.clear_new_sequence  s    rF   c                 2    g | _         | j                          y)zUnbind the shortcut.N)r   rI   r   s    rE   r   zShortcutEditor.unbind_shortcut  s    rF   c                 d    | j                         }|r|D ]	  }d|_         | j                          y)z7Unbind all conflicted shortcuts, and accept the new oner   N)r   rv   rI   )rC   r   r   s      rE   r   zShortcutEditor.accept_override  s2    ((*	% "!"rF   )rW   rX   rY   rZ   r@   propertyr   r   r   r
   r   rI   rL   rH   r   r   r  r   r$  r   r   r   r   r   r[   r\   s   @rE   r   r      s    . + + / /rh 
V- - 
V- -<&&
!(/(b#


rF   r   c                   *    e Zd ZdZddZd Zd Zd Zy)r   zShortcut convenience class for holding shortcut context, name,
    original ordering index, key sequence for the shortcut and localized text.
    Nc                 <    d| _         || _        || _        || _        y )Nr   )indexr   r   rv   )rC   r   r   rv   s       rE   r@   zShortcut.__init__  s    
	rF   c                 d    dj                  | j                  | j                  | j                        S )Nz{0}/{1}: {2})r   r   r   rv   r   s    rE   __str__zShortcut.__str__  s#    $$T\\499dhhGGrF   c                 b    t        j                  | j                  | j                        | _        y r>   )r   get_shortcutr   r   rv   r   s    rE   loadzShortcut.load  s    $$T\\499=rF   c                 n    t        j                  | j                  | j                  | j                         y r>   )r   set_shortcutr   r   rv   r   s    rE   savezShortcut.save  s     $,,		488<rF   r>   )rW   rX   rY   rZ   r@   r2  r5  r8  rQ   rF   rE   r   r     s    H>=rF   r   )r   r%   r8   r9   c                       e Zd ZddZd Zd Zd Zej                  fdZ	ej                  fdZ
 e       fdZ e       fd	Zej                  fd
Zd Zd Zd Zd Zy)ShortcutsModelNc                    t        j                  |        || _        g | _        g | _        g | _        g | _        g | _        d| _        t               | _
        g | _        |j                         }|2|j                         j                         j                         | _        n|| _        |2|j#                         j                         j                         | _        y || _        y )Nr   )r   r@   rx   r   scores	rich_textnormal_textcontext_rich_textlettersr   labelwidthspalettetextcolorr   
text_colorhighlightedTexttext_color_highlight)rC   rg   rF  rH  rC  s        rE   r@   zShortcutsModel.__init__  s    $$T*!#X
 .."%lln22499;DO(DO''')//1668 % )=D%rF   c                     | j                   j                  j                  | j                   j                               }|S )z:Get the currently selected index in the parent table view.)rx   proxy_modelmapToSourcecurrentIndex)rC   is     rE   current_indexzShortcutsModel.current_index  s.    LL$$001J1J1LMrF   c                 ^    t        | j                  d       | _        | j                          y)Qt Override.c                 :    | j                   dz   | j                  z   S )N/r   r   )xs    rE   <lambda>z+ShortcutsModel.sortByName.<locals>.<lambda>  s    aiimAFF.B rF   rv   N)sortedr   resetr   s    rE   
sortByNamezShortcutsModel.sortByName
  s!    $BD

rF   c                     |j                         st        j                  S t        j                  t	        t        j                  | |                  S rP  )isValidr	   ItemIsEnabled	ItemFlagsintr   flagsrC   r0  s     rE   r`  zShortcutsModel.flags  s9    }}###||C 3 9 9$ FGHHrF   c                    |j                         }|j                         r)d|cxk  r!t        | j                        k  st	               S  t	               S | j                  |   }|j
                  }|j                         }|t        j                  k(  r]| j                  }| j                  t        j                         k(  r:| j                         j                         |k(  r| j                  }n| j                  }|t        k(  rQt        | j                         dkD  r| j                   |   }n|j"                  }dj%                  ||      }t	        |      S |t&        k(  r,| j(                  |   }dj%                  ||      }t	        |      S |t*        k(  r3t-        |      j/                  t,        j0                        }t	        |      S |t2        k(  rt	        | j4                  |         S t	               S |t        j6                  k(  r3t	        t9        t        j:                  t        j<                  z              S t	               S )rP  r   z<p style="color:{0}">{1}</p>)rowr\  r   r   r   rv   columnr	   DisplayRolerF  rx   r   focusWidgetrN  rH  CONTEXTr?  r   r   NAMEr=  SEQUENCEr   r   r  SEARCH_SCOREr<  TextAlignmentRoler_  AlignHCenterAlignVCenter)	rC   r0  rolerc  r   rv   rd  rE  rD  s	            rE   datazShortcutsModel.data  s   iik}}qC'E#dnn2E'E=  (F= >>#&ll2>>!OOE|||7799%%'++-4 55E OOE t--.211#6D#++D5<<UDI"4((4~~c*5<<UDI"4((8##C(11,2I2IJ"4((<'
 #4;;s#344 } R)))s2??R__#DEFF}rF   c                 v   |t         j                  k(  ry|t         j                  k(  r3t        t	        t         j
                  t         j                  z              S t        t	        t         j                  t         j                  z              S |t         j                  k7  r
t               S |t         j                  k(  rt|t        k(  rt        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 )rP  ContextNamer   Score)r	   rk  
Horizontalr   r_  rl  rm  
AlignRightre  rg  r   rh  ri  rj  )rC   sectionorientationrn  s       rE   
headerDatazShortcutsModel.headerData?  s    2'''bmm+"3r'H#IJJs2==2??#BCDD2>>!= "--''!"1Y<00D"1V9--H$"1Z=11L("1W:..}rF   c                 ,    t        | j                        S r[  )r   r   ra  s     rE   rowCountzShortcutsModel.rowCountR  s    4>>""rF   c                      y)rP  r:   rQ   ra  s     rE   columnCountzShortcutsModel.columnCountV  s    rF   c                 V   |j                         rd|j                         cxk  rt        | j                        k  rmn y| j                  |j                            }|j	                         }t        |t              }|t        k(  r||_        | j                  j                  ||       yy)rP  r   TF)r\  rc  r   r   rd  r   r   ri  rv   dataChangedemit)rC   r0  valuern  r   rd  rD  s          rE   setDatazShortcutsModel.setDataZ  s    ==?qEIIKE#dnn2EE  ~~eiik2H\\^F ,D!#!!%/rF   c                    || _         | j                  D cg c]  }|j                   }}| j                  D cg c]  }|j                   }}t	        ||d      }t	        ||d      }t        | \  }| _        }t        | \  | _        | _        | _	        t        | j                  |      D 	
cg c]
  \  }	}
|	|
z    c}
}	| _	        | j                          yc c}w c c}w c c}
}	w )z4Update search letters with text input in search box.z
<b>{0}</b>)r  N)r@  r   r   r   r   zipr?  r>  r=  r<  rX  )rC   rD  r   contextsnamescontext_resultsresults__context_scoresrT  ys              rE   update_search_lettersz$ShortcutsModel.update_search_lettersf  s    59^^DH$$DD/3~~>8>>+(\3#D%,G! 	3D"N8;W5$.$+),T[[.)IJAq1uJ

 E> Ks   CC/C"c                 B    | j                  | j                                y)z3Update active row to update color in selected text.N)ro  rN  r   s    rE   update_active_rowz ShortcutsModel.update_active_rowt  s    		$$$&'rF   c                      | j                   |   S )z@Get row based on model index. Needed for the custom proxy model.)r   )rC   row_nums     rE   rc  zShortcutsModel.rowx  s    ~~g&&rF   c                 D    | j                          | j                          y)z5"Reset model to take into account new search letters.N)beginResetModelendResetModelr   s    rE   rX  zShortcutsModel.reset|  s    rF   )NN)rW   rX   rY   r@   rN  rY  r`  r	   re  ro  rx  r   rz  r|  EditRoler  r  r  rc  rX  rQ   rF   rE   r:  r:    sn    =4
I  "~~ 'R 57NN & )] # !,  *, 
('rF   r:  c                        e Zd Z	 ddZd Z fdZ fdZd Zd Zd Z	d Z
d	 Zd
 ZddZd Zd Z fdZd Z xZS )ShortcutsTablec                 ^   t        j                  | |       || _        d | _        d | _        t        | ||      | _        t        |       | _        d| _	        | j                  j                  | j                         | j                  j                  d       | j                  j                  t               | j                  j                  t               | j                  j                  t         j"                         | j%                  | j                         | j'                  t(               | j+                  t        t-        | d             | j+                  t        t-        | d             | j/                  t0        j2                         | j5                  t0        j6                         | j9                  d       | j;                  t0        j<                         | j?                         j@                  jC                  | jD                         | jG                         jI                          y )N)rF  rH  r   T	   )margin)%r   r@   rx   findershortcut_datar:  source_modelShortcutsSortFilterProxyrJ  
last_regexsetSourceModelsetDynamicSortFiltersetFilterByColumnrg  rh  setFilterCaseSensitivityr	   CaseInsensitivesetModel
hideColumnrj  setItemDelegateForColumnr$   setSelectionBehaviorr   
SelectRowssetSelectionModeSingleSelectionsetSortingEnabledsetEditTriggersAllEditTriggersselectionModelselectionChangedr   	selectionverticalHeaderrA   )rC   rg   rF  rH  s       rE   r@   zShortcutsTable.__init__  s   D&)!*$(/99MO 4D9''(9(9:--d3**73**4011"2D2DEd&&'%%%dLa,HI%%g|D/KL!!"3">">?/??@t$.>>?..66t~~F""$rF   c                     || _         y)z
        Shortcut data comes from the registration of actions on the main
        window. This allows to only display the right actions on the
        shortcut table. This also allows to display the localize text.
        N)r  )rC   r  s     rE   set_shortcut_dataz ShortcutsTable.set_shortcut_data  s     +rF   c                 `    | j                   j                          t        t        |   |       yrP  N)r  r  r?   r  focusOutEventrC   rm   rD   s     rE   r  zShortcutsTable.focusOutEvent  s$    ++-nd1!4rF   c                     t         t        |   |       | j                  | j	                         j                                yr  )r?   r  focusInEvent	selectRowrL  rc  r  s     rE   r  zShortcutsTable.focusInEvent  s0    nd03t((*..01rF   c                 D    | j                          | j                          y)zUpdate selected row.N)updateisActiveWindowra  s     rE   r  zShortcutsTable.selection  s    rF   c                    | j                          | j                         j                         }| j                  j                  D cg c]   }|j                  |j                  dz         " }}t        |      dk(  rdg}| j                  t        t        |             | j                         j                  d       yc c}w )z%Adjust column size based on contents.z	         r   TN)resizeColumnsToContentshorizontalHeaderra   r  r   rb   r   r   setColumnWidthrh  maxsetStretchLastSection)rC   fmr   r  s       rE   adjust_cellszShortcutsTable.adjust_cells  s    $$&""$002373D3D3N3NOa!&&5.)OOu:?CED#e*-55d; Ps   %B>c                 D   t        | j                  D cg c](  }|d   j                         |d   j                         f* c}      }t        t	        t        |                  }g }t        j                         D ]K  \  }}}||f|v s|j                         }|j                         }t        |||      }|j                  |       M t	        |d       }t        |      D ]  \  }}||_
         || j                  _        dgt        |      z  | j                  _        |D 	cg c]  }	|	j                   c}	| j                  _        | j                  j#                          | j%                          | j'                  t(        t*        j,                         yc c}w c c}	w )z)Load shortcuts and assign to table model.r%   r8   c                 4    | j                   | j                  z   S r>   rS  )items    rE   rU  z/ShortcutsTable.load_shortcuts.<locals>.<lambda>  s    t||DII7M rF   rV  r   N)setr  lowerr   rW  r   iter_shortcutsr   r   	enumerater0  r  r   r   r<  r   r=  rX  r  sortByColumnrg  r	   AscendingOrder)
rC   r  r  r   r   r   r  r   rM  r   s
             rE   load_shortcutszShortcutsTable.load_shortcuts  sl   
  $ 2 24Dd1gmmotAw}}? 4 5VC$678	%)%8%8%: 	+!GT6-/!--/zz| $GT6:  *	+ 9*MN	 %Y/ 	KAxHN	 '0#$%3s9~#5 7@&A!qvv&A#!'2#4#4534, 'Bs   -F$Fc           	      @   g }t        | j                  j                        D ]  \  }}|t        | j                  j                        dz
  k(  r nt	        |j
                        dk(  rF| j                  j                  |dz   d D ]~  }||u rt	        |j
                        t	        |j
                        k(  s4|j                  |j                  k(  s|j                  dk(  s|j                  dk(  sl|j                  ||f         |r| j                         j                  j                          dj                  |D cg c]  \  }}|d| c}}      }t        j                  | t        d      t        d      dz   |z   t        j                         yyc c}}w )	r   r%   r   Nr   
z <---> 	Conflictsz+The following conflicts have been detected:)r  r  r   r   r   rv   r   r   rg   show_this_pager  r   r   r  r   r   )rC   r   r0  sh1sh2cstrs         rE   check_shortcutszShortcutsTable.check_shortcuts  so   	#D$5$5$?$?@ 	1JE3D--778::377|r!((22578< 1#:sww<3sww</s{{2ckkS6Hs*$$c3Z01	1 KKM((--/99.79"*#s 03C8 9 :Dan ! #. !//3!448!9:E..J	 9s   F
c                 z    | j                          | j                  j                  D ]  }|j                           y)z Save shortcuts from table model.N)r  r  r   r8  )rC   r   s     rE   save_shortcutszShortcutsTable.save_shortcuts  s2    ))33 	HMMO	rF   c                    | j                   j                  | j                               }|j                         |j	                         }}| j
                  j                  }||   j                  }||   j                  }| j
                  j                  |t              }|j                         }t        | ||||      }	|	j                         r)|	j                  }
| j
                  j                  ||
       yy)z5Create, setup and display the shortcut editor dialog.N)rJ  rK  rL  rc  rd  r  r   r   r   r0  ri  ro  r   exec_r   r  )rC   r0  rc  rd  r   r   r   sequence_indexrr   dialogr   s              rE   r~   zShortcutsTable.show_editor  s      ,,T->->-@Aiik5<<>V%%//	C.((~""**00h?!&&(gtXyI<<>!..L%%nlC rF   c                    |rd}n8| j                   j                         j                  dd      j                         }| j                  j                  |       | j                  j                  |       | j                  t        t        j                         | j                  |k7  r| j                  d       || _        y)z.Update the regex text for the shortcut finder.r    r   N)r  rD  replacer  rJ  
set_filterr  r  r  rj  r	   r  r  r  )rC   regexrX  rD  s       rE   	set_regexzShortcutsTable.set_regex  s    D;;##%--c26<<>D##D)//5,(9(9:??e#NN1rF   c                     | j                         j                         }| j                  j                         }|dz   |k(  rd}| j	                  |dz          y)z-Move to next row from currently selected row.r%   r(  NrL  rc  rJ  rz  r  rC   rc  rowss      rE   r{   zShortcutsTable.next_row!  sM    !%%'((*7d?CsQwrF   c                     | j                         j                         }| j                  j                         }|dk(  r|}| j	                  |dz
         y)z1Move to previous row from currently selected row.r   r%   Nr  r  s      rE   ry   zShortcutsTable.previous_row)  sI    !%%'((*!8CsQwrF   c                 r   |j                         }|t        j                  t        j                  fv r| j	                          y|t        j
                  fv r| j                  j                          y|t        j                  fv r)| j                         j                  j                          y|t        j                  t        j                  t        j                  t        j                  fv rt        t         | G  |       y|t        j$                  t        j&                  fvrd|j)                         }|rQt+        j,                  t.        |      6| j                  j                          | j                  j1                  |       yyy|t        j$                  fv r| j                  j#                  |       yyr  )rv   r	   r|   r}   r~   Key_Tabr  r   Key_Backtabrg   	reset_btnrw   rz   Key_Left	Key_Rightr?   r  rH   
Key_Escape	Key_SpacerD  researchr    set_text)rC   rL   rv   rD  rD   s       rE   rH   zShortcutsTable.keyPressEvent1  s-   iik2<<//RZZL KK  "R^^$$KKM##,,.RYYR[[",,GG.$5e<55::<D99/6BKK((*KK((. C  R]]O#KK%%e, $rF   c                 D    | j                          | j                          yr  )r~   r  rK   s     rE   mouseDoubleClickEventz$ShortcutsTable.mouseDoubleClickEventE  s    rF   )NNN)NF)rW   rX   rY   r@   r  r  r  r  r  r  r  r  r~   r  r{   ry   rH   r  r[   r\   s   @rE   r  r    sT    DH%>+5
2

	<6@J.D"   -(rF   r  c                   B     e Zd ZdZd fd	Zd Zd Zd Zd Zd Z	 xZ
S )	r  z5Custom proxy for supporting shortcuts multifiltering.c                 |    t         t        |   |       || _        t	        j
                  d      | _        i | _        y)z*Initialize the multiple sort filter proxy.r   N)r?   r  r@   rx   r  compilepatternfilters)rC   rg   rD   s     rE   r@   z!ShortcutsSortFilterProxy.__init__N  s0    &6v>zz#rF   c                 V    | j                   | j                  |<   | j                          y)z+Set regular expression in the given column.N)r  r  invalidateFilterrC   rd  s     rE   r  z*ShortcutsSortFilterProxy.setFilterByColumnU  s     #||VrF   c                 D   | j                   j                         D ]  \  }}t        |      | _        | j                  r|r| j                  j                  d       n| j                  j                  d       | j                  | j                   |<   | j                           y)z"Set regular expression for filter.FTN)r  itemsr   r  rx   r  r  )rC   rD  rv   r  s       rE   r  z#ShortcutsSortFilterProxy.set_filterZ  sy    ||))+ 	$GC+D1DL||..u5..t4 $DLL!!#	$rF   c                 Z    | j                   j                  |       | j                          y)z%Clear the filter of the given column.N)r  popr  r  s     rE   clearFilterz$ShortcutsSortFilterProxy.clearFiltere  s      rF   c                 2    i | _         | j                          y)zClear all the filters.N)r  r  r   s    rE   clearFiltersz%ShortcutsSortFilterProxy.clearFiltersj  s    rF   c                    g }| j                   j                         D ]  \  }}| j                         }|j                  |||      }|j	                         s:|j                  |      j                  }t        j                  ||      }	|	d}	|j                  |      j                  }
t        j                  ||
      }|d}|j                  |	       |j                  |        t        |      S )zTQt override.

        Reimplemented to allow filtering in multiple columns.
        r   )r  r  sourceModelr0  r\  rc  r   r  r  r   r   r  )rC   r  rg   r  rv   r  modelidxr   r_namer   	r_contexts               rE   filterAcceptsRowz)ShortcutsSortFilterProxy.filterAcceptsRowo  s    
 ,,,,. 	*JC$$&E++gsF3C{{}yy)..5$/>F))G,44IIeW5	$ "Iv&y)	* 7|rF   r>   )rW   rX   rY   rZ   r@   r  r  r  r  r
  r[   r\   s   @rE   r  r  K  s$    ? 
	$ 
 
rF   r  c                      g } t        j                         D ]<  \  }}}|j                         }|j                         }| j                  d||ddf       > | S )z/
    Load shortcuts from CONF for testing.
    N)r   r  r  r   )r  r   r   r  s       rE   load_shortcuts_datar    sa     M!002 @r--/zz|dGT4>?@ rF   c                 \    t               }| j                  |       | j                          | S )z/
    Load shortcuts into `shortcut_table`.
    )r  r  r  )shortcut_tabler  s     rE   r  r    s,     ()M$$]3!!#rF   c                      ddl m}   |        }t               }t        |      }|j	                          |j                          |j                          y )Nr   )qapplication)spyder.utils.qthelpersr  r  r  showr  r  )r  apptables      rE   testr    s<    3
.CE5!E	JJLIIK	rF   __main__)IrZ   r  qtpy.compatr   r   qtpy.QtCorer   r   r   r   r	   r
   
qtpy.QtGuir   r   qtpy.QtWidgetsr   r   r   r   r   r   r   r   r   r   r   r   r   spyder.api.translationsr   spyder.config.managerr   spyder.utils.icon_managerr   r  r   spyder.utils.stringmatchingr   r   spyder.widgets.helperwidgetsr    r!   r"   r#   r$   ranger   r  r  r  r  r  r  r  r  r<   r^   rt   r   objectr   rg  rh  ri  rj  r:  r  r  r  r  r  rW   )_is   0rE   <module>r#     sZ   # 
 3: : *B B B B & & ) 4 K8 8 +02,7Bu||B75%.H  $C C  	 
 ) B8y 88=^ = NW Nb
=v =* )5 %xU( UpFZ FR84 8v		 zF K 8s   >D)