
    JeH                        d Z ddlm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mZ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 dd
lmZ ddlmZmZm Z  ddl!m"Z"  G d de      Z# G d de      Z$ G d de      Z% G d de%      Z&y)zTabs widget    N)PYQT5)QEventQPointQtSignalSlot)QHBoxLayoutQMenuQTabBar
QTabWidgetQWidget	QLineEdit)_)CONF)to_text_string)ima)get_common_path)add_actionscreate_actioncreate_toolbutton)PANES_TABBAR_STYLESHEETc                   (    e Zd ZdZd Zd Zd Zd Zy)EditTabNamePopup)Popup on top of the tab to edit its name.c                 4   ||n| j                         | _        || _        || _        d| _        t        j                  | |       | j                  j                  | j                         | j                  |        t        rB| j                  t        j                  t        j                  z  t        j                   z         n0| j                  t        j                  t        j                  z         | j#                  d       | j%                  dddd       y)r   N)parentF	   r   )r   main
split_charsplit_index	tab_indexr   __init__editingFinishedconnectedit_finishedinstallEventFilterr   setWindowFlagsr   PopupFramelessWindowHintNoDropShadowWindowHintsetFramesetTextMargins)selfr   r   r    s       5/usr/lib/python3/dist-packages/spyder/widgets/tabs.pyr"   zEditTabNamePopup.__init__%   s    
 %0Fdkkm	$&  	4/ 	$$T%7%78 	% &&'))* &&' 	e 	Aq!Q'    c                 r   |j                         t        j                  k(  r-| j                         j	                  |j                               rB|j                         t        j                  k(  r2|j                         t        j                  k(  r| j                          yt        j                  | ||      S )z2Catch clicks outside the object and ESC key press.T)typer   MouseButtonPressgeometrycontains	globalPosKeyPresskeyr   
Key_Escapehider   eventFilter)r-   widgetevents      r.   r:   zEditTabNamePopup.eventFilterK   sx    ZZ\V444]]_--eoo.?@0-IIK $$T6599r/   c                    | j                          || _        | j                  j                  |      }|j	                  dddd       | j                  |j                                | j                  | j                  j                  |j                                      | j                  j                  |      }|j                  dd      }| j                  r(|j                  | j                        | j                     }| j                  |       | j!                          | j#                         s| j%                          yy)zActivate the edit tab.   & N)setFocusr!   r   tabRectadjustsetFixedSizesizemovemapToGlobaltopLefttabTextreplacer   splitr    setText	selectAll	isVisibleshow)r-   indexrecttexts       r.   edit_tabzEditTabNamePopup.edit_tabX   s     	  yy  'Aq"b! 	$))+& 			$))''78 yy  '||D#&??::doo.t/?/?@DT~~IIK  r/   c                 B   | j                          t        | j                  t              ru| j                  dk\  ret	        | j                               }| j                  j                  | j                  |       | j                  j                  j                  |       yyy)zOn clean exit, update tab name.r   N)
r9   
isinstancer!   intr   rT   r   
setTabTextsig_name_changedemit)r-   tab_texts     r.   r%   zEditTabNamePopup.edit_finishedx   so     			dnnc*t~~/B%diik2HII  :II&&++H5	 0C*r/   N)__name__
__module____qualname____doc__r"   r:   rU   r%    r/   r.   r   r   "   s    3$(L:@	6r/   r   c                   f    e Zd ZdZ eeefeeef      Z ee      Z	 	 d	dZ	d Z
d Zd Zd Zd Zy)
TabBarz*Tabs base class with drag and drop supportc                 >   t        j                  | |       || _        | j                  d       t	               | _        | j                  d       | j                  d       | j                  d       || _	        | j                  rt        | ||      | _        y d | _        y )Npane-tabbarT)r   r"   ancestorsetObjectNamer   _TabBar__drag_start_possetAcceptDropssetUsesScrollButtons
setMovablerename_tabsr   tab_name_editor)r-   r   rf   rl   r   r    s         r.   r"   zTabBar.__init__   s    v& =) !'D!!!$' '#3D*4?$AD  $(D r/   c                     |j                         t        j                  k(  rt        |j	                               | _        t        j                  | |       y)zReimplement Qt methodN)buttonr   
LeftButtonr   posrh   r   mousePressEventr-   r<   s     r.   rr   zTabBar.mousePressEvent   s7    <<>R]]*$*599;$7D!e,r/   c                 0    t        j                  | |       yOverride Qt methodN)r   mouseMoveEventrs   s     r.   rw   zTabBar.mouseMoveEvent   s    2 	tU+r/   c                 
   |j                         }t        |j                               }d|v r@t        |j	                  d            t        | j                        k(  r|j                          t        j                  | |       y)rv   z	parent-idN)
