B
    nôb\Œ ã               @   s  d Z ddlmZ ddlZddlm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 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"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/m0Z0 ddl1m2Z2m3Z3m4Z4m5Z5m6Z6 dd	l7m8Z8m9Z9 dd
l:m;Z; ddl<m=Z= ddl>m?Z? ddl@mAZAmBZB ddlCmDZE ddlCmFZF ddlGmHZH ddlImJZJ ddlKmLZL ddlMmNZN dZOG dd„ dePƒZQG dd„ de/ƒZRG dd„ deƒZSG dd„ deReQƒZTG dd„ deTƒZUG dd „ d eTƒZVG d!d"„ d"eVƒZWG d#d$„ d$eVƒZXG d%d&„ d&eƒZYdS )'z%
Configuration dialog / Preferences.
é    N)ÚAPI)ÚgetexistingdirectoryÚgetopenfilenameÚfrom_qvariantÚto_qvariant)ÚQSizeÚQtÚSignalÚSlotÚQRegExp)ÚQColorÚQRegExpValidator)ÚQButtonGroupÚ	QCheckBoxÚ	QComboBoxÚQDialogÚQDialogButtonBoxÚQDoubleSpinBoxÚQFontComboBoxÚQGridLayoutÚ	QGroupBoxÚQHBoxLayoutÚQLabelÚ	QLineEditÚ	QListViewÚQListWidgetÚQListWidgetItemÚQMessageBoxÚQPushButtonÚQRadioButtonÚQScrollAreaÚQSpinBoxÚ	QSplitterÚQStackedWidgetÚQStyleFactoryÚ
QTabWidgetÚQVBoxLayoutÚQWidgetÚQApplication)Ú_ÚLANGUAGE_CODESÚload_lang_confÚrunning_in_mac_appÚsave_lang_conf)Úget_fontÚset_font)ÚCONF)Ú	NoDefault)Úis_gtk_desktop)Úto_text_stringÚis_text_string)Úicon_manager)Úsyntaxhighlighters)Úgetcwd_or_home)ÚColorLayout)ÚFileComboBox)Ú
CodeEditorz#https://doc.qt.io/qt-5/highdpi.htmlc               @   s(   e Zd ZdZdZdd„ Zefdd„ZdS )ÚConfigAccessMixinz0Namespace for methods that access config storageNc             C   s   t  | j||¡ d S )N)r0   ÚsetÚCONF_SECTION)ÚselfÚoptionÚvalue© rA   ú:lib/python3.7/site-packages/spyder/plugins/configdialog.pyÚ
set_option5   s    zConfigAccessMixin.set_optionc             C   s   t  | j||¡S )N)r0   Úgetr=   )r>   r?   ÚdefaultrA   rA   rB   Ú
get_option8   s    zConfigAccessMixin.get_option)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r=   rC   r1   rF   rA   rA   rA   rB   r;   1   s   r;   c               @   sp   e Zd ZdZeeƒZeƒ Zd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S )Ú
ConfigPagez0Base class for configuration page in PreferencesNc             C   s   t  | |¡ || _d| _d S )NF)r'   Ú__init__Úapply_callbackÚis_modified)r>   ÚparentrM   rA   rA   rB   rL   C   s    zConfigPage.__init__c             C   s   |   ¡  |  ¡  dS )z‹
        Initialize configuration page:
            * setup GUI widgets
            * load settings and change widgets accordingly
        N)Ú
