
    ce^                        d Z ddlmZ ddlZddlmZ ddlZddlZddl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 dd	lm Z  dd
l!m"Z"m#Z# ddl$m%Z% ddl&m'Z'm(Z( ddl)m*Z* ddl+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3 ddl4m5Z5  G d de0          Z6 G d de0          Z7 G d de/          Z8 G d de,          Z9 G d d          Z: G d de1          Z; G d de          Z< G d de          Z= G d  d!e5          Z>dS )"zConda channel selector dialog.    )defaultdictN)product)parse)QEventQRegExpQSizeQtSignal)QKeySequenceQRegExpValidator)QAbstractItemViewQActionQApplicationQFrameQHBoxLayoutQListWidgetQListWidgetItemQMenuQProgressBarQSizePolicyQVBoxLayout)AnacondaAPI)CONFAnacondaBrand)get_domain_from_api_url)path_is_writableconvert_file_url_to_path)SASS_VARIABLES)ButtonDangerButtonNormalButtonPrimary	FrameBase	LabelBaseLineEditBaseSpacerHorizontalSpacerVertical)
DialogBasec                       e Zd ZdZdS )LabelConfigLocationz,Label displaying the configuration location.N__name__
__module____qualname____doc__     Klib/python3.11/site-packages/anaconda_navigator/widgets/dialogs/channels.pyr)   r)   *   s        6666r0   r)   c                       e Zd ZdZdS )LabelChannelInfoz%Label displaying channel information.Nr*   r/   r0   r1   r3   r3   .   s        ////r0   r3   c                       e Zd ZdZdS )FrameChannelszFrame used in CSS styling.Nr*   r/   r0   r1   r5   r5   2   s        $$$$r0   r5   c                   6     e Zd ZdZ e            Z fdZ xZS )ButtonRemoveChannelz"Button that emits signal on focus.c                 |    t                                          |           | j                                         dS Override Qt method.N)superfocusInEventsig_focusedemitselfevent	__class__s     r1   r<   z ButtonRemoveChannel.focusInEvent;   s6    U###r0   )r+   r,   r-   r.   r
   r=   r<   __classcell__rB   s   @r1   r7   r7   6   sI        ,,&((K                 r0   r7   c                       e Zd ZdZddZdS )
WorkerMock6Worker mock to handle `defaults` channel special case.Nc                 0    || _         || _        || _        dS )rG   Nitemurlrepodata_url)r@   rJ   rK   rL   s       r1   __init__zWorkerMock.__init__E   s    	r0   )NNN)r+   r,   r-   r.   rM   r/   r0   r1   rF   rF   C   s.        @@           r0   rF   c                        e Zd ZdZ ed          Z e            Z e            Z e            Z	 fdZ
 fdZ fdZd Zd Z xZS )LineEditChannela  
    Custom line edit that uses different validators for text and url.

    More info:
    http://conda.pydata.org/docs/config.html#channel-locations-channels

    Valid entries:
    - defaults  <- Special case
    - <some-channel-name>
    - https://conda.anaconda.org/<channel>/<package>
    - https://conda.anaconda.org/t/<token>/<package>
    - http://<some.custom.url>/<channel>
    - https://<some.custom.url>/<channel>
    - file:///<some-local-directory>
    z2^[A-Za-z][A-Za-z0-9/_-]+$|^https?://.*|^file:///.*c                     t                      j        |i | t          | j                  | _        t          |           | _        |                     | j                   |                     t          j
        t          j
                   dS )zACustom line edit that uses different validators for text and url.)parentN)r;   rM   r   VALID_RE
