
    Je,,                         d 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  G d	 d
e      Z G d de      Z G d de      Zy)Project Explorer    N)QSortFilterProxyModelQtSignalSlot)QAbstractItemViewQHeaderViewQMessageBox)_)to_text_string)misc)DirViewc                   f     e Zd ZdZg dZdgZ fdZd Zej                  fdZ
d Zd Zd	 Z x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                 j    t         t        |   |       d| _        g | _        | j                  d       y)zInitialize the proxy model.NT)superr   __init__	root_path	path_listsetDynamicSortFilterselfparent	__class__s     Q/usr/lib/python3/dist-packages/spyder/plugins/projects/widgets/projectexplorer.pyr   zProxyModel.__init__2   s.    j$(0!!$'    c                     t        j                  t        |            | _        |D cg c]   }t        j                  t        |            " c}| _        | j                          yc c}w )z
        Setup proxy model filter parameters.

        Parameters
        ----------
        root_path: str
            Root path of the proxy model.
        path_list: list
            List with all the paths.
        N)ospnormpathstrr   r   invalidateFilter)r   r   r   ps       r   setup_filterzProxyModel.setup_filter9   sI     c)n58AB1#,,s1v.B Cs   %A&c                 D    | j                         j                  ||       y)Reimplement Qt method.N)sourceModelsort)r   columnorders      r   r(   zProxyModel.sortH   s    .r   c           
      B   | j                   y| j                         j                  |d|      }t        j                  t        j
                  t        | j                         j                  |                        }t        j                  | j                         j                  |      ry| j                  D cg c]  }t        j                  |       c}D ]  }||k(  s#|j                  |t        j                  z         s+t        | j                  D cg c]$  }|j                  t        j                  |z         & c}      sGt        | j                  D cg c]$  }|j                  t        j                  |z         & c}      r y y y yc c}w c c}w c c}w )r&   Tr   F)r   r'   indexr   normcaser    r!   filePath
startswithr   ossepanyPATHS_TO_SHOWendswithPATHS_TO_HIDE)r   rowparent_indexr,   pathr#   ds          r   filterAcceptsRowzProxyModel.filterAcceptsRowL   sH   >>!  "((a>||CLL  "++E235 6 <<'2248/3~~>!cll1o> 19BFF
 ;)-);); =$% !%bffqj 9  = >)-);); =$% !%bffqj 9  = >#(#'#  ? = =s   :F)F
)F
c                    |t         j                  k(  rb| j                  d   j                  t        j
                        d   }|j                         |k(  r t	        j                  | j                  |      S t        j                  | ||      S )z8Show tooltip with full path only for the root directory.r   )