setup_pageÚload_from_conf)r>   rA   rA   rB   Ú
initializeH   s    zConfigPage.initializec             C   s   t ‚dS )zReturn configuration page nameN)ÚNotImplementedError)r>   rA   rA   rB   Úget_nameQ   s    zConfigPage.get_namec             C   s   t ‚dS )z&Return configuration page icon (24x24)N)rS   )r>   rA   rA   rB   Úget_iconU   s    zConfigPage.get_iconc             C   s   t ‚dS )zSetup configuration page widgetN)rS   )r>   rA   rA   rB   rP   Y   s    zConfigPage.setup_pagec             C   s   || _ | j |¡ d S )N)rN   Úapply_button_enabledÚemit)r>   ÚstaterA   rA   rB   Úset_modified]   s    zConfigPage.set_modifiedc             C   s   t ‚dS )z,Return True if all widget contents are validN)rS   )r>   rA   rA   rB   Úis_valida   s    zConfigPage.is_validc             C   sd   | j r`|  ¡  | jdk	r |  ¡  | jdkr2|  ¡  x"| jD ]}|| jkr:|  ¡  P q:W |  d¡ dS )zApply changes callbackNÚmainF)	rN   Úsave_to_confrM   r=   Ú
_save_langÚrestart_optionsÚchanged_optionsÚprompt_restart_requiredrY   )r>   Zrestart_optionrA   rA   rB   Úapply_changese   s    


zConfigPage.apply_changesc             C   s   t ‚dS )z%Load settings from configuration fileN)rS   )r>   rA   rA   rB   rQ   z   s    zConfigPage.load_from_confc             C   s   t ‚dS )z#Save settings to configuration fileN)rS   )r>   rA   rA   rB   r\   ~   s    zConfigPage.save_to_conf)N)rG   rH   rI   rJ   r	   ÚboolrV   Úshow_this_pagerL   rR   rT   rU   rP   rY   rZ   ra   rQ   r\   rA   rA   rA   rB   rK   <   s   
	rK   c               @   sx   e Zd ZdZeƒ ZeeƒZddd„Zdd„ Z	dd„ Z
dd	d
„Zeƒ dd„ ƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚConfigDialogz/Spyder configuration ('Preferences') dialog boxNc             C   s†  t  | |¡ || _tƒ | _tƒ | _ttdƒƒ| _	t
t
jt
jB t
jB ƒ}| t
j¡| _|  tj¡ |  tdƒ¡ |  t d¡¡ | j tj¡ | j d¡ | j d¡ tƒ }| | j¡ | | j¡ tƒ }| | j	¡ | d¡ | |¡ t ƒ }| |¡ | !|¡ |  "|¡ | jr&| j	j# $| jj%¡ | jj& $| j'¡ | jj( $| jj)¡ |j* $| j+¡ |j, $| j-¡ |j# $| j.¡ t/ 0ddt1ƒ ¡ d S )NzReset to defaultsZPreferencesZ	configureé   r   r[   Úinterface_language)2r   rL   r[   r#   Úpages_widgetr   Úcontents_widgetr   r)   Zbutton_resetr   ÚOkZApplyÚCancelÚbuttonÚ	apply_btnZsetAttributer   ZWA_DeleteOnCloseÚsetWindowTitleZsetWindowIconÚimaÚiconZsetMovementr   ZStaticZ
setSpacingÚsetCurrentRowr"   Ú	addWidgetr   Ú
addStretchr&   Ú	addLayoutÚ	setLayoutÚclickedÚconnectZreset_spyderZcurrentChangedÚcurrent_page_changedZcurrentRowChangedÚsetCurrentIndexÚacceptedÚacceptÚrejectedÚrejectÚbutton_clickedr0   r<   r+   )r>   rO   ÚbboxZ	hsplitterZ	btnlayoutÚvlayoutrA   rA   rB   rL   Š   sD    






zConfigDialog.__init__c             C   s
   | j  ¡ S )zReturn current page index)rh   Z
currentRow)r>   rA   rA   rB   Úget_current_indexÁ   s    zConfigDialog.get_current_indexc             C   s   | j  |¡ dS )zSet current page indexN)rh   rp   )r>   ÚindexrA   rA   rB   Úset_current_indexÅ   s    zConfigDialog.set_current_indexc             C   s(   |dkr| j  ¡ }n| j  |¡}| ¡ S )zReturn page widgetN)rg   ÚcurrentWidgetÚwidget)r>   r   r„   rA   rA   rB   Úget_pageÉ   s    zConfigDialog.get_pagec             C   sD   x4t | j ¡ ƒD ]"}|  |¡}| ¡ s*dS | ¡  qW t | ¡ dS )zReimplement Qt methodN)Úrangerg   Úcountr…   rZ   ra   r   rz   )r>   r   Ú
configpagerA   rA   rB   rz   Ñ   s    
zConfigDialog.acceptc             C   s*   || j kr&|  ¡ }| ¡ sd S | ¡  d S )N)rl   r…   rZ   ra   )r>   rk   rˆ   rA   rA   rB   r}   Û   s
    
zConfigDialog.button_clickedc             C   s.   |   |¡}| j |jd k	¡ | j |j¡ d S )N)r…   rl   Z
setVisiblerM   Ú
setEnabledrN   )r>   r   r„   rA   rA   rB   rw   ã   s    
z!ConfigDialog.current_page_changedc                sÊ   ˆ j  |j ¡ |j ˆ j ¡ f‡ fdd„	¡ |j ˆ jj¡ tˆ ƒ}| 	d¡ | 
|¡ ˆ j |¡ tˆ jƒ}y| | ¡ ¡ W n tk
r”   Y nX | | ¡ ¡ | tjtjB ¡ | tddƒ¡ d S )Nc                s   ˆ j  | ¡S )N)rh   rp   )Úrow)r>   rA   rB   Ú<lambda>ê   s    z'ConfigDialog.add_page.<locals>.<lambda>Tr   é   )Úcheck_settingsrv   rc   rh   r‡   rV   rl   r‰   r    ZsetWidgetResizableZ	setWidgetrg   rq   r   ÚsetIconrU   Ú	TypeErrorÚsetTextrT   ZsetFlagsr   ZItemIsSelectableZItemIsEnabledZsetSizeHintr   )r>   r„   Z
scrollareaÚitemrA   )r>   rB   Úadd_pageè   s    


zConfigDialog.add_pagec             C   s   | j  ¡  dS )zpThis method is called to check all configuration page settings
        after configuration dialog has been shownN)r   rW   )r>   rA   rA   rB   Úcheck_all_settingsú   s    zConfigDialog.check_all_settingsc             C   s    t  | |¡ | j |  ¡ ¡ dS )zn
        Reimplement Qt method to be able to save the widget's size from the
        main application
        N)r   ÚresizeEventÚsize_changerW   Úsize)r>   ZeventrA   rA   rB   r”   ÿ   s    zConfigDialog.resizeEvent)N)N)rG   rH   rI   rJ   r	   r   r   r•   rL   r€   r‚   r…   r
   rz   r}   rw   r’   r“   r”   rA   rA   rA   rB   rd   ƒ   s   
7

rd   c               @   sB  e Zd 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eeƒdd„ ƒZeddddfdd„Zeddddddfdd„Zedejddfdd„Zedfdd„Zdd„ Zeddfdd„Zd2d d!„Zeddddfd"d#„Zeddfd$d%„Zeddfd&d'„Zeddfd(d)„Zedddddfd*d+„Zd3d,d-„Zd.d/„ Zd0d1„ Z dS )4ÚSpyderConfigPagez+Plugin configuration dialog box page widgetNc                sh   t jˆ |‡ fdd„d i ˆ _i ˆ _i ˆ _i ˆ _i ˆ _i ˆ _i ˆ _i ˆ _	i ˆ _
tƒ ˆ _tƒ ˆ _d ˆ _d S )Nc                  s   ˆ   ˆ j¡S )N)Úapply_settingsr_   rA   )r>   rA   rB   r‹     s    z+SpyderConfigPage.__init__.<locals>.<lambda>)rM   )rK   rL   Ú
checkboxesÚradiobuttonsÚ	lineeditsÚvalidate_dataÚ	spinboxesÚ
comboboxesÚ	fontboxesÚ
coloreditsÚsceditsr<   r_   Údictr^   Údefault_button_group)r>   rO   rA   )r>   rB   rL     s    zSpyderConfigPage.__init__c             C   s   t ‚d S )N)rS   )r>   ÚoptionsrA   rA   rB   r˜     s    zSpyderConfigPage.apply_settingsc             C   s   dS )zZThis method is called to check settings after configuration 
        dialog has been shownNrA   )r>   rA   rA   rB   r      s    zSpyderConfigPage.check_settingsc             C   s   t  | |¡ |stƒ | _d S )N)rK   rY   r<   r_   )r>   rX   rA   rA   rB   rY   %  s    zSpyderConfigPage.set_modifiedc             C   sj   xd| j D ]Z}|| jkr| ¡ r| j| \}}t| ¡ ƒ}||ƒst | |  ¡ d||f tj¡ dS qW dS )z,Return True if all widget contents are validz%s:<br><b>%s</b>FT)	r›   rœ   Z	isEnabledr3   Útextr   ÚcriticalrT   ri   )r>   ÚlineeditZ	validatorZinvalid_msgr¥   rA   rA   rB   rZ   *  s    
zSpyderConfigPage.is_validc                sl  xjt ˆ j ¡ ƒD ]X\}\}}| ˆ  ||¡¡ tdksP|j |f‡ fdd„	¡ q|j |f‡ fdd„	¡ qW xZt ˆ j ¡ ƒD ]H\}\}}| ˆ  ||¡¡ |j	 |f‡ fdd„	¡ |j
r||jˆ j|< q|W xZt ˆ j ¡ ƒD ]H\}\}}| ˆ  ||¡¡ |j |f‡ fdd„	¡ |j
rØ|jˆ j|< qØW xJt ˆ j ¡ ƒD ]8\}\}}| ˆ  ||¡¡ |j |f‡ fdd„	¡ q4W x¶t ˆ j ¡ ƒD ]¤\}\}}ˆ  ||¡}xLt| ¡ ƒD ]*}	t| |	¡tƒ}
t|
ƒt|ƒkr¦P q¦W | ¡ dkræd	}	|	rö| |	¡ |j |f‡ fd
d„	¡ |j
r€|jˆ j|< q€W x†t ˆ j ¡ ƒD ]t\\}}}ˆ  |¡}| |¡ | | ¡ ¡ |d	krvd}n|}|j |f‡ fdd„	¡ |j |f‡ fdd„	¡ q8W xšt ˆ j ¡ ƒD ]ˆ\}\}}t |ƒ}|j!}|j"}| ˆ  ||¡¡ tdks|j |f‡ fdd„	¡ n|j |f‡ fdd„	¡ |j |f‡ fdd„	¡ qÀW xt ˆ j# ¡ ƒD ]\\}}}\}}|j!}|j"}ˆ  ||¡\}}}| |¡ | |¡ | |¡ |j |f‡ fdd„	¡ tdks|j |f‡ fdd„	¡ |j |f‡ fdd„	¡ |j |f‡ fdd„	¡ nH|j |f‡ fdd„	¡ |j |f‡ fdd„	¡ |j |f‡ fdd„	¡ q^W d	S )z%Load settings from configuration fileZpysidec                s
   ˆ   |¡S )N)Úhas_been_modified)Ú_fooÚopt)r>   rA   rB   r‹   =  s    z1SpyderConfigPage.load_from_conf.<locals>.<lambda>c                s
   ˆ   | ¡S )N)r¨   )rª   )r>   rA   rB   r‹   @  s    c                s
   ˆ   |¡S )N)r¨   )r©   rª   )r>   rA   rB   r‹   D  s    c                s
   ˆ   |¡S )N)r¨   )r©   rª   )r>   rA   rB   r‹   J  s    c                s
   ˆ   |¡S )N)r¨   )r©   rª   )r>   rA   rB   r‹   P  s    r   Nc                s
   ˆ   |¡S )N)r¨   )r©   rª   )r>   rA   rB   r‹   `  s    Zplugin_fontc                s
   ˆ   |¡S )N)r¨   )r©   rª   )r>   rA   rB   r‹   m  s    c                s
   ˆ   |¡S )N)r¨   )r©   rª   )r>   rA   rB   r‹   o  s    c                s
   ˆ   |¡S )N)r¨   )r©   rª   )r>   rA   rB   r‹   x  s    c                s
   ˆ   | ¡S )N)r¨   )rª   )r>   rA   rB   r‹   {  s    c                s
   ˆ   |¡S )N)r¨   )r©   rª   )r>   rA   rB   r‹   }  s    c                s
   ˆ   |¡S )N)r¨   )r©   rª   )r>   rA   rB   r‹   ‡  s    c                s
   ˆ   |¡S )N)r¨   )r©   rª   )r>   rA   rB   r‹   ‹  s    c                s
   ˆ   |¡S )N)r¨   )r©   rª   )r>   rA   rB   r‹     s    c                s
   ˆ   |¡S )N)r¨   )r©   rª   )r>   rA   rB   r‹     s    c                s
   ˆ   | ¡S )N)r¨   )rª   )r>   rA   rB   r‹   ’  s    c                s
   ˆ   | ¡S )N)r¨   )rª   )r>   rA   rB   r‹   ”  s    c                s
   ˆ   | ¡S )N)r¨   )rª   )r>   rA   rB   r‹   –  s    )$Úlistr™   ÚitemsZ