_validatorr   menusetValidatorsetSizePolicyr   	Expanding)r@   argskwargsrB   s      r1   rM   zLineEditChannel.__init__c   sz    $)&)))*4=99&&&	$/***;0+2GHHHHHr0   c                 F   |                                 t          j        k    r^|                                t          j        z  r=|                                 s)|                     |                                           dS t                      
                    |          S )r:   T)typer   MouseButtonPressbuttonsr	   RightButton	isEnabled	show_menuposr;   rA   r?   s     r1   rA   zLineEditChannel.eventk   st    JJLLF333".8X3aeaoaoaqaq3NN599;;'''4ww}}U###r0   c                    |                                 }|                    t          j                  rYt	          j                    }|                                }| j                            |          r| 	                    |           dS n\|t          j        t          j        fv r| j                                         n(|t          j        fv r| j                                         t#                                          |           dS r9   )keymatchesr   Paster   	clipboardtextrR   
exactMatchsetTextr	   
Key_Return	Key_Entersig_return_pressedr>   
Key_Escapesig_escape_pressedr;   keyPressEvent)r@   rA   rc   rf   rg   rB   s        r1   ro   zLineEditChannel.keyPressEventr   s    iikk ==+,, 
	/$.00I>>##D}''-- T""" r}bl333',,....''',,...e$$$$$r0   c                 b   | j                                          t          d| j                   }|j                            | j                   | j                             |           | j                             d           | j                             | 	                    |                     dS )z Show copy menu for channel item.z&CopyTN)
rT   clearr   	triggeredconnect	copy_text	addAction
setEnabledexec_mapToGlobal)r@   ra   copys      r1   r`   zLineEditChannel.show_menu   s    	w	**t~...	D!!!	T"""	((--.....r0   c                     t          j                    }|                    |                                            | j                                         dS )zCopy channel text to clipboard.N)r   rf   ri   rg   
sig_copiedr>   )r@   rf   s     r1   rt   zLineEditChannel.copy_text   sF     *,,	$))++&&&r0   )r+   r,   r-   r.   r   rR   r
   rl   rn   r{   rM   rA   ro   r`   rt   rC   rD   s   @r1   rO   rO   L   s           wLMMHJI I I I I$ $ $ $ $% % % % %$/ / /      r0   rO   c                   @     e Zd ZdZd fd	Zd Zed             Z xZS )ListWidgetItemChannel4Conda channels list widget item used in CSS styling.Nc                    t                                                       |r|nd| _        |r|nd| _        d| _        d}t                      | _        t          | j                  | _        | j        	                    d           t          |          | _
        | j
        	                    d           t                      | _        t                      | _        t                      | _        | j        	                    t#          |                     | j                            |           t'                      }|                    | j                   |                    | j                   |                    | j
                   | j
                            |           t-                      }|                    |           |                                 |                    | j                   |                    | j                   | j                            |           |                     |                                            dS )r~    z,Enter a channel name, file location, or url.z&Path to configuration file: {location}FN)r;   rM   channellocationnew_channel_help_textr5   widgetr)   new_channel_help
setVisiblelabel_locationrO   text_channelr3   
label_infor7   button_remover   ri   r   	addWidget
setToolTipr   	addLayout
addStretch	setLayoutsetSizeHintwidget_size)r@   r   r   location_labellayout_namelayout_framerB   s         r1   rM   zListWidgetItemChannel.__init__   s   ")1wwr$,4"%S"A $oo 3D4N O O((///1.AA&&u---+--*,,022 	%%&6x&@&@AAA!!'*** "mmd/000d3444d1222&&~666"}}{+++!!!t///t1222l+++))++,,,,,r0   c                 l    | j                             |           | j                                          dS )z/Set the editable status of the channel textbox.N)r   rv   setFocus)r@   values     r1   set_editablez"ListWidgetItemChannel.set_editable   s4    $$U+++""$$$$$r0   c                  J    t          t          j        t          j                  S )z)Return the size defined in the SASS file.)r   r   WIDGET_CHANNEL_TOTAL_WIDTHWIDGET_CHANNEL_TOTAL_HEIGHTr/   r0   r1   r   z!ListWidgetItemChannel.widget_size   s     ^>@jkkkr0   )NN)	r+   r,   r-   r.   rM   r   staticmethodr   rC   rD   s   @r1   r}   r}      su        >>#- #- #- #- #- #-J% % %
 l l \l l l l lr0   r}   c                       e Zd ZdZ ee          Z ee          Z ee          Z	 e            Z
 eeeee          Z e            Z	 	 	 	 	 d fd	Z fdZd Zd	 Zd
 Zd Zd Zedd            Zd Zd Zed             Z xZS )ListWidgetChannelsConda channels list widget.Nhttps://anaconda.orghttps://api.anaconda.orghttps://conda.anaconda.orgc                 (   t                                          |           g | _        || _        t	          j                    \  }}|rI|t          j        k    r9t          |          }t          j
        |d          }t          j
        |d          }|| _        || _        || _        d| _        |                     d           |                     t"          j                   |                     t"          j                   |                     t"          j                   |                     t0          j                   |                     t"          j                   |                     t:          j                   |                     d           dS )r   apicondaFr   TN) r;   rM   _itemsr   r   get_logged_datar   ANACONDA_ORGr   r   urljoinapi_urlmain_url	conda_urlrepeat_errorsetObjectNamesetResizeModer   AdjustsetMovementStaticsetFrameStylePlainsetSelectionModer   NoSelectionsetViewModeListModesetFocusPolicyr	   NoFocussetUniformItemSizes)	r@   rQ   r   r   r   r   logged_brandlogged_api_urlrB   s	           r1   rM   zListWidgetChannels.__init__   s\    	    '+';'='=$n 	9lm.HHH.~>>HmHe44Gh88I "! 	/000;-...+,,,;,---/;<<<-...BJ'''  &&&&&r0   c                     t                                                                          j                   j        j                             fd           j        j                             fd           j        j	                             fd           j        j
                            d fd	           j                                                                        sod _                                                              d           j        j                             j                   j                            d           n!d _         j                                       j                            j                   j                            d           dS )	zN
        Override Qt method.

        Add a content item to the list.
        c                  .                                    S N)validate_channelrJ   r@   s   r1   <lambda>z,ListWidgetChannels.addItem.<locals>.<lambda>   s    T=R=RSW=X=X r0   c                  .                                    S r   )escape_pressedr   s   r1   r   z,ListWidgetChannels.addItem.<locals>.<lambda>  s    T=P=PQU=V=V r0   c                  .                                    S r   )remove_channelr   s   r1   r   z,ListWidgetChannels.addItem.<locals>.<lambda>  s    43F3Ft3L3L r0   Nc                 .                                   S r   )	fix_focus)vrJ   r@   s    r1   r   z,ListWidgetChannels.addItem.<locals>.<lambda>  s    dnnT>R>R r0   TFr   )r;   addItemsetItemWidgetr   r   rl   rs   rn   r   clickedr=   r   striplower
is_editingscrollToBottomr   
textEditedcheck_repeatr   r   appendr   r   setDisabled)r@   rJ   rB   s   ``r1   r   zListWidgetChannels.addItem   s    	4---,445X5X5X5X5XYYY,445V5V5V5V5VWWW"**+L+L+L+L+LMMM&../R/R/R/R/R/RSSS |!!##))++ 	%"DO!!!d###(001BCCC))%0000#DOKt$$$$$T\222##D)))))r0   c                 Z    |                      |                                 dz
             dS )z3Handle cancellation of ongoing new channel editing.   N)takeItemcountr@   rJ   s     r1   r   z!ListWidgetChannels.escape_pressed  s'    djjllQ&'''''r0   c                     | j                             |          }|                     |           | j                                         dS )z4Set the current row based on focus of child widgets.N)r   indexsetCurrentRowsig_focus_fixedr>   )r@   rJ   rows      r1   r   zListWidgetChannels.fix_focus  sF    k%%3!!#####r0   c                    | j         D ]Z}t          j        t                    5  |                    |                                           ddd           n# 1 swxY w Y   [|                                  |                                  dS )zUpdate custom CSS style sheet.N)r   
contextlibsuppressBaseExceptionr   r   updaterepaintr   s     r1   update_style_sheetz%ListWidgetChannels.update_style_sheet  s    K 	5 	5D$]33 5 5  !1!1!3!34445 5 5 5 5 5 5 5 5 5 5 5 5 5 5 	s   (AA	A	c                     || j         v rj| j                             |          }|                     |           | j                             |           | j                            |j                   dS dS )zRemove the selected channel.N)r   r   r   removesig_channel_removedr>   r   )r@   rJ   r   s      r1   r   z!ListWidgetChannels.remove_channel&  ss    4;K%%d++EMM%   Kt$$$$))$,77777	 r0   c                    |                      d           |j        }|rG|                    d           |j        |_        |j                            |j                   |j                            |j                   |j                            d           |j	                            d           |j
                            d           |                     |           | j                            |           | j                            |j                   | j                            d           |                                  | j                            dddd           nt'          j        dd          rd\  }}nd|j         d	d
}}| j                            |ddd           |                    d           |                     ||           | j                            d           | j                                         dS )z$Callback for channel url validation.FTr   Nmainoffline_mode)z+Can't validate channel due to offline mode.zOffline Modez<b>z"</b> is not a valid conda channel.zInvalid channelrg   )r   rJ   r   r   r   ri   r   r   r   r   r   show_tool_tipr   r   sig_channel_addedr>   sig_channel_statusr   sig_status_updatedr   getrK   sig_channel_checked)r@   workervaliderrorrJ   
error_textshort_error_texts          r1   _channel_url_validatedz)ListWidgetChannels._channel_url_validated.  s   { 	0e$$$!>DL%%fn555((888!,,U333**5111))$///t$$$Kt$$$"''777#((...##%%%#((Rt<<<<x// y/l,
,,0dfj0d0d0dfw,
#(()92tTJJJd###t*555#((/// %%'''''r0   r   c                     | j         }|                    |           |                    t          |                     dS )z"Set the tooltip in case of errors.N)r   r   rv   bool)rJ   rg   r   s      r1   r   z ListWidgetChannels.show_tool_tipM  s?     $$t**%%%%%r0   c                 ,   g }| j                                         D ]5\  }}|D ]-}|                                }|                    ||f           .6|                                                                }| j        j        j        |f}||v | _        dS )z:Check that given channel (text) and source is not in list.N)	sourcesitemsr   r   r   r   
_conda_apiuser_rc_pathr   )r@   rg   comparesourcechannelsr   lower_channelcurrent_compares           r1   r   zListWidgetChannels.check_repeatT  s     $ 2 2 4 4 	8 	8FH# 8 8 '677778 zz||!!##8.;TB+w6r0   c                    |j                                                                         }| j                            dddd           ||_        | j        rM|                     |d| d           t          |dd          }||_        | 	                    |dd	           d	S |sf|                     |d
           | j                            ddd	d	           t          |dd          }||_        | 	                    |dd	           d	S |dk    r0t          |||          }||_        | 	                    |dd	          S |
                    d          r^t          |||          }||_        t          |          }t          j                            |          }| 	                    ||d	          S |
                    d          rt          j        dd          }t#          j        |          j        }|                    d          d         }|}	t#          j        |          j        ||fv r"|                    | j        | j                  }	|	}nt          j        dd          }
| j                            d          r| j        n	| j        dz   }t#          j        ||          }	t          j                    \  }}|t6          j        k    r t#          j        | j        d|
 d|           }	|	d         dk    r
|	d	d         n|	}	|	 d}| j                            |          }|j                             | j	                   ||_!        |	|_"        ||_        ||_#        | $                    d           |                     |           d	S )z.Validate entered channel with current api url.zValidating channel...r   r   zChannel <b>z</b> is in list already.r   rI   FNzChannel cannot be empty.zChannel cannot be emptydefaultsTzfile:///)zhttps://zhttp://r   anaconda_api_urlzapi.anaconda_server_token/zapi/repo/t/z/noarch/repodata.json)%r   rg   r   r   r>   r   r   r   rF   r   
startswithr   ospathisdirr   r   r   urlparsenetlocsplitreplacer   r   endswithr   r   r   TEAM_EDITIONr   download_is_valid_urlsig_finishedrs   rJ   rK   rL   r   )r@   rJ   r   r   r  r   r  anaconda_org_api_netlocanaconda_org_netlocrK   tokenr   r   _rL   s                  r1   r   z#ListWidgetChannels.validate_channel`  s   #((**0022$$%<b!QGGG 	t*Y*Y*Y*YZZZTrCCCF$FN''t<<<4 	t*DEEE#(()BBdSSSTrCCCF$FN''t<<<4 j  TwWMMMF$FN..vtTBBBj)) 	DTwWMMMF$FN+G44DGMM$''E..vudCCC566 	T#x0BCC&+n5E&F&F&M#"9"?"?"G"G"KC~g&&-2IK^1___ oodmT^DDHV%<==E*..*A*A#*F*F`DN]`L`I-	733C #244OL!}999mDM3R3R3R3R3RSSb'S..c#2#hhc444//==##D$?@@@
 *4   tr0   c                     t          t                    }| j        D ]'}||j                                     |j                   (|S )zReturn the channels.)r   listr   r   r   r   )r@   config_sourcesrJ   s      r1   r   zListWidgetChannels.sources  sH     %T**K 	? 	?D4=)00>>>>r0   )NNr   r   r   )r   )r+   r,   r-   r.   r
   objectr   r   r   r   r   r   r   rM   r   r   r   r   r   r   r   r   r   r   propertyr   rC   rD   s   @r1   r   r      sm       %%v &.. &((??fhhO '*.#' #' #' #' #' #'J* * * * *8( ( ($ $ $  8 8 8( ( (> & & & \&
7 
7 
7E E EN   X    r0   r   c                        e Zd ZdZ eee          Z e            Z e            ZdZ	d fd	Z
ed             Zd Zd Zd Zd	 Zd
 Zd ZddZddZed             Z xZS )DialogChannelsz>Dialog to add delete and select active conda package channels.i&  Nc                 \    t                                          |           | _        d _        t	                       _        d _        i  _        t            j                   _	        t          d           _        t          d           _        t                      _        t          d           _        t          d           _        t%          d           _         j                            d	            j	                            t.          j                    j	                            t.          j                                                                         t8          j        z                                  d
                                d                                  j!                    "                    d           tG                      }|$                     j                   |%                                 |$                     j                   tG                      }|$                     j                   |$                    tM                                 |$                     j                   |$                    tM                                 |%                                 |$                     j                   |$                    tM                                 |$                     j                   tO                      }|(                    |           |$                    tS                                 |$                     j	                   |$                    tS                                 |$                    tS                                 |(                    |            *                    |            j        j+        ,                     j-                    j        j+        ,                     j.                    j        j+        ,                     j/                    j	        j0        ,                     j1                    j	        j2        ,                    d fd	            j	        j2        ,                    d fd	            j	        j3        ,                    d fd	            j	        j3        ,                    d fd	            j	        j4        ,                     j5                    j	        j6        ,                     j7                    j        8                    d            j        8                    d            j        8                    d	            1                    ddd           dS )z?Dialog to add delete and select active conda pacakge channels .r   N)rQ   r   z.Manage channels you want Navigator to include.zCollecting sources...zAdd...CancelzUpdate channelsFgQ?i,  Tc                 ,                                     S r   set_tab_orderr   r@   s    r1   r   z)DialogChannels.__init__.<locals>.<lambda>  s    4;M;M;O;O r0   c                 6    j                                         S r   	button_okr   r(  s    r1   r   z)DialogChannels.__init__.<locals>.<lambda>  s    4>;R;R;T;T r0   c                 ,                                     S r   r&  r(  s    r1   r   z)DialogChannels.__init__.<locals>.<lambda>  s    T=O=O=Q=Q r0   c                 6    j                                         S r   r*  r(  s    r1   r   z)DialogChannels.__init__.<locals>.<lambda>  s    T^=T=T=V=V r0   r   )actionr   	max_valuer   )9r;   rM   _parent
_conda_urlr   r   initial_sourcesr  r   r  r#   r   label_statusr   progress_barr    
button_addbutton_cancelr!   r+  frame_title_barr   r   r   NoFramesetFrameShapesetWindowFlagswindowFlagsr	   PopupsetWindowOpacitysetMinimumHeightsetMinimumWidthWIDTHsetModalr   r   r   r%   r   r   r&   r   r   rs   add_channelupdate_channelsrejectr   update_statusr   r   r   sig_check_readyr   refreshr   )r@   rQ   layout_button	layout_oklayoutrB   s   `    r1   rM   zDialogChannels.__init__  s      6==#  'dAAA	#$TUU%&=>>(..&x00)(33&'899 	''...	///	///D,,..9:::d###c"""TZ(((d $000  """000MM	D-...,..///D-...,..///D.///,..///DN+++'''))***###))***))***###v 	''(8999&&t';<<<"**4;777	$,,T-?@@@	#++,O,O,O,O,OPPP	#++,T,T,T,T,TUUU	%--.Q.Q.Q.Q.QRRR	%--.V.V.V.V.VWWW	%--d.BCCC	$,,T\:::##D)))""4(((&&u---"9aPPPPPr0   c                     g }|                                  D ])\  }}|                    t          |g|                     *|S )z
        Flatten sources and channels dictionary to list of tuples.

        [(source, channel), (source, channel)...]
        )r   extendr   )r   groupedr  r  s       r1   _group_sources_and_channelsz*DialogChannels._group_sources_and_channels   sK      ' 	8 	8FHNN7F8X667777r0   c                     |                                 }|t          j        fv rD| j        j        r"|                                  d| j        _        dS |                                  dS dS )r:   FN)rc   r	   rm   r  r   rG  rD  )r@   rA   rc   s      r1   ro   zDialogChannels.keyPressEvent  sa    iikk2=/!!y# ',	$$$ "!r0   c                     |                      t          j                   t          j        t
                    5  | j                                         ddd           dS # 1 swxY w Y   dS )zUpdate custom css style sheets.N)r?  r   WIDGET_CHANNEL_DIALOG_WIDTHr   r   r   r  r   r@   s    r1   r   z!DialogChannels.update_style_sheet  s    ^GHHH // 	+ 	+I((***	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+s   A  A$'A$c                 .   |                     dg           | _        | j                            d           | j                                        D ]\  }}|                     dg           }|D ]v}t          ||          }|                    d           |j                            d           |j	                            d           | j
                            |           w|                                  | j                                         | j                            d           | j                            d           | j
        j                                        | _        |                                  | j                                         dS )zSetup the channels widget.r  Fr  r   r   TN)r   r  r5  r   r   r}   r   r   r   r   r  r   r'  r   r+  
setDefaultr6  rv   r   ry   r2  rE  sig_setup_readyr>   )	r@   r   conda_config_datar   r  datar  r   rJ   s	            r1   setupzDialogChannels.setup  s   /334DbII##E*** /5577 	( 	(LFDxx
B//H# ( (,WvNNN!!%(((%00777#..u555	!!$''''( 	  """!!$'''%%d+++#y05577!!#####r0   c                 F   | j         j        r`|                     | j        | j         j        d         j                   |                     | j         j        d         j        | j                   |                     | j        | j                   |                                  dS )z!Fix the tab ordering in the list.r   r	  N)r  r   setTabOrderr5  r   r6  r+  rG  rR  s    r1   r'  zDialogChannels.set_tab_order6  s    9 	UT_di.>q.A.OPPPTY-b1?ASTTT+T^<<<r0   c                    | j         j        j        }t          d|          }|j                            d           |j                            d           | j                            |           | 	                    d           dS )zAdd new conda channel.r   rT  TFN)
r   r   r   r}   r   r   r   r  r   rG  )r@   r   rJ   s      r1   rB  zDialogChannels.add_channel?  s}    x*7$R,GGG((...&&t,,,	$Ur0   c                 8   | j         j        }|                     | j                  }|                     |          }t	          |          t	          |          k    r* | j        j        | j          |                                  dS |                                  dS )z Update channels list and status.N)	r  r   rN  r2  sortedsig_channels_updatedr>   acceptrD  )r@   r   originalupdateds       r1   rC  zDialogChannels.update_channelsH  s    )#33D4HII227;;(vg..*D%*DL99KKMMMMMKKMMMMMr0   Tc                 z   | j                             |ot          | j        j                             | j                            |           | j                            d           | j                                        dk    r6| j                             d           | j                            d           dS dS )z1Update enable/disable status based on item count.Tr   FN)r5  rv   r   r  r   r+  r6  )r@   channel_statuss     r1   rG  zDialogChannels.refreshU  s    "">#Kd49?6K6KLLL!!.111%%d+++9??!!O&&t,,,N%%e,,,,, "!r0   r   c                 j   t          |          }| j                            |           | j                            |           |S|Q| j                            d           | j                            d|           | j                            |           dS | j                            d           dS )z1Update the status and progress bar of the widget.NTr   F)r   r3  ri   r   r4  setRangesetValue)r@   r.  messager   r/  visibles         r1   rE  zDialogChannels.update_status_  s    v,,!!&)))$$W---!6((...&&q)444&&u-----((/////r0   c                     |                      | j                  }|                      | j        j                  }t	          |          }t	          |          }||z
  }||z
  }||fS )z-Return sources to add and remove from config.)rN  r2  r  r   set)r@   ra  rb  addr   s        r1   r   zDialogChannels.sourcesk  sf     33D4HII22493DEEx==g,, G#F{r0   r   )T)r   r   NN)r+   r,   r-   r.   r
   r  r_  rV  rF  r@  rM   r   rN  ro   r   rY  r'  rB  rC  rG  rE  r   r   rC   rD   s   @r1   r"  r"    s5       HH!6&&11fhhOfhhOEDQ DQ DQ DQ DQ DQL 	 	 \	  + + +$ $ $.      - - - -
0 
0 
0 
0   X    r0   r"  )?r.   collectionsr   r   	itertoolsr   r  typingurllibr   qtpy.QtCorer   r   r   r	   r
   
qtpy.QtGuir   r   qtpy.QtWidgetsr   r   r   r   r   r   r   r   r   r   r   #anaconda_navigator.api.anaconda_apir   anaconda_navigator.configr   r   anaconda_navigator.utilsr   anaconda_navigator.utils.miscr   r   anaconda_navigator.utils.stylesr   anaconda_navigator.widgetsr   r    r!   r"   r#   r$   r%   r&   "anaconda_navigator.widgets.dialogsr'   r)   r3   r5   r7   rF   rO   r}   r   r"  r/   r0   r1   <module>r{     s   % $ # # # # # #           				        : : : : : : : : : : : : : : 5 5 5 5 5 5 5 5                         
 < ; ; ; ; ; 9 9 9 9 9 9 9 9 < < < < < < T T T T T T T T : : : : : :                    : 9 9 9 9 97 7 7 7 7) 7 7 70 0 0 0 0y 0 0 0% % % % %I % % %         ,                     E E E E El E E ET/l /l /l /l /lO /l /l /ldg g g g g g g gTE E E E EZ E E E E Er0   