o
    ä¸Gf7T  ã                
   @   sÖ  d dl Z d dl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yA Z zedƒe‚dZ[ww ze dd¡ W n ey[ Z zeeƒe‚dZ[ww 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" G dd„ deej#ƒZ$G dd„ de ej%ƒZ&G dd„ de	ej%ƒZ'e (e$¡G dd„ dej)ƒƒZ*e (e$¡G dd„ dej+ƒƒZ,e (e$¡G dd„ dej-ƒƒZ.e (e$ej/¡ e (e$ej0¡ e'Z1G dd„ deƒZ2ej3G dd„ deƒƒZ4dS )é    N)Ú_apiÚbackend_toolsÚcbook)ÚToolContainerBaseÚKeyEventÚLocationEventÚ
MouseEventÚResizeEventÚ
CloseEventz#The GTK4 backends require PyGObjectÚGtkz4.0)ÚGioÚGLibr   ÚGdkÚ	GdkPixbufé   )Ú_backend_gtk)Ú_BackendGTKÚ_FigureCanvasGTKÚ_FigureManagerGTKÚ_NavigationToolbar2GTKÚTimerGTKc                       sì   e Zd ZdZdZe dd„ ¡ZdZd4‡ fdd„	Z	dd	„ Z
d
d„ Zd4d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d4d 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 )5ÚFigureCanvasGTK4Zgtk4Fc                 C   s   t S ©N)ÚFigureManagerGTK4)Úcls© r   ú@lib/python3.10/site-packages/matplotlib/backends/backend_gtk4.pyÚ<lambda>$   s    zFigureCanvasGTK4.<lambda>Nc           	         sŠ  t ƒ j|d |  d¡ |  d¡ d| _d | _|  | j¡ |  d| j	¡ |  d| j
¡ t ¡ }| d¡ | d| j¡ | d| j¡ |  |¡ t ¡ }| d| j¡ | d	| j¡ |  |¡ t ¡ }| d
| j¡ | d| j¡ | d| j¡ |  |¡ tj tjj¡}| d| j¡ |  |¡ |  d¡ t ¡ }d}t ddd¡d u r«|  |d¡ n|  | !d¡¡ |  "¡ }| #|tj$¡ | %d¡ d S )N)ÚfigureTr   Zresizeznotify::scale-factorZpressedZreleasedzkey-pressedzkey-releasedÚmotionZenterZleaveÚscrollz/.matplotlib-canvas { background-color: white; }é   é	   é   éÿÿÿÿzutf-8zmatplotlib-canvas)&ÚsuperÚ__init__Úset_hexpandZset_vexpandÚ_idle_draw_idÚ_rubberband_rectZset_draw_funcÚ
_draw_funcÚconnectÚresize_eventÚ_update_device_pixel_ratior   ZGestureClickZ
set_buttonÚbutton_press_eventÚbutton_release_eventZadd_controllerZEventControllerKeyÚkey_press_eventÚkey_release_eventZEventControllerMotionÚmotion_notify_eventÚenter_notify_eventÚleave_notify_eventZEventControllerScrollÚnewZEventControllerScrollFlagsÚVERTICALÚscroll_eventZset_focusableZCssProviderZcheck_versionZload_from_dataÚencodeZget_style_contextZadd_providerZ#STYLE_PROVIDER_PRIORITY_APPLICATIONZ	add_class)	Úselfr   ZclickÚkeyr   r    ZcssZstyleZ	style_ctx©Ú	__class__r   r   r&   '   sH   





ÿ

zFigureCanvasGTK4.__init__c                 C   s   t d| ƒ ¡  d S )NZclose_event)r
   Ú_process©r9   r   r   r   ÚdestroyV   s   zFigureCanvasGTK4.destroyc                 C   s   |   t |¡¡ d S r   )Zset_cursor_from_namer   Zmpl_to_gtk_cursor_name)r9   Zcursorr   r   r   Ú