setCheckedrF   r   ru   rv   rš   ÚtoggledÚrestart_requiredÚ
label_textr^   r›   r   ZtextChangedr   ZsetValueZvalueChangedrž   r†   r‡   r   ÚitemDatar3   rx   ÚcurrentIndexChangedrŸ   r.   ZsetCurrentFontZ	pointSizer    r   r§   Zcolorbtnr¡   )r>   Úcheckboxr?   rE   Úradiobuttonr§   ÚspinboxÚcomboboxr@   r   ÚdataÚfontboxÚsizeboxÚfontÚpropertyÚclayoutÚeditÚbtnÚcb_boldÚ	cb_italicÚcolorÚboldÚitalicrA   )r>   rB   rQ   7  s‚    




"



zSpyderConfigPage.load_from_confc             C   sÜ  x.t | j ¡ ƒD ]\}\}}|  || ¡ ¡ qW x.t | j ¡ ƒD ]\}\}}|  || ¡ ¡ q@W x2t | j ¡ ƒD ] \}\}}|  |t| ¡ ƒ¡ qpW x.t | j	 ¡ ƒD ]\}\}}|  || 
¡ ¡ q¤W x>t | j ¡ ƒD ],\}\}}| | ¡ ¡}|  |t|tƒ¡ qÔW xBt | j ¡ ƒD ]0\\}	}
}|	 ¡ }| |
 
¡ ¡ |  ||¡ qW x6t | j ¡ ƒD ]$\}\}}|  |t|j ¡ ƒ¡ qXW xVt | j ¡ ƒD ]D\\}}}\}}t|j ¡ ƒ}| ¡ }| ¡ }|  ||||f¡ qW dS )z#Save settings to configuration fileN)r«   r™   r¬   rC   Ú	isCheckedrš   r›   r3   r¥   r   r@   rž   r°   ÚcurrentIndexr   rŸ   ZcurrentFontZsetPointSizer/   r    r§   r¡   )r>   r²   r?   Ú_defaultr³   r§   r´   rµ   r¶   r·   r¸   r¹   r»   r¾   r¿   rÀ   rÁ   rÂ   rA   rA   rB   r\   ™  s,    "zSpyderConfigPage.save_to_confc             C   s   |   d¡ | j |¡ d S )NT)rY   r_   Úadd)r>   r?   rA   rA   rB   r¨   ²  s    
z"SpyderConfigPage.has_been_modifiedFc       
         s\   t |ƒ}|d k	r| |¡ ||fˆj|< ˆd k	s8ˆd k	rXd‡ ‡‡‡fdd„	}	|j |	¡ |S )NFc                sH   | sˆ sDˆd k	r&t  ˆˆ ¡ ˆt j¡ ˆd k	rDt  ˆˆ ¡ ˆt j¡ d S )N)r   ÚwarningrT   ri   Úinformation)Ú
is_checked)Úmsg_if_enabledÚmsg_infoÚmsg_warningr>   rA   rB   Úshow_message¿  s    
z6SpyderConfigPage.create_checkbox.<locals>.show_message)F)r   Ú
setToolTipr™   ru   rv   )
r>   r¥   r?   rE   ÚtiprÌ   rË   rÊ   r²   rÍ   rA   )rÊ   rË   rÌ   r>   rB   Úcreate_checkbox·  s    
z SpyderConfigPage.create_checkboxc
                s’   t |ƒ}
|d kr*ˆjd kr$tˆƒˆ_ˆj}| |
¡ |d k	rF|
 |¡ ||fˆj|
< ˆd k	sdˆd k	r‚‡ ‡‡‡fdd„}|
j |¡ |	|
_||
_	|
S )Nc                sH   | sˆ sDˆd k	r&t  ˆˆ ¡ ˆt j¡ ˆd k	rDt  ˆˆ ¡ ˆt j¡ d S )N)r   rÇ   rT   ri   rÈ   )rÉ   )rÊ   rË   rÌ   r>   rA   rB   rÍ   Ø  s    
z9SpyderConfigPage.create_radiobutton.<locals>.show_message)
r   r£   r   Z	addButtonrÎ   rš   r­   rv   r®   r¯   )r>   r¥   r?   rE   rÏ   rÌ   rË   rÊ   Úbutton_groupÚrestartr³   rÍ   rA   )rÊ   rË   rÌ   r>   rB   Úcreate_radiobuttonÊ  s    