mimeDatalistformatsrX   dataidrf   acceptProposedActionr   dragEnterEvent)r-   r<   ry   r{   s       r.   r   zTabBar.dragEnterEvent   sd    >>#x'')*'!
hmmK(
)R->
>&&(tU+r/   c                 N   |j                         }t        |j                  d            }| j                  |j	                               }|dk(  r| j                         }t        |j                  d            t        |       k7  rZt        |j                  d            }| j                  t        t        t        f   j                  |||       |j                          n1||k7  r,| j                  j                  ||       |j                          t        j                  | |       y)rv   zsource-indexr@   z	tabbar-idztabwidget-idN)ry   rX   r|   tabAtrq   countr}   r   sig_move_tabstrr[   r~   r   	dropEvent)r-   r<   ry   
index_fromindex_totabwidget_froms         r.   r   zTabBar.dropEvent   s    >>#~67
::eiik*r>zz|Hx}}[)*bh6+HMM.,IJN sCo.33NJ4<>&&(8#"":x8&&($&r/   c                 6   | j                   du ru|j                         t        j                  t        j                        k(  rA| j                  |j                               }|dk\  r| j                  j                  |       yyt        j                  | |       y)z2Override Qt method to trigger the tab name editor.Tr   N)rl   buttonsr   MouseButtonsrp   r   rq   rm   rU   r   mouseDoubleClickEventr-   r<   rR   s      r.   r   zTabBar.mouseDoubleClickEvent   sq    t#2??2==#AAJJuyy{+Ez$$--e4 
 ))$6r/   N)FrB   r   )r]   r^   r_   r`   r   rX   r   r   rZ   r"   rr   rw   r   r   r   ra   r/   r.   rc   rc      sI    43*sCo6Lc{GI(*-,6	,',7r/   rc   c                   |    e Zd ZdZ ee      Z	 	 ddZd Zd Z	e
j                  fdZd Zd Zd	 Zd
 ZddZd Zy)BaseTabsz.TabWidget with context menu and corner widgetsNc                    t        j                  | |       | j                  d       | j                  t        j
                         | j                         j                  d       i | _        || _	        |)t        |       | _        |rt        | j                  |       n|| _        | j                  t        t                     |i }|j!                  t        j"                  g        |j!                  t        j$                  g        t'        | t)        j*                  d      t-        d            | _        | j.                  j                  t        t                     t        |       | _        | j0                  j                  d       | j.                  j3                  | j0                         | j.                  j5                  | j.                  j6                         | j0                  j8                  j;                  | j<                         |t        j"                  xx   | j.                  gz  cc<   | j?                  |       y )NTre   
browse_tabzBrowse tabs)icontipzcheckbox-padding) r   r"   rj   setElideModer   	ElideNonetabBarrg   corner_widgetsmenu_use_tooltipsr
   menur   setStyleSheetr   r   
setdefaultTopLeftCornerTopRightCornerr   r   r   r   browse_buttonbrowse_tabs_menusetMenusetPopupModeInstantPopupaboutToShowr$   update_browse_tabs_menuset_corner_widgets)r-   r   actionsr   r   r   s         r.   r"   zBaseTabs.__init__   s   D&)!!$' 	",,'##M2 !2<dDIDIIw/DI3678 !N!!""2"2B7!!""3"3R8.sxx-1]3CE((-D)EF %d++,>?""4#8#89''(:(:(G(GH))11$2N2NOr''(T-?-?,@@(/r/   c           
           j                   j                          g }g }t         j                               D ]  } j                  rt         j                  |            }nt         j                  |            }|j                  |       t        j                  |      sk|j                  t        j                  |              d}t        |      t        |      k(  r%t        |      }|d}nt        |      dz   }|dk  rd}t        |      D ]x  \  }}t         ||d  j!                  |      |f fd	 j                  |            }|j#                  | j%                         k(          j                   j'                  |       z y)zUpdate browse tabs menuNr>      c                 &    j                  |      S N)setCurrentIndex)staterR   r-   s     r.   <lambda>z2BaseTabs.update_browse_tabs_menu.<locals>.<lambda>8  s    /3/C/CE/J r/   )r   toggledr   )r   clearranger   r   r   
tabToolTiprK   appendospisfiledirnamelenr   	enumerater   tabIcon
setCheckedcurrentIndex	addAction)r-   namesdirnamesrR   rT   offsetcommon
tab_actions   `       r.   r   z BaseTabs.update_browse_tabs_menu  s[   ##%4::<( 	3E%%%dooe&<=%dll5&9:LLzz$D 12	3  u:X&$X.F~VQQ;!F$U+ 	8KE4&tT&'],0LL,?CH 0K+/??5+A	CJ
 !!%4+<+<+>">?!!++J7	8r/   c                    t        |t              sJ t        d |D              sJ | j                  j	                  |       t        | j                  j                               D ]  \  }}t               }|j                          |j                  d       |j                  d       | j                  |      }|r|j                          | j                  ||       t               }|j                  dddd       |D ]5  }t        |t               r|j#                  |       %|j%                  |       7 |j'                  |       |j)                           y)z
        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              3   `   K   | ]&  }|t         j                  t         j                  fv  ( y wr   )r   r   r   ).0r7   s     r.   	<genexpr>z.BaseTabs.set_corner_widgets.<locals>.<genexpr>F  s.      . 2++R->->?? .s   ,.zcorner-widgetz,QWidget#corner-widget {border-radius: '0px'}r   N)rW   dictallr   updaterz   itemsr   r9   rg   r   cornerWidgetclosesetCornerWidgetr	   setContentsMarginsrX   
addSpacing	addWidget	setLayoutrQ   )r-   r   cornerwidgetscwidgetprev_widgetclayoutr;   s           r.   r   zBaseTabs.set_corner_widgets>  s:    .$/// .,. . 	. ."">2#D$7$7$=$=$?@ 	OFGiGLLN !!/2!!>@ ++F3K!!#  &1!mG&&q!Q2! .fc*&&v.%%f-	.
 g&LLN-	r/   c                 d    | j                  || j                  j                  |g       |z   i       y r   )r   r   get)r-   r   r   s      r.   add_corner_widgetszBaseTabs.add_corner_widgetsa  s4    !%!4!4!8!8!DW!L!N 	Or/   c                     | j                         }|j                  |j                               }|j                  |      S )z`
        Add offset to position event to capture the mouse cursor
        inside a tab.
        )r   mapFromGlobalr5   r   )r-   r<   tbpoints       r.   get_offset_poszBaseTabs.get_offset_pose  s4     [[]  !23xxr/   c                     | j                  |      }| j                  |       | j                  r*| j                  j                  |j	                                yyru   )r   r   r   popupr5   r   s      r.   contextMenuEventzBaseTabs.contextMenuEventp  sC    ##E*U#99IIOOEOO-. r/   c                     |j                         t        j                  k(  rB| j                  |      }|dk\  r,| j                  j                  |       |j                          yt        j                  | |       y)rv   r   N)	ro   r   	MidButtonr   sig_close_tabr[   acceptr   rr   r   s      r.   rr   zBaseTabs.mousePressEventw  s[    <<>R\\)''.Ez""''.""4/r/   c                 x   |j                         t        j                  z  }|j                         }d}|r| j	                         dkD  r| j                         }|t        j                  k(  s|t        j                  k(  r?|dkD  r| j                  |dz
         n"| j                  | j	                         dz
         d}nd|t        j                  k(  s|t        j                  k(  r>|| j	                         dz
  k  r| j                  |dz          n| j                  d       d}|st        j                  | |       yy)rv   Fr   r>   TN)	modifiersr   ControlModifierr7   r   r   
