a
     ³Ša{-  ã                   @   sÄ   d Z ddlmZ ddlZddlmZ ddlZddlm	Z	m
Z
mZmZ ddlmZmZmZ ddlmZ ddlmZ ddlmZ dd	lmZ ed
ƒZG dd„ de	ƒZG dd„ deƒZG dd„ deƒZdS )úProject Exploreré    )Úprint_functionN)ÚQSortFilterProxyModelÚQtÚSignalÚSlot)ÚQAbstractItemViewÚQHeaderViewÚQMessageBox)Úget_translation)Úto_text_string)Úmisc)ÚDirViewZspyderc                       s\   e Zd ZdZg d¢ZdgZ‡ fdd„Zdd„ Zej	fdd	„Z
d
d„ Zdd„ Zdd„ Z‡  ZS )Ú
ProxyModelz Proxy model to filter tree view.)
z.spyprojectÚ__pycache__z.ipynb_checkpointsz.gitz.hgz.svnz.pytest_cachez	.DS_Storez	Thumbs.dbz
.directoryz.githubc                    s*   t t| ƒ |¡ d| _g | _|  d¡ dS )zInitialize the proxy model.NT)Úsuperr   Ú__init__Ú	root_pathÚ	path_listZsetDynamicSortFilter©ÚselfÚparent©Ú	__class__© úNlib/python3.9/site-packages/spyder/plugins/projects/widgets/projectexplorer.pyr   6   s    zProxyModel.__init__c                 C   s,   t  t|ƒ¡| _dd„ |D ƒ| _|  ¡  dS )zÛ
        Setup proxy model filter parameters.

        Parameters
        ----------
        root_path: str
            Root path of the proxy model.
        path_list: list
            List with all the paths.
        c                 S   s   g | ]}t  t|ƒ¡‘qS r   )ÚospÚnormpathÚstr©Ú.0Úpr   r   r   Ú
<listcomp>I   ó    z+ProxyModel.setup_filter.<locals>.<listcomp>N)r   r   r   r   r   ZinvalidateFilter)r   r   r   r   r   r   Úsetup_filter=   s    zProxyModel.setup_filterc                 C   s   |   ¡  ||¡ dS )úReimplement Qt method.N)ÚsourceModelÚsort)r   ÚcolumnÚorderr   r   r   r'   L   s    zProxyModel.sortc                    sÎ   | j du rdS |  ¡  |d|¡}t t t|  ¡  |¡ƒ¡¡‰ t | j ¡ ˆ ¡rTdS dd„ | j	D ƒD ]`}ˆ |ks€ˆ  |t
j ¡rdt‡ fdd„| jD ƒƒs¾t‡ fdd„| jD ƒƒr¶ dS  dS qd dS qddS dS )	r%   NTr   c                 S   s   g | ]}t  |¡‘qS r   )r   Únormcaser   r   r   r   r"   \   r#   z/ProxyModel.filterAcceptsRow.<locals>.<listcomp>c                    s   g | ]}|ˆ v ‘qS r   r   ©r    Úd©Úpathr   r   r"   ^   r#   c                    s   g | ]}|ˆ v ‘qS r   r   r+   r-   r   r   r"   _   r#   F)r   r&   Úindexr   r*   r   r   ÚfilePathÚ
startswithr   ÚosÚsepÚanyÚPATHS_TO_SHOWÚPATHS_TO_HIDE)r   ÚrowZparent_indexr/   r!   r   r-   r   ÚfilterAcceptsRowP   s     
ÿzProxyModel.filterAcceptsRowc                 C   sH   |t jkr:| jd  tj¡d }| ¡ |kr:t | j|¡S t	 | ||¡S )z8Show tooltip with full path only for the root directory.r   éÿÿÿÿ)
r   ZToolTipRoler   Úsplitr   r3   ÚdataÚjoinr   r   )r   r/   ZroleZroot_dirr   r   r   r;   h   s
    