z#SpyderConfigPage.create_radiobuttonc             C   s²   t |ƒ}| d¡ tƒ }	|tjkr(tƒ ntƒ }
|
 |¡ |
 |	¡ |
 dddd¡ |r`|	 	|¡ |rv|	 
tt|ƒƒ¡ ||f| j|	< t| ƒ}||_|	|_| |
¡ ||	_||	_|S )NTr   )r   ÚsetWordWrapr   r   ÚVerticalr&   r   rq   ÚsetContentsMarginsrÎ   ZsetValidatorr   r   r›   r'   ÚlabelÚtextboxrt   r®   r¯   )r>   r¥   r?   rE   rÏ   Ú	alignmentÚregexrÒ   r×   r¼   Úlayoutr„   rA   rA   rB   Úcreate_lineeditå  s&    




z SpyderConfigPage.create_lineeditc       
         s¾   ˆj |||tjd}xˆjD ]‰ | ˆ ¡rP qW tdƒ}tj|fˆjˆ < t	t
 d¡dˆƒ}| tdƒ¡ |j ‡ ‡fdd„¡ tƒ }| |¡ | |¡ | dddd¡ tˆƒ}	|	 |¡ |	S )	N)rÙ   zInvalid directory pathZDirOpenIconÚ zSelect directoryc                  s
   ˆ  ˆ ¡S )N)Úselect_directoryrA   )r¼   r>   rA   rB   r‹     s    z3SpyderConfigPage.create_browsedir.<locals>.<lambda>r   )rÜ   r   Ú
Horizontalr›   ÚisAncestorOfr)   ÚospÚisdirrœ   r   rn   ro   rÎ   ru   rv   r   rq   rÖ   r'   rt   )
r>   r¥   r?   rE   rÏ   r„   ÚmsgÚ
browse_btnrÛ   Ú	browsedirrA   )r¼   r>   rB   Úcreate_browsedirü  s"    





z!SpyderConfigPage.create_browsedirc             C   sB   t | ¡ ƒ}t |¡stƒ }td ƒ}t| ||ƒ}|r>| |¡ dS )zSelect directoryN)r3   r¥   rá   râ   r7   r)   r   r   )r>   r¼   ÚbasedirÚtitleZ	directoryrA   rA   rB   rÞ     s    
z!SpyderConfigPage.select_directoryc                sÀ   ˆj |||tjd}xˆjD ]‰ | ˆ ¡rP qW tdƒ}tj|fˆjˆ < t	t
 d¡dˆƒ}| tdƒ¡ |j ‡ ‡‡fdd„¡ tƒ }	|	 |¡ |	 |¡ |	 dddd¡ tˆƒ}
|
 |	¡ |
S )	N)rÙ   zInvalid file pathÚFileIconrÝ   zSelect filec                  s   ˆ  ˆ ˆ¡S )N)Úselect_filerA   )r¼   Úfiltersr>   rA   rB   r‹   $  s    z4SpyderConfigPage.create_browsefile.<locals>.<lambda>r   )rÜ   r   rß   r›   rà   r)   rá   Úisfilerœ   r   rn   ro   rÎ   ru   rv   r   rq   rÖ   r'   rt   )r>   r¥   r?   rE   rÏ   rë   r„   rã   rä   rÛ   rå   rA   )r¼   rë   r>   rB   Úcreate_browsefile  s"    





z"SpyderConfigPage.create_browsefilec             C   s^   t  t| ¡ ƒ¡}t  |¡s"tƒ }|dkr2tdƒ}tdƒ}t| |||ƒ\}}|rZ| |¡ dS )zSelect FileNzAll files (*)zSelect file)	rá   Údirnamer3   r¥   râ   r7   r)   r   r   )r>   r¼   rë   rç   rè   ÚfilenameZ
_selfilterrA   rA   rB   rê   -  s    
zSpyderConfigPage.select_filec	             C   s  t | ƒ}	|rt|ƒ}
|
|	_nd }
|r4t|ƒ}||	_nd }|d k	rpt|ƒtkrTtƒ }ntƒ }| d¡ | 	|¡ ntƒ }|d k	rˆ| 
|¡ |d k	rš| |¡ |d k	r¬| |¡ ||f| j|< tƒ }x$|
||fD ]}|d k	rÌ| |¡ qÌW | d¡ | dddd¡ ||	_|	 |¡ |	S )Nre   r   )r'   r   ÚplabelÚslabelÚtypeÚintr!   r   ZsetDecimalsZsetSingleStepZ
setMinimumZ
setMaximumrÎ   r   r   rq   rr   rÖ   r´   rt   )r>   ÚprefixÚsuffixr?   rE   Úmin_Úmax_ÚsteprÏ   r„   rð   rñ   r´   rÛ   Ú	subwidgetrA   rA   rB   Úcreate_spinbox9  s@    





zSpyderConfigPage.create_spinboxc       
      C   sš   t |ƒ}tttjƒ| ƒ}|j d¡ |d k	r6| |¡ ||f| j|< |rP||fS t	ƒ }| 
|¡ | |¡ | d¡ | dddd¡ t| ƒ}	|	 |¡ |	S )NéP   re   r   )r   r8   r   r   Úblackr§   ÚsetMaximumWidthrÎ   r    r   rq   rs   rr   rÖ   r'   rt   )
r>   r¥   r?   rE   rÏ   Úwithout_layoutr×   r»   rÛ   r„   rA   rA   rB   Úcreate_coloredit`  s     




z!SpyderConfigPage.create_coloreditc             C   s
  t |ƒ}tttjƒ| ƒ}|j d¡ |d k	r6| |¡ tƒ }| 	t
 d¡¡ | tdƒ¡ tƒ }	|	 	t
 d¡¡ |	 tdƒ¡ ||f| j|||	f< |r¢||||	fS tƒ }
|
 |¡ |
 |¡ |
 d¡ |
 |¡ |
 |	¡ |
 d¡ |
 dddd¡ t| ƒ}| |
¡ |S )	Nrû   rÁ   ZBoldrÂ   ZItalicé
   re   r   )r   r8   r   r   rü   r§   rý   rÎ   r   rŽ   rn   ro   r)   r¡   r   rq   rs   Z
addSpacingrr   rÖ   r'   rt   )r>   r¥   r?   rE   rÏ   rþ   r×   r»   r¾   r¿   rÛ   r„   rA   rA   rB   Úcreate_scedits  s2    







zSpyderConfigPage.create_sceditc             C   s
  t |ƒ}tƒ }|dk	r | |¡ x0|D ](\}	}
