B
    nb\$                 @   s   d Z ddlZddlmZ ddlmZ ddlZddlmZ ddl	m
Z
mZ ddlmZmZ y
ej W n ek
r~   eje_Y nX G dd	 d	eZdS )
zY
Widget that handle communications between the IPython Console and
the Variable Explorer
    N)
QEventLoop)QMessageBox)RichJupyterWidget)_debug_print)PY2to_text_stringc                   s   e Zd ZdZdZi ZdZdZdd Zdd Z	dd	 Z
d
d Zdd Zdd Zdd Zdd Zdd Zdd Zdd Z fddZ fddZ  ZS )NamepaceBrowserWidgetz
    Widget with the necessary attributes and methods to handle communications
    between the IPython Console and the Variable Explorer
    NTc             C   s   || _ |   dS )zSet namespace browser widgetN)namespacebrowserconfigure_namespacebrowser)selfr
    r   Mlib/python3.7/site-packages/spyder/widgets/ipythonconsole/namespacebrowser.pyset_namespacebrowser0   s    z*NamepaceBrowserWidget.set_namespacebrowserc                s,    j  fdd  j fdd dS )z-Configure associated namespace browser widgetc                s    j | S )N)r
   Zprocess_remote_view)data)r   r   r   <lambda>8   s    zBNamepaceBrowserWidget.configure_namespacebrowser.<locals>.<lambda>c                s    j | S )N)r
   Zset_var_properties)r   )r   r   r   r   <   s    N)Zsig_namespace_viewconnectZsig_var_properties)r   r   )r   r   r   5   s    z0NamepaceBrowserWidget.configure_namespacebrowserc             C   s   | j r| d | d dS )zRefresh namespace browserz)get_ipython().kernel.get_namespace_view()z)get_ipython().kernel.get_var_properties()N)r
   silent_exec_method)r   r   r   r   refresh_namespacebrowser?   s
    z.NamepaceBrowserWidget.refresh_namespacebrowserc             C   s*   | j r&t| j  }d| }| | dS )zSet the namespace view settingsz1get_ipython().kernel.namespace_view_settings = %sN)r
   r   Zget_view_settingssilent_execute)r   Zsettingscoder   r   r   set_namespace_view_settingsG   s    z1NamepaceBrowserWidget.set_namespace_view_settingsc             C   s   d| }| j r | jj}d| }n| j}t }| j|j || |  | j	|j d}| j
dkr| jr| jdd }d| _t|| j
S )zAsk kernel for a valuez$get_ipython().kernel.get_value('%s')!N)_readingkernel_clientinputr   r   sig_got_replyr   quitexec_
disconnect_kernel_value_kernel_reply
ValueError)r   namer   method	wait_loopmsgr   r   r   	get_valueP   s"    

zNamepaceBrowserWidget.get_valuec             C   s<   t |}d||tf }| jr.| jd|  n
| | dS )zSet value for a variablez,get_ipython().kernel.set_value('%s', %s, %s)r   N)r   r   r   r   r   r   )r   r#   valuer   r   r   r   	set_valuel   s    zNamepaceBrowserWidget.set_valuec             C   s.   d| }| j r | jd|  n
| | dS )zRemove a variablez'get_ipython().kernel.remove_value('%s')r   N)r   r   r   r   )r   r#   r   r   r   r   remove_valuew   s    z"NamepaceBrowserWidget.remove_valuec             C   s2   d||f }| j r$| jd|  n
| | dS )zCopy a variablez+get_ipython().kernel.copy_value('%s', '%s')r   N)r   r   r   r   )r   Z	orig_namenew_namer   r   r   r   
copy_value   s
    z NamepaceBrowserWidget.copy_valuec             C   sj   | j r$td}t| td| d S t }| j|j | d||f  |	  | j
|j d }| jS )Nz;Loading this kind of data while debugging is not supported.Warningz*get_ipython().kernel.load_data('%s', '%s'))r   r   r   warningr   r   r   r   r   r   r   r!   )r   filenameZextmessager%   r   r   r   	load_data   s    zNamepaceBrowserWidget.load_datac             C   sf   | j r$td}t| td| d S t }| j|j | d|  |	  | j
|j d }| jS )Nz-Saving data while debugging is not supported.r-   z)get_ipython().kernel.save_namespace('%s'))r   r   r   r.   r   r   r   r   r   r   r   r!   )r   r/   r0   r%   r   r   r   save_namespace   s    z$NamepaceBrowserWidget.save_namespacec          
   C   s   |d  d}|dkry2tr0t|d d }ntt|d d }W n2 tk
rz } zd| _t|| _W dd}~X Y nX || _| j	
  dS |dkr|d d }|dk	rt|tr| | n6|dkr| d	 n"|d
kr| jdd ntd|  dS )z1
        Handle internal spyder messages
        contentspyder_msg_typer   Zbuffersr   N	pdb_stateZpdb_continuecontinueZset_breakpointsT)ZforcezNo such spyder message type: %s)getr   cloudpickleloadsbytes	Exceptionr    reprr!   r   emit
isinstancedictZrefresh_from_pdbZwrite_to_stdinZset_spyder_breakpointsr   )r   r&   r4   r(   r5   r   r   r   _handle_spyder_msg   s*    
z(NamepaceBrowserWidget._handle_spyder_msgc                s   |d d }| j d |}d| _|d dd}|dkrl| jrl| jd	k	rZ|   |   d| _t | j	_
|r|jd
kr| js| | | j d | ntt| | d	S )z^
        Reimplemented to handle communications between Spyder
        and the kernel
        parent_headermsg_idZexecuteFr3   Zexecution_count r   Nr   )Z_request_infor7   r   _kernel_is_startingr
   r   r   time	monotonic	ipyclientt0ZkindZ_hiddenZhandle_exec_methodpopsuperr	   _handle_execute_reply)r   r&   rB   infoZ
exec_count)	__class__r   r   rK      s    

z+NamepaceBrowserWidget._handle_execute_replyc                s   |d  dd}|d  dd}|dkrdt | j_| jjj| jj | jj	d | j
sd| _
nH|d	kr|d
kr| jdk	r|   |   t | j_ntt| | dS )z]
        Reimplemented to refresh the namespacebrowser after kernel
        restarts
        r3   Zexecution_staterC   rA   msg_typeZstartingi  TZidleZshutdown_requestN)r7   rE   rF   rG   rH   ZtimerZtimeoutr   Z	show_timestartrD   r
   r   r   rJ   r	   _handle_status)r   r&   staterN   )rM   r   r   rP      s    
z$NamepaceBrowserWidget._handle_status)__name__
__module____qualname____doc__r
   Z_kernel_methodsr    rD   r   r   r   r   r'   r)   r*   r,   r1   r2   r@   rK   rP   __classcell__r   r   )rM   r   r	      s$   
		!r	   )rU   rE   Zqtpy.QtCorer   Zqtpy.QtWidgetsr   r8   Zqtconsole.rich_jupyter_widgetr   Zspyder.config.baser   r   Zspyder.py3compatr   r   rF   AttributeErrorr	   r   r   r   r   <module>
   s   
