
    G@dh                     n   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- d  e.dd          D             ddgz   Z/e/g dz   Z0i Z1dZ2dZ3dZ4dZ5dZ6 G d de          Z7 G d de          Z8 G d de+          Z9 G d de          Z: G d de;          Z<g d \  Z=Z>Z?Z@ G d! d"e          ZA G d# d$e          ZB G d% d&e	          ZCd' ZDd( ZEd) ZFeGd*k    r eF             dS dS )+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HTMLDelegatec                 8    g | ]}d                      |          S )zF{})format).0_is     Flib/python3.11/site-packages/spyder/plugins/shortcuts/widgets/table.py
<listcomp>r*   #   s$    777Bu||B777       $   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                 ~    t          t          |                                            |                                  d S N)superrC   __init__hideself	__class__s    r)   rG   zShortcutTranslator.__init__>   s1     $''00222		r+   c                 |    |                      |           |                                 |                                 S )z?Return a QKeySequence representation of the provided QKeyEvent.)keyPressEventacceptkeySequencerJ   events     r)   keyevent_to_keyseqz%ShortcutTranslator.keyevent_to_keyseqB   s5    5!!!!!!r+   c                     dS Qt OverrideF rP   s     r)   keyReleaseEventz"ShortcutTranslator.keyReleaseEventH       ur+   c                     dS rT   rV   rP   s     r)   
timerEventzShortcutTranslator.timerEventL   rX   r+   c                     dS rT   rV   rP   s     r)   rQ   zShortcutTranslator.eventP   rX   r+   )
__name__
__module____qualname____doc__rG   rR   rW   rZ   rQ   __classcell__rK   s   @r)   rC   rC   4   s~             " " "          r+   rC   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          |                               |           |                     d           |                                                     d          }|                                                     |                                 j                  }| 	                    |d|z  z   dz              d S )NTz2Ctrl+Shift+Alt+Backspace, Ctrl+Shift+Alt+Backspacer?   rA   )
rF   rc   rG   setReadOnlyfontMetricswidthstylepixelMetricPM_DefaultFrameWidthsetMinimumWidth)rJ   parenttwfwrK   s       r)   rG   zShortcutLineEdit.__init__X   s    %%..v666%%@B BZZ\\%%djjll&GHHR1r6]Q./////r+   c                 T    |                                                      |           dS rU   N)rl   rM   rJ   es     r)   rM   zShortcutLineEdit.keyPressEventc   s$    ##A&&&&&r+   c                 T    |                                                      |           dS rp   )rl   rW   rq   s     r)   rW   z ShortcutLineEdit.keyReleaseEventg   s$    %%a(((((r+   c                     |                      |           t          t          |                               |           dS )zQt method extension.N)
setToolTiprF   rc   setText)rJ   sequencerK   s     r)   rv   zShortcutLineEdit.setTextk   s:    !!!%%--h77777r+   )	r\   r]   r^   r_   rG   rM   rW   rv   r`   ra   s   @r)   rc   rc   U   su        BB0 0 0 0 0' ' ') ) )8 8 8 8 8 8 8 8 8r+   rc   c                   "     e Zd ZdZ fdZ xZS )ShortcutFinderz4Textbox for filtering listed shortcuts in the table.c                    |                                 }|t          j        fv r| j                                         dS |t          j        fv r| j                                         dS |t          j        t          j        fv r| j        	                                 dS t          t          |                               |           dS )zQt and FilterLineEdit Override.N)keyr	   Key_Up_parentprevious_rowKey_Downnext_row	Key_Enter
Key_Returnshow_editorrF   ry   rM   )rJ   rQ   r{   rK   s      r)   rM   zShortcutFinder.keyPressEventt   s    iikk29+L%%'''''R[M!!L!!#####R\2=111L$$&&&&&.$''55e<<<<<r+   )r\   r]   r^   r_   rM   r`   ra   s   @r)   ry   ry   q   s>        >>
= 
= 
= 
= 
= 
= 
= 
= 
=r+   ry   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                    t          t          |                               |           || _        |                     |                                 t          j         z             || _        || _	        || _
        |pt          d          | _        t                      | _        |                                  |                                  d S )Nz<None>)rF   r   rG   r}   setWindowFlagswindowFlagsr	   WindowContextHelpButtonHintcontextname	shortcutsr   current_sequencelist_qsequencessetupupdate_warning)rJ   rl   r   r   rw   r   rK   s         r)   rG   zShortcutEditor.__init__   s    nd##,,V444D,,..;;< 	= 	= 	= 	" ( 7AhKK66