|	dkr>|
dks&| |	t|
ƒ¡ q&W d}xBt|ƒD ]6\}}|\}	}
|	dkr`|
dkr`| || ¡ |d7 }q`W ||f| j|< tƒ }| 	|¡ | 	|¡ | 
d¡ | dddd¡ t| ƒ}||_||_| |¡ ||_||_|S )zchoices: couples (name, key)Nr   re   )r   r   rÎ   ÚaddItemr   Ú	enumerateÚinsertSeparatorrž   r   rq   rr   rÖ   r'   r×   rµ   rt   r®   r¯   )r>   r¥   Úchoicesr?   rE   rÏ   rÒ   r×   rµ   ÚnameÚkeyr‡   r   r‘   rÛ   r„   rA   rA   rB   Úcreate_combobox  s4    




z SpyderConfigPage.create_comboboxc
                s   t ˆ||	d}
||
_||
_|
 ¡ ‰ |ˆ _|ˆ _||fˆjˆ < |dk	rN|
 |¡ |
 |¡ tdƒ}tj	|fˆj
ˆ < tt d¡dˆƒ}| tdƒ¡ |j ‡ ‡‡fdd„¡ tƒ }| |
d	d	d	d
¡ | |d	d¡ | d	d	d	d	¡ tˆƒ}|
|_||_| |¡ |S )zchoices: couples (name, key))Úadjust_to_contentsÚdefault_line_editNzInvalid file pathré   rÝ   zSelect filec                  s   ˆ  ˆ ˆ¡S )N)rê   rA   )r¼   rë   r>   rA   rB   r‹   Ä  s    z7SpyderConfigPage.create_file_combobox.<locals>.<lambda>r   é	   r   )r9   r®   r¯   ZlineEditr›   rÎ   ZaddItemsr)   rá   rì   rœ   r   rn   ro   ru   rv   r   rq   rÖ   r'   rµ   rä   rt   )r>   r¥   r  r?   rE   rÏ   rÒ   rë   r	  r
  rµ   rã   rä   rÛ   r„   rA   )r¼   rë   r>   rB   Úcreate_file_combobox®  s2    


z%SpyderConfigPage.create_file_comboboxc             C   s   |rt |ƒ}nt tdƒƒ}tƒ }|dk	r2| |¡ t dtdƒ ƒ}	tƒ }
|
 dd¡ || j||
f< tƒ }x|||	|
fD ]}| |¡ qvW | 	d¡ t
| ƒ}||_|	|_||_|
|_| |¡ |sø|dkrÐtdƒ}t|ƒ}| |¡ |dk	rô| |¡ |S |S dS )	z"Option=None -> setting plugin fontzFont: Nz  zSize: é   éd   re   z
Font style)r   r)   r   ZsetFontFiltersr!   ZsetRangerŸ   r   rq   rr   r'   Ú	fontlabelÚ	sizelabelr·   r¸   rt   r   rÎ   )r>   r?   r¥   rè   rÏ   ÚfontfiltersÚwithout_groupr  r·   r  r¸   rÛ   rù   r„   ÚgrouprA   rA   rB   Úcreate_fontgroupÑ  s:    





z!SpyderConfigPage.create_fontgroupc                s.   t |ƒ}|j |¡ |j d‡ fdd„	¡ |S )NFrÝ   c                s
   ˆ   |¡S )N)r¨   )Úcheckedrª   )r>   rA   rB   r‹      s    z0SpyderConfigPage.create_button.<locals>.<lambda>)FrÝ   )r   ru   rv   )r>   r¥   Úcallbackr½   rA   )r>   rB   Úcreate_buttoný  s    zSpyderConfigPage.create_buttonc             G   s<   t ƒ }tƒ }x|D ]}| |¡ qW | d¡ | |¡ |S )zACreate simple tab widget page: widgets added in a vertical layoutre   )r'   r&   rq   rr   rt   )r>   Úwidgetsr„   rÛ   ZwidgrA   rA   rB   Ú
create_tab  s    


zSpyderConfigPage.create_tab)N)NNNNNF)!rG   rH   rI   rJ   r=   rL   r˜   r   rY   rZ   rQ   r\   r
   Ústrr¨   r1   rÐ   rÓ   r   rÕ   rÜ   ræ   rÞ   rí   rê   rú   rÿ   r  r  r  r  r  r  rA   rA   rA   rB   r—     sR   b

&  
+r—   c               @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚPluginConfigPagez+Plugin configuration dialog box page widgetc             C   s6   || _ |j| _|j| _|j| _|j| _t | |¡ d S )N)	ÚpluginrF   rC   Zget_plugin_fontr.   Úapply_plugin_settingsr˜   r—   rL   )r>   r  rO   rA   rA   rB   rL     s    zPluginConfigPage.__init__c             C   s
   | j  ¡ S )N)r  Zget_plugin_title)r>   rA   rA   rB   rT     s    zPluginConfigPage.get_namec             C   s
   | j  ¡ S )N)r  Zget_plugin_icon)r>   rA   rA   rB   rU     s    zPluginConfigPage.get_iconN)rG   rH   rI   rJ   rL   rT   rU   rA   rA   rA   rB   r    s   r  c               @   sL   e Zd ZdZdZdZdZdd„ Zdd„ Zdd„ Z	d	d
„ Z
dd„ Zdd„ ZdS )ÚGeneralConfigPagez}Config page that maintains reference to main Spyder window
       and allows to specify page name and icon declaratively
    Nc             C   s   t  | |¡ || _d S )N)r—   rL   r[   )r>   rO   r[   rA   rA   rB   rL   (  s    zGeneralConfigPage.__init__c             C   s   | j S )zConfiguration page name)ÚNAME)r>   rA   rA   rB   rT   ,  s    zGeneralConfigPage.get_namec             C   s   | j S )z"Loads page icon named by self.ICON)ÚICON)r>   rA   rA   rB   rU   0  s    zGeneralConfigPage.get_iconc             C   s   t ‚d S )N)rS   )r>   r¤   rA   rA   rB   r˜   4  s    z GeneralConfigPage.apply_settingsc       
         s¨   | j ‰ | j}‡ fdd„|D ƒ}t|ƒdkr4tdƒ}ntdƒ}tdƒ}d}x|D ]}|d |¡7 }qNW td	ƒ}d
 |||¡}t | ||tjtjB ¡}	|	tjkr¤|  	¡  dS )z*Prompt the user with a request to restart.c                s   g | ]}|ˆ krˆ | ‘qS rA   rA   )Ú.0Úo)Úrestart_optsrA   rB   ú
<listcomp>;  s    z=GeneralConfigPage.prompt_restart_required.<locals>.<listcomp>re   z8Spyder needs to restart to change the following setting:z9Spyder needs to restart to change the following settings:zDo you wish to restart now?rÝ   z<li>{0}</li>ZInformationz{0}<ul>{1}</ul><br>{2}N)
r^   r_   Úlenr)   Úformatr   rÈ   ÚYesÚNorÒ   )
r>   Zchanged_optsr¤   Z	msg_startZmsg_endZmsg_optionsr?   Z	msg_titlerã   ÚanswerrA   )r#  rB   r`   7  s     



