a
    s=icY                  
   @   sx  d dl Z d dlZd dlZd dlmZ d dlZd dlZd dlmZm	Z	m
Z
 d dlmZmZmZmZmZmZmZ d dlmZ zd dlZW n. ey Z zedeW Y dZ[n
dZ[0 0 zedd W n* ey Z zeeW Y dZ[n
dZ[0 0 d d	lmZmZmZmZm Z  d
dl!m"Z" d
dl"m#Z#m$Z$m%Z%m&Z' d
dl"m(Z( e)e*Z+ej,G dd dZ-e . dd Z/G dd deej0Z1G dd de%ej2Z3G dd deej4Z5e	6e1G dd de	j7Z8ej9dddG dd de	j:Z;e	6e1G dd  d e	j<Z=e	6e1G d!d" d"e	j>Z?e9d#d*d$d%Z@e5Z2e	6e1e"jA e	6e1e"jB G d&d' d'e$ZCe#jDG d(d) d)e#ZEdS )+    N)Path)_apibackend_toolscbook)FigureCanvasBaseToolContainerBase
CloseEventKeyEventLocationEvent
MouseEventResizeEvent)Cursorsz#The GTK3 backends require PyGObjectGtkz3.0)GioGLibGObjectr   Gdk   )_backend_gtk)_BackendGTK_FigureManagerGTK_NavigationToolbar2GTKTimerGTK)backend_versionc                   @   sZ   e Zd Zejdddedd Zejdddedd Zejddded	d Zd
S )__getattr__3.5 )obj_typec                 C   sj   zNt tjjtj }tj|dtj	|dtj
|dtj|dtj|diW S  tyd   i  Y S 0 d S )NmovepointerdefaultZ	crosshairwait)	functoolspartialr   Cursornew_from_nameDisplayget_defaultr   ZMOVEZHANDPOINTERZSELECT_REGIONZWAIT	TypeError)selfZ
new_cursor r+   q/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/matplotlib/backends/backend_gtk3.pycursord*   s    




z__getattr__.cursord3.6c                 C   s   t jdkrdS dS )Nwin32zmatplotlib.pngzmatplotlib.svg)sysplatformr*   r+   r+   r,   <lambda>;   s    z__getattr__.<lambda>c                 C   s   t tdtdS )Nimagesicon_filename)strr   _get_data_pathr   r2   r+   r+   r,   r3   >   s    N)	__name__
__module____qualname__r   
deprecatedpropertyr-   r5   Zwindow_iconr+   r+   r+   r,   r   (   s   r   c                 C   s   t jt j t| S N)r   r$   r%   r&   r'   r   Zmpl_to_gtk_cursor_name)Z
mpl_cursorr+   r+   r,   _mpl_to_gtk_cursorB   s    r>   c                       s&  e Zd ZdZeZedd Ze	j
je	j
jB e	j
jB e	j
jB e	j
jB e	j
jB e	j
jB e	j
jB e	j
jB Zd1 fdd	Zdd Zd	d
 Zd2d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 Z 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. Z)d/d0 Z*  Z+S )3FigureCanvasGTK3Zgtk3c                 C   s   t S r=   )FigureManagerGTK3)clsr+   r+   r,   r3   L       zFigureCanvasGTK3.<lambda>Nc                    s,  t  j|d d| _d | _| d| j | d| j | d| j | d| j | d| j	 | d| j	 | d	| j
 | d	| j | d
| j | d| j | d| j | d| j | d| j | d| j | | jj | d t }|d |  }||tj |d d S )N)figurer   scroll_eventbutton_press_eventbutton_release_eventconfigure_eventzscreen-changedznotify::scale-factordrawkey_press_eventkey_release_eventmotion_notify_evententer_notify_eventleave_notify_eventsize_allocateTs/   .matplotlib-canvas { background-color: white; }zmatplotlib-canvas)super__init___idle_draw_id_rubberband_rectconnectrD   rE   rF   rG   _update_device_pixel_ratioon_draw_event
_post_drawrI   rJ   rK   rL   rM   rN   Z
set_events	__class__
event_maskZset_can_focusr   ZCssProviderZload_from_dataZget_style_contextZadd_providerZ#STYLE_PROVIDER_PRIORITY_APPLICATIONZ	add_class)r*   rC   cssZ	style_ctxrW   r+   r,   rP   Y   s0    

