o
    i%,                     @   s   d Z ddlZddlmZ ddlmZ ddlmZ ddlm	Z
 eeZG dd dZG dd	 d	eZG d
d deZG dd deZdS )a  
Classes used for blocking interaction with figure windows:

`BlockingInput`
    Creates a callable object to retrieve events in a blocking way for
    interactive sessions.  Base class of the other classes listed here.

`BlockingKeyMouseInput`
    Creates a callable object to retrieve key or mouse clicks in a blocking
    way for interactive sessions.  Used by `~.Figure.waitforbuttonpress`.

`BlockingMouseInput`
    Creates a callable object to retrieve mouse clicks in a blocking way for
    interactive sessions.  Used by `~.Figure.ginput`.

`BlockingContourLabeler`
    Creates a callable object to retrieve mouse clicks in a blocking way that
    will then be used to place labels on a `.ContourSet`.  Used by
    `~.Axes.clabel`.
    N)Integral)cbook)MouseButtonc                   @   sR   e Zd ZdZdddZdd Zdd Zd	d
 Zdd ZdddZ	e	Z
dddZdS )BlockingInputz1Callable for retrieving events in a blocking way. c                 C   s   || _ || _d S Nfig
eventslist)selfr	   r
   r   r   T/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/matplotlib/blocking_input.py__init__#   s   
zBlockingInput.__init__c                 C   sZ   |  | tdt| j |   t| j| j  kr dkr+n dS | jj	  dS dS )zY
        Event handler; will be passed to the current figure to retrieve events.
        zEvent %ir   N)
	add_event_loginfolenevents
post_eventnr	   canvasstop_event_loopr   eventr   r   r   on_event'   s   
"zBlockingInput.on_eventc                 C   s   dS )z-For baseclass, do nothing but collect events.Nr   r   r   r   r   r   7   s    zBlockingInput.post_eventc                 C   s$   | j D ]	}| jj| qg | _ dS )zDisconnect all callbacks.N)	callbacksr	   r   mpl_disconnect)r   cbr   r   r   cleanup:   s   

zBlockingInput.cleanupc                 C      | j | dS )z5For base class, this just appends an event to events.N)r   appendr   r   r   r   r   @   s   zBlockingInput.add_eventc                 C   r   )z
        Remove an event from the event list -- by default, the last.

        Note that this does not check that there are events, much like the
        normal pop method.  If no events exist, this will throw an exception.
        N)r   pop)r   indexr   r   r   	pop_eventD   s   zBlockingInput.pop_event      c                    st   t jt|d | _g  _t jjdr j   fdd j	D  _
z jjj|d W     jS    w )z%Blocking call to retrieve *n* events.)r   managerc                    s   g | ]} j j| jqS r   )r	   r   mpl_connectr   ).0namer   r   r   
<listcomp>Y   s    z*BlockingInput.__call__.<locals>.<listcomp>)timeout)r   _check_isinstancer   r   r   hasattrr	   r   showr
   r   start_event_loopr   )r   r   r,   r   r   r   __call__O   s   


zBlockingInput.__call__N)r   r!   )r%   r&   )__name__
__module____qualname____doc__r   r   r   r   r   r$   r"   r1   r   r   r   r   r       s    

	r   c                   @   s   e Zd ZdZejZejZej	Z
ejejej	fddZ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dZd ddZd!ddZdS )"BlockingMouseInputa  
    Callable for retrieving mouse clicks in a blocking way.

    This class will also retrieve keypresses and map them to mouse clicks:
    delete and backspace are a right click, enter is like a middle click,
    and all others are like a left click.
    c                 C   s&   t j| |dd || _|| _|| _d S N)button_press_eventkey_press_eventr   )r   r   
button_add
button_popbutton_stop)r   r	   	mouse_add	mouse_pop
mouse_stopr   r   r   r   r   s   
zBlockingMouseInput.__init__c                 C   sD   t | jdkrtd dS | jd jdkr|   dS |   dS )zProcess an event.r   zNo events yetr!   r:   N)r   r   r   warningr*   	key_eventmouse_eventr   r   r   r   r   }   s
   zBlockingMouseInput.post_eventc                 C   s\   | j d }|j}|| jkr| | dS || jkr | | dS || jkr,| | dS dS )zProcess a mouse click event.r!   N)r   buttonr<   mouse_event_popr=   mouse_event_stopr;   mouse_event_add)r   r   rD   r   r   r   rC      s   



zBlockingMouseInput.mouse_eventc                 C   s\   | j d }|jdu rdS |j }|dv r| | dS |dv r'| | dS | | dS )zV
        Process a key press event, mapping keys to appropriate mouse clicks.
        r!   N)	backspacedelete)escapeenter)r   keylowerrE   rF   rG   )r   r   rL   r   r   r   rB      s   


zBlockingMouseInput.key_eventc                 C   s"   |j r
| | dS t|  dS )z
        Process an button-1 event (add a click if inside axes).

        Parameters
        ----------
        event : `~.backend_bases.MouseEvent`
        N)inaxes	add_clickr   r"   r   r   r   r   rG      s   z"BlockingMouseInput.mouse_event_addc                 C   s   t |  | jj  dS )z
        Process an button-2 event (end blocking input).

        Parameters
        ----------
        event : `~.backend_bases.MouseEvent`
        N)r   r"   r	   r   r   r   r   r   r   rF      s   
	z#BlockingMouseInput.mouse_event_stopc                 C   s"   t |  | jr| | dS dS )z
        Process an button-3 event (remove the last click).

        Parameters
        ----------
        event : `~.backend_bases.MouseEvent`
        N)r   r"   r   r   r   r   r   rE      s   
	z"BlockingMouseInput.mouse_event_popc                 C   sz   | j |j|jf tdt| j |j|j | jr;tj	|jg|jgddd}|j