z)GeneralConfigPage.prompt_restart_requiredc             C   s   | j  ¡  dS )zRestart Spyder.N)r[   rÒ   )r>   rA   rA   rB   rÒ   P  s    zGeneralConfigPage.restart)rG   rH   rI   rJ   r=   r  r   rL   rT   rU   r˜   r`   rÒ   rA   rA   rA   rB   r    s   r  c               @   s@   e Zd ZdZedƒZdd„ Zdd„ Zdd„ Zd	d
„ Z	dd„ Z
dS )ÚMainConfigPager[   ÚGeneralc       ;   	   C   sr  t  d¡| _| j}ttdƒƒ}t ¡ }tdd„ |D ƒƒ}| j	tdƒ|ddd}d	d
ddg}t
t|dd„ |D ƒƒƒ}| j	tdƒ|ddd}|tdƒdtdƒd}	|tdƒdƒ}
|tdƒdƒ}|tdƒdƒ}tƒ rä|  dd¡ |	 d¡ tƒ }tƒ }| |jdd¡ | |jdd¡ | |jdd¡ | |jdd¡ | |¡ | d¡ tƒ }| |¡ | |	¡ | |
¡ | |¡ | |¡ | |¡ ttdƒƒ}dd„ t
t ¡ ƒD ƒ}tƒ rÀd|krÀdg}t
t|d d„ |D ƒƒƒ}| j	td!ƒ|d"| jjd#}d$d%g}t
t|d&d„ |D ƒƒƒ}| j	td'ƒ|d(dd}|td)ƒd*ƒ}|td+ƒd,ƒ}|td-ƒd.ƒ}|td/ƒd0td1ƒd}|td2ƒd3ƒ}|  d4td5ƒd6ddd7¡}|j |j j¡ |j |j!j¡ |j  |  "d3¡¡ |j! |  "d3¡¡ |td8ƒd9ƒ}| jd4td:ƒd;t# $¡ dd<d=d>}|j |j j¡ |j |j!j¡ |j  |  "d9¡¡ |j! |  "d9¡¡ tƒ }| |dd¡ | |j dd¡ | |j!dd?¡ | |dd¡ | |j dd¡ | |j!dd?¡ | %d?d=¡ tƒ } tƒ }!|! |jdd¡ |! |jdd¡ |! |jdd¡ |! |jdd¡ |  |!¡ |  d¡ tƒ }"|" | ¡ |" |¡ |" |¡ |" |¡ |" |¡ |" |¡ | |"¡ ttd@ƒƒ}#|tdAƒdBƒ}$|tdCƒdD| jj& '¡ d}%| jd4tdEƒdFd=dGd=dH}&|%j |&j¡ |& |  "dD¡¡ |% | jj& (¡ ¡ |& | jj& (¡ ¡ |tdIƒdJ| jj) '¡ d}'| jd4tdEƒdKd=dGd=dH}(|'j |(j¡ |( |  "dJ¡¡ |' | jj) (¡ ¡ |( | jj) (¡ ¡ |  "dB¡})|$j |%j¡ |$j |&j¡ |$j |'j¡ |$j |(j¡ |% |)¡ |& |)¡ |' |)¡ |( |)¡ tƒ }*|* |%dd¡ |* |&dd¡ |* |'dd¡ |* |(dd¡ tƒ }+|+ |$¡ |+ |*¡ |# |+¡ ttdLƒƒ},t*|,ƒ}-t+tdMƒ ,t-¡ƒ}.|. .d¡ | j/tdNƒdO|-dP}/| j/tdQƒdR|-tdSƒddT}0| j/tdUƒdV|-tdWƒddT}1| j0d4dXtdYƒt1j2dZdd[}2|/j |2j3¡ |0j |2j3¡ |1j |2j¡ tƒ }3|3 |.¡ tƒ }4|4 |/dd¡ |4 |0dd¡ |4 |1d?d¡ |4 |2d?d¡ |3 |4¡ |, |3¡ | j4d\td]ƒt5j6dd^}5| j4d_td`ƒdda}6ttdbƒƒ}7tƒ }8|8 |5j7dd¡ |8 |5j8dd¡ |8 |5j9dd?¡ |8 |5j:ddc¡ |8 |6j7dd¡ |8 |6j8dd¡ |8 |6j9dd?¡ |8 |6j:ddc¡ |7 |8¡ t;ƒ }9|9 <|  =|7|,|¡tddƒ¡ |9 <|  =||#¡tdeƒ¡ tƒ }:|: |9¡ |  |:¡ d S )fNZgenprefsr+  c             S   s   g | ]\}}||f‘qS rA   rA   )r!  r  ÚvalrA   rA   rB   r$  a  s    z-MainConfigPage.setup_page.<locals>.<listcomp>z	Language:rf   T)rÒ   Z	AutomaticZDesktopZSoftwareZGLESc             S   s   g | ]}|  ¡ ‘qS rA   )Úlower)r!  ÚcrA   rA   rB   r$  i  s    zRendering engine:ZopenglzUse a single instanceZsingle_instancez^Set this to open external<br> Python files in an already running instance (Requires a restart))rÏ   zPrompt when exitingZprompt_on_exitz4Show internal Spyder errors to report them to GithubZshow_internal_errorszCheck for updates on startupZcheck_updates_on_startupFr   re   Z	Interfacec             S   s   g | ]}t |ƒ‘qS rA   )r  )r!  ZtxtrA   rA   rB   r$  “  s    zGTK+c             S   s   g | ]}|  ¡ ‘qS rA   )r-  )r!  ZstylerA   rA   rB   r$  ™  s    zQt windows styleZwindows_style)rE   zSpyder 2zSpyder 3c             S   s   g | ]}|  ¡ ‘qS rA   )r-  )r!  ZthemerA   rA   rB   r$  Ÿ  s    z
Icon themeZ
icon_themezVertical title bars in panesZvertical_dockwidget_titlebarszVertical tabs in panesZvertical_tabszAnimated toolbars and panesZanimated_dockszTear off menusZtear_off_menusz4Set this to detach any<br> menu from the main windowzCustom margin for panes:Zuse_custom_marginrÝ   ZpixelsZcustom_marginé   zCursor blinking:Zuse_custom_cursor_blinkingZmsZcustom_cursor_blinkingiˆ  r  )rE   rö   r÷   rø   é   z
Status barzShow status barÚshow_status_barzShow memory usage everyzmemory_usage/enablez mszmemory_usage/timeouti@B )rö   r÷   rø   zShow CPU usage everyzcpu_usage/enablezcpu_usage/timeoutzScreen resolutionzƒConfiguration for high DPI screens<br><br>Please see <a href="{0}">{0}</a><> for more information about these options (in English).ZNormalZnormal_screen_resolution)rÑ   zEnable auto high DPI scalingZhigh_dpi_scalingzSet this for high DPI displays)rÑ   rÏ   rÒ   zSet a custom high DPI scalingZhigh_dpi_custom_scale_factorz>Set this for high DPI displays when auto scaling does not workZhigh_dpi_custom_scale_factorszZEnter values for different screens separated by semicolons ';', float values are supportedz([0-9]+(?:\.[0-9]*)(;[0-9]+(?:\.[0-9]*))*)rÏ   rÙ   rÚ   rÒ   r¹   zPlain text font)r?   rè   r  r  Z	rich_fontzRich text font)r?   rè   r  ZFontsé   Z
AppearancezAdvanced Settings)>rn   ro   r   rÐ   r   r)   r*   r¬   Úsortedr  r«   Úzipr,   rC   r‰   r   r   rq   r×   rµ   rs   rr   r&   rt   r$   Úkeysr2   r[   Zdefault_stylerú   r­   rv   r´   rñ   rF   r(   ZcursorFlashTimeZsetColumnStretchZ
mem_statusZtoolTipZis_supportedZ
cpu_statusr   r   r&  ÚHDPI_QT_PAGErÔ   rÓ   rÜ   r   rß   ÚsetDisabledr  r   ZMonospacedFontsr  r·   r  r¸   r%   ZaddTabr  );r>   ZnewcbZgeneral_groupZ	languagesZlanguage_choicesZlanguage_comboZopengl_optionsZopengl_choicesZopengl_comboZsingle_instance_boxZ
prompt_boxZpopup_console_boxZcheck_updatesZcomboboxes_advanced_layoutZcbs_adv_gridZgeneral_layoutZinterface_groupZstylesr  Zstyle_comboZthemesZicon_choicesZicons_comboZvertdock_boxZverttabs_boxZanimated_boxZtear_off_boxZ
margin_boxZmargin_spinZ
cursor_boxZcursor_spinZmargins_cursor_layoutZcomboboxes_layoutZ
cbs_layoutZinterface_layoutZ
sbar_groupr1  Z
memory_boxZmemory_spinZcpu_boxZcpu_spinZstatus_bar_oZcpu_memory_layoutZsbar_layoutZscreen_resolution_groupZscreen_resolution_bgZscreen_resolution_labelZnormal_radioZauto_scale_radioZcustom_scaling_radioZcustom_scaling_editZscreen_resolution_layoutZscreen_resolution_inner_layoutZplain_text_fontZrich_text_fontZfonts_groupZfonts_layoutZtabsr   rA   rA   rB   rP   Y  s    








































zMainConfigPage.setup_pagec             C   s
   t |dS )z"Return global font used in Spyder.)r?   )r.   )r>   r?   rA   rA   rB   r.   f  s    zMainConfigPage.get_fontc             C   s6   t ||d | jj| jj }x|D ]}| ¡  q"W dS )zSet global font used in Spyder.)r?   N)r/   r[   Z
widgetlistZthirdparty_pluginsZupdate_font)r>   r¹   r?   Zpluginsr  rA   rA   rB   r/   j  s    
zMainConfigPage.set_fontc             C   s   | j  ¡  d S )N)r[   r˜   )r>   r¤   rA   rA   rB   r˜   r  s    zMainConfigPage.apply_settingsc             C   s˜   x@t | j ¡ ƒD ].\}\}}|dkr| | ¡ ¡}t|tƒ}P qW yt|ƒ |  d|¡ W n8 t	k
r’   t
 | tdƒtdƒ t ¡ ¡t
j¡ dS X dS )zX
        Get selected language setting and save to language configuration file.
        rf   ÚErrorzkWe're sorry but the following error occurred while trying to set your selected language:<br><br><tt>{}</tt>N)r«   rž   r¬   r°   rÄ   r   r3   r-   rC   Ú	Exceptionr   r¦   r)   r&  Ú	tracebackÚ
