U
    md>Y                  
   @   s<  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 zd dlZW n, ek
r Z zedeW 5 dZ[X Y nX zedd W n( ek
r Z z
eeW 5 dZ[X Y nX 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#m$Z% e&e'Z(ej)G dd dZ*e + dd Z,G dd de!ej-Z.G dd de#ej/Z0G dd deej1Z2e	3e.G dd de	j4Z5e	3e.G dd de	j6Z7e	3e.G dd de	j8Z9e:dd#ddZ;e2Z/e	3e.ej< e	3e.ej= G dd  d e"Z>e j?G d!d" d"e Z@dS )$    N)Path)_apibackend_toolscbook)ToolContainerBase
CloseEventKeyEventLocationEvent
MouseEventResizeEventz#The GTK3 backends require PyGObjectGtkz3.0)GioGLibGObjectr   Gdk   )_backend_gtk)_BackendGTK_FigureCanvasGTK_FigureManagerGTK_NavigationToolbar2GTKTimerGTKc                   @   s@   e Zd Zejdddedd Zejdddedd ZdS )__getattr__3.6 )obj_typec                 C   s   t jdkrdS dS )Nwin32zmatplotlib.pngzmatplotlib.svg)sysplatformself r!   Y/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/matplotlib/backends/backend_gtk3.py<lambda>)   s    z__getattr__.<lambda>c                 C   s   t tdtdS )Nimagesicon_filename)strr   _get_data_pathr   r   r!   r!   r"   r#   ,   s    N)__name__
__module____qualname__r   
deprecatedpropertyr%   Zwindow_iconr!   r!   r!   r"   r   &   s   r   c                 C   s   t jt j t| S N)r   ZCursorZnew_from_nameZDisplayget_defaultr   Zmpl_to_gtk_cursor_name)Z
mpl_cursorr!   r!   r"   _mpl_to_gtk_cursor0   s    r/   c                       s4  e Zd Zd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d4 fdd	Zdd Zd	d
 Zd5d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e ddd d!Z!d"d# Z"d$d% Z#d&d' Z$d(d) Z%d*d+ Z&d,d- Z'd.d/ Z(d0d1 Z)d2d3 Z*  Z+S )6FigureCanvasGTK3Zgtk3c                 C   s   t S r-   )FigureManagerGTK3)clsr!   r!   r"   r#   9       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connectr5   r6   r7   r8   _update_device_pixel_ratioon_draw_event
_post_drawr:   r;   r<   r=   r>   r?   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    r4   cssZ	style_ctxrH   r!   r"   rA   F   s0    

zFigureCanvasGTK3.__init__c                 C   s   t d|   d S )NZclose_event)r   _processr   r!   r!   r"   destroye   s    zFigureCanvasGTK3.destroyc                 C   s8   |  d}|d k	r4|t| tj }|d d S )NwindowT)get_property
set_cursorr/   r   MainContextdefault	iteration)r    cursorrN   contextr!   r!   r"   rP   h   s
    

zFigureCanvasGTK3.set_cursorc                 C   sd   |dk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_positionget_displayZget_device_managerZget_client_pointerxydevice_pixel_ratior4   Zbboxheight)r    eventrN   trX   rY   stater!   r!   r"   _mpl_coordsp   s    
zFigureCanvasGTK3._mpl_coordsc                 C   sF   |j tjjkrdnd}td| f| ||| |j|d  dS )Nr   r5   )step	modifiersguiEventF)		directionr   ZScrollDirectionZUPr
   r_   _mpl_modifiersr^   rL   )r    widgetr\   ra   r!   r!   r"   r5      s    
zFigureCanvasGTK3.scroll_eventc                 C   s4   t d| f| ||jf| |j|d  dS )Nr6   rb   rc   Fr
   r_   buttonre   r^   rL   r    rf   r\   r!   r!   r"   r6      s     