zProxyModel.datac                 C   s   |   ¡  |  |¡¡S )z¥
        Returns the type of file for the given index.

        Parameters
        ----------
        index: int
            Given index to search its type.
        )r&   ÚtypeÚmapToSource)r   r/   r   r   r   r=   p   s    	zProxyModel.type)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r6   r5   r   r$   r   ZAscendingOrderr'   r8   r;   r=   Ú__classcell__r   r   r   r   r      s   ÿr   c                       sb   e Zd ZdZd‡ f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‡  ZS )ÚFilteredDirViewz"Filtered file/directory tree view.Nc                    s$   t ƒ  |¡ d| _|  ¡  d| _dS )z!Initialize the filtered dir view.N)r   r   Ú
proxymodelÚsetup_proxy_modelr   r   r   r   r   r   ~   s    zFilteredDirView.__init__c                 C   s   t | ƒ| _| j | j¡ dS )zSetup proxy model.N)r   rE   ZsetSourceModelÚfsmodel©r   r   r   r   rF   †   s    
z!FilteredDirView.setup_proxy_modelc                 C   s   | j dur|  | j¡ dS )zInstall proxy model.N)r   ZsetModelrE   rH   r   r   r   Úinstall_model‹   s    
zFilteredDirView.install_modelc                 C   s@   || _ |  ¡  | j |¡}| j | j g ¡ |  | j |¡¡ dS )z~
        Set root path.

        Parameters
        ----------
        root_path: str
            New path directory.
        N)r   rI   rG   ZsetRootPathrE   r$   ZsetRootIndexÚmapFromSource)r   r   r/   r   r   r   Úset_root_path   s
    	zFilteredDirView.set_root_pathc                 C   s2   | j  |¡}| ¡ r.| ¡ | j u r.| j |¡S dS )z›
        Return index associated with filename.

        Parameters
        ----------
        filename: str
            String with the filename.
        N)rG   r/   ÚisValidZmodelrE   rJ   )r   Úfilenamer/   r   r   r   Ú	get_indexŸ   s    	zFilteredDirView.get_indexc                    s4   ˆ j dusJ ‚‡ fdd„|D ƒ}ˆ j ˆ j |¡ dS )zŒ
        Set folder names

        Parameters
        ----------
        folder_names: list
            List with the folder names.
        Nc                    s   g | ]}t  ˆ j|¡‘qS r   )r   r<   r   )r    ÚdirnamerH   r   r   r"   ¶   s   ÿz4FilteredDirView.set_folder_names.<locals>.<listcomp>)r   rE   r$   )r   Zfolder_namesr   r   rH   r   Úset_folder_names¬   s
    	
ÿz FilteredDirView.set_folder_namesc                 C   s*   |r&| j  | j |¡¡}t t|ƒ¡S dS )z‘
        Return filename from index

        Parameters
        ----------
        index: int
            Index of the list of filenames
        N)rG   r0   rE   r>   r   r   r   )r   r/   r.   r   r   r   Úget_filenameº   s    	zFilteredDirView.get_filenamec                 C   s"   dD ]}|   |¡ q|  d¡ dS )zSetup view for projects.)é   é   é   TN)Z
hideColumnZsetHeaderHidden)r   Úir   r   r   Úsetup_project_viewÇ   s    z"FilteredDirView.setup_project_viewc                 C   s>   |r:|  ¡ r:|  d¡r$|  |¡ }n
|  |¡}|  ||¡ d S )NZsingle_click_to_open)rL   Zget_confZ
isExpandedZsetExpanded)r   rO   r/   Ústater   r   r   Údirectory_clickedÎ   s
    

z!FilteredDirView.directory_clicked)N)r?   r@   rA   rB   r   rF   rI   rK   rN   rP   rQ   rV   rX   rC   r   r   r   r   rD   |   s   rD   c                   @   sP   e Zd ZdZeƒ Zddd„Zeeƒdd„ ƒZ	dd„ Z
d	d
„ Zeƒ ddd„ƒZdS )ÚProjectExplorerTreeWidgetzExplorer tree widgetTc                 C   s>   t  | |¡ d | _|  t j¡ || _|  d¡ |  t j¡ d S )NT)	rD   r   Zlast_folderZsetSelectionModeZExtendedSelectionÚshow_hscrollbarZsetDragEnabledZsetDragDropModeZDragDrop)r   r   rZ   r   r   r   r   Ü   s    
z"ProjectExplorerTreeWidget.__init__c                 C   sF   |   d|¡ || _|  ¡  | ¡ |  ¡  tj¡ |  ¡  tj	¡ dS )zToggle horizontal scrollbarrZ   N)
Zset_confrZ   ÚheaderZsetStretchLastSectionZsetHorizontalScrollModer   ZScrollPerPixelZsetSectionResizeModer	   ZResizeToContents)r   Úcheckedr   r   r   Útoggle_hscrollbarç   s
    z+ProjectExplorerTreeWidget.toggle_hscrollbarc                 C   sF   |   | ¡ ¡}|r:|  |¡}t |¡r0| ¡  qB| ¡  n| ¡  dS )úReimplement Qt methodN)ÚindexAtÚposrQ   r   ÚisdirZacceptProposedActionÚignore)r   Úeventr/   Údstr   r   r   ÚdragMoveEventñ   s    



