o
    e?"                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlmZ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mZmZmZ G dd	 d	ejeZG d
d deejeZG dd dejeZG dd dejeZe jdd ZejG dd deZdS )    N)_apicbook)Gcf   )_macosx)FigureCanvasAgg)_BackendFigureCanvasBaseFigureManagerBaseNavigationToolbar2ResizeEvent	TimerBasec                   @   s   e Zd ZdZdS )TimerMacz6Subclass of `.TimerBase` using CFRunLoop timer events.N)__name__
__module____qualname____doc__ r   r   Q/var/www/myenv/lib/python3.10/site-packages/matplotlib/backends/backend_macosx.pyr      s    r   c                       sv   e Zd ZdZeZedd Z fddZ	 fddZ
dd	 Zd
d Zdd Zd fdd	Zdd ZdddZ  ZS )FigureCanvasMacmacosxc                 C   s   t S N)FigureManagerMacclsr   r   r   <lambda>%   s    zFigureCanvasMac.<lambda>c                    s&   t  j|d d| _d| _t | _d S )N)figureF)super__init___draw_pending_is_drawingset_timers)selfr   	__class__r   r   r   '   s   zFigureCanvasMac.__init__c                    sN   | j rdS tj| dd t   W d   n1 sw   Y  |   dS )z/Render the figure and update the macosx canvas.NT)r    )r    r   _setattr_cmr   drawupdater#   r$   r   r   r'   .   s   zFigureCanvasMac.drawc                 C   s6   t | ddst | ddsd| _| | j d S d S d S )Nr   Fr    T)getattrr   _single_shot_timer
_draw_idler)   r   r   r   	draw_idle8   s   
zFigureCanvasMac.draw_idlec                    sD    fdd} j dd}d|_||||  j| |  dS )z/Add a single shot timer with the given callbackc                    s   |    j | |  d S r   )r"   removestop)callbacktimerr)   r   r   callback_funcF   s   z9FigureCanvasMac._single_shot_timer.<locals>.callback_funcr   )intervalTN)	new_timersingle_shotadd_callbackr"   addstart)r#   r0   r2   r1   r   r)   r   r+   A   s   z"FigureCanvasMac._single_shot_timerc                 C   sT   |    | js	 W d   dS d| _|   W d   dS 1 s#w   Y  dS )a	  
        Draw method for singleshot timer

        This draw method can be added to a singleshot timer, which can
        accumulate draws while the eventloop is spinning. This method will
        then only draw the first time and short-circuit the others.
        NF)_idle_draw_cntxr   r'   r)   r   r   r   r,   P   s   

"zFigureCanvasMac._draw_idleNc                    s   t  | |   d S r   )r   blitr(   )r#   bboxr$   r   r   r:   `   s   zFigureCanvasMac.blitc                 C   sJ   | j j| j }|| }|| }| j j||dd td|   |   d S )NF)forwardresize_event)r   dpidevice_pixel_ratioset_size_inchesr   _processr-   )r#   widthheightscaler   r   r   resizee   s   zFigureCanvasMac.resizer   c                 C   s8   t   | j|d W d    d S 1 sw   Y  d S )N)timeout)_maybe_allow_interrupt_start_event_loop)r#   rF   r   r   r   start_event_loopn   s   "z FigureCanvasMac.start_event_loopr   )r   )r   r   r   required_interactive_frameworkr   
_timer_clsr   classpropertymanager_classr   r'   r-   r+   r,   r:   rE   rI   __classcell__r   r   r$   r   r      s    
		r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
