B
    nb\n*                 @   s$  d Z ddlZddlZddlmZ ddlZddlZddlZddl	m
Z
 ddlmZmZ ddlmZmZmZ ddlmZmZmZmZ ddlmZmZ ddlmZ dd	lmZ dd
lmZ ej d dkZ!ej"dkZ#dZ$dddg\Z%Z&Z'dd Z(dd Z)dd Z*G dd deZ+dd Z,e-dkr e,  dS )zu
Restart Spyder

A helper script that allows to restart (and also reset) Spyder from within the
running application.
    N)PYQT5)QtQTimer)QColorQPixmapQIcon)QApplicationQMessageBoxQSplashScreenQWidget)_get_image_path)to_text_string)qapplication)CONF2ntg?         c             C   sd   t | } t }| jtjO  _tjd| tjtj|d}|	 \}}t
|}|  | |k}|S )zBCheck if a process is running on windows systems based on the pid.ztasklist /fi "PID eq {0}")stdoutstderrstartupinfo)str
subprocessZSTARTUPINFOZdwFlagsZSTARTF_USESHOWWINDOWPopenformatPIPEZSTDOUTcommunicater   kill)pidr   ZprocessZ
stdoutdataZ
stderrdataZcheck r!   1lib/python3.7/site-packages/spyder/app/restart.py_is_pid_running_on_windows*   s    r#   c             C   s.   yt | d W n tk
r$   dS X dS dS )z?Check if a process is running on unix systems based on the pid.r   FTN)osr   OSError)r    r!   r!   r"   _is_pid_running_on_unix>   s
    r&   c             C   s   t jdkrt| S t| S dS )z/Check if a process is running based on the pid.r   N)r$   namer#   r&   )r    r!   r!   r"   is_pid_runningJ   s    
r(   c                   sB   e Zd ZdZ fddZdd Zdd Zdd	 ZdddZ  Z	S )	Restarterz`Widget in charge of displaying the splash information screen and the
       error messages.
    c                s   t t|   ddddddg| _t| | _tttdd| _	| 
d | j	 }|d | j	| | j	  | jj| j d S )	N .z..z...z
splash.svgZsvgF
   )superr)   __init__ellipsisr   timer_ellipsisr
   r   r   splashZ
setVisiblefontZsetPixelSizeZsetFontZshowZtimeoutZconnectanimate_ellipsis)selfr2   )	__class__r!   r"   r.   W   s    






zRestarter.__init__c             C   s(   | j |tjtjB tjB ttj dS )zShow message on splash screen.N)r1   ZshowMessager   ZAlignBottomZAlignCenterZAlignAbsoluter   Zwhite)r4   textr!   r!   r"   _show_messagej   s    zRestarter._show_messagec             C   s<   | j d}dt| | j | }| j | | | dS )z5Animate dots at the end of the splash screen message.r    N)r/   poplensplash_textappendr7   )r4   r/   r6   r!   r!   r"   r3   o   s    zRestarter.animate_ellipsisc             C   s    || _ | | | jd dS )z1Sets the text in the bottom of the Splash screen.i  N)r;   r7   r0   start)r4   r6   r!   r!   r"   set_splash_messagev   s    
zRestarter.set_splash_messageNc             C   s   t tdttdttdi}t tdttdttdi}|rX| }|| d| }n|| }|| }| j  t	| ||tj
 t|dS )	a6  Launch a message box with a predefined error message.

        Parameters
        ----------
        error_type : int [CLOSE_ERROR, RESET_ERROR, RESTART_ERROR]
            Possible error codes when restarting/reseting spyder.
        error : Exception
            Actual Python exception error caught.
        zKIt was not possible to close the previous Spyder instance.
Restart aborted.z<Spyder could not reset to factory defaults.
Restart aborted.z9It was not possible to restart Spyder.
Operation aborted.zSpyder exit errorzSpyder reset errorzSpyder restart errorz

{0}N)CLOSE_ERRORr   RESET_ERRORRESTART_ERROR__repr__r   r1   Zhider	   ZwarningZOkRuntimeError)r4   
error_typeerrorZmessagesZtitlesemessagetitler!   r!   r"   launch_error_message|   s    

zRestarter.launch_error_message)N)
__name__
__module____qualname____doc__r.   r7   r3   r>   rI   __classcell__r!   r!   )r5   r"   r)   S   s   r)   c           
   C   s  t ddrXtt dd} ttd | d}t|dkrL|d tjd< ql| tjd< nd	tjd< d	tjd< t	 }t
 }trttd
}nttd}|| |td tjdd }tjdd }tjdd }tjdd }ttttd }	t|	d }
t||||gs,d}t|t|}t|}t|}t|}d|kr|r|d|kr||ddg }n
|d d|krddg}ndg}d|}d|}tj}|rt|
d}nt|
d}t|dd}d|||}t }trdnd}xDt t!|t" D ]$}t#|s,P t$%t" t&'  qW |j(t)d tj* }|r\|td d|||}yt+j,|||d}W n2 t-k
r } z|j(t.|d  W d d }~X Y nX |/  |j0}d!}xt t!|t" D ]$}t#|sP t$%t" t&'  qW y|1  W n2 t2k
rN } z|j(t.|d  W d d }~X Y nX |j(t.d |td" yt+j,|||d W n2 t-k
r } z|j(t3|d  W d d }~X Y nX d S )#NmainZhigh_dpi_custom_scale_factorZhigh_dpi_custom_scale_factors;r   r   ZQT_SCALE_FACTORZQT_SCREEN_SCALE_FACTORSr*   z
spyder.svgz
spyder.pngzClosing SpyderZSPYDER_ARGSZ
SPYDER_PIDZSPYDER_IS_BOOTSTRAPZSPYDER_RESETz<This script can only be called from within a Spyder instancez--new-instancez--z--resetr8   zbootstrap.pyspyderappzstart.pyz"{0}" "{1}" {2}Z      )rD   zResetting Spyder to defaults)shellenv)rD   rE      Z
Restarting)4r   getr   listfiltersplitr:   r$   environr   r)   r   r   r   ZsetWindowIconr>   r   r9   ospdirnameabspath__file__anyrC   astZliteral_evalr<   joinsys
executabler   
IS_WINDOWSrangeint
SLEEP_TIMEr(   timeZsleepr   ZprocessEventsrI   r?   copyr   r   	Exceptionr@   r   r    r   r%   rA   )ZfactorsfrR   Z	restarterZAPP_ICONZspyder_argsr    Zis_bootstrapresetZthis_folderZspyder_folderrE   argsZ
args_resetZpythonrQ   Z	spyderdirZcommandrU   Z	wait_timeZcounterrV   Zcommand_resetpZ	pid_resetr!   r!   r"   rO      s    















 

rO   __main__).rM   rb   r$   os.pathpathr]   r   rd   rj   Zqtpyr   Zqtpy.QtCorer   r   Z
qtpy.QtGuir   r   r   Zqtpy.QtWidgetsr   r	   r
   r   Zspyder.config.baser   r   Zspyder.py3compatr   Zspyder.utils.qthelpersr   Zspyder.config.mainr   versionZPY2r'   rf   ri   r?   r@   rA   r#   r&   r(   r)   rO   rJ   r!   r!   r!   r"   <module>   s4   
	I 