r+   c                 6    d                     | j                  S )z7Return a string representation of the new key sequence., )joinr   rJ   s    r)   new_sequencezShortcutEditor.new_sequence   s     yy)***r+   c                 *    t          | j                  S )z7Return the QKeySequence object of the new key sequence.)r   r   r   s    r)   new_qsequencezShortcutEditor.new_qsequence   s     D-...r+   c           	      >   t                      }|                    t          j        d                     t	                      }|                    dddd           |                    d           |                    |           |                    d           t                      | _
        | j
                            t          d                     | j
                            t          j        t          j        z             | j
                            d           t%                      }|                    dddd           |                    |           |                    | j
                   |                    dd           t          t          d                    | _        t          | j                  | _        t          t          d                    | _        t3          |           | _        | j                            t          d	                     t                      | _        | j                            t;                                 t                      | _        | j                            d           | j                            t          j        t          j        z             t?          t          d
                    | _         t?          t          d                    | _!        | j!        "                    d           t?          t          d                    | _#        t?          t          d                    | _$        t%                      }|                    | j                    |                    d           |                    | j!                   |                    | j#                   |                    | j$                   tK          | t          j&        d          t          d          | j'                  | _(        tK          | t          j&        d          t          d          | j)                  | _*        t%                      }|                    d           |                    dddd           |                    | j*                   |                    | j(                   | +                    t          d          ,                    | j-                             | j        .                    d           d}| j        /                    |           |.                    d           |/                    |           ta                      }|                    dddd           |                    |dddd           |1                    te          dd          dddd           |                    | j        dd           |                    | j        dd           |                    | j        dd           |                    | j        dd           |                    | j        dd           |                    |dd           |                    | j        dddd           |3                    dd           |4                    dd           t	          |           }|                    |           |5                    d           |                    |           |6                    |j7                   | j!        j8        9                    | j:                   | j#        j8        9                    | j;                   | j$        j8        9                    | j<                   | j         j8        9                    | j=                   | j        | j        | j        | j#        | j         | j$        | j!        | j(        | j*        f	}	|	D ]5}
|
>                    t          j?                   |
@                                 6dS )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OkFr9   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;
            }rA      r?   r@   
   N)Ar#   setIconr   get_std_iconr   setContentsMargins
setSpacing	addWidget
addStretchr   
label_inforv   r   setAlignmentr	   AlignTop	AlignLeftsetWordWrapr   	addLayout
setStretchlabel_current_sequencer   text_current_sequencelabel_new_sequencerc   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setWindowTitler&   r   ru   setStyleSheetr   addItemr   setColumnStretchsetRowStretch
addSpacingsetSizeConstraintSetFixedSizeclickedconnectaccept_overrideunbind_shortcutrejectset_sequence_to_defaultsetFocusPolicyNoFocus
clearFocus)rJ   	icon_infolayout_icon_infolayout_info
button_boxnewseq_btnbarrh   layout_sequencelayoutwidgetsws              r)   r   zShortcutEditor.setup   s2    %&&	#*+BCCDDD&==++Aq!Q777##A&&&""9---##C((( (( F G G	H 	H 	H 	$$R[2<%?@@@##D)))!mm&&q!Q222.///do...q#&&&&,Q/B-C-C&D&D#%+D,A%B%B""(?););"<"<!1$!7!711!4E2F2FGGG-//""577+++#XX&&t,,,''bl(BCCC)!I,,77$QtWW--!!%(((''

