
    G@d.                        d Z ddlmZ ddlZddlZddlmZmZmZm	Z	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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!m"Z" eeef         Z#ee#ee$         ee$         ee$         f         Z% G d d          Z& G d de          Z' G d de          Z( G d de          Z) G d de)          Z* G d de)          Z+dS )z
Spyder API toolbar widgets.
    )OrderedDictN)UnionOptionalTupleListDict)QEventQObjectQSizeQt)QActionQProxyStyleQStyleQToolBarQToolButtonQWidget)SpyderAPIError)_)ima)SpyderAction)APP_TOOLBAR_STYLESHEETPANES_TOOLBAR_STYLESHEETc                   *    e Zd Zej        Zej        ZdS )ToolbarLocationN)__name__
__module____qualname__r   TopToolBarAreaTopBottomToolBarAreaBottom     ;lib/python3.11/site-packages/spyder/api/widgets/toolbars.pyr   r   '   s        

C!FFFr#   r   c                       e Zd ZdZd ZdS )ToolTipFilterz0
    Filter tool tip events on toolbuttons.
    c                     |                                 }t          |t                    r|                                nd }|t          j        k    r||j        |j        S t          j	        | ||          S N)
type
isinstancer   defaultActionr	   ToolTiptiptext_beside_iconr
   eventFilter)selfobjevent
event_typeactions        r$   r/   zToolTipFilter.eventFilter3   sl    ZZ\\
(23(D(DN""$$$$''F,>z!.."4e444r#   N)r   r   r   __doc__r/   r"   r#   r$   r&   r&   .   s-         5 5 5 5 5r#   r&   c                   "     e Zd ZdZ fdZ xZS )ToolbarStyleNc                 L   |t           j        k    rq| j        dk    r&t          j        dk    rdS t
          j        dk    rdS dS | j        dk    r&t          j        dk    rdS t
          j        dk    rd	S d
S t          d           t                      	                    |||          S )z
        Adjust size of toolbar extension button (in pixels).

        From https://stackoverflow.com/a/27042352/438386
        Applicationnt(   darwin6   9   
MainWidget$   *   ,   zUnknown toolbar style type)
r   PM_ToolBarExtensionExtentTYPEosnamesysplatformprintsuperpixelMetric)r0   pmoptionwidget	__class__s       r$   rK   zToolbarStyle.pixelMetricD   s     111yM))7d??2\X--22l**7d??2\X--222333ww""2vv666r#   )r   r   r   rD   rK   __classcell__rO   s   @r$   r7   r7   ?   s?         D7 7 7 7 7 7 7 7 7r#   r7   c                   ~     e Zd ZdZ fdZ	 	 ddedee         dee         dee         d	ef
d
Z	defdZ
 fdZ xZS )SpyderToolbarz_
    Spyder Toolbar.

    This class provides toolbars with some predefined functionality.
    c                    t                                          |           t                      | _        i | _        i | _        || _        d| _        |                     |           | 	                    t          d          }|                    t          j        d                     |                    t          d                     d S )N)parentdefault_sectionqt_toolbar_ext_buttontoolbar_ext_buttonMore)rJ   __init__r   _section_items	_item_map_pending_items_title_default_sectionsetWindowTitle	findChildr   setIconr   icon