set_cursorY   s   zFigureCanvasGTK4.set_cursorc                 C   sb   |du r|   ¡  ¡ }| |  ¡  ¡  ¡ ¡\}}}}n|\}}|| j }| jjj	|| j  }||fS )a™  
        Convert the *xy* position of a GTK event, or of the current cursor
        position if *xy* 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_nativeÚget_surfaceÚget_device_positionÚget_displayÚget_default_seatÚget_pointerÚdevice_pixel_ratior   ZbboxÚheight)r9   ZxyÚsurfaceÚis_overÚxÚyÚmaskr   r   r   Ú_mpl_coords]   s   ÿ
zFigureCanvasGTK4._mpl_coordsc                 C   s,   t d| g|  ¡ ¢R ||  |¡dœŽ ¡  dS )Nr7   )ÚstepÚ	modifiersT©r   rN   Ú_mpl_modifiersr=   )r9   Ú
controllerZdxZdyr   r   r   r7   s   s   ÿÿþzFigureCanvasGTK4.scroll_eventc                 C   s@   t d| g|  ||f¡¢| ¡ ‘R d|  |¡iŽ ¡  |  ¡  d S )Nr.   rP   )r   rN   Úget_current_buttonrR   r=   Z
grab_focus©r9   rS   Zn_pressrK   rL   r   r   r   r.   z   s   ÿÿþýz#FigureCanvasGTK4.button_press_eventc                 C   s8   t d| g|  ||f¡¢| ¡ ‘R d|  |¡iŽ ¡  d S )Nr/   rP   )r   rN   rT   rR   r=   rU   r   r   r   r/   ‚   s   ÿÿþý
z%FigureCanvasGTK4.button_release_eventc                 C   ó*   t d| |  |||¡g|  ¡ ¢R Ž  ¡  dS )Nr0   T©r   Ú_get_keyrN   r=   ©r9   rS   ÚkeyvalÚkeycodeÚstater   r   r   r0   ‰   ó   ÿþz FigureCanvasGTK4.key_press_eventc                 C   rV   )Nr1   TrW   rY   r   r   r   r1      r]   z"FigureCanvasGTK4.key_release_eventc                 C   s0   t d| g|  ||f¡¢R d|  |¡iŽ ¡  d S )Nr2   rP   rQ   ©r9   rS   rK   rL   r   r   r   r2   —   s   ÿÿþ
z$FigureCanvasGTK4.motion_notify_eventc                 C   s.   t d| g|  ||f¡¢R d|  ¡ iŽ ¡  d S )NZfigure_enter_eventrP   ©r   rN   rR   r=   r^   r   r   r   r3      s   ÿÿþ
z#FigureCanvasGTK4.enter_notify_eventc                 C   s(   t d| g|  ¡ ¢R d|  ¡ iŽ ¡  d S )NZfigure_leave_eventrP   r_   )r9   rS   r   r   r   r4   £   s   ÿÿþ
z#FigureCanvasGTK4.leave_notify_eventc                 C   sX   |   ¡  | jj}|| j | }|| j | }| jj||dd td| ƒ ¡  |  ¡  d S )NF)Zforwardr,   )r-   r   ÚdpirG   Zset_size_inchesr	   r=   Ú	draw_idle)r9   ZareaÚwidthrH   r`   ZwinchZhinchr   r   r   r,   ©   s   zFigureCanvasGTK4.resize_eventc                    sz   |d u r|   ¡  ¡ }| |  ¡  ¡  ¡ ¡\}}}‰ n| ¡ ‰ dtjj	fdtjj
fdtjjfdtjjfg}‡ fdd„|D ƒS )NÚctrlÚaltÚshiftr%   c                    s   g | ]
\}}ˆ |@ r|‘qS r   r   )Ú.0ÚnamerM   ©Zevent_stater   r   Ú
<listcomp>¿   s    z3FigureCanvasGTK4._mpl_modifiers.<locals>.<listcomp>)rA   rB   rC   rD   rE   rF   Zget_current_event_stater   ÚModifierTypeÚCONTROL_MASKÚALT_MASKÚ
SHIFT_MASKÚ
SUPER_MASK)r9   rS   rI   rJ   rK   rL   Z	mod_tabler   rh   r   rR   ²   s   ÿ