33(855 ]]
T0111c"""T^,,,T.///T/000 #4sx,,344-#/ #/ #/ %6sx
++455,%. %. %.!
 $  ###((Aq!444 9::: 7888 	Ao..55di@@AAA%%b))) 	((///R   &&& &--**1aA666!!+q!Q:::B 3 3Q1a@@@!!$"=q!DDD!!$"<aCCC!!$"91a@@@!!$"4a;;;!!$"8!Q???!!-A666!!$"4aAqAAA((C000%%a---T"")))"$$$  !4555 	&&t';<<<!))$*>???"**4;777#++D,HIII
  2D4Jt2D4FND3T5NP  	 	ARZ(((LLNNNN	 	r+   c                     | j                                          t          t          |                                            dS )zSlot for rejected signal.N)r   setFocusrF   r   r   rI   s    r)   r   zShortcutEditor.reject  s<     	##%%%nd##**,,,,,r+   c                     | j                                          t          t          |                                            dS )zSlot for accepted signal.N)r   r   rF   r   rN   rI   s    r)   rN   zShortcutEditor.accept  s;     	!!!nd##**,,,,,r+   c                 "   |                                 t          j        k    r|                     |           dS |                                 t          j        t          j        fv rdS t          t          |                               |          S )Qt method override.T)	typer   ShortcutOverriderM   KeyPressShortcutrF   r   rQ   )rJ   rQ   rK   s     r)   rQ   zShortcutEditor.event#  ss     ::<<6222u%%%4ZZ\\fov???4..44U;;;r+   c                    |                                 }|r|t          j        k    rdS t          | j                  dk    rdS |t          j        t          j        t          j        t          j        fv rdS t                      }|
                    |          }|                    t          j                  }| j                            |           |                                  dS )r   NrA   )r{   r	   Key_unknownlenr   Key_Control	Key_ShiftKey_AltKey_MetarC   rR   toStringr   PortableTextappendr   )rJ   rQ   	event_key
translatorevent_keyseqevent_keystrs         r)   rM   zShortcutEditor.keyPressEvent1  s    IIKK	 	I77Ft  A%%FR[2 2 2 F'))
!44U;;#,,\-FGG---r+   c                    g }t          | j                  dk    r|S | j        }| j        D ]}t	          j        t          |j                            }|                                r=|j	        |j
        f| j	        | j
        fk    r\|j	        | j	        dfv s| j	        dk    r?|                    |          s|                    |          r|                    |           |S )Check shortcuts for conflicts.r   r   )r   r   r   r   r   
fromStringstrr{   isEmptyr   r   matchesr   )rJ   	conflictsr   shortcutshortcut_qsequences        r)   check_conflictszShortcutEditor.check_conflictsD  s    	t  A%%* 		/ 		/H!-!8X\9J9J!K!K!))++  (-0T\494MMMDL##666$,#:M:M&..}== /%--.@AA/$$X...r+   c                 ^    	 | j                             d           dS # t          $ r Y dS 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    r)   check_asciizShortcutEditor.check_asciiW  sI    
	$$W--- 4 " 	 	 	55	s    
,,c                 .   t          | j                  dk    rdS | j        d         | j        dk    rt          nt          }t          fddD                       rdS | j        dk    rt          nt          }t          fd|D                       rdS dS )zACheck if the first sub-sequence of the new key sequence is valid.r   Teditorc              3       K   | ]}|v V  	d S rE   rV   )r'   mkeystrs     r)   	<genexpr>z1ShortcutEditor.check_singlekey.<locals>.<genexpr>k  s'      JJAAKJJJJJJr+   )CtrlAltShiftMetac              3   $   K   | ]
}|k    V  d S rE   rV   )r'   kr  s     r)   r	  z1ShortcutEditor.check_singlekey.<locals>.<genexpr>r  s'      ??V??????r+   F)r   r   r   EDITOR_SINGLE_KEYSSINGLE_KEYSany)rJ   valid_single_keysr  s     @r)   check_singlekeyzShortcutEditor.check_singlekeyc  s    t  A%%4%a(F!%!9!9 "4!3?J JJJJ)IJJJKK 
!t
 &*\X%=%= &8%7CN "????->???@@ !4 5r+   c                    | j         }| j        }| j                            |                    t
          j                             |                                 }t          | j	                  dk    rt          }d}t                      }n~|rt          }d}t          d          }d}	|D ]*}
|	dz  }	|	d                    |
j        |
j                  z  }	+|	dz  }	t          |          dk    rt          d	          }nt          d
          }|d                    | j                  z  }|                    ||	|          }t#          j        d          }n|t&          v r+t(          }t          d          }t#          j        d          }n|                                 du s|                                 du r+t.          }t          d          }t#          j        d          }n*t0          }t          d          }t#          j        d          }|| _        || _        | j                            |           | j                            | j        t0          t          fv            | j                            |           dS )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   rv   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   )rJ   r   r   r   r  r   r   template	tip_titletip_bodystip_overrides               r)   r   zShortcutEditor.update_warningw  so   *(&&""<#:;;	= 	= 	= ((**	t  A%%$GC77DD 	9'GFH=>>IH O OL(4;;AIqvNNNH9~~"" !KLL !MNNM00;;;L//)X|DDC#$788DDY&&"G566C#$788DD!!##u,,0@0@0B0Be0K0K!G344C#$788DD G122C#$788D"""4(((!!LZ):;;	= 	= 	=""3'''''r+   c                 v    d |                     d          D             | _        |                                  dS )zx
        This is a convenience method to set the new QKeySequence of the
        shortcut editor from a string.
        c                 ,    g | ]}t          |          S rV   )r   r'   r#  s     r)   r*   z8ShortcutEditor.set_sequence_from_str.<locals>.<listcomp>  s    JJJLOOJJJr+   r   N)splitr   r   rJ   rw   s     r)   set_sequence_from_strz$ShortcutEditor.set_sequence_from_str  s?    
 KJX^^D5I5IJJJr+   c                     t          j        dd                    | j        | j                            }|r0|                    d          | _        |                                  dS |                                  dS )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   r)  s     r)   r   z&ShortcutEditor.set_sequence_to_default  sy    #di@@B B 	#'~~d33D!!!!!  """""r+   c                 V    | j         dd         | _         |                                  dS )z7Remove the last subsequence from the sequence compound.Nr   r   r   s    r)   r   z ShortcutEditor.back_new_sequence  s.    +CRC0r+   c                 <    g | _         |                                  dS )zClear the new sequence.Nr/  r   s    r)   r   z!ShortcutEditor.clear_new_sequence  s"    r+   c                 <    g | _         |                                  dS )zUnbind the shortcut.N)r   rN   r   s    r)   r   zShortcutEditor.unbind_shortcut  s    r+   c                 r    |                                  }|r|D ]	}d|_        
|                                  dS )z7Unbind all conflicted shortcuts, and accept the new oner   N)r   r{   rN   )rJ   r   r   s      r)   r   zShortcutEditor.accept_override  sD    ((**	 	"% " "!r+   )r\   r]   r^   r_   rG   propertyr   r   r   r
   r   rN   rQ   rM   r   r  r  r   r*  r   r   r   r   r   r`   ra   s   @r)   r   r      s       ..     + + X+ / / X/r r rh 
TVV- - - - V- 
TVV- - - - V-< < < < <  &  &
 
 
! ! !(/( /( /(b  # # #  
  
  
      r+   r   c                   ,    e Zd ZdZddZd Zd Zd ZdS )r   zShortcut convenience class for holding shortcut context, name,
    original ordering index, key sequence for the shortcut and localized text.
    Nc                 >    d| _         || _        || _        || _        d S )Nr   )indexr   r   r{   )rJ   r   r   r{   s       r)   rG   zShortcut.__init__  s"    
	r+   c                 N    d                     | j        | j        | j                  S )Nz{0}/{1}: {2})r&   r   r   r{   r   s    r)   __str__zShortcut.__str__  s     $$T\49dhGGGr+   c                 N    t          j        | j        | j                  | _        d S rE   )r   get_shortcutr   r   r{   r   s    r)   loadzShortcut.load  s    $T\49==r+   c                 P    t          j        | j        | j        | j                   d S rE   )r   set_shortcutr   r   r{   r   s    r)   savezShortcut.save  s#    $,	48<<<<<r+   rE   )r\   r]   r^   r_   rG   r8  r;  r>  rV   r+   r)   r   r     sb            H H H> > >= = = = =r+   r   )r   r,   r?   r@   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dS )ShortcutsModelNc                 
   t          j        |            || _        g | _        g | _        g | _        g | _        g | _        d| _        t                      | _
        g | _        |                                }|>|                                                                                                | _        n|| _        |?|                                                                                                | _        d S || _        d S )Nr   )r   rG   r}   r   scores	rich_textnormal_textcontext_rich_textlettersr   labelwidthspalettetextcolorr   
text_colorhighlightedTexttext_color_highlight)rJ   rl   rL  rN  rI  s        r)   rG   zShortcutsModel.__init__  s    $T***!#XX
 ..""%llnn224499;;DOO(DO'''))//116688 %%% )=D%%%r+   c                 r    | j         j                            | j                                                   }|S )z:Get the currently selected index in the parent table view.)r}   proxy_modelmapToSourcecurrentIndex)rJ   is     r)   current_indexzShortcutsModel.current_index  s-    L$001J1J1L1LMMr+   c                 f    t          | j        d           | _        |                                  dS )Qt Override.c                 &    | j         dz   | j        z   S )N/r   r   )xs    r)   <lambda>z+ShortcutsModel.sortByName.<locals>.<lambda>  s    aimAF.B r+   r{   N)sortedr   resetr   s    r)   