r   ToolTipRoler   splitr   r1   datajoinr   r   )r   r,   roleroot_dirs       r   r?   zProxyModel.dataf   sh    2>>!~~a(..sww7;Hzz|x'xx99$))$t<<r   c                 ^    | j                         j                  | j                  |            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,   s     r   rD   zProxyModel.typen   s)     !&&t'7'7'>??r   )__name__
__module____qualname____doc__r5   r3   r   r$   r   AscendingOrderr(   r:   r?   rD   __classcell__r   s   @r   r   r      sC    *M" 	M(  "$!2!2 /4=	@r   r   c                   T     e Zd ZdZd fd	Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Z xZS )FilteredDirViewz"Filtered file/directory tree view.c                 `    t         |   |       d| _        | j                          d| _        y)z!Initialize the filtered dir view.N)r   r   
proxymodelsetup_proxy_modelr   r   s     r   r   zFilteredDirView.__init__|   s*      r   c                 n    t        |       | _        | j                  j                  | j                         y)zSetup proxy model.N)r   rP   setSourceModelfsmodelr   s    r   rQ   z!FilteredDirView.setup_proxy_model   s$    $T*&&t||4r   c                 T    | j                   | j                  | j                         yy)zInstall proxy model.N)r   setModelrP   rU   s    r   install_modelzFilteredDirView.install_model   s!    >>%MM$//* &r   c                    || _         | j                          | j                  j                  |      }| j                  j                  | j                   g        | j                  | j                  j                  |             y)z~
        Set root path.

        Parameters
        ----------
        root_path: str
            New path directory.
        N)r   rX   rT   setRootPathrP   r$   setRootIndexmapFromSource)r   r   r,   s      r   set_root_pathzFilteredDirView.set_root_path   s`     #((3$$T^^R8$//77>?r   c                     | j                   j                  |      }|j                         r8|j                         | j                   u r| j                  j                  |      S yy)z
        Return index associated with filename.

        Parameters
        ----------
        filename: str
            String with the filename.
        N)rT   r,   isValidmodelrP   r\   )r   filenamer,   s      r   	get_indexzFilteredDirView.get_index   sN     ""8,==?u{{}<??0077  =?r   c                     | j                   J |D cg c]"  }t        j                  | j                   |      $ }}| j                  j	                  | j                   |       yc c}w )z
        Set folder names

        Parameters
        ----------
        folder_names: list
            List with the folder names.
        N)r   r   r@   rP   r$   )r   folder_namesdirnamer   s       r   set_folder_namesz FilteredDirView.set_folder_names   s]     ~~)))$02  XXdnng6 2	 2$$T^^Y?2s   'A#c                     |rR| j                   j                  | j                  j                  |            }t	        j
                  t        |            S y)z
        Return filename from index

        Parameters
        ----------
        index: int
            Index of the list of filenames
        N)rT   r.   rP   rE   r   r    r!   )r   r,   r8   s      r   get_filenamezFilteredDirView.get_filename   sB     <<(()D)DU)KLD<<D	** r   c                 V    dD ]  }| j                  |        | j                  d       y)zSetup view for projects.)         TN)
hideColumnsetHeaderHidden)r   is     r   setup_project_viewz"FilteredDirView.setup_project_view   s+     	AOOA	T"r   c                     |rY|j                         rH| j                  d      r| j                  |       }n| j                  |      }| j                  ||       y y y )Nsingle_click_to_open)r_   get_conf
isExpandedsetExpanded)r   re   r,   states       r   directory_clickedz!FilteredDirView.directory_clicked   sP    U]]_}}34 OOE22.UE* %5r   N)rF   rG   rH   rI   r   rQ   rX   r]   rb   rf   rh   rp   rw   rK   rL   s   @r   rN   rN   z   s5    ,5
+
@8@+#+r   rN   c                   j    e Zd ZdZ e       ZddZ ee      d        Z	d Z
d Z e       d	d       Zy)
ProjectExplorerTreeWidgetzExplorer tree widgetc                     t         j                  | |       d | _        | j                  t         j                         || _        | j                  d       | j                  t         j                         y )NT)	rN   r   last_foldersetSelectionModeExtendedSelectionshow_hscrollbarsetDragEnabledsetDragDropModeDragDrop)r   r   r   s      r   r   z"ProjectExplorerTreeWidget.__init__   sZ      v.o??@. 	D!_556r   c                 *   | j                  d|       || _        | j                         j                  |        | j                         j	                  t
        j                         | j                         j                  t        j                         y)zToggle horizontal scrollbarr   N)
set_confr   headersetStretchLastSectionsetHorizontalScrollModer   ScrollPerPixelsetSectionResizeModer	   ResizeToContents)r   checkeds     r   toggle_hscrollbarz+ProjectExplorerTreeWidget.toggle_hscrollbar   sf     	'1&++K8--.?.N.NO**;+G+GHr   c                     | j                  |j                               }|rH| j                  |      }t        j                  |      r|j                          y|j                          y|j                          y)Reimplement Qt methodN)indexAtposrh   r   isdiracceptProposedActionignore)r   eventr,   dsts       r   dragMoveEventz'ProjectExplorerTreeWidget.dragMoveEvent   sR    UYY[)##E*Cyy~**,LLNr   c                    |j                          |j                         }|t        j                  t        j                  fvry| j                  | j                  |j                                     }d\  }}|j                         j                         D cg c]  }t        |j                                }}t        |      dkD  rUt        j                  t        j                  z  t        j                   z  t        j"                  z  t        j$                  z  }n!t        j                  t        j                   z  }|D ]  }	|	|k(  r
t'        j(                  |t'        j*                  |	            }
t'        j,                  |
      r|||rOt'        j.                  |
      rt        j0                  | t3        d      t3        d      |
z  |      }|t        j                   k(  r|t        j$                  k(  r y|t        j                  k(  rd}nr|t        j"                  k(  r_d}t        j4                  | t3        d      t3        d      |
z  t        j6                         |j9                  t        j                          y	 |t        j                  k(  rCt'        j.                  |	      rt;        j<                  |	|       n~t;        j>                  |	|       ngt'        j.                  |	      rtA        jB                  |	|       nt;        jD                  |	|       | jF                  jH                  jK                  |	        yc c}w # tL        $ rm}|t        j                  k(  rt3        d      }nt3        d	      }t        j4                  | t3        d
      t3        d      ||	tO        |      fz         Y d}~zd}~ww xY w)r   N)NNrj   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)(r   
dropActionr   
MoveAction
CopyActionrh   r   r   mimeDataurlsr   toStringlenr
   YesYesToAllNoNoToAllCancelr   r@   basenameexistsisfilewarningr   criticalOksetDropActionshutilr   copytreer   	move_filer   parent_widgetremovedemitEnvironmentErrorr!   )r   r   actionr   
yes_to_all	no_to_allurlsrc_listbuttonssrc	dst_fnameanswererror
action_strs                 r   	dropEventz#ProjectExplorerTreeWidget.dropEvent   s   !!#"--77
 UYY[ 9: *
I$~~/4468 #3<<>2 8 8x=1")=)=="~~&(3(;(;<"))*G "oo6G :	Cczcll3&78Izz)$)Y-B  ZZ	*(00,- 9 :<EFF / ;#5#55;#7#77%)
;#6#66$(	 ((,-<=	I#	 ''6R]]*zz#C-S1zz#sC0C-&&..33C8]:	8n $ R]]*!"6J!"6J$$() 5 69CS9<U9EE s     MB=M	N>A"N99N>Nc                     || j                         }t        |      dkD  }d}|D ]S  }|| j                  j                  d   k(  r| j                  j                          :| j                  |||      }|P|rS y y)zDelete filesNrj   r   )get_selected_filenamesr   rP   r   sig_delete_projectr   delete_file)r   fnamesmultipler   fnames        r   deletez ProjectExplorerTreeWidget.deleteK  s     >002Fv;?
 	E11!44'',,.!--eXzJ
)*	r   )Trx   )rF   rG   rH   rI   r   r   r   r   boolr   r   r   r    r   r   rz   rz      sN    7 
$ZI I
N` 
V r   rz   )rI   r0   os.pathr8   r   r   qtpy.QtCorer   r   r   r   qtpy.QtWidgetsr   r	   r
   spyder.api.translationsr   spyder.py3compatr   spyder.utilsr   (spyder.plugins.explorer.widgets.explorerr   r   rN   rz   r   r   r   <module>r      sa    
 
   @ ? F F & +  <\@& \@~X+g X+vD Dr   