format_excri   )r>   rµ   r?   rÅ   r¶   r@   rA   rA   rB   r]   u  s    
zMainConfigPage._save_langN)rG   rH   rI   r=   r)   r  rP   r.   r/   r˜   r]   rA   rA   rA   rB   r*  U  s     r*  c               @   s”   e Zd ZdZedƒZdd„ Zdd„ Zedd„ ƒZ	ed	d
„ ƒZ
edd„ ƒZdd„ Zdd„ Zddd„Zdd„ Zdd„ Zdd„ Zdd„ Zeƒ dd„ ƒZdS )ÚColorSchemeConfigPageZcolor_schemeszSyntax coloringc             C   sb  t  d¡| _|  d¡}y| | d¡¡ W n tk
r>   Y nX |  dg ¡}ttdƒƒ}t	tdƒƒ}t	tdƒƒ}t	tdƒƒ| _
t| ƒ| _t| ƒ| _t	td	ƒƒ| _t| | jd
| _i | _| d¡ |  tdƒdgd¡}|j| _tƒ }tƒ }| |¡ tƒ }	|	 |j¡ |	 |j¡ tƒ }
|
 |	¡ |
 |¡ |
 | j¡ |
 | j
¡ |
 d¡ |
 |¡ tƒ }| | j¡ tƒ }| |
¡ | |¡ | |¡ ttdƒƒ}| |¡ | |¡ |  |¡ |j  | j!¡ |j  | j"¡ | jj  | j#¡ | j
j  | j$¡ | jj%  | j&¡ | jj%  | j'¡ x|D ]}| j (|¡ qW x|D ]}| jj(|dd q4W |  )¡  |  &¡  d S )NZ
eyedropperÚnamesÚCustomÚcustom_nameszÔHere you can select the color scheme used in the Editor and all other Spyder plugins.<br><br>You can also edit the color schemes provided by Spyder or create your own ones by using the options provided below.<br>zEdit selectedzCreate new schemeZDeleteZReset)rO   ÚstackTzScheme:)rÝ   rÝ   Úselectedre   zManage color schemes)Úcustom)*rn   ro   r   rF   Úpopr   Ú
ValueErrorr   r)   r   Údelete_buttonr:   Úpreview_editorr#   Zstacked_widgetÚreset_buttonÚSchemeEditorÚscheme_editor_dialogÚscheme_choices_dictrÔ   r  rµ   Úschemes_comboboxr&   rq   r   r×   rs   rr   r   rt   ru   rv   Úcreate_new_schemeÚedit_schemeÚreset_to_defaultÚdelete_schemer±   Úupdate_previewÚupdate_buttonsÚadd_color_scheme_stackÚupdate_combobox)r>   r=  r?  Zabout_labelZedit_buttonr  Zschemes_combobox_widgetr   Zmanage_layoutZcombo_layoutZbuttons_layoutZpreview_layoutZbuttons_preview_layoutZmanage_groupr  rA   rA   rB   rP   Ž  sr    

















z ColorSchemeConfigPage.setup_pagec             C   s†   |   d| j¡ | jj dg¡ | jjd k	r:| jj dg¡ | jjd k	rV| jj dg¡ | jjd k	rr| jj dg¡ |  ¡  |  	¡  d S )NrA  Zcolor_scheme_name)
rC   Úcurrent_schemer[   Úeditorr  Z
ipyconsoleZ
historylogÚhelprS  rP  )r>   r¤   rA   rA   rB   r˜   á  s    z$ColorSchemeConfigPage.apply_settingsc             C   s
   | j  ¡ S )N)rK  ZcurrentText)r>   rA   rA   rB   Úcurrent_scheme_nameï  s    z)ColorSchemeConfigPage.current_scheme_namec             C   s   | j | j S )N)rJ  rW  )r>   rA   rA   rB   rT  ó  s    z$ColorSchemeConfigPage.current_schemec             C   s
   | j  ¡ S )N)rK  rÄ   )r>   rA   rA   rB   Úcurrent_scheme_index÷  s    z*ColorSchemeConfigPage.current_scheme_indexc             C   sþ   | j }| j d¡ |  d¡}y| | d¡¡ W n tk
rD   Y nX |  dg ¡}x&|| D ]}|| j|  d |¡¡< q\W |rŽ|dg | }n|}| j}| 	¡  x.|D ]&}|dkr´q¦| 
|  d |¡¡|¡ q¦W |râ| t|ƒ¡ | j d¡ | j |¡ dS )z Recreates the combobox contents.Tr=  r>  r?  z{0}/nameNF)rX  rK  ZblockSignalsrF   rC  r   rD  rJ  r&  Úclearr  r  r%  rx   )r>   r   r=  r?  Únr  rµ   r  rA   rA   rB   rS  û  s.    

