U
    FvfAY                  
   @   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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 )Zobj_typec                 C   s   t jdkrdS dS )Nwin32zmatplotlib.pngzmatplotlib.svg)sysplatformself r    D/tmp/pip-unpacked-wheel-7vhvci0g/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   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ScrollDirection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_   buttonrf   r^   rL   r   rg   r\   r    r    r!   r6      s     
z#FigureCanvasGTK3.button_press_eventc                 C   s4   t d| f| ||jf| |j|d  dS )Nr7   rh   Fri   rk   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   rk   r    r    r!   r:      s    
z FigureCanvasGTK3.key_press_eventc                 C   s*   t d| | |f|  d|i  dS )Nr;   rc   Trl   rk   r    r    r!   r;      s    
z"FigureCanvasGTK3.key_release_eventc                 C   s.   t d| f| || |j|d  dS )Nr<   rh   F)r
   r_   rf   r^   rL   rk   r    r    r!   r<      s
    
z$FigureCanvasGTK3.motion_notify_eventc                 C   s@   t j|   }td| f| || ||d  d S )NZfigure_enter_eventrh   	r   ZKeymapZget_for_displayrW   Zget_modifier_stater	   r_   rf   rL   r   rg   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_eventrh   rn   ro   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ZforwardZresize_event)	r4   dpiwidthrZ   r[   set_size_inchesr   rL   	draw_idle)r   rg   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!   rf      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_namerf   r^   isprintableremovejoin)r   r\   Zunikeyr|   modsr    r    r!   rm      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      Frp   )rO   rr   rZ   r[   r4   rq   rs   )r   rg   r\   whrq   r    r    r!   r8      s    z FigureCanvasGTK3.configure_eventc                 C   s   || _ |   d S r,   )rC   r   )r   Z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   Zdimr   r    r!   	<genexpr>   s   z.FigureCanvasGTK3._post_draw.<locals>.<genexpr>r   )r   r   r   r   )	rC   Zmove_toZline_toZset_antialiasZset_line_widthZset_dashZset_source_rgbZstroke_preserveZstroke)	r   rg   ctxZx0Zy0r   r   x1y1r    r   r!   rG      s.    



zFigureCanvasGTK3._post_drawc                 C   s   d S r,   r    )r   rg   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?   staticmethodrf   rm   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zoomZ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imagerj   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_patternZ
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   descriptionZtogglerj   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   rj   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)rg   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   Z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   Z	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   Z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   exportr!  r    r    r    r!   <module>   s^    
	
 wfQU	  