ó
‹²,]c           @   s}  d  Z  d d l j Z d d l Z d d l m Z d d l 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 m Z m Z m Z m Z 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# d d l$ m% Z% d d l& m' Z' m( Z( m) Z) d e f d „  ƒ  YZ* d e f d „  ƒ  YZ+ d e f d „  ƒ  YZ, d e, f d „  ƒ  YZ- d S(   s   Tabs widgetiÿÿÿÿN(   t   PYQT5(   t
   QByteArrayt   QEventt	   QMimeDatat   QPointt   Qtt   Signalt   Slot(   t   QDrag(   t   QApplicationt   QHBoxLayoutt   QMenut   QTabBart
   QTabWidgett   QWidgett	   QLineEdit(   t   _(   t   config_shortcut(   t   PY2t   to_binary_stringt   to_text_string(   t   icon_manager(   t   get_common_path(   t   add_actionst   create_actiont   create_toolbuttont   EditTabNamePopupc           B   s2   e  Z d  Z d „  Z d „  Z d „  Z d „  Z RS(   s)   Popup on top of the tab to edit its name.c         C   sÔ   | d k	 r | n	 |  j ƒ  |  _ | |  _ | |  _ d |  _ t j |  d d ƒ|  j j	 |  j
 ƒ |  j |  ƒ t r– |  j t j t j Bt j Bƒ n |  j t j t j Bƒ |  j t ƒ |  j d d d d ƒ d S(   s)   Popup on top of the tab to edit its name.t   parenti	   i    N(   t   NoneR   t   maint
   split_chart   split_indext	   tab_indexR   t   __init__t   editingFinishedt   connectt   edit_finishedt   installEventFilterR    t   setWindowFlagsR   t   Popupt   FramelessWindowHintt   NoDropShadowWindowHintt   setFramet   Falset   setTextMargins(   t   selfR   R   R   (    (    s2   lib/python2.7/site-packages/spyder/widgets/tabs.pyR!   '   s     !			c         C   s‰   | j  ƒ  t j k r1 |  j ƒ  j | j ƒ  ƒ s[ | j  ƒ  t j k rv | j ƒ  t j	 k rv |  j
 ƒ  |  j t ƒ t St j |  | | ƒ S(   s2   Catch clicks outside the object and ESC key press.(   t   typeR   t   MouseButtonPresst   geometryt   containst	   globalPost   KeyPresst   keyR   t
   Key_Escapet   hidet   setFocusR+   t   TrueR   t   eventFilter(   R-   t   widgett   event(    (    s2   lib/python2.7/site-packages/spyder/widgets/tabs.pyR9   M   s    
c         C   sí   |  j  t ƒ | |  _ |  j j | ƒ } | j d d d d ƒ |  j | j ƒ  ƒ |  j |  j j	 | j
 ƒ  ƒ ƒ |  j j | ƒ } | j d d ƒ } |  j r¹ | j |  j ƒ |  j } n  |  j | ƒ |  j ƒ  |  j ƒ  sé |  j ƒ  n  d S(   s   Activate the edit tab.i   iþÿÿÿiÿÿÿÿu   &u    N(   R7   R8   R    R   t   tabRectt   adjustt   setFixedSizet   sizet   movet   mapToGlobalt   topLeftt   tabTextt   replaceR   t   splitR   t   setTextt	   selectAllt	   isVisiblet   show(   R-   t   indext   rectt   text(    (    s2   lib/python2.7/site-packages/spyder/widgets/tabs.pyt   edit_tab[   s    		
c         C   sm   |  j  ƒ  t |  j t ƒ ri |  j d k ri t |  j ƒ  ƒ } |  j j |  j | ƒ |  j j j	 | ƒ n  d S(   s   On clean exit, update tab name.i    N(
   R6   t
   isinstanceR    t   intR   RL   R   t
   setTabTextt   sig_change_namet   emit(   R-   t   tab_text(    (    s2   lib/python2.7/site-packages/spyder/widgets/tabs.pyR$   {   s
    
!(   t   __name__t
   __module__t   __doc__R!   R9   RM   R$   (    (    (    s2   lib/python2.7/site-packages/spyder/widgets/tabs.pyR   $   s
   	&		 t   TabBarc           B   sw   e  Z d  Z e e e f e e e f ƒ Z e e ƒ Z e d d d „ Z	 d „  Z
 d „  Z d „  Z d „  Z d „  Z RS(	   s*   Tabs base class with drag and drop supportt    i    c         C   s¢   t  j |  | ƒ | |  _ t j d k r8 |  j d ƒ n  t ƒ  |  _ |  j t	 ƒ |  j
 t	 ƒ |  j t	 ƒ | |  _ |  j r• t |  | | ƒ |  _ n	 d  |  _ d  S(   Nt   darwins
   plugin-tab(   R   R!   t   ancestort   syst   platformt   setObjectNameR   t   _TabBar__drag_start_post   setAcceptDropsR8   t   setUsesScrollButtonst
   setMovablet   rename_tabsR   t   tab_name_editorR   (   R-   R   RZ   Rb   R   R   (    (    s2   lib/python2.7/site-packages/spyder/widgets/tabs.pyR!   Œ   s    				c         C   sA   | j  ƒ  t j k r- t | j ƒ  ƒ |  _ n  t j |  | ƒ d S(   s   Reimplement Qt methodN(   t   buttonR   t
   LeftButtonR   t   posR^   R   t   mousePressEvent(   R-   R;   (    (    s2   lib/python2.7/site-packages/spyder/widgets/tabs.pyRg   ¤   s    c         C   s   t  j |  | ƒ d S(   s   Override Qt methodN(   R   t   mouseMoveEvent(   R-   R;   (    (    s2   lib/python2.7/site-packages/spyder/widgets/tabs.pyRh   ª   s    c         C   so   | j  ƒ  } t | j ƒ  ƒ } d | k r[ t | j d ƒ ƒ t |  j ƒ k r[ | j ƒ  n  t j	 |  | ƒ d S(   s   Override Qt methods	   parent-idN(
   t   mimeDatat   listt   formatsRO   t   datat   idRZ   t   acceptProposedActionR   t   dragEnterEvent(   R-   R;   Ri   Rk   (    (    s2   lib/python2.7/site-packages/spyder/widgets/tabs.pyRo   Å   s    $c         C   s÷   | j  ƒ  } t | j d ƒ ƒ } |  j | j ƒ  ƒ } | d k rQ |  j ƒ  } n  t | j d ƒ ƒ t |  ƒ k r· t | j d ƒ ƒ } |  j t	 t t f j
 | | | ƒ | j ƒ  n, | | k rã |  j j
 | | ƒ | j ƒ  n  t j |  | ƒ d S(   s   Override Qt methods   source-indexiÿÿÿÿs	   tabbar-ids   tabwidget-idN(   Ri   RO   Rl   t   tabAtRf   t   countRm   R   t   sig_move_tabt   strRR   Rn   R   t	   dropEvent(   R-   R;   Ri   t
   index_fromt   index_tot   tabwidget_from(    (    s2   lib/python2.7/site-packages/spyder/widgets/tabs.pyRt   Ð   s    !c         C   sx   |  j  t k rd | j ƒ  t j t j ƒ k rd |  j | j ƒ  ƒ } | d k rt |  j j	 | ƒ qt n t
 j |  | ƒ d S(   s2   Override Qt method to trigger the tab name editor.i    N(   Rb   R8   t   buttonsR   t   MouseButtonsRe   Rp   Rf   Rc   RM   R   t   mouseDoubleClickEvent(   R-   R;   RJ   (    (    s2   lib/python2.7/site-packages/spyder/widgets/tabs.pyRz   æ   s    (   RT   RU   RV   R   RO   Rs   Rr   RQ   R+   R!   Rg   Rh   Ro   Rt   Rz   (    (    (    s2   lib/python2.7/site-packages/spyder/widgets/tabs.pyRW   ‡   s   				t   BaseTabsc           B   s€   e  Z d  Z e e ƒ Z d d d e d „ Z d „  Z	 d „  Z
 e j d „ Z d „  Z d „  Z d „  Z d d	 „ Z d
 „  Z RS(   s.   TabWidget with context menu and corner widgetsc         C   sk  t  j |  | ƒ |  j t ƒ t j d k r< |  j d ƒ n  i  |  _ | |  _ | d  k r… t
 |  ƒ |  _ | rŽ t |  j | ƒ qŽ n	 | |  _ | d  k r£ i  } n  | j t j g  ƒ | j t j g  ƒ t |  d t j d ƒ d t d ƒ ƒ|  _ t
 |  ƒ |  _ |  j j |  j ƒ |  j j |  j j ƒ |  j j j |  j ƒ | t j c |  j g 7<|  j | ƒ d  S(   NRY   s
   plugin-tabt   icont
   browse_tabt   tips   Browse tabs(   R   R!   R`   R8   R[   R\   R]   t   corner_widgetst   menu_use_tooltipsR   R   t   menuR   t
   setdefaultR   t   TopLeftCornert   TopRightCornerR   t   imaR|   R   t   browse_buttont   browse_tabs_menut   setMenut   setPopupModet   InstantPopupt   aboutToShowR#   t   update_browse_tabs_menut   set_corner_widgets(   R-   R   t   actionsR   R   R€   (    (    s2   lib/python2.7/site-packages/spyder/widgets/tabs.pyR!   ø   s0    					c            s•  ˆ  j  j ƒ  g  } g  } x… t ˆ  j ƒ  ƒ D]q } ˆ  j rS t ˆ  j | ƒ ƒ } n t ˆ  j | ƒ ƒ } | j | ƒ t	 j
 | ƒ r, | j t	 j | ƒ ƒ q, q, Wd } t | ƒ t | ƒ k rt | ƒ } | d k rà d } qt | ƒ d } | d k rd } qn  x† t | ƒ D]x \ } } t ˆ  | | d ˆ  j | ƒ d | ‡  f d † d ˆ  j | ƒ ƒ} | j | ˆ  j ƒ  k ƒ ˆ  j  j | ƒ qWd S(   s   Update browse tabs menui   i   R|   t   toggledc            s   ˆ  j  | ƒ S(   N(   t   setCurrentIndex(   t   stateRJ   (   R-   (    s2   lib/python2.7/site-packages/spyder/widgets/tabs.pyt   <lambda>9  s    R~   N(   R‡   t   cleart   rangeRq   R€   R   t
   tabToolTipRC   t   appendt   ospt   isfilet   dirnameR   t   lenR   t	   enumerateR   t   tabIcont
   setCheckedt   currentIndext	   addAction(   R-   t   namest   dirnamesRJ   RL   t   offsett   commont
   tab_action(    (   R-   s2   lib/python2.7/site-packages/spyder/widgets/tabs.pyRŒ     s2    		c         C   s#  t  | t ƒ s t ‚ t d „  | Dƒ ƒ s1 t ‚ |  j j | ƒ xÛ t |  j j ƒ  ƒ D]Ä \ } } t ƒ  } | j	 ƒ  |  j
 | ƒ } | r˜ | j ƒ  n  |  j | | ƒ t ƒ  } | j d d d d ƒ x: | D]2 } t  | t ƒ ró | j | ƒ qÎ | j | ƒ qÎ W| j | ƒ | j ƒ  qW Wd S(   sà   
        Set tabs corner widgets
        corner_widgets: dictionary of (corner, widgets)
        corner: Qt.TopLeftCorner or Qt.TopRightCorner
        widgets: list of widgets (may contains integers to add spacings)
        c         s   s'   |  ] } | t  j t  j f k Vq d  S(   N(   R   Rƒ   R„   (   t   .0R4   (    (    s2   lib/python2.7/site-packages/spyder/widgets/tabs.pys	   <genexpr>G  s   i    N(   RN   t   dictt   AssertionErrort   allR   t   updateRj   t   itemsR   R6   t   cornerWidgett   closet   setCornerWidgetR
   t   setContentsMarginsRO   t
   addSpacingt	   addWidgett	   setLayoutRI   (   R-   R   t   cornert   widgetst   cwidgett   prev_widgett   clayoutR:   (    (    s2   lib/python2.7/site-packages/spyder/widgets/tabs.pyR   ?  s&    	"	
	c         C   s+   |  j  i |  j j | g  ƒ | | 6ƒ d  S(   N(   R   R   t   get(   R-   R³   R²   (    (    s2   lib/python2.7/site-packages/spyder/widgets/tabs.pyt   add_corner_widgets[  s    	c         C   sH   |  j  |  j ƒ  j | j ƒ  ƒ ƒ |  j rD |  j j | j ƒ  ƒ n  d S(   s   Override Qt methodN(   R   t   tabBarRp   Rf   R   t   popupR2   (   R-   R;   (    (    s2   lib/python2.7/site-packages/spyder/widgets/tabs.pyt   contextMenuEvent_  s    "	c         C   sq   | j  ƒ  t j k r] |  j ƒ  j | j ƒ  ƒ } | d k r] |  j j | ƒ | j ƒ  d Sn  t	 j
 |  | ƒ d S(   s   Override Qt methodi    N(   Rd   R   t	   MidButtonR¹   Rp   Rf   t   sig_close_tabRR   t   acceptR   Rg   (   R-   R;   RJ   (    (    s2   lib/python2.7/site-packages/spyder/widgets/tabs.pyRg   e  s    
c         C   s  | j  ƒ  t j @} | j ƒ  } t } | rê |  j ƒ  d k rê |  j ƒ  } | t j k r˜ | d k rx |  j | d ƒ n |  j |  j ƒ  d ƒ t	 } qê | t j
 k rê | |  j ƒ  d k  rÑ |  j | d ƒ n |  j d ƒ t	 } qê n  | st j |  | ƒ n  d S(   s   Override Qt methodi    i   N(   t	   modifiersR   t   ControlModifierR4   R+   Rq   Rž   t
   Key_PageUpR   R8   t   Key_PageDownR   t   keyPressEvent(   R-   R;   t   ctrlR4   t   handledRJ   (    (    s2   lib/python2.7/site-packages/spyder/widgets/tabs.pyRÃ   o  s"    	i   c         C   s‡   | d k r5 |  j  ƒ  |  j ƒ  d k r5 | d } nA | d k  rf |  j  ƒ  d k rf |  j ƒ  | } n |  j  ƒ  | } |  j | ƒ d S(   s   Ctrl+Tabi    i   N(   Rž   Rq   R   (   R-   t   deltaRJ   (    (    s2   lib/python2.7/site-packages/spyder/widgets/tabs.pyt   tab_navigate…  s    (c      	   C   s§   | d k	 } | r% |  j j | ƒ n  y$ t j |  | ƒ |  j j | ƒ WnW t k
 r¢ t |  d | d t j	 d ƒ d t
 d ƒ ƒ} |  j | r˜ | n d ƒ n Xd S(   sA   Setting Tabs close function
        None -> tabs are not closablet	   triggeredR|   t	   filecloseR~   s   Close current tabN(   R   R½   R#   R   t   setTabsClosablet   tabCloseRequestedt   AttributeErrorR   R…   R|   R   R­   (   R-   t   funcR‘   t   close_button(    (    s2   lib/python2.7/site-packages/spyder/widgets/tabs.pyt   set_close_function  s    N(   RT   RU   RV   R   RO   R½   R   R+   R!   RŒ   R   R   R„   R¸   R»   Rg   RÃ   RÇ   RÏ   (    (    (    s2   lib/python2.7/site-packages/spyder/widgets/tabs.pyR{   ô   s   "	$			
	
t   Tabsc           B   sŒ   e  Z d  Z e e e ƒ Z e ƒ  Z e e e e e ƒ Z d d d e
 e
 d d d „ Z e e e ƒ d „  ƒ Z e e e e ƒ d „  ƒ Z RS(   s>   BaseTabs widget with movable tabs and tab navigation shortcutsRX   i    c	   
   	      s  t  j ˆ  | | | | | ƒ t ˆ  | d | d | d | ƒ}	 |	 j j ˆ  j ƒ |	 j t t t f j ˆ  j ƒ ˆ  j	 |	 ƒ t
 ‡  f d †  d d d d d	 | ƒt
 ‡  f d
 †  d d d d d	 | ƒt
 ‡  f d †  d d d d d	 | ƒt
 ‡  f d †  d d d d d	 | ƒd  S(   NRb   R   R   c              s   ˆ  j  d ƒ S(   Ni   (   RÇ   (    (   R-   (    s2   lib/python2.7/site-packages/spyder/widgets/tabs.pyR’   ·  RX   t   contextt   editort   names   go to next fileR   c              s   ˆ  j  d ƒ S(   Niÿÿÿÿ(   RÇ   (    (   R-   (    s2   lib/python2.7/site-packages/spyder/widgets/tabs.pyR’   ¹  RX   s   go to previous filec              s   ˆ  j  j ˆ  j ƒ  ƒ S(   N(   R½   RR   Rž   (    (   R-   (    s2   lib/python2.7/site-packages/spyder/widgets/tabs.pyR’   »  RX   s   close file 1c              s   ˆ  j  j ˆ  j ƒ  ƒ S(   N(   R½   RR   Rž   (    (   R-   (    s2   lib/python2.7/site-packages/spyder/widgets/tabs.pyR’   ½  RX   s   close file 2(   R{   R!   RW   Rr   R#   t   move_tabRs   RO   t   move_tab_from_another_tabwidgett	   setTabBarR   (
   R-   R   RŽ   R   R   R€   Rb   R   R   t   tab_bar(    (   R-   s2   lib/python2.7/site-packages/spyder/widgets/tabs.pyR!   ¨  s$    
	
c         C   s®   |  j  j | | ƒ |  j | ƒ |  j | ƒ } } |  j | ƒ |  j | ƒ } } |  j ƒ  } |  j | ƒ |  j | | | | ƒ |  j	 | | ƒ |  j
 | ƒ |  j j ƒ  d S(   s   Move tab inside a tabwidgetN(   t	   move_dataRR   R•   RC   Rœ   R:   t   currentWidgett	   removeTabt	   insertTabt   setTabToolTipt   setCurrentWidgett   move_tab_finished(   R-   Ru   Rv   R~   RL   R|   R:   t   current_widget(    (    s2   lib/python2.7/site-packages/spyder/widgets/tabs.pyRÔ   À  s    c         C   s)   |  j  j | t t |  ƒ ƒ | | ƒ d S(   s$   Move tab from a tabwidget to anotherN(   Rr   RR   R   Rm   (   R-   Rw   Ru   Rv   (    (    s2   lib/python2.7/site-packages/spyder/widgets/tabs.pyRÕ   Ð  s    	N(   RT   RU   RV   R   RO   RØ   RÞ   Rs   Rr   R   R+   R!   R   RÔ   RÕ   (    (    (    s2   lib/python2.7/site-packages/spyder/widgets/tabs.pyRÐ   ¡  s   	(.   RV   t   os.patht   pathR—   R[   t   qtpyR    t   qtpy.QtCoreR   R   R   R   R   R   R   t
   qtpy.QtGuiR   t   qtpy.QtWidgetsR	   R
   R   R   R   R   R   t   spyder.config.baseR   t   spyder.config.guiR   t   spyder.py3compatR   R   R   t   spyder.utilsR   R…   t   spyder.utils.miscR   t   spyder.utils.qthelpersR   R   R   R   RW   R{   RÐ   (    (    (    s2   lib/python2.7/site-packages/spyder/widgets/tabs.pyt   <module>   s    44cm­