üzFigureCanvasGTK4._mpl_modifiersc                    s|   t t |¡ƒ‰t ˆt |¡¡‰ 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 ƒ}d g |¢ˆ ‘¡S )	Nrc   Zcontrolrd   re   r%   c                    s6   g | ]\}}}|ˆ krˆ|@ r|d krˆ  ¡ s|‘qS )re   )Úisprintable)rf   ÚmodrM   Zmod_key©r:   r\   Zunikeyr   r   ri   Ì   s    þz-FigureCanvasGTK4._get_key.<locals>.<listcomp>ú+)Úchrr   Zkeyval_to_unicoder   Z_unikey_or_keysym_to_mplkeyZkeyval_namerj   rk   rl   rm   rn   Újoin)r9   rZ   r[   r\   rP   Úmodsr   rq   r   rX   Á   s   þüÿzFigureCanvasGTK4._get_keyc                 O   s   |   |  ¡ ¡r|  ¡  d S d S r   )Z_set_device_pixel_ratioZget_scale_factorÚdraw©r9   ÚargsÚkwargsr   r   r   r-   Ò   s   ÿz+FigureCanvasGTK4._update_device_pixel_ratioc                 C   s   || _ |  ¡  d S r   )r)   Ú
queue_draw)r9   Zrectr   r   r   Ú_draw_rubberbandØ   s   z!FigureCanvasGTK4._draw_rubberbandc                 C   s   |   | |¡ |  | |¡ d S r   )Úon_draw_eventÚ
_post_draw)r9   Zdrawing_areaÚctxrb   rH   r   r   r   r*   Ý   s   zFigureCanvasGTK4._draw_funcc                    s0  ˆ j d u rd S d}d}ˆ js‡ fdd„ˆ j D ƒ\}}}}nˆ j \}}}}|ˆ j9 }|ˆ j9 }|| }	|| }
| ||¡ | ||
¡ | ||¡ | |	|¡ | ||
¡ | |	|
¡ | |	|¡ | |	|
¡ | d¡ | |¡ | ||fd¡ | ddd¡ | 	¡  | ||f|¡ | ddd¡ | 
¡  d S )Nr   r#   c                 3   s    | ]}|ˆ j  V  qd S r   )rG   )rf   Zdimr>   r   r   Ú	<genexpr>è   s   € ÿz.FigureCanvasGTK4._post_draw.<locals>.<genexpr>r   )r)   Ú_context_is_scaledrG   Zmove_toZline_toZset_antialiasZset_line_widthZset_dashZset_source_rgbZstroke_preserveZstroke)r9   Úwidgetr~   ZlwZdashZx0Zy0ÚwÚhZx1Zy1r   r>   r   r}   á   s:   

ÿ



zFigureCanvasGTK4._post_drawc                 C   s   d S r   r   )r9   r   r~   r   r   r   r|     s   zFigureCanvasGTK4.on_draw_eventc                 C   s   |   ¡ r
|  ¡  d S d S r   )Zis_drawablerz   r>   r   r   r   rv   
  s   ÿzFigureCanvasGTK4.drawc                    s*   ˆ j dkrd S ‡ fdd„}t |¡ˆ _ d S )Nr   c                     s   z
ˆ   ¡  W dˆ _dS dˆ _w )Nr   F)rv   r(   )rx   r>   r   r   Ú	idle_draw  s
   
ÿz-FigureCanvasGTK4.draw_idle.<locals>.idle_draw)r(   r   Zidle_add)r9   r„   r   r>   r   ra     s   
zFigureCanvasGTK4.draw_idlec                 C   s,   t j ¡ }| ¡ r| d¡ | ¡ s	d S d S )NT)r   ZMainContextÚdefaultZpendingZ	iteration)r9   Úcontextr   r   r   Úflush_events  s   

ÿzFigureCanvasGTK4.flush_eventsr   )!Ú__name__Ú
__module__Ú__qualname__Zrequired_interactive_frameworkZsupports_blitr   ZclasspropertyZmanager_classr€   r&   r?   r@   rN   r7   r.   r/   r0   r1   r2   r3   r4   r,   rR   rX   r-   r{   r*   r}   r|   rv   ra   r‡   Ú__classcell__r   r   r;   r   r   !   s8    /

	%r   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚNavigationToolbar2GTK4c           	      C   s2  t j | ¡ |  d¡ i | _| jD ]Y\}}}}|d u r#|  t  ¡ ¡ qt j 	t