sortByNamezShortcutsModel.sortByName
  s6    $B$BD D D

r+   c                     |                                 st          j        S t          j        t	          t          j        | |                              S rV  )isValidr	   ItemIsEnabled	ItemFlagsintr   flagsrJ   r6  s     r)   rf  zShortcutsModel.flags  sA    }} 	$##|C 3 9$ F FGGHHHr+   c                    |                                 }|                                r!d|cxk    rt          | j                  k     sn t	                      S | j        |         }|j        }|                                }|t          j        k    rb| j	        }| j
        t          j                    k    r9|                                                                  |k    r| j        }n| j	        }|t          k    rRt          | j                  dk    r| j        |         }n|j        }d                    ||          }t	          |          S |t&          k    r2| j        |         }d                    ||          }t	          |          S |t*          k    r;t-          |                              t,          j                  }t	          |          S |t2          k    rt	          | j        |                   S nC|t          j        k    r3t	          t9          t          j        t          j        z                      S t	                      S )rV  r   z<p style="color:{0}">{1}</p>)rowrb  r   r   r   r{   columnr	   DisplayRolerL  r}   r   focusWidgetrT  rN  CONTEXTrE  r   r&   NAMErC  SEQUENCEr   r   r  SEARCH_SCORErB  TextAlignmentRolere  AlignHCenterAlignVCenter)	rJ   r6  roleri  r   r{   rj  rK  rJ  s	            r)   datazShortcutsModel.data  s   iikk}} 	!qC'E'E'E'E#dn2E2E'E'E'E'E== >#&l2>!!OE||79999%%''++--44 5EE OE  t-..221#6DD#+D5<<UDII"4(((4~c*5<<UDII"4(((8###C((11,2IJJ"4(((<''
 #4;s#3444 ( R)))s2?R_#DEEFFF}}r+   c                    |t           j        k    rv|t           j        k    r3t          t	          t           j        t           j        z                      S t          t	          t           j        t           j        z                      S |t           j        k    rt                      S |t           j        k    r|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 )rV  ContextNamer   Score)r	   rq  