z%ColorSchemeConfigPage.update_comboboxc             C   s`   | j }|  d¡}y| | d¡¡ W n tk
r8   Y nX ||k}| j |¡ | j | ¡ dS )z6Updates the enable status of delete and reset buttons.r=  r>  N)rT  rF   rC  r   rD  rE  r‰   rG  )r>   rT  r=  Zdelete_enabledrA   rA   rB   rQ    s    
z$ColorSchemeConfigPage.update_buttonsNc             C   sT   d}t  dd¡}|dkr| j}| jjdddtƒ ||d | j |¡ | j d¡ dS )	zÑ
        Update the color scheme of the preview editor and adds text.

        Note
        ----
        'index' is needed, because this is triggered by a signal that sends
        the selected index.
        zy"""A string"""

# A comment

# %% A cell

class Foo(object):
    def __init__(self):
        bar = 42
        print(bar)
rU  Zblank_spacesNTF)ZlinenumbersZmarkersZtab_moder¹   Úshow_blanksÚcolor_schemeÚPython)r0   rD   rT  rF  Zsetup_editorr.   Zset_textZset_language)r>   r   Úscheme_namer¥   r[  rA   rA   rB   rP  )  s    	z$ColorSchemeConfigPage.update_previewc             C   sh  |   d¡}|   dg ¡}t|ƒd }dd„ |D ƒ}x*tt|ƒƒD ]}|| |kr>|d }P q>W d |d ¡}| |¡ |  d|¡ x>tjD ]4}d ||¡}d | j|¡}	|   |	¡}
|  ||
¡ qˆW |  d |¡|¡ | j	}|j
|d	d
 | |¡ |  ¡  | ¡ rD| ¡ }|  d |¡|¡ ||  |¡d }|  ¡  | j |¡ n | |¡ |  d|¡ | |¡ dS )z.Creates a new color scheme with a custom name.r=  r?  re   c             S   s   g | ]}t | d ¡d ƒ‘qS )ú-éÿÿÿÿ)ró   Úsplit)r!  rZ  rA   rA   rB   r$  O  s    z;ColorSchemeConfigPage.create_new_scheme.<locals>.<listcomp>z
custom-{0}z{0}/{1}z{0}/nameT)rB  N)rF   r%  r†   r&  ÚappendrC   r6   ÚCOLOR_SCHEME_KEYSrT  rI  rR  Ú
set_schemerQ   Úexec_Úget_scheme_namer   rS  rK  rx   ÚremoveÚdelete_color_scheme_stack)r>   r=  r?  ZcounterZcustom_indexÚiZcustom_namer  r  Zdefault_namer?   Údlgr   rA   rA   rB   rL  H  s<    





z'ColorSchemeConfigPage.create_new_schemec             C   s^   | j }| | j¡ | ¡ rZ| ¡ }x*|D ]"}d |¡}|| }|  ||¡ q(W | jdd dS )zEdit current scheme.ztemp/{0}Ztemp)r^  N)rI  rd  rT  re  Úget_edited_color_schemer&  rC   rP  )r>   rj  Ztemporal_color_schemer  r?   r@   rA   rA   rB   rM  u  s    

z!ColorSchemeConfigPage.edit_schemec             C   sÞ   | j }t | tdƒtdƒtjtjB ¡}|tjkrÚ|  d¡}|  d¡ | j 	| 
d¡¡ |  dd¡ |  dg ¡}||kr€| |¡ |  d|¡ x(tjD ]}d ||¡}t | j|¡ q”W t | jd |¡¡ |  ¡  |  ¡  d	S )
z3Deletes the currently selected custom color scheme.ÚWarningz,Are you sure you want to delete this scheme?r=  ZspyderrA  r?  z{0}/{1}z{0}/nameN)rT  r   rÇ   r)   r'  r(  rF   rd  rK  rx   r   rC   rg  r6   rc  r&  r0   Zremove_optionr=   rS  rP  )r>   r^  r)  r=  r?  r  r?   rA   rA   rB   rO  ƒ  s&    



z#ColorSchemeConfigPage.delete_schemec             C   s   | j }| |¡ dS )zW
        Set the current stack in the dialog to the scheme with 'scheme_name'.
        N)rI  rd  )r>   r^  rj  rA   rA   rB   rd  ¡  s    z ColorSchemeConfigPage.set_schemec             C   sZ   | j }|  d¡}||krVx4tjD ]*}d ||¡}t | j|¡}|  ||¡ q W |  	¡  dS )z1Restore initial values for default color schemes.r=  z{0}/{1}N)
rT  rF   r6   rc  r&  r0   Zget_defaultr=   rC   rQ   )r>   Zschemer=  r  r?   r@   rA   rA   rB   rN  ¨  s    
z&ColorSchemeConfigPage.reset_to_default)NN)rG   rH   rI   r=   r)   r  rP   r˜   rº   rW  rT  rX  rS  rQ  rP  rL  rM  rO  rd  r
   rN  rA   rA   rA   rB   r<  Š  s   S"
-r<  c                   sL   e Zd ZdZd‡ fdd„	Zdd„ Zdd„ Zd	d
„ Zddd„Zdd„ Z	‡  Z
S )rH  zA color scheme editor dialog.Nc                sž   t t| ƒ |¡ || _|| _g | _i | _i | _d | _d | _	t
t
jt
jB ƒ}tƒ }| | j¡ | |¡ |  |¡ |j | j¡ |j | j¡ |j | j¡ d S )N)ÚsuperrH  rL   rO   r@  Úorderr  Úscheme_name_textboxZlast_edited_color_schemeÚlast_used_schemer   ri   rj   r&   rq   rt   ry   rv   rz   rk  r{   r|   )r>   rO   r@  r~   rÛ   )Ú	__class__rA   rB   rL   ¹  s     

zSchemeEditor.__init__c             C   s   | j  | j |¡¡ || _dS )z'Set the current stack by 'scheme_name'.N)r@  rx   rn  r   rp  )r>   r^  rA   rA   rB   rd  Õ  s    zSchemeEditor.set_schemec             C   s   | j | j  ¡ S )zk
        Returns the edited scheme name, needed to update the combobox on
        scheme creation.
        )ro  rp  r¥   )r>   rA   rA   rB   rf  Ú  s    zSchemeEditor.get_scheme_namec             C   st   i }| j }xd| j| D ]V}| j| | }t|ƒdkrB|d  ¡ }n"|d  ¡ |d  ¡ |d  ¡ f}|||< qW |S )z—
        Get the values of the last edited color scheme to be used in an instant
        preview in the preview editor, without using `apply`.
        re   r   r0  )rp  r  r%  r¥   rÃ   )r>   r\  r^  r  r¬   r@   rA   rA   rB   rk  á  s    z$SchemeEditor.get_edited_color_schemeFc          	   C   s¤  t dƒdddddddd	gft d
ƒddddddgft dƒddgfg}| j}| t dƒd |¡¡}i | j|< |j tjtj	B ¡ |  
t dƒ¡ tƒ }| |j¡ | |j¡ |j| j|< |sÄ|j d¡ tƒ }| |¡ tƒ }tƒ }	x€t|ƒD ]r\}
}|\}}tƒ }x&t|ƒD ]\}}d ||¡}| j |¡}tj| }t|ƒr¢|j||dd\}}| tjtj	B ¡ | ||d d¡ | ||d d¡ |g| j| |< n†|j||dd\}}}}| tjtj	B ¡ | ||d d¡ | ||d d¡ | ||d d¡ | ||d d¡ |||g| j| |< qW t|ƒ}| |¡ |
dkrV| |¡ qì|	 |¡ qìW | |	¡ | |¡ tƒ }| |¡ | j |¡ | j |¡ dS )z<Add a stack for a given scheme and connects the CONF values.ZTextZnormalÚcommentÚstringZnumberÚkeywordZbuiltinZ
definitionÚinstanceZ	HighlightZcurrentcellZcurrentlineZ
occurrenceZ	matched_pZunmatched_pZ	ctrlclickZ
BackgroundZ
backgroundZ	sideareaszScheme name:z{0}/namezColor scheme editorTz{0}/{1})rþ   re   r   r0  r2  N) r)   rO   rÜ   r&  r  r×   ZsetAlignmentr   Z
AlignRightZAlignVCenterrm   r   rq   rØ   ro  r7  r&   rs   r  r   rF   r6   rc  r4   rÿ   r  r   rt   r'   r@  rn  rb  )r>   r^  rB  Zcolor_scheme_groupsrO   Z	line_editZname_layoutZ	cs_layoutZh_layoutZv_layoutr   r‘   Z
group_namer5  Zgroup_layoutrŠ   r  r?   r@   r  r×   r»   r¾   r¿   Z	group_boxZ	stackitemrA   rA   rB   rR  ú  sv    











z#SchemeEditor.add_color_scheme_stackc             C   s<   |   |¡ | j ¡ }| j |¡ | j |¡}| j |¡ dS )z%Remove stack widget by 'scheme_name'.N)rd  r@  rƒ   ZremoveWidgetrn  r   rC  )r>   r^  r„   r   rA   rA   rB   rh  R  s
    

z&SchemeEditor.delete_color_scheme_stack)NN)F)rG   rH   rI   rJ   rL   rd  rf  rk  rR  rh  Ú__classcell__rA   rA   )rq  rB   rH  ·  s   
XrH  )ZrJ   Úos.pathÚpathrá   r:  Zqtpyr   Zqtpy.compatr   r   r   r   Zqtpy.QtCorer   r   r	   r
   r   Z
qtpy.QtGuir   r   Zqtpy.QtWidgetsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   Zspyder.config.baser)   r*   r+   r,   r-   Zspyder.config.guir.   r/   Zspyder.config.mainr0   Zspyder.config.userr1   Zspyder.config.utilsr2   Zspyder.py3compatr3   r4   Zspyder.utilsr5   rn   r6   Zspyder.utils.miscr7   Zspyder.widgets.colorsr8   Zspyder.widgets.comboboxesr9   Z$spyder.widgets.sourcecode.codeeditorr:   r6  Úobjectr;   rK   rd   r—   r  r  r*  r<  rH  rA   rA   rA   rB   Ú<module>	   sL   t
G     
6  7  /