| | j| | jj  dS dS )z
        Add the coordinates of an event to the list of clicks.

        Parameters
        ----------
        event : `~.backend_bases.MouseEvent`
        zinput %i: %f, %f+r)markercolorN)clicksr    xdataydatar   r   r   show_clicksmlinesLine2DrN   add_linemarksr	   r   draw)r   r   liner   r   r   rO      s   zBlockingMouseInput.add_clickr!   c                 C   s6   | j | | jr| j|  | jj  dS dS )z
        Remove a click (by default, the last) from the list of clicks.

        Parameters
        ----------
        event : `~.backend_bases.MouseEvent`
        N)rT   r"   rW   r[   remover	   r   r\   r   r   r#   r   r   r   	pop_click   s
   zBlockingMouseInput.pop_clickc                 C   s   |  || t| | dS )zw
        Remove a click and the associated event from the list of clicks.

        Defaults to the last click.
        N)r`   r   r"   r_   r   r   r   r"      s   zBlockingMouseInput.popNc                 C   s:   | j r| jD ]}|  qg | _| jj  t|  dS )z{
        Parameters
        ----------
        event : `~.backend_bases.MouseEvent`, optional
            Not used
        N)rW   r[   r^   r	   r   r\   r   r   )r   r   markr   r   r   r      s   

zBlockingMouseInput.cleanupr%   r&   Tc                 C   s(   || _ g | _g | _tj| ||d | jS )zV
        Blocking call to retrieve *n* coordinate pairs through mouse clicks.
        r   r,   )rW   rT   r[   r   r1   )r   r   r,   rW   r   r   r   r1     s
   zBlockingMouseInput.__call__r2   r   )r%   r&   T)r3   r4   r5   r6   r   LEFTr;   RIGHTr<   MIDDLEr=   r   r   rC   rB   rG   rF   rE   rO   r`   r"   r   r1   r   r   r   r   r7   e   s(    
	


	r7   c                   @   sD   e Zd ZdZdd Zdd ZdddZd	d
 Zdd ZdddZ	dS )BlockingContourLabelerzt
    Callable for retrieving mouse clicks and key presses in a blocking way.

    Used to place contour labels.
    c                 C   s   || _ tj| |jjd d S )N)r	   )csr7   r   axfigure)r   rg   r   r   r   r     s   zBlockingContourLabeler.__init__c                 C      |  | d S r   )button1r   r   r   r   rO        z BlockingContourLabeler.add_clickr!   c                 C   rj   r   )button3r_   r   r   r   r`     rl   z BlockingContourLabeler.pop_clickc                 C   sJ   |j | jjkr| jj|j|j| j| jdd | jj	
  dS t|  dS )z
        Process an button-1 event (add a label to a contour).

        Parameters
        ----------
        event : `~.backend_bases.MouseEvent`
        F)inline_spacing	transformN)rN   rg   rh   add_label_nearxyinlinern   r	   r   r\   r   r"   r   r   r   r   rk      s   	zBlockingContourLabeler.button1c                 C   s(   | j rdS | j  | jjjj  dS )a  
        Process an button-3 event (remove a label if not in inline mode).

        Unfortunately, if one is doing inline labels, then there is currently
        no way to fix the broken contour - once humpty-dumpty is broken, he
        can't be put back together.  In inline mode, this does nothing.

        Parameters
        ----------
        event : `~.backend_bases.MouseEvent`
        N)rs   rg   	pop_labelrh   ri   r   r\   r   r   r   r   rm   1  s   
zBlockingContourLabeler.button3   c                 C   s"   || _ || _tj| ||dd d S )NF)r   r,   rW   )rs   rn   r7   r1   )r   rs   rn   r   r,   r   r   r   r1   C  s
   

zBlockingContourLabeler.__call__Nr2   )ru   r!   r!   )
r3   r4   r5   r6   r   rO   r`   rk   rm   r1   r   r   r   r   rf     s    
rf   c                   @   s*   e Zd ZdZdd Zdd Zd
ddZd	S )BlockingKeyMouseInputzQ
    Callable for retrieving mouse clicks and key presses in a blocking way.
    c                 C   s   t j| |dd d S r8   )r   r   )r   r	   r   r   r   r   O  s   zBlockingKeyMouseInput.__init__c                 C   s*   | j r| j d jdk| _dS td dS )zDetermine if it is a key event.r!   r:   zNo events yet.N)r   r*   
keyormouser   rA   r   r   r   r   r   S  s   z BlockingKeyMouseInput.post_eventr&   c                 C   s   d| _ tj| d|d | j S )z
        Blocking call to retrieve a single mouse click or key press.

        Returns ``True`` if key press, ``False`` if mouse click, or ``None`` if
        timed out.
        Nr%   rb   )rw   r   r1   )r   r,   r   r   r   r1   Z  s   zBlockingKeyMouseInput.__call__N)r&   )r3   r4   r5   r6   r   r   r1   r   r   r   r   rv   J  s
    rv   )r6   loggingnumbersr   
matplotlibr   matplotlib.backend_basesr   matplotlib.lineslinesrX   	getLoggerr3   r   r   r7   rf   rv   r   r   r   r   <module>   s    
E +;