z#FigureCanvasGTK3.button_press_eventc                 C   s4   t d| f| ||jf| |j|d  dS )Nr7   rg   Frh   rj   r!   r!   r"   r7      s     
z%FigureCanvasGTK3.button_release_eventc                 C   s*   t d| | |f|  d|i  dS )Nr:   rc   Tr   _get_keyr_   rL   rj   r!   r!   r"   r:      s    
z FigureCanvasGTK3.key_press_eventc                 C   s*   t d| | |f|  d|i  dS )Nr;   rc   Trk   rj   r!   r!   r"   r;      s    
z"FigureCanvasGTK3.key_release_eventc                 C   s.   t d| f| || |j|d  dS )Nr<   rg   F)r
   r_   re   r^   rL   rj   r!   r!   r"   r<      s
    
z$FigureCanvasGTK3.motion_notify_eventc                 C   s@   t j|   }td| f| || ||d  d S )NZfigure_enter_eventrg   	r   ZKeymapZget_for_displayrW   Zget_modifier_stater	   r_   re   rL   r    rf   r\   Zgtk_modsr!   r!   r"   r=      s    z#FigureCanvasGTK3.enter_notify_eventc                 C   s@   t j|   }td| f| || ||d  d S )NZfigure_leave_eventrg   rm   rn   r!   r!   r"   r>      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)	r4   dpiwidthrZ   r[   set_size_inchesr   rL   	draw_idle)r    rf   Z
allocationZdpivalZwinchZhinchr!   r!   r"   r?      s    zFigureCanvasGTK3.size_allocateexcludec                   sH   dt jjdfdt jjdfdt jjdfdt jjdfg} fdd|D S )NZctrlcontrolZaltshiftr@   c                    s&   g | ]\}}}|kr |@ r|qS r!   r!   ).0namemaskkeyevent_staterv   r!   r"   
<listcomp>   s     z3FigureCanvasGTK3._mpl_modifiers.<locals>.<listcomp>)r   ZModifierTypeZCONTROL_MASKZ	MOD1_MASKZ
SHIFT_MASKZ	MOD4_MASK)r~   rv   rb   r!   r}   r"   re      s    zFigureCanvasGTK3._mpl_modifiersc                 C   s^   t t|j}t|t|j}| j|j|d}d|krN|	 rN|
d d||fS )Nru   rx   +)chrr   Zkeyval_to_unicodekeyvalr   Z_unikey_or_keysym_to_mplkeyZkeyval_namere   r^   isprintableremovejoin)r    r\   Zunikeyr|   modsr!   r!   r"   rl      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"   rE      s    z+FigureCanvasGTK3._update_device_pixel_ratioc                 C   sd   | dd krd S |j| j }|j| j }|dk s:|dk r>d S | jj}| jj|| || dd dS )NrN      Fro   )rO   rr   rZ   r[   r4   rq   rs   )r    rf   r\   whrq   r!   r!   r"   r8      s    z FigureCanvasGTK3.configure_eventc                 C   s   || _ |   d S r-   )rC   r   )r    rectr!   r!   r"   _draw_rubberband   s    z!FigureCanvasGTK3._draw_rubberbandc           	         s    j d k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-   )rZ   )ry   dimr   r!   r"   	<genexpr>   s   z.FigureCanvasGTK3._post_draw.<locals>.<genexpr>r   )r   r   r   r   )	rC   move_toZline_toZset_antialiasZset_line_widthZset_dashZset_source_rgbZstroke_preservestroke)	r    rf   ctxZx0Zy0r   r   x1y1r!   r   r"   rG      s.    