z'ProjectExplorerTreeWidget.dragMoveEventc                 C   sV  |  ¡  | ¡ }|tjtjfvr$dS |  |  | ¡ ¡¡}d\}}dd„ | ¡  	¡ D ƒ}t
|ƒdkr‚tjtjB tjB tjB tjB }ntjtjB }|D ]¼}||kr¢q’t |t |¡¡}	t |	¡rz|dusÐ|durØ|rÖq’n¢t |	¡rJt | tdƒtdƒ|	 |¡}
|
tjkrq’n8|
tjkr$ qRn$|
tjkr6d}n|
tjkrzd}q’n0t | tdƒtd	ƒ|	 tj¡ | tj¡  dS zl|tjkr°t |¡r¢t ||¡ nt ||¡ n4t |¡rÊt ||¡ nt  ||¡ | j!j" #|¡ W q’ t$yN } zN|tjkrtd
ƒ}ntdƒ}t | tdƒtdƒ||t%|ƒf ¡ W Y d}~q’d}~0 0 q’dS )r^   N)NNc                 S   s   g | ]}t | ¡ ƒ‘qS r   )r   ZtoString)r    Zurlr   r   r   r"   	  s   ÿz7ProjectExplorerTreeWidget.dropEvent.<locals>.<listcomp>rR   zProject explorerz>File <b>%s</b> already exists.<br>Do you want to overwrite it?Tz Folder <b>%s</b> already exists.ÚcopyÚmover   z9<b>Unable to %s <i>%s</i></b><br><br>Error message:<br>%s)&rb   Z
dropActionr   Z
MoveActionZ
CopyActionrQ   r_   r`   ZmimeDataZurlsÚlenr
   ZYesZYesToAllZNoZNoToAllZCancelr   r<   ÚbasenameÚexistsÚisfileZwarningÚ_ZcriticalZOkZsetDropActionÚshutilrf   Zcopytreer   Z	move_filerg   Zparent_widgetZremovedÚemitÚEnvironmentErrorr   )r   rc   Úactionrd   Ú
yes_to_allZ	no_to_allZsrc_listZbuttonsÚsrcZ	dst_fnameZanswerÚerrorZ
action_strr   r   r   Ú	dropEventý   s”    
ÿ
ÿÿþ
ÿû
ü
ÿÿýz#ProjectExplorerTreeWidget.dropEventNc                 C   sh   |du r|   ¡ }t|ƒdk}d}|D ]>}|| jjd krD| j ¡  q$|  |||¡}|dur$|s$ qdq$dS )zDelete filesNrR   r   )Zget_selected_filenamesrh   rE   r   Úsig_delete_projectrn   Zdelete_file)r   ÚfnamesZmultiplerq   Úfnamer   r   r   ÚdeleteM  s    z ProjectExplorerTreeWidget.delete)T)N)r?   r@   rA   rB   r   ru   r   r   Úboolr]   re   rt   rx   r   r   r   r   rY   ×   s   

	PrY   )rB   Z
__future__r   r2   Úos.pathr.   r   rm   Zqtpy.QtCorer   r   r   r   Zqtpy.QtWidgetsr   r	   r
   Zspyder.api.translationsr   Zspyder.py3compatr   Zspyder.utilsr   Z(spyder.plugins.explorer.widgets.explorerr   rl   r   rD   rY   r   r   r   r   Ú<module>   s   ][