j tt d|› d¡ƒ¡¡}|dv r>t  ¡ nt  ¡  | j|< }| |¡ | d¡ | d¡ | dt| |ƒ¡|_| |¡ |  |¡ qt  ¡ }| d¡ | d	¡ |  |¡ t  ¡ | _| j t jj¡ |  | j¡ t | |¡ d S )
NZtoolbarZimagesú-symbolic.svg)ZzoomZpanÚflatúimage-buttonÚclickedõ   <small>Â 
Â </small>T)r   ÚBoxr&   Úadd_css_classZ_gtk_idsZ	toolitemsÚappendÚ	SeparatorÚImageÚnew_from_giconr   ÚIconÚnew_for_stringÚstrr   Z_get_data_pathÚToggleButtonÚButtonÚ	set_childr+   ÚgetattrZ_signal_handlerÚset_tooltip_textÚLabelÚ
set_markupr'   ÚmessageÚset_justifyÚJustificationÚRIGHTr   )	r9   ÚcanvasÚtextZtooltip_textÚ
image_fileÚcallbackÚimageÚbuttonÚlabelr   r   r   r&   #  sF   
ÿÿÿþ



ÿ
ÿ


zNavigationToolbar2GTK4.__init__c                    sh  t jdˆ j ¡ t jjdd}|ˆ _t  ¡ }| d¡ | 	d¡ | 
|¡ | |¡ g }d }tˆ j ¡  ¡ ƒD ]/\}\}}t  ¡ }| |¡ |D ]
}	| 	d|	› ¡ qG| 
|¡ | |¡ ˆ j ¡ |v re|}q6|| g|d |… ¢||d d … ¢}| dd	||¡ | d|d
 ¡ | tj tj tjd ¡¡¡ | ˆ j ¡ ¡ t |j d¡‡ fdd„ƒ}
| !¡  d S )NzSave the figureT)ÚtitleÚtransient_forÚactionÚmodalz	All filesÚ*z*.r   ÚformatzFile formatr   úsavefig.directoryÚresponsec              
      sÔ   |   ¡ }|  d¡}ˆ j ¡ | d }|  ¡  d ˆ _|tjjkr!d S t	j
d r1| ¡ }| ¡ t	j
d< zˆ jjj| ¡ |d W d S  tyi } ztjˆ j ¡ tjjtjjdt|ƒd}| ¡  W Y d }~d S d }~ww )Nr²   r   r³   )r²   T)r®   Zmessage_typeZbuttonsr°   r§   )Zget_fileZ
get_choicer¦   Úget_supported_filetypes_groupedr?   Ú_save_dialogr   ZResponseTypeZACCEPTÚmplÚrcParamsZ
get_parentZget_pathr   ZsavefigÚ	ExceptionZMessageDialogÚget_rootZMessageTypeZERRORZButtonsTypeZOKrš   Úshow)Údialogr´   ÚfileÚfmtÚparentÚeÚmsgr>   r   r   Úon_responser  s,   

ü€úz7NavigationToolbar2GTK4.save_figure.<locals>.on_response)"r   ZFileChooserNativer¦   rº   ZFileChooserActionZSAVEr¶   Z
FileFilterZset_nameZadd_patternZ
add_filterZ
set_filterÚ	enumeraterµ   Úitemsr”   Zget_default_filetypeZ
add_choiceZ
set_choiceZset_current_folderr   ZFileZnew_for_pathÚosÚpathÚ
expanduserr·   r¸   Zset_current_nameZget_default_filenameÚ	functoolsÚpartialr+   r»   )r9   rx   r¼   ZffÚformatsZdefault_formatÚirg   Zfmtsr¾   rÂ   r   r>   r   Úsave_figureM  sL   ü



ÿ


