
    G@d~3                     ^   d 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	 ddl
mZ ddlmZ ddl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 ddlmZmZ ddlmZm Z  ddl!m"Z" ddl#m$Z$m%Z%  ej&        e'          Z(ee)e*e+e,e-e.f         Z/ee0e1f         Z2ee/e2f         Z3 G d de          Z4dS )z
Spyder preferences plugin.

This plugin is in charge of managing preference pages and tabs for all plugins
in Spyder, both internal and external.
    N)Union)parseVersion)QIcon)Slot)QMessageBox)PluginsSpyderPluginV2SpyderPlugin)on_plugin_availableon_plugin_teardown_)CONF_VERSION)	NoDefault)ApplicationMenusToolsMenuSections)PreferencesActionsPreferencesContainer)PythonpathActions)ApplicationToolbarsMainToolbarSectionsc                   $    e Zd ZdZdZdZej        ej        gZ	dZ
eZdZdZdZd$ fd	Zdeeef         d	dfd
Zdeeef         fdZdedededefdZ	 	 d%dedededed	ef
dZdeded	efdZd Zed	efd            Zd	efdZ d	e!fdZ"d Z# e$ej                  d             Z% e$ej                  d             Z& e'ej                  d              Z( e'ej                  d!             Z) e*            d"             Z+d&d#Z, xZ-S )'Preferencesz
    Spyder preferences plugin.

    This class manages all the preference pages and tabs for all internal
    and external plugins, as well enabling other plugins to add configurations
    to other sections.
    preferencesFnewoldNc                 h    t                                          ||           i | _        i | _        d S N)super__init__config_pagesconfig_tabs)selfparentconfiguration	__class__s      Alib/python3.11/site-packages/spyder/plugins/preferences/plugin.pyr!   zPreferences.__init__@   s3    ///    pluginreturnc           	      <   t          |d          r|j        |j        }| j        ||f| j        |j        <   |j        pt
          }t          |          }|j        =|j        D ]5}|j        |         }|D ]#}||         }|                     |||||           $6|j	        A|j	        D ];}|j	        |         }	| j
                            |g           }
|
|	z  }
|
| j
        |<   :d S d S t          |d          r'|j        "|j        }| j        ||f| j        |j        <   d S d S d S )NCONF_WIDGET_CLASSCONFIGWIDGET_CLASS)hasattrr-   NEW_APIr"   NAMEr   r   ADDITIONAL_CONF_OPTIONScheck_version_and_mergeADDITIONAL_CONF_TABSr#   getr.   OLD_APICONF_SECTION)r$   r*   Widgetplugin_conf_versionconf_section	conf_keysconf_key	new_valueplugin_nametabs_to_addplugin_tabss              r(   register_plugin_preferencesz'Preferences.register_plugin_preferencesE   s   F/00 #	.(4-F.2lFF-KDfk*"("5"E"'(;"<"< -9$*$B 9 9L & >| LI$- 9 9$-h$7	44((I/9 9 9 99 *6#)#> @ @K"("=k"JK"&"2"6"6{B"G"GK;.K4?D$[11 76@ @ f233 	.)5.F ff6.Df1222	. 	.55r)   c                 (   t          |dd          pt          |dd          }| j                            |           t          |t                    r>|j        pg D ]6}|j        |         }|D ]"}| j        |                             |           #5dS dS )zBRemove a plugin preference page and additional configuration tabs.r1   Nr7   )getattrr"   pop
isinstancer
   r4   r#   remove)r$   r*   namer>   tabstabs         r(   deregister_plugin_preferencesz)Preferences.deregister_plugin_preferencesl   s     -- :FND99 	 	d### fn-- 	> & ; Ar > >2;? > >C$[188====>	> 	>> >r)   r:   r<   r=   current_versionc                     |                      ||d          }|                      d|i           }|                    |j        i           }||v r||         }	|	d         }