Key_PageUpKey_8r   Key_PageDownKey_9r   keyPressEvent)r-   r<   ctrlr7   handledrR   s         r.   r   zBaseTabs.keyPressEvent  s     2#5#55iikDJJL1$%%'Ebmm#sbhh19((3(()9:'3"((?4::<!++((3((+$$T51 r/   c                    |dkD  r*| j                         | j                         dz
  k(  r|dz
  }n?|dk  r'| j                         dk(  r| j                         |z   }n| j                         |z   }| j                  |       y)zCtrl+Tabr   r>   N)r   r   r   )r-   deltarR   s      r.   tab_navigatezBaseTabs.tab_navigate  st    19**,

Q>!GEQY4,,.!3JJL&E%%'-EU#r/   c           	      H   |du}|r| j                   j                  |       	 t        j                  | |       | j                  j                  |       y# t
        $ rC t        | |t        j                  d      t        d            }| j                  |r|nd       Y yw xY w)zASetting Tabs close function
        None -> tabs are not closableN	fileclosezClose current tab)	triggeredr   r   )r   r$   r   setTabsClosabletabCloseRequestedAttributeErrorr   r   r   r   r   )r-   funcr   close_buttons       r.   set_close_functionzBaseTabs.set_close_function  s     D &&t,		B&&tU3""**40 	B,TT25((;2G123F1GIL   DA	Bs   1A A	B! B!)NNNF)r>   )r]   r^   r_   r`   r   rX   r   r"   r   r   r   r   r   r   r   rr   r   r   r   ra   r/   r.   r   r      sV    83KM268=&0P"8H!F 241B1B O	/02,$Br/   r   c                       e Zd ZdZ eee      Z e       Z eeeee      Z		 	 	 	 ddZ
 eee      d        Z eeee      d        Zy)Tabsz?BaseTabs widget with movable tabs and tab navigation shortcuts.Nc	                     t         j                   |||||       t         ||||      }	|	j                  j	                   j
                         |	j                  t        t        t        f   j	                   j                          j                  |	       t        j                   fddd|       t        j                   fddd|       t        j                   fddd	|       t        j                   fd
dd|       y )N)rl   r   r    c                  &     j                  d      S )Nr>   r   r-   s   r.   r   zTabs.__init__.<locals>.<lambda>  s    D%%a( r/   editorzgo to next file)contextnamer   c                  &     j                  d      S )Nr@   r   r   s   r.   r   zTabs.__init__.<locals>.<lambda>  s    D%%b) r/   zgo to previous filec                  V     j                   j                   j                               S r   r   r[   r   r   s   r.   r   zTabs.__init__.<locals>.<lambda>  !    D&&++D,=,=,?@ r/   zclose file 1c                  V     j                   j                   j                               S r   r  r   s   r.   r   zTabs.__init__.<locals>.<lambda>  r  r/   zclose file 2)r   r"   rc   r   r$   move_tabr   rX   move_tab_from_another_tabwidget	setTabBarr   config_shortcut)
r-   r   r   r   r   r   rl   r   r    tab_bars
   `         r.   r"   zTabs.__init__  s     	$(*;	=v%0$.%02 	$$T]]3c3_-55*.*N*N	Pw("		 	)&		 	@		 	@		r/   c                    | j                   j                  ||       | j                  |      | j                  |      }}| j	                  |      | j                  |      }}| j                         }| j                  |       | j                  ||||       | j                  ||       | j                  |       | j                  j                          y)zMove tab inside a tabwidgetN)	move_datar[   r   rK   r   r;   currentWidget	removeTab	insertTabsetTabToolTipsetCurrentWidgetmove_tab_finished)r-   r   r   r   rT   r   r;   current_widgets           r.   r  zTabs.move_tab  s     	J1OOJ/j1IT||J/Z1Hf++-z"xt48S)n-##%r/   c                 d    | j                   j                  |t        t        |             ||       y)z$Move tab from a tabwidget to anotherN)r   r[   r   r}   )r-   r   r   r   s       r.   r	  z$Tabs.move_tab_from_another_tabwidget  s*     	~~bh/G)8	5r/   )NNNFFrB   r   )r]   r^   r_   r`   r   rX   r  r  r   r   r"   r   r  r	  ra   r/   r.   r   r     sr    IsC I#sC-L268=/1%N 
#s^& & 
#sC	5 	5r/   r   )'r`   os.pathpathr   qtpyr   qtpy.QtCorer   r   r   r   r   qtpy.QtWidgetsr	   r
   r   r   r   r   spyder.config.baser   spyder.config.managerr   spyder.py3compatr   spyder.utils.icon_managerr   spyder.utils.miscr   spyder.utils.qthelpersr   r   r   spyder.utils.stylesheetr   r   rc   r   r   ra   r/   r.   <module>r#     s       8 8< < ! & + ) -7 7 ;_6y _6Dg7W g7TBBz BBJH58 H5r/   