o
    h.                     @   sV   d dl mZmZmZmZ G dd dZG dd deZG dd dZG dd	 d	Zd
S )    )_apibackend_toolscbookwidgetsc                   @   s   e Zd ZdZdddZdS )	ToolEventz)Event for tool manipulation (add/remove).Nc                 C   s   || _ || _|| _|| _d S N)namesendertooldata)selfr   r	   r
   r    r   o/var/www/html/construction_image-detection-poc/venv/lib/python3.10/site-packages/matplotlib/backend_managers.py__init__   s   
zToolEvent.__init__r   __name__
__module____qualname____doc__r   r   r   r   r   r      s    r   c                       s"   e Zd ZdZd fdd	Z  ZS )ToolTriggerEventz/Event to inform that a tool has been triggered.Nc                    s   t  |||| || _d S r   )superr   canvasevent)r   r   r	   r
   r   r   	__class__r   r   r      s   
zToolTriggerEvent.__init__)NN)r   r   r   r   r   __classcell__r   r   r   r   r      s    r   c                   @   s   e Zd ZdZdd ZdS )ToolManagerMessageEventzs
    Event carrying messages from toolmanager.

    Messages usually get displayed to the user by the toolbar.
    c                 C   s   || _ || _|| _d S r   )r   r	   message)r   r   r	   r   r   r   r   r      s   
z ToolManagerMessageEvent.__init__Nr   r   r   r   r   r      s    r   c                   @   s   e Zd ZdZd)ddZedd Zedd Zejd	d Zd*ddZ	dd Z
dd Zd)ddZedd Zdd Zdd Zdd Zdd Zdd Zdd  Zd+d!d"Zd#d$ Zed%d& Zd*d'd(ZdS ),ToolManagera  
    Manager for actions triggered by user interactions (key press, toolbar
    clicks, ...) on a Figure.

    Attributes
    ----------
    figure : `.Figure`
    keypresslock : `~matplotlib.widgets.LockDraw`
        `.LockDraw` object to know if the `canvas` key_press_event is locked.
    messagelock : `~matplotlib.widgets.LockDraw`
        `.LockDraw` object to know if the message is available to write.
    Nc                 C   sJ   d | _ i | _i | _i | _t | _t | _	t | _
d | _| | d S r   )_key_press_handler_id_tools_keys_toggledr   CallbackRegistry
_callbacksr   LockDrawkeypresslockmessagelock_figure
set_figurer   figurer   r   r   r   .   s   


zToolManager.__init__c                 C   s   | j sdS | j jS )z Canvas managed by FigureManager.N)r'   canvasr   r   r   r   r+   >   s   zToolManager.canvasc                 C      | j S )zFigure that holds the canvas.)r'   r,   r   r   r   r*   E      zToolManager.figurec                 C   s   |  | d S r   )r(   r)   r   r   r   r*   J   s   Tc                 C   sR   | j r
| j| j  || _|r| jd| j| _ |r%| j D ]}||_qdS dS )z
        Bind the given figure to the tools.

        Parameters
        ----------
        figure : `.Figure`
        update_tools : bool, default: True
            Force tools to update figure.
        key_press_eventN)	r   r+   mpl_disconnectr'   mpl_connect
_key_pressr   valuesr*   )r   r*   update_toolsr
   r   r   r   r(   N   s   
zToolManager.set_figurec                 C   s   | j ||S )a  
        Connect event with string *s* to *func*.

        Parameters
        ----------
        s : str
            The name of the event. The following events are recognized:

            - 'tool_message_event'
            - 'tool_removed_event'
            - 'tool_added_event'

            For every tool added a new event is created

            - 'tool_trigger_TOOLNAME', where TOOLNAME is the id of the tool.

        func : callable
            Callback function for the toolmanager event with signature::

                def func(event: ToolEvent) -> Any

        Returns
        -------
        cid
            The callback id for the connection. This can be used in
            `.toolmanager_disconnect`.
        )r#   connect)r   sfuncr   r   r   toolmanager_connectb   s   zToolManager.toolmanager_connectc                 C   s   | j |S )z
        Disconnect callback id *cid*.

        Example usage::

            cid = toolmanager.toolmanager_connect('tool_trigger_zoom', onpress)
            #...later
            toolmanager.toolmanager_disconnect(cid)
        )r#   
disconnect)r   cidr   r   r   toolmanager_disconnect   s   
z"ToolManager.toolmanager_disconnectc                 C   s.   |du r| }d}t |||}| j|| dS )z!Emit a `ToolManagerMessageEvent`.Ntool_message_event)r   r#   process)r   r   r	   r6   eventr   r   r   message_event   s
   zToolManager.message_eventc                 C   r-   )zCurrently toggled tools.)r!   r,   r   r   r   active_toggle   r.   zToolManager.active_togglec                    s    fdd| j  D }|S )a  
        Return the keymap associated with the specified tool.

        Parameters
        ----------
        name : str
            Name of the Tool.

        Returns
        -------
        list of str
            List of keys associated with the tool.
        c                    s   g | ]