zFigureCanvasGTK3.__init__c                 C   s   t d|   d S )NZclose_event)r   _processr2   r+   r+   r,   destroyx   s    zFigureCanvasGTK3.destroyc                 C   s8   |  d}|d ur4|t| tj }|d d S )NwindowT)get_property
set_cursorr>   r   MainContextr    	iteration)r*   cursorr]   contextr+   r+   r,   r_   {   s
    

zFigureCanvasGTK3.set_cursorc                 C   sd   |du r0|   }||   \}}}}n|j|j }}|| j }| jj	j
|| j  }||fS )a  
        Convert the position of a GTK event, or of the current cursor position
        if *event* is None, to Matplotlib coordinates.

        GTK use logical pixels, but the figure is scaled to physical pixels for
        rendering.  Transform to physical pixels so that all of the down-stream
        transforms work as expected.

        Also, the origin is different and needs to be corrected.
        N)
get_windowZget_device_positionZget_displayZget_device_managerZget_client_pointerxydevice_pixel_ratiorC   Zbboxheight)r*   eventr]   tre   rf   stater+   r+   r,   _mpl_coords   s    
zFigureCanvasGTK3._mpl_coordsc                 C   s>   |j tjjkrdnd}td| g| |R ||d  dS )Nr   rD   )stepguiEventF)	directionr   ZScrollDirectionUPr   rl   r[   )r*   widgetri   rn   r+   r+   r,   rD      s
    zFigureCanvasGTK3.scroll_eventc                 C   s,   t d| g| ||jR d|i  dS )NrE   ro   Fr   rl   buttonr[   r*   rr   ri   r+   r+   r,   rE      s    
z#FigureCanvasGTK3.button_press_eventc                 C   s,   t d| g| ||jR d|i  dS )NrF   ro   Frs   ru   r+   r+   r,   rF      s    
z%FigureCanvasGTK3.button_release_eventc                 C   s,   t d| | |g|  R d|i  dS )NrI   ro   Tr	   _get_keyrl   r[   ru   r+   r+   r,   rI      s    
z FigureCanvasGTK3.key_press_eventc                 C   s,   t d| | |g|  R d|i  dS )NrJ   ro   Trv   ru   r+   r+   r,   rJ      s    
z"FigureCanvasGTK3.key_release_eventc                 C   s&   t d| g| |R d|i  dS )NrK   ro   F)r   rl   r[   ru   r+   r+   r,   rK      s    
z$FigureCanvasGTK3.motion_notify_eventc                 C   s&   t d| g| |R d|i  d S )NZfigure_enter_eventro   r
   rl   r[   ru   r+   r+   r,   rL      s    z#FigureCanvasGTK3.enter_notify_eventc                 C   s&   t d| g| |R d|i  d S )NZfigure_leave_eventro   rx   ru   r+   r+   r,   rM      s    z#FigureCanvasGTK3.leave_notify_eventc                 C   sT   | j j}|j| j | }|j| j | }| j j||dd td|   |   d S )NFforwardZresize_event)	rC   dpiwidthrg   rh   set_size_inchesr   r[   	draw_idle)r*   rr   Z
allocationZdpivalZwinchZhinchr+   r+   r,   rN      s    zFigureCanvasGTK3.size_allocatec                 C   s   t t|j}t|t|j}tjjdftjj	dftjj
dftjjdfg}|D ]0\}}|j|@ rT|dkrv| sT| d| }qT|S )NZctrlZaltshiftrO   +)chrr   Zkeyval_to_unicodekeyvalr   Z_unikey_or_keysym_to_mplkeyZkeyval_nameZModifierTypeZCONTROL_MASKZ	MOD1_MASKZ
SHIFT_MASKZ	MOD4_MASKrk   isprintable)r*   ri   Zunikeykey	modifiersZkey_maskprefixr+   r+   r,   rw      s    





zFigureCanvasGTK3._get_keyc                 O   s"   |  |  r|   |   d S r=   )Z_set_device_pixel_ratioZget_scale_factorZqueue_resize
queue_drawr*   argskwargsr+   r+   r,   rT      s    z+FigureCanvasGTK3._update_device_pixel_ratioc                 C   sd   | dd u rd S |j| j }|j| j }|dk s:|dk r>d S | jj}| jj|| || dd dS )Nr]      Fry   )r^   r|   rg   rh   rC   r{   r}   )r*   rr   ri   whr{   r+   r+   r,   rG      s    z FigureCanvasGTK3.configure_eventc                 C   s   || _ |   d S r=   )rR   r   )r*   rectr+   r+   r,   _draw_rubberband   s    z!FigureCanvasGTK3._draw_rubberbandc           	         s    j d u rd S  fdd j D \}}}}|| }|| }||| ||| ||| ||| ||| ||| ||| ||| |d |d |dd |ddd |  |dd |ddd |  d S )Nc                 3   s   | ]}| j  V  qd S r=   )rg   ).0dimr2   r+   r,   	<genexpr>   s   z.FigureCanvasGTK3._post_draw.<locals>.<genexpr>r   )r   r   r   r   )	rR   move_toZline_toZset_antialiasZset_line_widthZset_dashZset_source_rgbZstroke_preservestroke)	r*   rr   ctxZx0Zy0r   r   x1y1r+   r2   r,   rV      s.    