Horizontalr   re  rr  rs  
AlignRightrk  rm  r   rn  ro  rp  )rJ   sectionorientationrt  s       r)   
headerDatazShortcutsModel.headerData?  s   2'''bm++"3r'H#I#IJJJs2=2?#BCCDDD2>!!== "-'''!!"1Y<<000D"1V99---H$$"1Z==111L(("1W::...}}r+   c                 *    t          | j                  S ra  )r   r   rg  s     r)   rowCountzShortcutsModel.rowCountR  s    4>"""r+   c                     dS )rV  rA   rV   rg  s     r)   columnCountzShortcutsModel.columnCountV  s    qr+   c                    |                                 rd|                                cxk    rt          | j                  k     rzn nw| j        |                                         }|                                }t          |t                    }|t          k    r||_        | j	        
                    ||           dS dS )rV  r   TF)rb  ri  r   r   rj  r   r   ro  r{   dataChangedemit)rJ   r6  valuert  r   rj  rJ  s          r)   setDatazShortcutsModel.setDataZ  s    ==?? 	qEIIKKEEEE#dn2E2EEEEEE~eiikk2H\\^^F ,,D!!#!!%///4ur+   c                 l   || _         d | j        D             }d | j        D             }t          ||d          }t          ||d          }t          | \  }| _        }t          | \  | _        | _        | _        d t          | j        |          D             | _        |                                  dS )z4Update search letters with text input in search box.c                     g | ]	}|j         
S rV   )r   r'   r   s     r)   r*   z8ShortcutsModel.update_search_letters.<locals>.<listcomp>i  s    DDDH$DDDr+   c                     g | ]	}|j         
S rV   r   r  s     r)   r*   z8ShortcutsModel.update_search_letters.<locals>.<listcomp>j  s    >>>8>>>r+   z
<b>{0}</b>)r   c                     g | ]
\  }}||z   S rV   rV   )r'   rZ  ys      r)   r*   z8ShortcutsModel.update_search_letters.<locals>.<listcomp>q  s     JJJAq1uJJJr+   N)	rF  r   r   ziprE  rD  rC  rB  r^  )rJ   rJ  contextsnamescontext_resultsresults__context_scoress           r)   update_search_lettersz$ShortcutsModel.update_search_lettersf  s    DDT^DDD>>t~>>>+(\3 3 3#D%,GGG! 	3D"N8;W5$.$+JJT[.)I)IJJJ

r+   c                 T    |                      |                                            dS )z3Update active row to update color in selected text.N)ru  rT  r   s    r)   update_active_rowz ShortcutsModel.update_active_rowt  s&    		$$$&&'''''r+   c                     | j         |         S )z@Get row based on model index. Needed for the custom proxy model.)r   )rJ   row_nums     r)   ri  zShortcutsModel.rowx  s    ~g&&r+   c                 V    |                                   |                                  dS )z5"Reset model to take into account new search letters.N)beginResetModelendResetModelr   s    r)   r^  zShortcutsModel.reset|  s,    r+   )NN)r\   r]   r^   rG   rT  r_  rf  r	   rk  ru  r~  r   r  r  EditRoler  r  r  ri  r^  rV   r+   r)   r@  r@    s$       = = = =4  
  I I I  "~ ' ' ' 'R 57N    & )[]] # # # # !,     *, 
 
 
 
  ( ( (' ' '    r+   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 )ShortcutsTableNc                    t          j        | |           || _        d | _        d | _        t          | ||          | _        t          |           | _        d| _	        | j        
                    | j                   | j                            d           | j                            t                     | j                            t                     | j                            t           j                   |                     | j                   |                     t(                     |                     t          t-          | d                     |                     t          t-          | d                     |                     t0          j                   |                     t0          j                   |                     d           |                     t0          j                   |                                 j         !                    | j"                   | #                                $                                 d S )N)rL  rN  r   T	   )margin)%r   rG   r}   findershortcut_datar@  source_modelShortcutsSortFilterProxyrP  
last_regexsetSourceModelsetDynamicSortFiltersetFilterByColumnrm  rn  setFilterCaseSensitivityr	   CaseInsensitivesetModel
hideColumnrp  setItemDelegateForColumnr$   setSelectionBehaviorr   
SelectRowssetSelectionModeSingleSelectionsetSortingEnabledsetEditTriggersAllEditTriggersselectionModelselectionChangedr   	selectionverticalHeaderrH   )rJ   rl   rL  rN  s       r)   rG   zShortcutsTable.__init__  s   D&)))!*$(/99MO O O 4D99''(9:::--d333**7333**400011"2DEEEd&'''%%%%%dLa,H,H,HIII%%g|D/K/K/KLLL!!"3">???/?@@@t$$$.>???.66t~FFF""$$$$$r+   c                     || _         dS )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  )rJ   r  s     r)   set_shortcut_dataz ShortcutsTable.set_shortcut_data  s     +r+   c                     | j                                          t          t          |                               |           dS rV  N)r  r  rF   r  focusOutEventrJ   rr   rK   s     r)   r  zShortcutsTable.focusOutEvent  s<    ++---nd##11!44444r+   c                     t          t          |                               |           |                     |                                                                            dS r  )rF   r  focusInEvent	selectRowrR  ri  r  s     r)   r  zShortcutsTable.focusInEvent  sQ    nd##00333t((**..0011111r+   c                 V    |                                   |                                  dS )zUpdate selected row.N)updateisActiveWindowrg  s     r)   r  zShortcutsTable.selection  s'    r+   c                 v   |                                   |                                                                 fd| j        j        D             }t          |          dk    rdg}|                     t          t          |                     |                                 	                    d           dS )z%Adjust column size based on contents.c                 J    g | ]}                     |j        d z              S )z	         )rg   r   )r'   r#  fms     r)   r*   z/ShortcutsTable.adjust_cells.<locals>.<listcomp>  s+    OOOa!&5.))OOOr+   r   TN)
resizeColumnsToContentshorizontalHeaderrf   r  r   r   setColumnWidthrn  maxsetStretchLastSection)rJ   r  r  s     @r)   adjust_cellszShortcutsTable.adjust_cells  s    $$&&&""$$0022OOOO43D3NOOOu::??CED#e**---55d;;;;;r+   c                    t          d | j        D                       }t          t          t          |                              }g }t	          j                    D ]Z\  }}}||f|v rN|                                }|                                }t          |||          }|                    |           [t          |d           }t          |          D ]\  }}||_
        || j        _        dgt          |          z  | j        _        d |D             | j        _        | j                                         |                                  |                     t&          t(          j                   dS )z)Load shortcuts and assign to table model.c                 v    g | ]6}|d                                           |d                                          f7S )r,   r?   )lower)r'   items     r)   r*   z1ShortcutsTable.load_shortcuts.<locals>.<listcomp>  sA     4 4 4Dd1gmmootAw}}? 4 4 4r+   c                      | j         | j        z   S rE   rY  )r  s    r)   r[  z/ShortcutsTable.load_shortcuts.<locals>.<lambda>  s    t|DI7M r+   r\  r   c                     g | ]	}|j         
S rV   r  r'  s     r)   r*   z1ShortcutsTable.load_shortcuts.<locals>.<listcomp>  s    &A&A&A!qv&A&A&Ar+   N)setr  r   r]  r   iter_shortcutsr  r   r   	enumerater6  r  r   r   rB  rC  r^  r  sortByColumnrm  r	   AscendingOrder)rJ   r  r   r   r   r  r   rS  s           r)   load_shortcutszShortcutsTable.load_shortcuts  s   
  4 4 $ 24 4 4 5 5VC$6$67788	%)%8%:%: 	+ 	+!GT6-//!--//zz|| $GT6::  ***9*M*MNNN	 %Y// 	 	KAxHNN&/#$%3s9~~#5 &A&Ay&A&A&A#!!!'2#455555r+   c                    g }t          | j        j                  D ]\  }}|t          | j        j                  dz
  k    r nt	          |j                  dk    r@| j        j        |dz   d         D ]n}||u rt	          |j                  t	          |j                  k    r=|j        |j        k    s|j        dk    s|j        dk    r|                    ||f           o|r|                                 j	        
                                 d                    d |D                       }t          j        | t          d          t          d          dz   |z   t          j                   dS dS )	r   r,   r   Nr   
c                 "    g | ]\  }}|d |S )z <---> rV   )r'   sh1sh2s      r)   r*   z2ShortcutsTable.check_shortcuts.<locals>.<listcomp>  s7     9 9 9"*#s 03ssCC8 9 9 9r+   	Conflictsz+The following conflicts have been detected:)r  r  r   r   r   r{   r   r   rl   show_this_pager  r   r   r  r   r   )rJ   r   r6  r  r  cstrs         r)   check_shortcutszShortcutsTable.check_shortcuts  s   	#D$5$?@@ 	1 	1JE3D-788:::37||r!!(25788< 1 1#::sw<<3sw<<//s{22ckS6H6Hs**$$c3Z0001  	JKKMM(--///99 9 9.79 9 9 : :Dann ! #. !/ !//3!448!9:E.J J J J J		J 	Jr+   c                 t    |                                   | j        j        D ]}|                                 dS )z Save shortcuts from table model.N)r  r  r   r>  )rJ   r   s     r)   save_shortcutszShortcutsTable.save_shortcuts  sB    )3 	 	HMMOOOO	 	r+   c                    | j                             |                                           }|                                |                                }}| j        j        }||         j        }||         j        }| j        	                    |t                    }|                                }t          | ||||          }	|	                                r$|	j        }
| j                            ||
           dS dS )z5Create, setup and display the shortcut editor dialog.N)rP  rQ  rR  ri  rj  r  r   r   r   r6  ro  ru  r   exec_r   r  )rJ   r6  ri  rj  r   r   r   sequence_indexrw   dialogr   s              r)   r   zShortcutsTable.show_editor  s     ,,T->->-@-@AAiikk5<<>>V%/	C.(~"*00h??!&&((gtXyII<<>> 	D!.L%%nlCCCCC	D 	Dr+   Fc                    |rd}n?| j                                                             dd                                          }| j                            |           | j                            |           |                     t          t          j                   | j        |k    r|                     d           || _        dS )z.Update the regex text for the shortcut finder.r    r   N)r  rJ  replacer  rP  
set_filterr  r  r  rp  r	   r  r  r  )rJ   regexr^  rJ  s       r)   	set_regexzShortcutsTable.set_regex  s     	?DD;##%%--c266<<>>D##D)))//555,(9:::?e##NN1r+   c                     |                                                                  }| j                                        }|dz   |k    rd}|                     |dz              dS )z-Move to next row from currently selected row.r,   r.  NrR  ri  rP  r  r  rJ   ri  rowss      r)   r   zShortcutsTable.next_row!  sa    !!%%''((**7d??CsQwr+   c                     |                                                                  }| j                                        }|dk    r|}|                     |dz
             dS )z1Move to previous row from currently selected row.r   r,   Nr  r  s      r)   r~   zShortcutsTable.previous_row)  s]    !!%%''((**!88CsQwr+   c                 l   |                                 }|t          j        t          j        fv r|                                  dS |t          j        fv r| j                                         dS |t          j        fv r-| 	                                j
                                         dS |t          j        t          j        t          j        t          j        fv r*t          t           |                               |           dS |t          j        t          j        fvri|                                }|rOt+          j        t.          |          7| j                                         | j                            |           dS dS dS |t          j        fv r| j                            |           dS dS r  )r{   r	   r   r   r   Key_Tabr  r   Key_Backtabrl   	reset_btnr|   r   Key_Left	Key_RightrF   r  rM   
Key_Escape	Key_SpacerJ  researchr    set_text)rJ   rQ   r{   rJ  rK   s       r)   rM   zShortcutsTable.keyPressEvent1  s   iikk2<///RZL  K  """""R^$$$KKMM#,,.....RYR[",GGG.$''55e<<<<<555::<<D /9/66BK((***K((...../ /BB R]O##K%%e,,,,, $#r+   c                 V    |                                   |                                  dS r  )r   r  rP   s     r)   mouseDoubleClickEventz$ShortcutsTable.mouseDoubleClickEventE  s%    r+   )NNN)NF)r\   r]   r^   rG   r  r  r  r  r  r  r  r  r   r  r   r~   rM   r  r`   ra   s   @r)   r  r    s2       DH% % % %>+ + +5 5 5 5 5
2 2 2 2 2
  
	< 	< 	<6 6 6@J J J.  D D D"                 - - - - -(      r+   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.Nc                     t          t          |                               |           || _        t	          j        d          | _        i | _        dS )z*Initialize the multiple sort filter proxy.r   N)rF   r  rG   r}   r  compilepatternfilters)rJ   rl   rK   s     r)   rG   z!ShortcutsSortFilterProxy.__init__N  sC    &--66v>>>z#r+   c                 L    | j         | j        |<   |                                  dS )z+Set regular expression in the given column.N)r  r  invalidateFilterrJ   rj  s     r)   r  z*ShortcutsSortFilterProxy.setFilterByColumnU  s(    #|Vr+   c                 .   | j                                         D ]z\  }}t          |          | _        | j        r|r| j                            d           n| j                            d           | j        | j         |<   |                                  {dS )z"Set regular expression for filter.FTN)r  itemsr   r  r}   r  r
  )rJ   rJ  r{   r  s       r)   r  z#ShortcutsSortFilterProxy.set_filterZ  s    |))++ 	$ 	$GC+D11DL| 5 5..u5555..t444 $DL!!####	$ 	$r+   c                 b    | j                             |           |                                  dS )z%Clear the filter of the given column.N)r  popr
  r  s     r)   clearFilterz$ShortcutsSortFilterProxy.clearFiltere  s0       r+   c                 <    i | _         |                                  dS )zClear all the filters.N)r  r
  r   s    r)   clearFiltersz%ShortcutsSortFilterProxy.clearFiltersj  s!    r+   c                     g }| j                                         D ]\  }}|                                 }|                    |||          }|                                r|                    |          j        }t          j        ||          }	|	d}	|                    |          j	        }