zFigureCanvasGTK3._post_drawc                 C   s   d S r-   r!   )r    rf   r   r!   r!   r"   rF     s    zFigureCanvasGTK3.on_draw_eventc                 C   s   |   r|   d S r-   )Zis_drawabler   r   r!   r!   r"   r9     s    zFigureCanvasGTK3.drawc                    s*    j dkrd S  fdd}t| _ d S )Nr   c                     s   z   W 5 d _ X dS )Nr   F)rB   r9   )r   r   r!   r"   	idle_draw  s    z-FigureCanvasGTK3.draw_idle.<locals>.idle_draw)rB   r   Zidle_add)r    r   r!   r   r"   rt     s    
zFigureCanvasGTK3.draw_idlec                 C   s"   t j }| r|d q
d S )NT)r   rQ   rR   pendingrS   )r    rU   r!   r!   r"   flush_events&  s    
zFigureCanvasGTK3.flush_events)N)N),r(   r)   r*   Zrequired_interactive_frameworkr   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_MASKrI   rA   rM   rP   r_   r5   r6   r7   r:   r;   r<   r=   r>   r?   staticmethodre   rl   rE   r8   r   rG   rF   r9   rt   r   __classcell__r!   r!   rK   r"   r0   7   sV   


	
r0   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   rN   Nc                 C   sl  || _ tj|  | tjj i | _| jD ]\}}}}|d krR| 	t
 d q,tjtjttd| dtjj}|dkrt nt  | j|< }|| || |dt| ||_|| | 	|d q,t }	| 	|	d t }
|
d |	 d |	!|
 t }	| 	|	d t | _"| j"#tj$j% |	!| j" | &  t'| | d S )Nr`   r$   -symbolic.svg)Zzoompanclickedu   <small> 
 </small>T)(_winr   rA   	set_styler   ToolbarStyleICONSZ_gtk_idsZ	toolitemsinsertZSeparatorToolItemImagenew_from_giconr   Iconnew_for_stringr&   r   r'   IconSizeLARGE_TOOLBARToggleToolButton
ToolButton	set_labelset_icon_widgetrD   getattrZ_signal_handlerset_tooltip_textZToolItemLabelZ
set_markupZ
set_expandaddmessageset_justifyJustificationRIGHTshow_allr   )r    canvasrN   textZtooltip_text
image_filecallbackimageri   toolitemlabelr!   r!   r"   rA   .  sT    

 



zNavigationToolbar2GTK3.__init__c                 C   s   | j S r-   )r   r   r!   r!   r"   r#   `  r3   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 |k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 nX t&k
r }	 z8t j'j t(|	t j)j*t j+j
d        W 5 d }	~	X Y nX 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_namer&   r   Zget_current_namewith_suffix)r   rz   fmtdialogr    r!   r"   on_notify_filtert  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_filter	functoolspartialrD   Zset_current_foldermplZrcParamsr   Zget_default_filenameZset_do_overwrite_confirmationrunget_filenamer   r   rM   ospathdirnamer4   Zsavefig	ExceptionMessageDialogr&   MessageTypeERRORButtonsType)
r    r   rz   Zfmtsffr   r   responsefnameer!   r   r"   save_figureb  sV    
 



  z"NavigationToolbar2GTK3.save_figure)N)
