a
    c_8                     @   s   d Z ddlmZmZmZmZ ddlmZmZm	Z	m
Z
mZmZ ddlmZ ddlZddlZdZeejej ZedZdZd	Zd
Zee e e e e Zdd ZG dd deZedkrddlmZ edddd ddlm Z  e e dS )z6
Dialog for building Tkinter accelerator key bindings
    )ToplevelListbox	StringVarTclError)FrameButtonCheckbuttonEntryLabel	Scrollbar)
messageboxN)ZF1ZF2ZF3ZF4ZF5ZF6ZF7ZF8ZF9ZF10ZF11ZF12z~!@#%^&*()_-+={}[]|;:,.<>/?)TabSpaceZReturn)Z	BackSpaceZDeleteZInsert)ZHomeZEndPage Up	Page Down
Left ArrowRight ArrowUp Arrow
Down Arrowc              $   C   s|   ddddddddd	d
dddddddddddddddddddddd d!d"d#d$#}| | | } d%|v rr| tjv rr|  } d&|  S )'z3Translate from keycap symbol to the Tkinter keysym.ZspaceZ
asciitildeZexclamZatZ
numbersignZpercentZasciicircumZ	ampersandZasteriskZ	parenleftZ
parenrightZ
underscoreZminusZplusZequalZ	braceleftZ
bracerightZbracketleftZbracketrightZbarZ	semicolonZcolonZcommaZperiodZlessZgreaterZslashZquestionZPriorZNextZLeftZRightZUpZDownr   )#r   ~!@#%^&*()_-+={}[]|;:,.<>/?r   r   r   r   r   r   r   ShiftzKey-)getstringascii_lowercaseupper)key	modifiersmapping r8   #lib/python3.9/idlelib/config_key.pytranslate_key   s"    r:   c                   @   s   e Zd ZdZdddddZdd Zdd	 Zd
d Zdd ZdddZ	dd Z
dd Zdd Zd ddZd!ddZdd Zdd ZdS )"GetKeysDialogzKey Sequence ErrorF)_htest_utestc          	      C   sB  t | | |   | jdd | jddd | | | | |   | d| j	 || _
|| _|| _d| _t| | _| jd |   g | _| jD ]"}t| }|d | j| qd| _|   |   | d| | d |  d   | |s| d |  d  nd	 f  |s>|   |    d
S )a  
        parent - parent of this dialog
        title - string which is the title of the popup dialog
        action - string, the name of the virtual event these keys will be
                 mapped to
        current_key_sequences - list, a list of all key sequence lists
                 currently mapped to virtual events, for overlap checking
        _htest - bool, change box location when running htest
        _utest - bool, do not wait when running unittest
           )borderwidthF)heightwidthZWM_DELETE_WINDOW z+%d+%d      N)!r   __init__ZwithdrawZ	configureZ	resizabletitleZ	transientZgrab_setZprotocolcancelparentactioncurrent_key_sequencesresultr   
key_stringsetset_modifiers_for_platformmodifier_varsr6   appendadvancedcreate_widgetsZupdate_idletasksZgeometryZwinfo_rootxZwinfo_widthZwinfo_reqwidthZwinfo_rootyZwinfo_heightZwinfo_reqheightZ	deiconifyZwait_window)	selfrH   rF   rI   rJ   r<   r=   modifiervariabler8   r8   r9   rE   0   sL    