t          |	d                   }||k    }|j        |j        k    }|                     |
|||          }|}|t          k    r|                     ||          }|                     |||           t          |          |	d<   ||	d<   |	||<   |||j        <   |                     d||           dS t          |          |d||<   |||j        <   |                     d||           |t          k    r|                     ||          }|                     |||           dS )z=Add a versioned additional option to a configuration section.N)sectiondefaultadditional_configurationrN   version)rM   )rP   rN   )
get_confr5   r1   r   majormerge_defaultsr   merge_configurationsset_confstr)r$   r:   r<   r=   rK   r*   current_valuesection_additionalplugin_additionalconf_key_infoprev_defaultprev_versionallow_replacementallow_deletionsnew_defaults                  r(   r3   z#Preferences.check_version_and_merge|   s    lD & : :!]]+E3?35 + 7 7 /226;CC(((-h7M(3L y!9::L /, >-3l6HHO++L),=P PI#K	)) 55mYOO	MM)\  ; ; ; (+?';';M)$'2M)$*7h'.?v{+MM*,>$  & & & & &
 //$+ +h' /@v{+MM*,>$  & & & 	)) 55mYOO	MM)\  ; ; ; ; ;r)   r[   r_   r]   r^   c                    t          |          }t          |          }|t          u r|t          u r|D ]=}||v r,||         }||         }	|                     ||	||          ||<   2||         ||<   >|r=t          |                                          D ]}
|
|vr|                    |
           |S ||k    r|r|S |S |S )z'Compare and merge two versioned values.)typedictrS   listkeysrD   )r$   r[   r_   r]   r^   	prev_typenew_typenew_keycurrent_subvaluenew_subvalueold_keys              r(   rS   zPreferences.merge_defaults   s   
 &&	$$T!1!1& 	A 	Al**'3G'<$#.w#7L,0,?,?(,)?-< -<L))
 -8,@L)) 2#L$5$5$7$788 2 2Gk11$((111[((  $""##r)   rW   c                 ^   t          |          }t          |          }t          t          h}t          t          t
          t          t          t          h}|t          u rI|t          u r@|D ];}||v r*||         }||         }	| 
                    ||	          ||<   0||         ||<   <|S ||v r,||v r( |t          |          t          |          z             S ||k    r
||v r||v r|S ||v r ||v r |t          |          |gz             S ||S t                              d| d|            |S )zd
        Recursively match and merge a new configuration value into a
        previous one.
        Nz
The value z cannot be replacedby )ra   rc   tupleintfloatboolcomplexrV   bytesrb   rT   loggerwarning)
r$   rW   r=   current_typerf   iterable_types
base_typesrg   rh   ri   s
             r(   rT   z Preferences.merge_configurations   s    M**	??5$e<
4H$4$4$ @ @m++'4W'=$#,W#5L-1-F-F(,.8 .8M'** .7w-?M'**  ^++N0J0J<] 3 3d9oo EFFFh&&
**x:/E/E^++J0F0F<m!4!4	{!BDDD"NN - - -!*- - . . .  r)   c                     |                                  }|                    | j        | j        ||                                            d S r   )get_containercreate_dialogr"   r#   get_main)r$   prefs_dialog_size	containers      r(   open_dialogzPreferences.open_dialog  sN    &&((	t/1BMMOO	 	 	 	 	r)   c                       t          d          S )Nr   r    r)   r(   get_namezPreferences.get_name	  s    r)   c                      t          d          S )Nz6This plugin provides access to Spyder preferences pager   r$   s    r(   get_descriptionzPreferences.get_description  s    IJJJr)   c                 ,    |                      d          S )N	configure)create_iconr   s    r(   get_iconzPreferences.get_icon  s    ,,,r)   c                                                        }                                 |j                             fd           |j                             j                   d S )Nc                  8                          j                  S r   )r}   r{   )mainr$   s   r(   <lambda>z+Preferences.on_initialize.<locals>.<lambda>  s    D$$T%;<< r)   )rx   rz   sig_show_preferences_requestedconnectsig_reset_preferences_requestedreset)r$   r|   r   s   ` @r(   on_initializezPreferences.on_initialize  sk    &&((	}}088<<<<<	> 	> 	>199$*EEEEEr)   )r*   c                 0   |                                  }|                     t          j                  }|                    |j        t          j        t          j                   |                    |j	        t          j        t          j
                   d S )N)menu_idrM   )rx   