NavigationToolbar2Macc                    s^   t d ttj \}}}}tj| |t fdd|D tdd |D  t| | d S )Nimagesc                 3   s(    | ]}|d urt  | d V  qd S )Nz.pdf)str).0
image_name	data_pathr   r   	<genexpr>}   s    
z1NavigationToolbar2Mac.__init__.<locals>.<genexpr>c                 s   s    | ]	}|d ur|V  qd S r   r   )rR   tooltipr   r   r   rV      s    )r   _get_data_pathzipr   	toolitemsr   r   tuple)r#   canvas_tooltipsimage_namesr   rT   r   r   x   s   
zNavigationToolbar2Mac.__init__c                 C   s&   | j t|t|t|t| d S r   )r\   set_rubberbandint)r#   eventx0y0x1y1r   r   r   draw_rubberband   s   &z%NavigationToolbar2Mac.draw_rubberbandc                 C   s   | j   d S r   )r\   remove_rubberbandr)   r   r   r   rh      s   z'NavigationToolbar2Mac.remove_rubberbandc                 G   s`   t jtjd }td|| j }|d u rd S tjd r't j	|tjd< | jj
| d S )Nzsavefig.directoryzSave the figure)ospath
expandusermplrcParamsr   choose_save_filer\   get_default_filenamedirnamer   savefig)r#   args	directoryfilenamer   r   r   save_figure   s   
z!NavigationToolbar2Mac.save_figureN)r   r   r   r   rg   rh   ru   r   r   r   r   rO   v   s
    
rO   c                       sD   e Zd ZeZdd Zdd Z fddZedd Z	d	d
 Z
  ZS )r   c                 C   s   d| _ tj| | ttd}tj| t| || | 	t
jd  | jd ur0| j  t
 r?|   | j  d S d S )NFzimages/matplotlib.pdfzmacosx.window_mode)_shownr   FigureManagerr   rQ   r   rX   set_iconr
   _set_window_moderl   rm   toolbarr(   is_interactiveshowr\   r-   )r#   r\   num	icon_pathr   r   r   r      s   

zFigureManagerMac.__init__c                 C   s   t |  | j  d S r   )r   destroyr\   flush_eventsr)   r   r   r   _close_button_pressed   s   
z&FigureManagerMac._close_button_pressedc                    s2   | j jr| j j }|  | j jst   d S r   )r\   r"   popr/   r   r   )r#   r1   r$   r   r   r      s
   zFigureManagerMac.destroyc                 C   s4   t   t  W d    d S 1 sw   Y  d S r   )rG   r   r|   r   r   r   r   start_main_loop   s   
"z FigureManagerMac.start_main_loopc                 C   s.   | j s
|   d| _ tjd r|   d S d S )NTzfigure.raise_window)rv   _showrl   rm   _raiser)   r   r   r   r|      s   
zFigureManagerMac.show)r   r   r   rO   _toolbar2_classr   r   r   classmethodr   r|   rN   r   r   r$   r   r      s    
r   c               
   #   s
   t t j} | dt jt jfv rdV  dS d t \}}|d |d t |	 }t
|	   fdd}t  t j| z$dV  W |  |  t | t  t j|   dure|    dS dS |  |  t | t  t j|   dur|    w w )a  
    This manager allows to terminate a plot by sending a SIGINT. It is
    necessary because the running backend prevents Python interpreter to
    run and process signals (i.e., to raise KeyboardInterrupt exception). To
    solve this one needs to somehow wake up the interpreter and make it close
    the plot window. The implementation is taken from qt_compat, see that
    docstring for a more detailed description.
    NFc                     s   |  t   d S r   )r   r/   )rr   handler_argsr   r   handle   s   z&_maybe_allow_interrupt.<locals>.handle)signal	getsignalSIGINTSIG_IGNSIG_DFLsocket
socketpairsetblockingset_wakeup_fdfilenor   wake_on_fd_writeclose)old_sigint_handlerwsockrsockold_wakeup_fdr   r   r   r   rG      s:   





rG   c                   @   s   e Zd ZeZeZejZdS )_BackendMacN)	r   r   r   r   FigureCanvasr   rw   r   mainloopr   r   r   r   r      s    
r   ) 
contextlibri   r   r   
matplotlibrl   r   r   matplotlib._pylab_helpersr    r   backend_aggr   matplotlib.backend_basesr   r	   r
   r   r   r   Timerr   r   r   rO   rw   r   contextmanagerrG   exportr   r   r   r   r   <module>   s$     a,
&