zFigureCanvasGTK3._post_drawc                 C   s   d S r=   r+   )r*   rr   r   r+   r+   r,   rU     s    zFigureCanvasGTK3.on_draw_eventc                 C   s   |   r|   d S r=   )Zis_drawabler   r2   r+   r+   r,   rH     s    zFigureCanvasGTK3.drawc                    s*    j dkrd S  fdd}t| _ d S )Nr   c                     s    z    W d _nd _0 dS )Nr   F)rH   rQ   )r   r2   r+   r,   	idle_draw#  s    
z-FigureCanvasGTK3.draw_idle.<locals>.idle_draw)rQ   r   Zidle_add)r*   r   r+   r2   r,   r~     s    
zFigureCanvasGTK3.draw_idlec                 C   s"   t j }| r|d q
d S )NT)r   r`   r    pendingra   )r*   rc   r+   r+   r,   flush_events+  s    
zFigureCanvasGTK3.flush_events)N)N),r8   r9   r:   Zrequired_interactive_framework	TimerGTK3Z
_timer_clsr   ZclasspropertyZmanager_classr   Z	EventMaskZBUTTON_PRESS_MASKZBUTTON_RELEASE_MASKZEXPOSURE_MASKZKEY_PRESS_MASKZKEY_RELEASE_MASKZENTER_NOTIFY_MASKZLEAVE_NOTIFY_MASKZPOINTER_MOTION_MASKZSCROLL_MASKrX   rP   r\   r_   rl   rD   rE   rF   rI   rJ   rK   rL   rM   rN   rw   rT   rG   r   rV   rU   rH   r~   r   __classcell__r+   r+   rZ   r,   r?   I   sT   


r?   c                   @   s@   e Zd Zeddd
ddZededd Zdd	 Z	dS )NavigationToolbar2GTK3r.   r]   Nc                 C   sl  || _ tj|  | tjj i | _| jD ]\}}}}|d u rR| 	t
 d q,tjtjttd| dtjj}|dv rt nt  | j|< }|| || |dt| ||_|| | 	|d q,t }	| 	|	d t }
|
d |	 d |	!|
 t }	| 	|	d t | _"| j"#tj$j% |	!| j" | &  t'| | d S )Nrm   r4   -symbolic.svg)Zzoompanclickedu   <small> 
 </small>T)(_winr   rP   	set_styler   ToolbarStyleICONSZ_gtk_idsZ	toolitemsinsertZSeparatorToolItemImagenew_from_giconr   Iconnew_for_stringr6   r   r7   IconSizeLARGE_TOOLBARToggleToolButton
ToolButton	set_labelset_icon_widgetrS   getattrZ_signal_handlerset_tooltip_textZToolItemLabelZ
set_markupZ
set_expandaddmessageset_justifyJustificationRIGHTshow_allr   )r*   canvasr]   textZtooltip_text
image_filecallbackimagert   toolitemlabelr+   r+   r,   rP   3  sR    






zNavigationToolbar2GTK3.__init__c                 C   s   | j S r=   )r   r2   r+   r+   r,   r3   e  rB   zNavigationToolbar2GTK3.<lambda>c           
   
      s  t jdj t jjt jt jjt j	t jj
fd j  D ]V\}}t  }|| |D ]}|d|  q\ | j |v r> | q>t jd fdd} tjd   j   d   }  }  }j |  d	 }    |t jj
kr$d S tjd rBt!j"#|tjd< zjj$j%||d
 W nZ t&y }	 z@t j'j t(|	t j)j*t j+j
d        W Y d }	~	n
d }	~	0 0 d S )NzSave the figure)titleparentactionbuttonsz*.znotify::filterc                     sD       }j | d } tt  d|  d S )Nr   .)	
get_filterget_namer   get_supported_filetypes_groupedset_current_namer6   r   Zget_current_namewith_suffix)r   namefmtdialogr*   r+   r,   on_notify_filtery  s
    z<NavigationToolbar2GTK3.save_figure.<locals>.on_notify_filterzsavefig.directoryTr   )format)r   message_formattyper   ),r   ZFileChooserDialogr   get_toplevelZFileChooserActionZSAVEZSTOCK_CANCELZResponseTypeZCANCELZ
STOCK_SAVEOKr   itemsZ
FileFilterset_nameZadd_pattern
add_filterZget_default_filetypeZ
set_filterr"   r#   rS   Zset_current_foldermplZrcParamsr   Zget_default_filenameZset_do_overwrite_confirmationrunget_filenamer   r   r\   ospathdirnamerC   Zsavefig	ExceptionMessageDialogr6   MessageTypeERRORButtonsType)
r*   r   r   Zfmtsffr   r   responsefnameer+   r   r,   save_figureg  sP    





z"NavigationToolbar2GTK3.save_figure)N)
r8   r9   r:   r   Zdelete_parameterrP   r;   r<   winr   r+   r+   r+   r,   r   2  s   
1r   c                   @   sP   e Zd Z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 ZdS )ToolbarGTK3r   c                 C   sl   t | | tj|  | dtjj t | _| j	tj
j | | jddd |   i | _i | _d S )NorientationFr   )r   rP   r   Boxset_propertyOrientationZ
HORIZONTALr   _messager   r   r   Zpack_endr   _groups
_toolitems)r*   toolmanagerr+   r+   r,   rP     s    
zToolbarGTK3.__init__c           
      C   s   |rt  }nt  }|| |d urLt jtj|t j	j
}|| |d u rXd}| ||| |d| j|}	|| |  | j|g  | j| ||	f d S )Nrm   r   )r   r   r   r   r   r   r   r   r   r   r   r   _add_buttonrS   
_call_toolr   r   r   
setdefaultappend)
r*   r   grouppositionr   descriptiontogglert   r   signalr+   r+   r,   add_toolitem  s$    




zToolbarGTK3.add_toolitemc                 C   sf   || j vrP| j r|   t }|tjj | |ddd |  || j |< | j | 	|| d S )NFr   )
r   _add_separatorr   Toolbarr   r   r   
pack_startr   r   )r*   rt   r   r   Ztoolbarr+   r+   r,   r     s    

zToolbarGTK3._add_buttonc                 C   s   |  | d S r=   )Ztrigger_tool)r*   Zbtnr   r+   r+   r,   r     s    zToolbarGTK3._call_toolc                 C   sD   || j vrd S | j | D ]&\}}|| || || qd S r=   )r   Zhandler_blockZ
set_activeZhandler_unblock)r*   r   Ztoggledr   r   r+   r+   r,   toggle_toolitem  s    


zToolbarGTK3.toggle_toolitemc                 C   sl   || j vr"| j| d|  d S | jD ]6}| j | D ]&\}}|| j| v r6| j| | q6q(| j |= d S )Nz not in toolbar)r   r   Zmessage_eventr   remove)r*   r   r   r   _signalr+   r+   r,   remove_toolitem  s    

zToolbarGTK3.remove_toolitemc                 C   s4   t  }|dt jj | |ddd |  d S )Nr   FTr   )r   Z	Separatorr   r   ZVERTICALr   r   )r*   sepr+   r+   r,   r     s    zToolbarGTK3._add_separatorc                 C   s   | j | d S r=   )r   r   )r*   sr+   r+   r,   set_message  s    zToolbarGTK3.set_messageN)r8   r9   r:   Z_icon_extensionrP   r   r   r   r   r  r   r  r+   r+   r+   r,   r     s   r   c                   @   s   e Zd Zdd ZdS )SaveFigureGTK3c                 O   s   t |   d S r=   )r   r   "_make_classic_style_pseudo_toolbarr   r+   r+   r,   trigger  s    zSaveFigureGTK3.triggerNr8   r9   r:   r  r+   r+   r+   r,   r    s   r  r   ZToolSetCursor)alternativec                   @   s   e Zd Zdd ZdS )SetCursorGTK3c                 C   s   t |  | d S r=   )r   r_   r  )r*   rb   r+   r+   r,   r_     s    zSetCursorGTK3.set_cursorN)r8   r9   r:   r_   r+   r+   r+   r,   r
    s   r
  c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )HelpGTK3c                 C   s~   ddddd}| d}dd |d	d
 D }|d
 }||v rH|| }n(t|dkr^| }n| rp|dg7 }d|| S )z
        Convert Matplotlib key presses to GTK+ accelerator identifiers.

        Related to `FigureCanvasGTK3._get_key`.
        Z	BackSpaceZ	Page_DownZPage_UpZScroll_Lock)Z	backspaceZpagedownZpageupZscroll_lockr   c                 S   s   g | ]}d | d qS )<>r+   )r   modr+   r+   r,   
<listcomp>  rB   z0HelpGTK3._normalize_shortcut.<locals>.<listcomp>Nrm   r   z<shift>r   )splitlen
capitalizeisupperjoin)r*   r   Zspecialpartsmodsr+   r+   r,   _normalize_shortcut  s    



zHelpGTK3._normalize_shortcutc                 C   s   d|vo| d S )z
        Check for a valid shortcut to be displayed.

        - GTK will never send 'cmd+' (see `FigureCanvasGTK3._get_key`).
        - The shortcut window only shows keyboard shortcuts, not mouse buttons.
        zcmd+zMouseButton.)
startswith)r*   r   r+   r+   r,   _is_valid_shortcut  s    zHelpGTK3._is_valid_shortcutc                    s   t  }t jj D ]l\}}|js(qt  }|| |	dd d  t j
d fdd j|D |j|jd}|| qt jdd jj d	}|  || |  d S )
Nc                 S   s
   |  dS )NF)Zset_visible)rr   datar+   r+   r,   r3   *  rB   z1HelpGTK3._show_shortcuts_window.<locals>.<lambda> c                 3   s"   | ]}  |r |V  qd S r=   )r  r  )r   r   r2   r+   r,   r   -  s   
z2HelpGTK3._show_shortcuts_window.<locals>.<genexpr>)Zacceleratorr   subtitleHelpT)r   modalZtransient_for)r   ZShortcutsSectionsortedr   Ztoolsr   r   ZShortcutsGroupr   forallZShortcutsShortcutr  Zget_tool_keymapr   ZShortcutsWindow_figurer   r   showr   )r*   sectionr   Ztoolr   Zshortcutr]   r+   r2   r,   _show_shortcuts_window  s.    



zHelpGTK3._show_shortcuts_windowc                 C   s>   t j| jj dt jjt jj| 	 dd}|
  |  d S )Nr   r  )r   )r   r   r!  r   r   r   INFOr   r   Z_get_help_textr   r\   )r*   r   r+   r+   r,   _show_shortcuts_dialog>  s    
zHelpGTK3._show_shortcuts_dialogc                 G   s(   t dddd u r|   n|   d S )Nr      r   )r   Zcheck_versionr$  r&  )r*   r   r+   r+   r,   r  F  s    
zHelpGTK3.triggerN)r8   r9   r:   r  r  r$  r&  r  r+   r+   r+   r,   r    s
   	"r  c                   @   s   e Zd Zdd ZdS )ToolCopyToClipboardGTK3c           
      O   sH   t jtj}| j }| \}}}}t|||||}	|	|	 d S r=   )
r   Z	Clipboardgetr   ZSELECTION_CLIPBOARDr   rd   Zget_geometryZpixbuf_get_from_windowZ	set_image)
r*   r   r   	clipboardr]   re   rf   r|   rh   Zpbr+   r+   r,   r  O  s
    
zToolCopyToClipboardGTK3.triggerNr  r+   r+   r+   r,   r(  M  s   r(  r.   c                 C   sd   |d ur|  }| sd }t| ts6dtt| } tj|tjj	tj
j| d}|  |  d S )N,)r   r   r   r   )r   Zis_toplevel
isinstancer6   r  mapr   r   r   r   r   r   r   r\   )msgr   r   r+   r+   r,   error_msg_gtkW  s    
r/  c                   @   s   e Zd ZeZeZdS )r@   N)r8   r9   r:   r   Z_toolbar2_classr   Z_toolmanager_toolbar_classr+   r+   r+   r,   r@   m  s   r@   c                   @   s   e Zd ZeZeZdS )_BackendGTK3N)r8   r9   r:   r?   ZFigureCanvasr@   ZFigureManagerr+   r+   r+   r,   r0  r  s   r0  )N)Fr"   loggingr   pathlibr   r0   Z
matplotlibr   r   r   r   Zmatplotlib.backend_basesr   r   r   r	   r
   r   r   Zmatplotlib.backend_toolsr   giImportErrorerrZrequire_version
ValueErrorr   Zgi.repositoryr   r   r   r   r   r   r   r   r   r   r   r   r   	getLoggerr8   _logZcaching_module_getattrr   	lru_cacher>   ZDrawingArear?   r   r   r   r   Z_register_tool_classZSaveFigureBaser  r;   ZSetCursorBaser
  ZToolHelpBaser  ZToolCopyToClipboardBaser(  r/  ZConfigureSubplotsGTKZRubberbandGTKr@   exportr0  r+   r+   r+   r,   <module>   sb   $ 

 jfQU	