setToolTipr   )r0   rU   title
ext_buttonrO   s       r$   rZ   zSpyderToolbar.__init__j   s    ''')mm  1E""" ^^K1HII
38$899:::aii(((((r#   NFaction_or_widgetsectionbeforebefore_sectionomit_idc                     d}t          |t                    st          |d          r|j        }nt          |d          r|j        }|s||t          d| d          |V| j        vr@ j                            |g           }|	                    ||||f           | j        |<   dS  j        |         }| j
        }||_        || j
        k    r|j        |_        |j        }| j        vr|g j        |<   no|Mg } j        |         D ]2}	|	|k    r|	                    |           |	                    |	           3| j        |<   n  j        |         	                    |           |}| j        v rtg }
 j                                        D ]8}||k    r|
	                    |           ||k    r|
	                    |           9t           fd|
D                        _        |P| j        |<   | j        v r? j                            |          }|D ]$\  }}}}                     ||||           !dS dS dS )aV  
        Add action or widget item to given toolbar `section`.

        Parameters
        ----------
        item: SpyderAction or QWidget
            The item to add to the `toolbar`.
        toolbar_id: str or None
            The application toolbar unique string identifier.
        section: str or None
            The section id in which to insert the `item` on the `toolbar`.
        before: str or None
            Make the item appear before another given item.
        before_section: str or None
            Make the item defined section appear before another given section
            (must be already defined).
        omit_id: bool
            If True, then the toolbar will check if the item to add declares an
            id, False otherwise. This flag exists only for items added on
            Spyder 4 plugins. Default: False
        N	action_idIDzItem z must declare an ID attribute.c              3   6   K   | ]}|j         |         fV  d S r(   )r[   ).0section_keyr0   s     r$   	<genexpr>z)SpyderToolbar.add_item.<locals>.<genexpr>   sD       .6 .6 d1+>?.6 .6 .6 .6 .6 .6r#   )rh   ri   rj   )r*   r   hasattrrm   rn   r   r\   r]   getappendr_   _sectionr[   keysr   popadd_item)r0   rg   rh   ri   rj   rk   item_idbefore_pending_itemsnew_actions_or_widgets
act_or_widnew_sections_keyssecitem_pendingitems   `             r$   ry   zSpyderToolbar.add_itemz   s)   0 '66 	*(+66	*&0GG%t,, 	*&)G 	J7?/?/K H(HHHJ J J T^++'+':'>'>vr'J'J$$++%wGI I I.B#F+/?+G$+!$///,2O ) /$---,<+=D((!)+&"&"5g"> > >J!V++.556FGGG*11*====/E#G,,#G,334DEEE&$"555 "*//11 2 2.((%,,W555'>>%,,S111"- .6 .6 .6 .6#4.6 .6 .6 #6 #6D &6DN7#$---#266w??=I A A9D'6>MM$1? " A A A A --A Ar#   rz   c                    | j                             |          }t          | j                                                  D ]U}| j        |         }||v r|                    |           t          |          dk    r| j                            |           V|                                  |                                  dS )z+Remove action or widget from toolbar by id.r   N)	r\   rx   listr[   rw   removelenclear_render)r0   rz   r   rh   section_itemss        r$   remove_itemzSpyderToolbar.remove_item   s    ~!!'**D/446677 	1 	1G /8M}$$$$T***=!!Q&&#''000

r#   c                    g }| j                                         D ]\\  }}|D ]}|                    ||g           t          |           }|                    d           |                    d|f           ]|r|                                 |D ]\  }}t          |t                    rt                      j        }nt                      j	        } ||           t          |t                    rpt          |dd          }|                     |          }|r|                    t          j                   |                                r|                    d           dS )z
        Create the toolbar taking into account sections and locations.

        This method is called once on widget setup.
        TNr.   F)r[   itemsru   r   setSeparatorrx   r*   rJ   	addAction	addWidgetgetattrwidgetForActionsetToolButtonStyler   ToolButtonTextBesideIconisCheckablesetCheckable)
r0   	sec_itemsr   r   r   sep
add_methodr.   rN   rO   s
            r$   r   zSpyderToolbar._render   s    	-3355 	* 	*JC . .  #t----$--CT"""dC[)))) 	MMOOO$ 	. 	.KS$$(( /"WW.

"WW.
Jt$(( .#*41CU#K#K --d33# K--b.IJJJ##%% .''---!	. 	.r#   )NNNF)r   r   r   r5   rZ   ToolbarItemr   strboolry   r   r   rP   rQ   s   @r$   rS   rS   c   s         ) ) ) ) )" IMGLVA VA VA"3-VA8@VA!)#VA@DVA VA VA VAp
3 
 
 
 
". ". ". ". ". ". ". ". ".r#   rS   c                   (     e Zd ZdZdZ	  fdZ xZS )ApplicationToolbarz*
    Spyder Main application Toolbar.
    Nc                 D   t                                          ||           t          d           | _        d| j        _        | j                            |            |                     | j                   |                     t          t                               d S )N)rU   re   r9   )
rJ   rZ   r7   _stylerD   	setParentsetStylesetStyleSheetr   r   r0   rU   re   rO   s      r$   rZ   zApplicationToolbar.__init__  s    e444"4(((d###dk"""356677777r#   )r   r   r   r5   rn   rZ   rP   rQ   s   @r$   r   r     sN          
B8 8 8 8 8 8 8 8 8r#   r   c                   :     e Zd ZdZdZ	 d fd	Zd Z fdZ xZS )MainWidgetToolbarz
    Spyder Widget toolbar class.

    A toolbar used in Spyder dockable plugins to add internal toolbars
    to their interface.
    Nc                    t                                          ||pd           t          dd          | _        |                     d                    t          t          j                              d d                              | 	                    d           | 
                    d           |                     t          j                   |                     | j                   t          d           | _        d| j        _        | j                            |            |                     | j                   |                     t          t*                               t-                      | _        d S )N )re      zmain_widget_toolbar_{}   Fr?   )rJ   rZ   r   
_icon_sizesetObjectNameformatr   uuiduuid4setFloatable
setMovablesetContextMenuPolicyr   PreventContextMenusetIconSizer7   r   rD   r   r   r   r   r&   _filterr   s      r$   rZ   zMainWidgetToolbar.__init__'  s<   u{333B-- 	3::
bqb!# # 	$ 	$ 	$%   !!""7888)))"4(('d###dk"""3788999$r#   c                 >    || _         |                     |           d S r(   )r   r   )r0   	icon_sizes     r$   set_icon_sizezMainWidgetToolbar.set_icon_size<  s#    ######r#   c                     g }| j                                         D ]\\  }}|D ]}|                    ||g           t          |           }|                    d           |                    d|f           ]|r|                                 |D ]\  }}t          |t                    rt                      j        }nt                      j	        } ||           t          |t                    r| 
                    |          }|                    | j                   t          |dd          }|r|                    t          j                   |                                r|                    d           dS )z
        Create the toolbar taking into account the sections and locations.

        This method is called once on widget setup.
        TNr.   F)r[   r   ru   r   r   rx   r*   rJ   r   r   r   installEventFilterr   r   r   r   r   r   r   )
r0   r   r   r   r   r   r   rN   r.   rO   s
            r$   r   zMainWidgetToolbar._render@  s    	-3355 	* 	*JC . .  #t----$--CT"""dC[)))) 	MMOOO$ 	. 	.KS$$(( /"WW.

"WW.
Jt$(( 	.--d33))$,777#*41CU#K#K # K--b.IJJJ##%% .''---#	. 	.r#   )NN)	r   r   r   r5   rn   rZ   r   r   rP   rQ   s   @r$   r   r     s{          
B' ' ' ' ' '*$ $ $#. #. #. #. #. #. #. #. #.r#   r   ),r5   collectionsr   rE   rG   typingr   r   r   r   r   r   qtpy.QtCorer	   r
   r   r   qtpy.QtWidgetsr   r   r   r   r   r   spyder.api.exceptionsr   spyder.api.translationsr   spyder.utils.icon_managerr   spyder.utils.qthelpersr   spyder.utils.stylesheetr   r   r   r   ToolbarItemEntryr   r&   r7   rS   r   r   r"   r#   r$   <module>r      s   
 $ # # # # # 				 



 5 5 5 5 5 5 5 5 5 5 5 5 5 5  3 2 2 2 2 2 2 2 2 2 2 2B B B B B B B B B B B B B B B B 1 0 0 0 0 0 % % % % % % ) ) ) ) ) ) / / / / / /6 6 6 6 6 6 6 6
 L')*hsmXc]!#' ( 
" " " " " " " "5 5 5 5 5G 5 5 5"7 7 7 7 7; 7 7 7H]. ]. ]. ]. ].H ]. ]. ].@8 8 8 8 8 8 8 8.I. I. I. I. I. I. I. I. I. I.r#   