€ÿ
ÿz"NavigationToolbar2GTK4.save_figureN)rˆ   r‰   rŠ   r&   rÌ   r   r   r   r   rŒ   "  s    *rŒ   c                   @   sX   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d„ ZdS )ÚToolbarGTK4r   c                 C   sš   t  | |¡ tj | ¡ |  dtjj¡ t ¡ | _|  | j¡ i | _	i | _
t ¡ }| d¡ | d¡ |  |¡ t ¡ | _| j tjj¡ |  | j¡ d S )NÚorientationr‘   T)r   r&   r   r’   Úset_propertyÚOrientationZ
HORIZONTALÚ	_tool_boxr”   Ú_groupsÚ
_toolitemsr    r¡   r'   Ú_messager£   r¤   r¥   )r9   Útoolmanagerr¬   r   r   r   r&     s    
ÿ


zToolbarGTK4.__init__c           
      C   s´   |rt  ¡ }nt  ¡ }| |¡ | d¡ |d ur-t j tj 	|¡¡}| 
|¡ | d¡ |d u r3d}|  |||¡ | d| j|¡}	| |¡ | j |g ¡ | j|  ||	f¡ d S )NrŽ   r   r$   r   )r   r›   rœ   Ú	set_labelr“   r–   r—   r   r˜   r™   r   Ú_add_buttonr+   Ú
_call_toolrŸ   rÓ   Ú
setdefaultr”   )
r9   rg   ÚgroupÚpositionr¨   ÚdescriptionZtoggler«   rª   Úsignalr   r   r   Úadd_toolitem¨  s$   



ÿ


zToolbarGTK4.add_toolitemc                 C   s>   d g}| j |  ¡ }|d ur| |¡ | ¡ }|d us|| S r   )rÒ   Úget_first_childr”   Úget_next_sibling)r9   rÚ   rÛ   ÚchildrenÚchildr   r   r   Ú_find_child_at_positionÀ  s   
þz#ToolbarGTK4._find_child_at_positionc                 C   sT   || j vr| j r|  ¡  t ¡ }| j |¡ || j |< | j |  ||  ||¡¡ d S r   )rÒ   Ú_add_separatorr   r’   rÑ   r”   Zinsert_child_afterrã   )r9   r«   rÚ   rÛ   Z	group_boxr   r   r   r×   È  s   


ÿzToolbarGTK4._add_buttonc                 C   s   |   |¡ d S r   )Ztrigger_tool)r9   Zbtnrg   r   r   r   rØ   Ò  s   zToolbarGTK4._call_toolc                 C   sD   || j vrd S | j | D ]\}}| |¡ | |¡ | |¡ qd S r   )rÓ   Zhandler_blockZ
set_activeZhandler_unblock)r9   rg   ZtoggledÚtoolitemrÝ   r   r   r   Útoggle_toolitemÕ  s   


ýzToolbarGTK4.toggle_toolitemc                 C   sl   || j vr| j |› d| ¡ d S | jD ]}| j | D ]\}}|| j| v r.| j|  |¡ qq| j |= d S )Nz not in toolbar)rÓ   rÕ   Zmessage_eventrÒ   Úremove)r9   rg   rÚ   rå   Z_signalr   r   r   Úremove_toolitemÝ  s   

€þzToolbarGTK4.remove_toolitemc                 C   s(   t  ¡ }| dt jj¡ | j |¡ d S )NrÎ   )r   r•   rÏ   rÐ   r6   rÑ   r”   )r9   Úsepr   r   r   rä   è  s   zToolbarGTK4._add_separatorc                 C   s   | j  |¡ d S r   )rÔ   rÖ   )r9   Úsr   r   r   Úset_messageí  s   zToolbarGTK4.set_messageN)rˆ   r‰   rŠ   Z_icon_extensionr&   rÞ   rã   r×   rØ   ræ   rè   rä   rë   r   r   r   r   rÍ   Œ  s    
rÍ   c                   @   ó   e Zd Zdd„ ZdS )ÚSaveFigureGTK4c                 O   s   t  |  ¡ ¡ d S r   )rŒ   rÌ   Z"_make_classic_style_pseudo_toolbarrw   r   r   r   Útriggeró  s   ÿzSaveFigureGTK4.triggerN©rˆ   r‰   rŠ   rî   r   r   r   r   rí   ñ  ó    rí   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚHelpGTK4c                 C   s~   dddddœ}|  d¡}dd„ |d	d
… D ƒ}|d
 }||v r$|| }nt|ƒdkr/| ¡ }n	| ¡ r8|dg7 }d |¡| S )z‚
        Convert Matplotlib key presses to GTK+ accelerator identifiers.

        Related to `FigureCanvasGTK4._get_key`.
        Z	BackSpaceZ	Page_DownZPage_UpZScroll_Lock)Z	backspaceZpagedownZpageupZscroll_lockrr   c                 S   s   g | ]}d | d ‘qS )ú<ú>r   )rf   rp   r   r   r   ri     s    z0HelpGTK4._normalize_shortcut.<locals>.<listcomp>Nr$   r   z<shift>Ú )ÚsplitÚlenÚ