zGetKeysDialog.__init__c                 O   s   t j|i | d S N)r   	showerror)rS   argskwargsr8   r8   r9   rW   `   s    zGetKeysDialog.showerrorc              	   C   s0  t | ddd | _}|jdddd t | }|jdd	d
 t|dd| jd| _| jjddddd t|dd| jd| _| jjddddd t |dd| _	| j	jdddddd t
| j	d| j dd}|jdd t
| j	d| jddd}|jddd	d t || _| jjddddd  i | _d}t| j| jD ]T\}}| j||}t| j| j|||d!d"}	|	jd|ddd# |	| j|< |d7 }q.t
| jdd$d%}
|
jddd&ddd' t| jd(d)d*d+| _| jjd,gtR   | jd-| j | jjdd&d&d.d/ t| jd0| jjd1}| jj|jd2 |jddd&d.d/ t| jd3| j d4| _!| j!jddd&d5 t |d6d| _"| j"jdddddd t
| j"dd7| j d8d9 d%}|jdd t#| j"| jd:| _$| j$jd	d; t || _%| j%jddddd  t
| j%dd<d%}|jdddd= t|| j&d>d?| _'| j'jddd@dddA | &  d S )BNrC   Zsunken)r?   relieftopTZboth)sideexpandfillZbottomx)r\   r^   ZOK   )textrA   commandr   r>   )rowcolumnpadxpadyZCancel   Zkeyseq_basic)nameZnsew)rc   rd   stickyre   rf   zNew keys for 'z' :ra   w)anchorleftZgroove)justifytextvariablerZ   r?   )ZipadxZipadyr^   )rc   rd   ri   re   rB   )rb   ra   rU   ZonvalueZoffvalue)rc   rd   re   ri   zSelect the desired modifier keys
above, and the final key from the
list on the right.

Use upper case Symbols when using
the Shift modifier.  (Letters will be
converted automatically.))rn   ra      )rc   rd   
columnspanre   ri      
   Zsingle)rA   r@   Z
selectmodeendz<ButtonRelease-1>ns)rc   rd   Zrowspanri   Zvertical)Zorientrb   )Zyscrollcommandz
Clear Keys)ra   rb   )rc   rd   rq   Zkeyseq_advancedzEnter new binding(s) for 'z' :
z2(These bindings will not be checked for validity!))ro   )r^   a  Key bindings are specified using Tkinter keysyms as
in these samples: <Control-f>, <Shift-F2>, <F12>,
<Control-space>, <Meta-less>, <Control-Alt-Shift-X>.
Upper case is used when the Shift modifier is present!

'Emacs style' multi-keystroke bindings are specified as
follows: <Control-x><Control-y>, where the first key
is the 'do-nothing' keybinding.

Multiple separate bindings for one action should be
separated by a space, eg., <Alt-v> <Meta-v>.)rc   rd   ri   << Basic Key Binding Entry)rb   ra   Zew)rc   rd   Zstickre   rf   )(r   frameZpackr   okZ	button_okZgridrG   Zbutton_cancelframe_keyseq_basicr
   rI   rL   frame_controls_basicZmodifier_checkbuttonszipr6   rO   modifier_labelr1   r   build_key_stringr   list_keys_finalinsertAVAILABLE_KEYSbindfinal_key_selectedr   yviewconfigrM   clear_key_seqZbutton_clearframe_keyseq_advancedr	   advanced_keysframe_help_advancedtoggle_levelbutton_level)rS   rw   Zframe_buttonsZbasic_titleZ
basic_keysrd   rT   rU   ZlabelZcheckZ
help_basicZscroll_keys_finalZadvanced_titleZhelp_advancedr8   r8   r9   rR   d   s    



zGetKeysDialog.create_widgetsc                 C   s.   t jdkrg d| _n
g d| _ddi| _dS )aV  Determine list of names of key modifiers for this platform.

        The names are used to build Tk bindings -- it doesn't matter if the
        keyboard has these keys; it matters if Tk understands them.  The
        order is also important: key binding equality depends on it, so
        config-keys.def must use the same ordering.
        darwin)r0   ControlZOptionZCommand)r   ZAltr0   r   ZCtrlN)sysplatformr6   r|   rS   r8   r8   r9   rN      s    

z(GetKeysDialog.set_modifiers_for_platformc                 C   s   | j ddrN|   | j jdd | j  | j  | j	  d| _
n0|   | j jdd | j  | j  d| _
dS )	z'Toggle between basic and advanced keys.ra   ZAdvancedrv   rj   TzAdvanced Key Binding Entry >>FN)r   Zcget
startswithr   r   r   Zliftr   r   Z	focus_setrQ   ry   rz   r   r8   r8   r9   r      s    




zGetKeysDialog.toggle_levelNc                 C   s   |    dS )z3Handler for clicking on key in basic settings list.N)r}   rS   eventr8   r8   r9   r      s    z GetKeysDialog.final_key_selectedc                 C   sN   |    }}| jd}|r0t||}|| | jdd| d dS )z2Create formatted string of modifiers plus the key.rl   r,   r    r-   N)get_modifiersr~   r1   r:   rP   rL   rM   join)rS   keylistr6   	final_keyr8   r8   r9   r}      s    

zGetKeysDialog.build_key_stringc                 C   s   dd | j D }dd |D S )z9Return ordered list of modifiers that have been selected.c                 S   s   g | ]}|  qS r8   )r1   ).0rU   r8   r8   r9   
<listcomp>       z/GetKeysDialog.get_modifiers.<locals>.<listcomp>c                 S   s   g | ]}|r|qS r8   r8   )r   modr8   r8   r9   r      r   )rO   )rS   Zmod_listr8   r8   r9   r      s    zGetKeysDialog.get_modifiersc                 C   sB   | j dd | j dd | jD ]}|d q"| jd dS )z#Clear modifiers and keys selection.r   rt   Zmovetoz0.0rB   N)r~   Zselect_clearr   rO   rM   rL   )rS   rU   r8   r8   r9   r      s
    
zGetKeysDialog.clear_key_seqc                 C   s\   | j   }|s(| j| j| dd d S | js8| |rH| |rH|| _| 	  | 
  d S )NzNo key specified.rF   rH   message)rL   r1   striprW   keyerror_titlerQ   keys_okbind_okrK   grab_releasedestroy)rS   r   keysr8   r8   r9   rx     s    
zGetKeysDialog.okc                 C   s   d| _ |   |   d S )NrB   )rK   r   r   r   r8   r8   r9   rG     s    zGetKeysDialog.cancelc                 C   s   | j d}|  }| j}dd | jD }|dsF| j|| dd nt|sh|tt vrh| j|| dd nR|d	gkr|tt d
 vrd}| j|| |d n"||v rd}| j|| |d ndS dS )zValidity check on user's 'basic' keybinding selection.

        Doesn't check the string produced by the advanced dialog because
        'modifiers' isn't set.
        rl   c                 S   s   g | ]}|D ]}|qqS r8   r8   )r   r   r5   r8   r8   r9   r     s   z)GetKeysDialog.keys_ok.<locals>.<listcomp>r-   zMissing the final Key)rH   r   zNo modifier key(s) specified.r   r0   )r   r   zBThe shift modifier by itself may not be used with this key symbol.z'This key combination is already in use.TF)	r~   r1   r   r   rJ   endswithrW   FUNCTION_KEYS	MOVE_KEYS)rS   r   r   r6   rF   Zkey_sequencesmsgr8   r8   r9   r     s4    



zGetKeysDialog.keys_okc              
   C   sh   z|  |dd }W n> tyR } z&| j| j| d| d W Y d}~dS d}~0 0 | || dS dS )z:Return True if Tcl accepts the new keys else show message.c                   S   s   d S rV   r8   r8   r8   r8   r9   <lambda>4  r   z'GetKeysDialog.bind_ok.<locals>.<lambda>z2The entered key sequence is not accepted.

Error: r   NFT)r   r   rW   r   Zunbind)rS   r   Zbindingerrr8   r8   r9   r   1  s    zGetKeysDialog.bind_ok)N)N)N)__name__
__module____qualname__r   rE   rW   rR   rN   r   r   r}   r   r   rx   rG   r   r   r8   r8   r8   r9   r;   +   s   0f
	

r;   __main__)mainz!idlelib.idle_test.test_config_keyrC   F)	verbosityexit)run)!__doc__Ztkinterr   r   r   r   Ztkinter.ttkr   r   r   r	   r
   r   r   r2   r   r   tupler3   ZdigitsZALPHANUM_KEYSZPUNCTUATION_KEYSZWHITESPACE_KEYSZ	EDIT_KEYSr   r   r:   r;   r   Zunittestr   Zidlelib.idle_test.htestr   r8   r8   r8   r9   <module>   s6    
  