
    Je.                     t   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+y)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y)ToolbarLocationN)__name__
__module____qualname__r   TopToolBarAreaTopBottomToolBarAreaBottom     =/usr/lib/python3/dist-packages/spyder/api/widgets/toolbars.pyr   r   '   s    


C!!Fr#   r   c                       e Zd ZdZd Zy)ToolTipFilterz0
    Filter tool tip events on toolbuttons.
    c                     |j                         }t        |t              r|j                         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   sb    ZZ\
(23(D""$$'F,>zz!...""4e44r#   N)r   r   r   __doc__r/   r"   r#   r$   r&   r&   .   s    5r#   r&   c                   "     e Zd ZdZ fdZ xZS )ToolbarStyleNc                 B   |t         j                  k(  r{| j                  dk(  r)t        j                  dk(  ryt
        j                  dk(  ryy| j                  dk(  r)t        j                  dk(  ryt
        j                  dk(  ry	y
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yyM)77d?\\X-l*77d?\\X-23w"2vv66r#   )r   r   r   rD   rK   __classcell__rO   s   @r$   r7   r7   ?   s     D7 7r#   r7   c                   l     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                 F   t         |   |       t               | _        i | _        i | _        || _        d| _        | j                  |       | j                  t        d      }|j                  t        j                  d             |j                  t        d             y )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    ')m  1E" ^^K1HI
388$89:ai(r#   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      |^| j                  vrA j                  j                  |g       }|j                  ||||f       | j                  |<   y j                  |   }| j                  }||_        |,| j                  k(  r|j                  |_        |j                  }| j                  vr|g j                  |<   nm|Mg } j                  |   D ])  }	|	|k(  r|j                  |       |j                  |	       + | j                  |<   n j                  |   j                  |       |u| j                  v rgg }
 j                  j                         D ]/  }||k(  r|
j                  |       ||k7  s|
j                  |       1 t         fd|
D               _        |[| j                  |<   | j                  v r= j                  j                  |      }|D ]  \  }}}} j!                  ||||        yyy)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   @   K   | ]  }|j                   |   f  y wr(   )r[   ).0section_keyr0   s     r$   	<genexpr>z)SpyderToolbar.add_item.<locals>.<genexpr>   s)      .6 d11+>?.6s   )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&00G%t,&))G7?/?/K ())GHJ J T^^+'+':':'>'>vr'J$$++%wGI.B##F+/?++G$+!$///,2OO ) //$---,<+=D(!)+&"&"5"5g"> >J!V+.556FG*11*=>
 0F##G,##G,334DE&$"5"55 "**//1 2.(%,,W5'>%,,S1	2
 #. .6#4.6 #6D &6DNN7#$---#2266w?=I A9D'6>MM$1? " AA . r#   rz   c                 f   | j                   j                  |      }t        | j                  j	                               D ]P  }| j                  |   }||v r|j                  |       t        |      dk(  s6| j                  j                  |       R | j                          | j                          y)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7 	1G //8M}$$$T*=!Q&##''0	1 	

r#   c                 V   g }| j                   j                         D ]N  \  }}|D ]  }|j                  ||g        t        |       }|j	                  d       |j                  d|f       P |r|j                          |D ]  \  }}t        |t              rt        	|    }n
t        	| $  } ||       t        |t              sDt        |dd      }| j                  |      }|r|j                  t        j                         |j                         s|j!                  d        y)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 	*JC .  #t-. $-CT"dC[)	* MMO$ 	.KS$$("W.
"W.
t$(#*41CU#K --d3#--b.I.IJ##%''-!	.r#   )NNNF)r   r   r   r5   rZ   ToolbarItemr   strboolry   r   r   rP   rQ   s   @r$   rS   rS   c   sr    )" IMGLVA VA"3-VA8@VA!)#VA@D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                    t         |   ||       t        d       | _        d| j                  _        | j                  j                  |        | j                  | j                         | j                  t        t                     y )N)rU   re   r9   )
rJ   rZ   r7   _stylerD   	setParentsetStylesetStyleSheetr   r   r0   rU   re   rO   s      r$   rZ   zApplicationToolbar.__init__  sc    e4"4((d#dkk"3567r#   )r   r   r   r5   rn   rZ   rP   rQ   s   @r$   r   r     s     
B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         |   ||xs d       t        dd      | _        | j	                  dj                  t        t        j                               d d              | j                  d       | j                  d       | j                  t        j                         | j                  | j                         t        d       | _        d| j                   _        | j                   j%                  |        | j'                  | j                          | j)                  t        t*                     t-               | _        y )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B- 	3::

bq!# 	$% !!""7"78)"4('d#dkk"3789$r#   c                 4    || _         | j                  |       y r(   )r   r   )r0   	icon_sizes     r$   set_icon_sizezMainWidgetToolbar.set_icon_size<  s    ##r#   c                    g }| j                   j                         D ]N  \  }}|D ]  }|j                  ||g        t        |       }|j	                  d       |j                  d|f       P |r|j                          |D ]  \  }}t        |t              rt        	|    }n
t        	| $  } ||       t        |t              sD| j                  |      }|j                  | j                         t        |dd      }|r|j                  t        j                          |j#                         s|j%                  d        y)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 	*JC .  #t-. $-CT"dC[)	* MMO$ 	.KS$$("W.
"W.
t$(--d3))$,,7#*41CU#K #--b.I.I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  3 2B B 1 % ) /6
 L')*hsmXc]!#' ( 
" "5G 5"7; 7H].H ].@8 8.I. I.r#   