capitalizeÚisupperrt   )r9   r:   ZspecialÚpartsru   r   r   r   Ú_normalize_shortcutú  s   ü



zHelpGTK4._normalize_shortcutc                 C   s   d|vo	|  d¡ S )zÖ
        Check for a valid shortcut to be displayed.

        - GTK will never send 'cmd+' (see `FigureCanvasGTK4._get_key`).
        - The shortcut window only shows keyboard shortcuts, not mouse buttons.
        zcmd+zMouseButton.)Ú
startswith)r9   r:   r   r   r   Ú_is_valid_shortcut  s   zHelpGTK4._is_valid_shortcutc           	         sÎ   t  ¡ }tˆ jj ¡ ƒD ]C\}}|jsqt  ¡ }| |¡ | 	¡ }|d ur2| 
d¡ | ¡ }|d us%t jd ‡ fdd„ˆ j |¡D ƒ¡|j|jd}| |¡ qt jddˆ jj ¡ d}| |¡ | ¡  d S )	NFú c                 3   s$    | ]}ˆ   |¡rˆ  |¡V  qd S r   )rü   rú   )rf   r:   r>   r   r   r   1  s   € ý
ÿz#HelpGTK4.trigger.<locals>.<genexpr>)Zacceleratorr­   ZsubtitleZHelpT)r­   r°   r®   )r   ZShortcutsSectionÚsortedrÕ   ZtoolsrÄ   rÜ   ZShortcutsGroupr”   rß   Zset_visiblerà   ZShortcutsShortcutrt   Zget_tool_keymaprg   ZShortcutsWindowZ_figurer¦   rº   r   r»   )	r9   rx   Úsectionrg   ZtoolrÚ   râ   ZshortcutZwindowr   r>   r   rî     s4   

þ
þú
ý
zHelpGTK4.triggerN)rˆ   r‰   rŠ   rú   rü   rî   r   r   r   r   rñ   ø  s    	rñ   c                   @   rì   )ÚToolCopyToClipboardGTK4c                 O   s~   t  ¡ '}| j |¡ | j ¡ \}}tj | ¡ tj	j
dd|||d ¡}W d   ƒ n1 s.w   Y  | j ¡ }| |¡ d S )NTé   r!   )ÚioÚBytesIOr¦   Z
print_rgbaZget_width_heightr   ZPixbufZnew_from_dataÚ	getbufferZ
ColorspaceZRGBZget_clipboardÚset)r9   rx   ry   Úfr‚   rƒ   ZpbZ	clipboardr   r   r   rî   D  s   
þý
zToolCopyToClipboardGTK4.triggerNrï   r   r   r   r   r   B  rð   r   c                   @   ó   e Zd ZeZeZdS )r   N)rˆ   r‰   rŠ   rŒ   Z_toolbar2_classrÍ   Z_toolmanager_toolbar_classr   r   r   r   r   V  s    r   c                   @   r  )Ú_BackendGTK4N)rˆ   r‰   rŠ   r   ZFigureCanvasr   ZFigureManagerr   r   r   r   r  [  s    r  )5rÈ   r  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	TimerGTK4ZDrawingArear   r’   rŒ   rÍ   Z_register_tool_classZSaveFigureBaserí   ZToolHelpBaserñ   ZToolCopyToClipboardBaser   ZConfigureSubplotsGTKZRubberbandGTKZToolbarr   Zexportr  r   r   r   r   Ú<module>   sT     
€ÿ
€ý  jeIÿÿ