get_pluginr	   MainMenuadd_item_to_application_menushow_actionr   Toolsr   reset_actionExtras)r$   r|   	main_menus      r(   on_main_menu_availablez"Preferences.on_main_menu_available  s    &&((	OOG$455	..!$*%+ 	/ 	
 	
 	
 	.."$*%, 	/ 	
 	
 	
 	
 	
r)   c                     |                                  }|                     t          j                  }|                    |j        t          j        t          j	        t          j                   d S )N)
toolbar_idrM   before)rx   r   r	   Toolbaradd_item_to_application_toolbarr   r   Mainr   ApplicationSectionr   Manager)r$   r|   toolbars      r(   on_toolbar_availablez Preferences.on_toolbar_available,  se    &&((	//'/22//!*/':$,	 	0 	
 	
 	
 	
 	
r)   c                     |                      t          j                  }|                    t          j        t          j                   |                    t          j        t          j                   d S )N)r   )	r   r	   r   !remove_item_from_application_menur   Showr   r   Reset)r$   r   s     r(   on_main_menu_teardownz!Preferences.on_main_menu_teardown7  st    OOG$455	33#$* 	4 	
 	
 	

 	33$$* 	4 	
 	
 	
 	
 	
r)   c                     |                      t          j                  }|                    t          j        t          j                   d S )N)r   )r   r	   r   $remove_item_from_application_toolbarr   r   r   r   )r$   r   s     r(   on_toolbar_teardownzPreferences.on_toolbar_teardownE  sH    //'/2244#*/ 	5 	
 	
 	
 	
 	
r)   c                    t          j        | j        t          d          t          d          t           j        t           j        z            }|t           j        k    r*dt          j        d<   | j        	                                 d S d S )NWarningzSSpyder will restart and reset to default settings: <br><br>Do you want to continue?TrueSPYDER_RESET)
r   rs   r   r   YesNoosenvironsig_restart_requestedemit)r$   answers     r(   r   zPreferences.resetM  s|    $TY) * + +_{~-/ / [_$$)/BJ~&&++----- %$r)   c                 ~    |                                  }|                                r|                                 dS )NT)rx   is_preferences_openclose_preferences)r$   
cancelabler|   s      r(   on_closezPreferences.on_closeW  s>    &&((	((** 	*'')))tr)   r   )FF)F).__name__
__module____qualname____doc__r1   r7   r	   r   r   OPTIONAL	CONF_FILEr   CONTAINER_CLASSCAN_BE_DISABLEDr0   r6   r!   r   r
   r   rA   rJ   rV   	BasicTyper   r3   ro   rS   rT   r}   staticmethodr   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__)r'   s   @r(   r   r   -   s         D L '/2HI*OOGG     
%. <=%.BF%. %. %. %.N> <=> > > > 8;8; 8; 	8;
 !8; 8; 8; 8;z 27/4!  ! 9 ! $-! *.!  )-!  :C!  !  !  ! F&!!*&!7@&!EN&! &! &! &!P    c       \ K K K K K-% - - - -F F F  0111
 
 21
  000
 
 10
 w/000
 
 10
 w///
 
 0/
 
TVV. . V.       r)   r   )5r   r   loggingtypingr   packaging.versionr   r   
qtpy.QtGuir   qtpy.QtCorer   qtpy.QtWidgetsr   spyder.api.pluginsr	   r
   r   )spyder.api.plugin_registration.decoratorsr   r   spyder.config.baser   spyder.config.mainr   spyder.config.userr   spyder.plugins.mainmenu.apir   r   ,spyder.plugins.preferences.widgets.containerr   r   spyder.plugins.pythonpath.apir   spyder.plugins.toolbar.apir   r   	getLoggerr   rr   rm   rn   ro   rp   rV   rq   BaseTyperc   rl   IterableTyper   r   r   r)   r(   <module>r      s    
			        - , , , , , , ,             & & & & & & E D D D D D D D D D- - - - - - - -             + + + + + + ( ( ( ( ( ( K K K K K K K K. . . . . . . . ; ; ; ; ; ; O O O O O O O O		8	$	$eT7C67T5[!(L()	n n n n n. n n n n nr)   