t          j        ||
          }|d}|
                    |	           |
                    |           t          |          S )zTQt override.

        Reimplemented to allow filtering in multiple columns.
        Nr   )r  r  sourceModelr6  rb  ri  r   r  r   r   r   r  )rJ   r  rl   r  r{   r  modelidxr   r_namer   	r_contexts               r)   filterAcceptsRowz)ShortcutsSortFilterProxy.filterAcceptsRowo  s    
 ,,,.. 	* 	*JC$$&&E++gsF33C{{}} 
*yy)).5$//>F))G,,4IeW55	$ "Iv&&&y)))7||r+   rE   )r\   r]   r^   r_   rG   r  r  r  r  r  r`   ra   s   @r)   r  r  K  s        ??          
	$ 	$ 	$     
     
      r+   r  c                      g } t          j                    D ]H\  }}}|                                }|                                }|                     d||ddf           I| S )z/
    Load shortcuts from CONF for testing.
    N)r   r  r  r   )r  r   r   r  s       r)   load_shortcuts_datar    sl     M!022 @ @r--//zz||dGT4>????r+   c                 t    t                      }|                     |           |                                  | S )z/
    Load shortcuts into `shortcut_table`.
    )r  r  r  )shortcut_tabler  s     r)   r  r    s;     ())M$$]333!!###r+   c                      ddl m}   |             }t                      }t          |          }|                                 |                                 |                                 d S )Nr   )qapplication)spyder.utils.qthelpersr  r  r  showr  r  )r  apptables      r)   testr$    si    333333
,..CE5!!E	JJLLLIIKKK	r+   __main__)Hr_   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  rC   rc   ry   r   objectr   rm  rn  ro  rp  r@  r  r  r  r  r$  r\   rV   r+   r)   <module>r1     s4   # " 
			 3 2 2 2 2 2 2 2: : : : : : : : : : : : : : : : * * * * * * * *B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B & % % % % % & & & & & & ) ) ) ) ) ) 4 4 4 4 4 4 K K K K K K K K8 8 8 8 8 8 8 8 8 8 8 8 8 8 87%%2,,7775%.H  $C $C $C C  	 
     )   B8 8 8 8 8y 8 8 88= = = = =^ = = = N N N N NW N N Nb
= = = = =v = = =* )5 %xU U U U U( U U UpF F F F FZ F F FR8 8 8 8 84 8 8 8v	 	 	  	 	 	 zDFFFFF r+   