\}}| kr|qS r   r   ).0kir   r   r   
<listcomp>   s    z/ToolManager.get_tool_keymap.<locals>.<listcomp>)r    items)r   r   keysr   rD   r   get_tool_keymap   s   zToolManager.get_tool_keymapc                 C   s   |  |D ]}| j|= qd S r   )rH   r    )r   r   rB   r   r   r   _remove_keys   s   
zToolManager._remove_keysc              	   C   sv   || j vrt|d| | t|tr|g}|D ]}|| jv r3td| d| j|  d|  || j|< qdS )z
        Set the keymap to associate with the specified tool.

        Parameters
        ----------
        name : str
            Name of the Tool.
        key : str or list of str
            Keys to associate with the tool.
        z not in ToolszKey z changed from z to N)r   KeyErrorrI   
isinstancestrr    r   warn_external)r   r   keyrB   r   r   r   update_keymap   s   



zToolManager.update_keymapc                 C   sT   |  |}t|ddr| |d | | td| |}| j|j| | j|= dS )z
        Remove tool named *name*.

        Parameters
        ----------
        name : str
            Name of the tool.
        toggledFtoolmanagertool_removed_eventN)	get_toolgetattrtrigger_toolrI   r   r#   r=   r   r   )r   r   r
   r>   r   r   r   remove_tool   s   
	
zToolManager.remove_toolc                 O   s   t t| j|}|stdt| || jv r"td | j| S || |g|R i |}|| j|< |j	dur?| 
||j	 t|t jre|jdu rS| jdt  n| j|jd |jre| |dd || j td| |}| j|j| |S )a  
        Add *tool* to `ToolManager`.

        If successful, adds a new event ``tool_trigger_{name}`` where
        ``{name}`` is the *name* of the tool; the event is fired every time the
        tool is triggered.

        Parameters
        ----------
        name : str
            Name of the tool, treated as the ID, has to be unique.
        tool : type
            Class of the tool to be added.  A subclass will be used
            instead if one was registered for the current canvas class.
        *args, **kwargs
            Passed to the *tool*'s constructor.

        See Also
        --------
        matplotlib.backend_tools.ToolBase : The base class for tools.
        zImpossible to find class for %sz;A "Tool class" with the same name already exists, not addedNtool_added_event)r   _find_tool_classtyper+   
ValueErrorrL   r   r   rM   default_keymaprO   rK   ToolToggleBaseradio_groupr!   
setdefaultsetrP   _handle_toggler(   r*   r   r#   r=   r   )r   r   r
   argskwargstool_clstool_objr>   r   r   r   add_tool   s(   





zToolManager.add_toolc                 C   s   |j }|du r%|j| jd v r| jd |j dS | jd |j dS | j| |jkr0d}n| j| du r;|j}n| | j| | || |j}|| j|< dS )aO  
        Toggle tools, need to untoggle prior to using other Toggle tool.
        Called from trigger_tool.

        Parameters
        ----------
        tool : `.ToolBase`
        canvasevent : Event
            Original Canvas event or None.
        data : object
            Extra data to pass to the tool when triggering.
        N)r]   r   r!   removeaddrU   )r   r
   r   r   r]   rP   r   r   r   r`     s$   zToolManager._handle_togglec                 C   st   |  |}|du rdS |du r| }t|tjr| ||| |||| d| }t|||||}| j|| dS )a  
        Trigger a tool and emit the ``tool_trigger_{name}`` event.

        Parameters
        ----------
        name : str
            Name of the tool.
        sender : object
            Object that wishes to trigger the tool.
        canvasevent : Event
            Original Canvas event or None.
        data : object
            Extra data to pass to the tool when triggering.
        Nztool_trigger_%s)	rS   rK   r   r\   r`   triggerr   r#   r=   )r   r   r	   r   r   r
   r6   r>   r   r   r   rU   ;  s   
zToolManager.trigger_toolc                 C   sF   |j d u s
| j rd S | j|j d }|d u rd S | j||d d S )N)r   )rN   r%   lockedr    getrU   )r   r>   r   r   r   r   r2   Z  s   zToolManager._key_pressc                 C   r-   )z,A dict mapping tool name -> controlled tool.)r   r,   r   r   r   toolsc  r.   zToolManager.toolsc                 C   sH   t |tjr|j| jv r|S || jvr|rtd| dS | j| S )a  
        Return the tool object with the given name.

        For convenience, this passes tool objects through.

        Parameters
        ----------
        name : str or `.ToolBase`
            Name of the tool, or the tool itself.
        warn : bool, default: True
            Whether a warning should be emitted it no tool with the given name
            exists.

        Returns
        -------
        `.ToolBase` or None
            The tool or None if no tool with the given name exists.
        z"ToolManager does not control tool N)rK   r   ToolBaser   r   r   rM   )r   r   warnr   r   r   rS   h  s   

zToolManager.get_toolr   )T)NNN)r   r   r   r   r   propertyr+   r*   setterr(   r8   r;   r?   r@   rH   rI   rO   rV   re   r`   rU   r2   rk   rS   r   r   r   r   r       s4    





	
9
+	
r   N)	
matplotlibr   r   r   r   r   r   r   r   r   r   r   r   <module>   s
    	