
    G@dH                     *   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&dS )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dS )EditTabNamePopup)Popup on top of the tab to edit its name.c                 2   ||n|                                  | _        || _        || _        d| _        t          j        | |           | j                            | j	                   | 
                    |            t          r:|                     t          j        t          j        z  t          j        z             n,|                     t          j        t          j        z             |                     d           |                     dddd           dS )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       3lib/python3.11/site-packages/spyder/widgets/tabs.pyr"   zEditTabNamePopup.__init__%   s    
 %0FFdkkmm	$&  	4//// 	$$T%7888 	%%%  
	&')*    &'   	e 	Aq!Q'''''    c                    |                                 t          j        k    r9|                                                     |                                          rD|                                 t          j        k    r8|                                t          j	        k    r| 
                                 dS 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   s    ZZ\\V444]]__--eoo.?.?@@ 500--IIKKK4 $T65999r/   c                    |                                   || _        | j                            |          }|                    dddd           |                     |                                           |                     | j                            |	                                                     | j        
                    |          }|                    dd          }| j        r%|                    | j                  | j                 }|                     |           |                                  |                                 s|                                  dS dS )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   s2    	  y  ''Aq"b!!! 	$))++&&& 			$)''77888 y  ''||D#&&? 	A::do..t/?@DT~~ 	IIKKKKK	 	r/   c                 @   |                                   t          | j        t                    rm| j        dk    rdt	          |                                           }| j                            | j        |           | j        j        	                    |           dS dS dS )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   s     			dnc** 	6t~/B/B%diikk22HI  :::I&++H55555		6 	6/B/Br/   N)__name__
__module____qualname____doc__r"   r:   rU   r%    r/   r.   r   r   "   sX        33$( $( $(L: : :  @	6 	6 	6 	6 	6r/   r   c                   t    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dS )TabBarz*Tabs base class with drag and drop supportFrB   r   c                 f   t          j        | |           || _        |                     d           t	                      | _        |                     d           |                     d           |                     d           || _	        | j	        rt          | ||          | _        d S d | _        d S )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 $AD    $(D   r/   c                     |                                 t          j        k    r&t          |                                          | _        t          j        | |           dS )zReimplement Qt methodN)buttonr   
LeftButtonr   posrh   r   mousePressEventr-   r<   s     r.   rr   zTabBar.mousePressEvent   sH    <<>>R]**$*599;;$7$7D!e,,,,,r/   c                 0    t          j        | |           dS Override Qt methodN)r   mouseMoveEventrs   s     r.   rw   zTabBar.mouseMoveEvent   s    2 	tU+++++r/   c                 :   |                                 }t          |                                          }d|v rLt          |                    d                    t          | j                  k    r|                                 t          j	        | |           dS )rv   z	parent-idN)
mimeDatalistformatsrX   dataidrf   acceptProposedActionr   dragEnterEvent)r-   r<   ry   r{   s       r.   r   zTabBar.dragEnterEvent   s    >>##x''))**'!!
hmmK((
)
)R->->
>
>&&(((tU+++++r/   c                    |                                 }t          |                    d                    }|                     |                                          }|dk    r|                                 }t          |                    d                    t          |           k    rkt          |                    d                    }| j        t          t          t          f         
                    |||           |                                 n5||k    r/| j        
                    ||           |                                 t          j        | |           dS )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677
::eiikk**r>>zz||Hx}}[))**bhh66+HMM.,I,IJJN sCo.33NJ4<> > >&&((((8##"":x888&&((($&&&&&r/   c                 @   | j         du r|                                t          j        t          j                  k    rK|                     |                                          }|dk    r| j                            |           dS dS t          j
        | |           dS )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   s    t##2?2=#A#AAAJJuyy{{++Ezz$--e44444 z
 )$66666r/   N)FrB   r   )r]   r^   r_   r`   r   rX   r   r   rZ   r"   rr   rw   r   r   r   ra   r/   r.   rc   rc      s        4463*sCo66Lvc{{GI( ( ( (*- - -, , ,6	, 	, 	,' ' ',7 7 7 7 7r/   rc   c                   z    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dS )BaseTabsz.TabWidget with context menu and corner widgetsNFc                    t          j        | |           |                     d           |                     t          j                   |                                                     d           i | _        || _	        |,t          |           | _        |rt          | j        |           n|| _        |                     t          t                               |i }|                    t          j        g            |                    t          j        g            t'          | t)          j        d          t-          d                    | _        | j                            t          t                               t          |           | _        | j                            d           | j                            | j                   | j                            | j        j                   | j        j                            | j                   |t          j        xx         | j        gz  cc<   |                     |           d S )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2 !2<dDI 0DIw///DI3677888 !N!!""2B777!!""3R888.sx--1]3C3CE E E((-D)E)EFFF %d++,>???""4#8999''(:(GHHH)11$2NOOOr'(((T-?,@@(((/////r/   c           
           j                                          g }g }t                                                     D ]} j        r#t                               |                    }n"t                               |                    }|                    |           t          j
        |          r'|                    t          j        |                     d}t          |          t          |          k    r.t          |          }|d}nt          |          dz   }|dk    rd}t          |          D ]\  }}t           ||d                              |          |f fd	                     |                    }|                    |                                 k                j                             |           dS )zUpdate browse tabs menuNr>      c                 .                         |          S N)setCurrentIndex)staterR   r-   s     r.   <lambda>z2BaseTabs.update_browse_tabs_menu.<locals>.<lambda>8  s    /3/C/CE/J/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::<<(( 	3 	3E% ;%dooe&<&<==%dll5&9&9::LLz$ 3D 1 1222 u::X&&$X..F~VQQ;;!F$U++ 	8 	8KE4&tT&''],0LL,?,?CH 0K 0K 0K 0K 0K+/??5+A+A	C C CJ
 !!%4+<+<+>+>">???!++J7777	8 	8r/   c                 <   t          |t                    sJ t          d |D                       sJ | j                            |           t          | j                                                  D ]'\  }}t                      }|                                 |	                    d           |
                    d           |                     |          }|r|                                 |                     ||           t                      }|                    dddd           |D ]B}t          |t                     r|                    |           -|                    |           C|                    |           |                                 )dS )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   J   K   | ]}|t           j        t           j        fv V  d S r   )r   r   r   ).0r7   s     r.   	<genexpr>z.BaseTabs.set_corner_widgets.<locals>.<genexpr>F  sF       . . 2+R->?? . . . . . .r/   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22#D$7$=$=$?$?@@ 	 	OFGiiGLLNNN !!/222!!>@ @ @ ++F33K $!!###  &111!mmG&&q!Q222! . .fc** .&&v....%%f----g&&&LLNNNN-	 	r/   c                 l    |                      || j                            |g           |z   i           d S r   )r   r   get)r-   r   r   s      r.   add_corner_widgetszBaseTabs.add_corner_widgetsa  sL    !%!4!8!8!D!DW!L!N 	O 	O 	O 	O 	Or/   c                     |                                  }|                    |                                          }|                    |          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  s>     [[]]  !2!233xxr/   c                     |                      |          }|                     |           | j        r.| j                            |                                           dS dS ru   )r   r   r   popupr5   r   s      r.   contextMenuEventzBaseTabs.contextMenuEventp  sa    ##E**U###9 	/IOOEOO--.....	/ 	/r/   c                 
   |                                 t          j        k    rK|                     |          }|dk    r0| j                            |           |                                 dS t          j        | |           dS )rv   r   N)	ro   r   	MidButtonr   sig_close_tabr[   acceptr   rr   r   s      r.   rr   zBaseTabs.mousePressEventw  su    <<>>R\))''..Ezz"''..."4/////r/   c                 p   |                                 t          j        z  }|                                }d}|r|                                 dk    r|                                 }|t          j        k    rL|dk    r|                     |dz
             n*|                     |                                 dz
             d}n[|t          j        k    rK||                                 dz
  k     r|                     |dz              n|                     d           d}|st          j
        | |           dS dS )rv   Fr   r>   TN)	modifiersr   ControlModifierr7   r   r   
Key_PageUpr   Key_PageDownr   keyPressEvent)r-   r<   ctrlr7   handledrR   s         r.   r   zBaseTabs.keyPressEvent  s3     2#55iikk 	DJJLL1$$%%''Ebm##199((3333(()9:::''4::<<!+++((3333((+++ 	2$T511111	2 	2r/   r>   c                 <   |dk    r3|                                  |                                 dz
  k    r|dz
  }nM|dk     r0|                                  dk    r|                                 |z   }n|                                  |z   }|                     |           dS )zCtrl+Tabr   r>   N)r   r   r   )r-   deltarR   s      r.   tab_navigatezBaseTabs.tab_navigate  s    199**,,

Q>>!GEEQYY4,,..!33JJLL&EE%%''-EU#####r/   c           	      ^   |du}|r| j                             |           	 t          j        | |           | j                            |           dS # t
          $ rO t          | |t          j        d          t          d                    }| 
                    |r|nd           Y dS 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33"**400000 	B 	B 	B,TT25(;2G2G123F1G1GI I IL   !@DAAAAAA	Bs   /A 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      s        88F3KKM268=&0 &0 &0 &0P"8 "8 "8H! ! !F 241B O O O O	 	 	/ / /0 0 02 2 2,$ $ $ $B B B B 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dS )
Tabsz?BaseTabs widget with movable tabs and tab navigation shortcuts.NFrB   r   c	                     t                                |||||           t           ||||          }	|	j                             j                   |	j        t          t          t          f                              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|           d S )N)rl   r   r    c                  .                          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                  .                          d          S )Nr@   r   r   s   r.   r   zTabs.__init__.<locals>.<lambda>  s    D%%b)) r/   zgo to previous filec                  \     j                                                                        S r   r   r[   r   r   s   r.   r   zTabs.__init__.<locals>.<lambda>  $    D&++D,=,=,?,?@@ r/   zclose file 1c                  \     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__  st    	$(*;	= 	= 	=v%0$.%02 2 2 	$$T]333c3_-55*.*N	P 	P 	Pw(((("		 	 	 	 	))))&		 	 	 	 	@@@@		 	 	 	 	@@@@		 	 	 	 	 	r/   c                    | j                             ||           |                     |          |                     |          }}|                     |          |                     |          }}|                                 }|                     |           |                     ||||           | 	                    ||           | 
                    |           | j                                         dS )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11OOJ//j1I1IT||J//Z1H1Hf++--z"""xt4448S)))n---##%%%%%r/   c                 t    | j                             |t          t          |                     ||           dS )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hh/G/G)8	5 	5 	5 	5 	5r/   )NNNFFrB   r   )r]   r^   r_   r`   r   rX   r  r  r   r   r"   r   r  r  ra   r/   r.   r   r     s        IIsC  I6#sC--L268=/1% % % %N 
T#s^^& & ^& 
T#sC	5 	5 	5 	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 8 8 8 8 8 8 8 8 8 8 8 8< < < < < < < < < < < < < < < < !           & & & & & & + + + + + + ) ) ) ) ) ) - - - - - -7 7 7 7 7 7 7 7 7 7 ; ; ; ; ; ;_6 _6 _6 _6 _6y _6 _6 _6Dg7 g7 g7 g7 g7W g7 g7 g7TBB BB BB BB BBz BB BB BBJH5 H5 H5 H5 H58 H5 H5 H5 H5 H5r/   