r(   r)   r*   r   Zdelete_parameterrA   r+   r,   winr   r!   r!   r!   r"   r   -  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   rA   r   Boxset_propertyOrientationZ
HORIZONTALr   _messager   r   r   Zpack_endr   _groups
_toolitems)r    toolmanagerr!   r!   r"   rA     s    
zToolbarGTK3.__init__c           
      C   s   |rt  }nt  }|| |d k	rLt jtj|t j	j
}|| |d krXd}| ||| |d| j|}	|| |  | j|g  | j| ||	f d S )Nr`   r   )r   r   r   r   r   r   r   r   r   r   r   r   _add_buttonrD   
_call_toolr   r   r   
setdefaultappend)
r    rz   grouppositionr   descriptiontoggleri   r   signalr!   r!   r"   add_toolitem  s$    




zToolbarGTK3.add_toolitemc                 C   sf   || j k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    ri   r   r   Ztoolbarr!   r!   r"   r     s    

zToolbarGTK3._add_buttonc                 C   s   |  | d S r-   )Ztrigger_tool)r    Zbtnrz   r!   r!   r"   r     s    zToolbarGTK3._call_toolc                 C   sD   || j krd S | j | D ]&\}}|| || || qd S r-   )r   Zhandler_blockZ
set_activeZhandler_unblock)r    rz   Ztoggledr   r   r!   r!   r"   toggle_toolitem  s    


zToolbarGTK3.toggle_toolitemc                 C   sl   || j kr"| j| d|  d S | jD ]6}| j | D ]&\}}|| j| kr6| j| | q6q(| j |= d S )Nz not in toolbar)r   r   Zmessage_eventr   r   )r    rz   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)r(   r)   r*   Z_icon_extensionrA   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   Z"_make_classic_style_pseudo_toolbarr   r!   r!   r"   trigger  s    zSaveFigureGTK3.triggerNr(   r)   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
 }||k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!   )ry   modr!   r!   r"   r     s     z0HelpGTK3._normalize_shortcut.<locals>.<listcomp>Nr`   r   z<shift>r   )splitlen
capitalizeisupperr   )r    r|   specialpartsr   r!   r!   r"   _normalize_shortcut  s    



zHelpGTK3._normalize_shortcutc                 C   s   d|k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)rf   datar!   r!   r"   r#     r3   z1HelpGTK3._show_shortcuts_window.<locals>.<lambda> c                 3   s"   | ]}  |r |V  qd S r-   )r  r  )ry   r|   r   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_keymaprz   ZShortcutsWindow_figurer   r   showr   )r    sectionrz   Ztoolr   ZshortcutrN   r!   r   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   rM   )r    r   r!   r!   r"   _show_shortcuts_dialog2  s    
   zHelpGTK3._show_shortcuts_dialogc                 G   s(   t dddd kr|   n|   d S )Nr      r   )r   Zcheck_versionr  r   )r    r   r!   r!   r"   r  :  s    
zHelpGTK3.triggerN)r(   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 )ToolCopyToClipboardGTK3c           
      O   sH   t jtj}| j }| \}}}}t|||||}	|	|	 d S r-   )
r   Z	Clipboardgetr   ZSELECTION_CLIPBOARDr   rV   Zget_geometryZpixbuf_get_from_windowZ	set_image)
r    r   r   	clipboardrN   rX   rY   rr   r[   Zpbr!   r!   r"   r  C  s
    
zToolCopyToClipboardGTK3.triggerNr  r!   r!   r!   r"   r"  A  s   r"  r   c                 C   sd   |d k	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
isinstancer&   r   mapr   r   r   r   r   r   r   rM   )msgr   r   r!   r!   r"   error_msg_gtkK  s    
  r)  c                   @   s   e Zd ZeZeZdS )r1   N)r(   r)   r*   r   Z_toolbar2_classr   Z_toolmanager_toolbar_classr!   r!   r!   r"   r1   a  s   r1   c                   @   s   e Zd ZeZeZdS )_BackendGTK3N)r(   r)   r*   r0   ZFigureCanvasr1   ZFigureManagerr!   r!   r!   r"   r*  f  s   r*  )N)Ar   loggingr   pathlibr   r   Z
matplotlibr   r   r   r   Zmatplotlib.backend_basesr   r   r   r	   r
   r   giImportErrorerrZrequire_version
ValueErrorr   Zgi.repositoryr   r   r   r   r   r   r   r   r   r   r   r   Z	TimerGTK3	getLoggerr(   _logZcaching_module_getattrr   	lru_cacher/   ZDrawingArear0   r   r   r   r   Z_register_tool_classZSaveFigureBaser  ZToolHelpBaser  ZToolCopyToClipboardBaser"  r+   r)  ZConfigureSubplotsGTKZRubberbandGTKr1   Zexportr*  r!   r!   r!   r"   <module>   s^    
	
 wfQU	  