o
    ¡:´a>_  ã                
   @   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 d dlmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZ zd dlZW n eyc Z zed	ƒe‚dZ[ww ze d
d¡ W n ey{ Z zee‚dZ[ww d dl m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& ddl'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z.m/Z0m1Z2 dd„ Z3G dd„ de$j4eƒZ5G dd„ deƒZ6G dd„ de,e$j7ƒZ8G dd„ dee$j7ƒZ9G dd„ de	j:ƒZ;G dd„ de	j<ƒZ=G dd„ de	j>ƒZ?e;e	_@e0e	_Ae2e	_Be=e	_Ce?e	_De9ZEejFG dd „ d e+ƒƒZGdS )!é    N)ÚPath)Ú_apiÚbackend_toolsÚcbook)ÚGcf)Ú_BackendÚFigureCanvasBaseÚFigureManagerBaseÚNavigationToolbar2Ú	TimerBaseÚToolContainerBase)ÚCursors)ÚFigure)ÚSubplotToolz#The GTK4 backends require PyGObjectÚGtkz4.0)ÚGioÚGLibÚGObjectr   ÚGdkÚ	GdkPixbufé   )Ú_create_applicationÚ_shutdown_applicationÚbackend_versionÚ_BackendGTKÚ_NavigationToolbar2GTKÚTimerGTKÚConfigureSubplotsGTKÚRubberbandGTKc                 C   s8   t jtjdtjdtjdtjdtjdtjdtj	di| dS )	NÚmoveZpointerÚdefaultZ	crosshairÚwaitz	ew-resizez	ns-resize)Úcursor)
r   Zcheck_getitemr   ZMOVEZHANDZPOINTERZSELECT_REGIONZWAITZRESIZE_HORIZONTALZRESIZE_VERTICAL)Z
mpl_cursor© r#   úB/usr/lib/python3/dist-packages/matplotlib/backends/backend_gtk4.pyÚ_mpl_to_gtk_cursor)   s   ùør%   c                   @   sÖ   e Zd ZdZdZeZ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(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ ZdS )3ÚFigureCanvasGTK4Zgtk4FNc                 C   sp  t  | |¡ 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j$¡ | %d¡ d S )NTr   Úresizeznotify::scale-factorZpressedZreleasedzkey-pressedzkey-releasedÚmotionZenterZleaveÚscrolls/   .matplotlib-canvas { background-color: white; }zmatplotlib-canvas)&r   Ú__init__r   Úset_hexpandZset_vexpandÚ_idle_draw_idZ_lastCursorÚ_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load_from_dataZget_style_contextZadd_providerZ#STYLE_PROVIDER_PRIORITY_APPLICATIONZ	add_class)ÚselfÚfigureZclickÚkeyr(   r)   ZcssZ	style_ctxr#   r#   r$   r*   ;   sF   





ÿ


zFigureCanvasGTK4.__init__c                 C   s   t  | |¡ d S ©N)r   Úpick)r<   Z
mouseeventr#   r#   r$   r@   g   s   zFigureCanvasGTK4.pickc                 C   s   |   ¡  d S r?   )Zclose_event©r<   r#   r#   r$   Údestroyl   s   zFigureCanvasGTK4.destroyc                 C   s   |   t|ƒ¡ d S r?   )Zset_cursor_from_namer%   )r<   r"   r#   r#   r$   Ú
set_cursoro   s   zFigureCanvasGTK4.set_cursorc                 C   s&   || j  }| jjj|| j   }||fS )aI  
        Calculate mouse coordinates in physical pixels.

        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.
        )Údevice_pixel_ratior=   ZbboxÚheight)r<   ÚxÚyr#   r#   r$   Ú_mouse_event_coordss   s   

z$FigureCanvasGTK4._mouse_event_coordsc                 C   s   t  | dd|¡ dS )Nr   T)r   r;   )r<   Ú
controllerZdxZdyr#   r#   r$   r;   ‚   s   zFigureCanvasGTK4.scroll_eventc                 C   s0   |   ||¡\}}t | ||| ¡ ¡ |  ¡  d S r?   )rH   r   r2   Úget_current_buttonÚ
grab_focus©r<   rI   Zn_pressrF   rG   r#   r#   r$   r2   †   s
   
ÿz#FigureCanvasGTK4.button_press_eventc                 C   s(   |   ||¡\}}t | ||| ¡ ¡ d S r?   )rH   r   r3   rJ   rL   r#   r#   r$   r3   Œ   s   
ÿz%FigureCanvasGTK4.button_release_eventc                 C   ó   |   |||¡}t | |¡ dS ©NT)Ú_get_keyr   r4   ©r<   rI   ÚkeyvalÚkeycodeÚstater>   r#   r#   r$   r4   ‘   ó   z FigureCanvasGTK4.key_press_eventc                 C   rM   rN   )rO   r   r5   rP   r#   r#   r$   r5   –   rT   z"FigureCanvasGTK4.key_release_eventc                 C   s"   |   ||¡\}}t | ||¡ d S r?   )rH   r   r6   ©r<   rI   rF   rG   r#   r#   r$   r6   ›   s   z$FigureCanvasGTK4.motion_notify_eventc                 C   s   t  | ¡ d S r?   )r   r8   )r<   rI   r#   r#   r$   r8   Ÿ   ó   z#FigureCanvasGTK4.leave_notify_eventc                 C   s&   |   ||¡\}}tj| ||fd d S )N)Zxy)rH   r   r7   rU   r#   r#   r$   r7   ¢   s   z#FigureCanvasGTK4.enter_notify_eventc                 C   sT   |   ¡  | jj}|| j | }|| j | }| jj||dd t | ¡ |  ¡  d S )NF)Zforward)r1   r=   ÚdpirD   Zset_size_inchesr   r0   Ú	draw_idle)r<   ZareaÚwidthrE   rW   ZwinchZhinchr#   r#   r$   r0   ¦   s   
zFigureCanvasGTK4.resize_eventc           	      C   s„   t t |¡ƒ}t |t |¡¡}tjjdftjjdftjj	dftjj
dfg}|D ]\}}||@ r?|dkr8| ¡ s?|› d|› }q(|S )NZctrlZaltÚshiftÚsuperú+)Úchrr   Zkeyval_to_unicoder   Z_unikey_or_keysym_to_mplkeyZkeyval_nameZModifierTypeZCONTROL_MASKZALT_MASKZ
SHIFT_MASKZ
SUPER_MASKÚisprintable)	r<   rQ   rR   rS   Zunikeyr>   Ú	modifiersZkey_maskÚprefixr#   r#   r$   rO   ¯   s    þ



ü€zFigureCanvasGTK4._get_keyc                 O   s   |   |  ¡ ¡r|  ¡  d S d S r?   )Z_set_device_pixel_ratioZget_scale_factorÚdraw)r<   ÚargsÚkwargsr#   r#   r$   r1   À   s   ÿz+FigureCanvasGTK4._update_device_pixel_ratioc                 C   s   || _ |  ¡  d S r?   )r-   Ú
queue_draw)r<   Zrectr#   r#   r$   Ú_draw_rubberbandÆ   s   z!FigureCanvasGTK4._draw_rubberbandc                 C   s   |   | |¡ |  | |¡ d S r?   )Úon_draw_eventÚ
_post_draw)r<   Zdrawing_areaÚctxrY   rE   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   é   c                 3   s    | ]}|ˆ j  V  qd S r?   )rD   )Ú.0ZdimrA   r#   r$   Ú	<genexpr>Ö   s   € ÿz.FigureCanvasGTK4._post_draw.<locals>.<genexpr>r   )r-   Ú_context_is_scaledrD   Zmove_toZline_toZset_antialiasZset_line_widthZset_dashZset_source_rgbZstroke_preserveZstroke)r<   Úwidgetrh   ZlwZdashZx0Zy0ÚwÚhZx1Zy1r#   rA   r$   rg   Ï   s:   

ÿ



zFigureCanvasGTK4._post_drawc                 C   s   d S r?   r#   )r<   rm   rh   r#   r#   r$   rf   ô   s   zFigureCanvasGTK4.on_draw_eventc                 C   s   |   ¡ r
|  ¡  d S d S r?   )Zis_drawablerd   rA   r#   r#   r$   ra   ø   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)ra   r,   ©rb   rA   r#   r$   Ú	idle_draw  s
   
ÿz-FigureCanvasGTK4.draw_idle.<locals>.idle_draw)r,   r   Zidle_add)r<   rq   r#   rA   r$   rX   ý   s   
zFigureCanvasGTK4.draw_idlec                 C   s,   t j ¡ }| ¡ r| d¡ | ¡ s	d S d S rN   )r   ZMainContextr    ZpendingZ	iteration)r<   Úcontextr#   r#   r$   Úflush_events	  s   

ÿzFigureCanvasGTK4.flush_eventsr?   )Ú__name__Ú
__module__Ú__qualname__Zrequired_interactive_frameworkZsupports_blitÚ	TimerGTK4Z
_timer_clsrl   r*   r@   rB   rC   rH   r;   r2   r3   r4   r5   r6   r8   r7   r0   rO   r1   re   r.   rg   rf   ra   rX   rs   r#   r#   r#   r$   r&   5   s8    
,	%r&   c                       sX   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Z‡  ZS )ÚFigureManagerGTK4a5  
    Attributes
    ----------
    canvas : `FigureCanvas`
        The FigureCanvas instance
    num : int or str
        The Figure number
    toolbar : Gtk.Box
        The toolbar
    vbox : Gtk.VBox
        The Gtk.VBox containing the canvas and toolbar
    window : Gtk.Window
        The Gtk.Window

    c           	         sR  t ƒ }t ¡ ˆ _| ˆ j¡ tƒ  ||¡ t ¡ ˆ _ˆ j 	dtj
j¡ ˆ j ˆ j¡ ˆ j ˆ j¡ ˆ j ¡ \}}ˆ  ¡ ˆ _ˆ jrOt ˆ j¡ ˆ jrOt ˆ j¡ ˆ jd urttjtjjd}| ˆ j¡ ˆ j |¡ ˆ j ¡ \}}||j7 }ˆ j ||¡ dˆ _ˆ j d‡ fdd„¡ ˆ j d‡ fdd„¡ t  ¡ r¢ˆ j !¡  ˆ j "¡  ˆ j #¡  d S )	NÚorientation)Zvscrollbar_policyFrB   c                     ó
   t  ˆ ¡S r?   ©r   rB   rp   rA   r#   r$   Ú<lambda>?  ó   
 z,FigureManagerGTK4.__init__.<locals>.<lambda>zclose-requestc                     rz   r?   r{   rp   rA   r#   r$   r|   @  r}   )$r   r   ZWindowÚwindowZ
add_windowr[   r*   ÚBoxZvboxÚset_propertyÚOrientationr:   Ú	set_childZprependÚcanvasÚget_width_heightÚ_get_toolbarÚtoolbarÚtoolmanagerr   Zadd_tools_to_managerZadd_tools_to_containerZScrolledWindowZ
PolicyTypeZNEVERÚappendÚget_preferred_sizerE   Úset_default_sizeÚ_destroyingr/   ÚmplZis_interactiveÚshowrX   rK   )	r<   rƒ   ZnumZapprn   ro   ÚswÚmin_sizeÚnat_size©Ú	__class__rA   r$   r*      s8   






zFigureManagerGTK4.__init__c                 G   s(   | j rd S d| _ | j ¡  | j ¡  d S rN   )r‹   r~   rB   rƒ   )r<   rb   r#   r#   r$   rB   G  s
   
zFigureManagerGTK4.destroyc                 C   sH   | j  ¡  | j ¡  tjd r"| j  ¡ r| j  ¡  d S t 	d¡ d S d S )Nzfigure.raise_windowz#Cannot raise window yet to be setup)
r~   r   rƒ   ra   rŒ   ÚrcParamsZget_surfaceZpresentr   Zwarn_externalrA   r#   r#   r$   r   R  s   



øzFigureManagerGTK4.showc                 C   s&   | j  ¡ s| j  ¡  d S | j  ¡  d S r?   )r~   Zis_fullscreenZ
fullscreenZunfullscreenrA   r#   r#   r$   Úfull_screen_toggle`  s   
z$FigureManagerGTK4.full_screen_togglec                 C   sD   t jd dkrt| j| jƒ}|S t jd dkrt| jƒ}|S d }|S )Nr†   Ztoolbar2r‡   )rŒ   r“   ÚNavigationToolbar2GTK4rƒ   r~   ÚToolbarGTK4r‡   )r<   r†   r#   r#   r$   r…   f  s   ü
ÿzFigureManagerGTK4._get_toolbarc                 C   s
   | j  ¡ S r?   )r~   Z	get_titlerA   r#   r#   r$   Úget_window_titleq  s   
z"FigureManagerGTK4.get_window_titlec                 C   ó   | j  |¡ d S r?   )r~   Z	set_title)r<   Útitler#   r#   r$   Úset_window_titlet  ó   z"FigureManagerGTK4.set_window_titlec                 C   sZ   t || jj ƒ}t || jj ƒ}| jr| j ¡ \}}||j7 }| j ¡ }| j ||¡ dS )zSet the canvas size in pixels.N)	Úintrƒ   rD   r†   r‰   rE   Zget_allocationr~   rŠ   )r<   rY   rE   r   r   Zcanvas_sizer#   r#   r$   r'   w  s   

zFigureManagerGTK4.resize)rt   ru   rv   Ú__doc__r*   rB   r   r”   r…   r—   rš   r'   Ú__classcell__r#   r#   r‘   r$   rx     s    'rx   c                   @   s   e Zd Zdd„ Zdd„ ZdS )r•   c           
      C   s(  || _ tj | ¡ |  d¡ i | _| jD ]Y\}}}}|d u r&|  t ¡ ¡ qtj	 
tj tt d|› d¡ƒ¡¡}|dv rAt ¡ nt ¡  | j|< }| |¡ | d¡ | d¡ | dt| |ƒ¡|_| |¡ |  |¡ qt ¡ }	|	 d¡ |	 d	¡ |  |	¡ t ¡ | _|  | j¡ t | |¡ d S )
Nr†   Zimagesú-symbolic.svg)ZzoomZpanÚflatúimage-buttonÚclickedõ   <small>Â 
Â </small>T)Úwinr   r   r*   Úadd_css_classZ_gtk_idsZ	toolitemsrˆ   Ú	SeparatorÚImageÚnew_from_giconr   ÚIconÚnew_for_stringÚstrr   Z_get_data_pathÚToggleButtonÚButtonr‚   r/   ÚgetattrZ_signal_handlerÚset_tooltip_textÚLabelÚ
set_markupr+   Úmessager
   )
r<   rƒ   r~   Ú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|| ¡ | tj tj tjd
 ¡¡¡ | ˆ j ¡ ¡ t |j d¡‡ fdd„ƒ}
| !¡  d S )NzSave the figureT)r™   Útransient_forÚactionÚmodalz	All filesÚ*z*.r   ÚformatzFile formatú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_groupedrB   Ú_save_dialogr   ZResponseTypeZACCEPTrŒ   r“   Z
get_parentZget_pathr=   ZsavefigÚ	ExceptionZMessageDialogÚget_rootZMessageTypeZERRORZButtonsTypeZOKr«   r   )Údialogr¿   ÚfileÚfmtÚparentÚeÚmsgrA   r#   r$   Úon_responseÒ  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   )r<   rb   rÄ   ZffÚformatsZdefault_formatÚiÚnameZfmtsrÆ   rÊ   r#   rA   r$   Úsave_figure­  sL   ü



ÿ


€ÿ
ÿz"NavigationToolbar2GTK4.save_figureN)rt   ru   rv   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 )r–   rŸ   c                 C   sŠ   t  | |¡ tj | ¡ |  dtjj¡ t ¡ | _|  | j¡ i | _	i | _
t ¡ }| d¡ | d¡ |  |¡ t ¡ | _|  | j¡ d S )Nry   r£   T)r   r*   r   r   r€   r   Z
HORIZONTALÚ	_tool_boxrˆ   Ú_groupsÚ
_toolitemsr°   r±   r+   Ú_message)r<   r‡   r¸   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­   Ú	set_labelr¥   r§   r¨   r   r©   rª   r‚   Ú_add_buttonr/   Ú
_call_toolr¯   rØ   Ú
setdefaultrˆ   )
r<   rÔ   Ú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)r<   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è   )r<   r·   rß   rà   Z	group_boxr#   r#   r$   rÜ   '  s   


ÿzToolbarGTK4._add_buttonc                 C   s   |   |¡ d S r?   )Ztrigger_tool)r<   ZbtnrÔ   r#   r#   r$   rÝ   1  rV   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)r<   rÔ   ZtoggledÚtoolitemrâ   r#   r#   r$   Útoggle_toolitem4  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)r<   rÔ   rß   rê   Z_signalr#   r#   r$   Úremove_toolitem<  s   

€þzToolbarGTK4.remove_toolitemc                 C   s(   t  ¡ }| dt jj¡ | j |¡ d S )Nry   )r   r¦   r€   r   r:   rÖ   rˆ   )r<   Úsepr#   r#   r$   ré   G  s   zToolbarGTK4._add_separatorc                 C   r˜   r?   )rÙ   rÛ   )r<   Úsr#   r#   r$   Úset_messageL  r›   zToolbarGTK4.set_messageN)rt   ru   rv   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                    s   G ‡ fdd„dƒ}t  |ƒ ¡S )Nc                       s   e Zd Z” jjZdS )z-SaveFigureGTK4.trigger.<locals>.PseudoToolbarN)rt   ru   rv   r=   rƒ   r#   rA   r#   r$   ÚPseudoToolbarS  ó    ró   )r•   rÕ   )r<   rb   rc   ró   r#   rA   r$   ÚtriggerQ  s   zSaveFigureGTK4.triggerN©rt   ru   rv   rõ   r#   r#   r#   r$   rò   P  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_lockr\   c                 S   s   g | ]}d | d ‘qS )ú<ú>r#   )rj   Úmodr#   r#   r$   Ú
<listcomp>h  s    z0HelpGTK4._normalize_shortcut.<locals>.<listcomp>NrÚ   r   z<shift>Ú )ÚsplitÚlenÚ
capitalizeÚisupperÚjoin)r<   r>   ZspecialÚpartsZmodsr#   r#   r$   Ú_normalize_shortcutZ  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)r<   r>   r#   r#   r$   Ú_is_valid_shortcutt  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  )rj   r>   rA   r#   r$   rk   ‘  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ShortcutsShortcutr  Zget_tool_keymaprÔ   ZShortcutsWindowZ_figurerƒ   rÃ   r‚   r   )	r<   rb   ÚsectionrÔ   Ztoolrß   rç   Zshortcutr~   r#   rA   r$   rõ   }  s4   

þ
þú
ý
zHelpGTK4.triggerN)rt   ru   rv   r  r  rõ   r#   r#   r#   r$   r÷   Y  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é   é   )ÚioÚBytesIOrƒ   Z
print_rgbar„   r   ZPixbufZnew_from_dataÚ	getbufferZ
ColorspaceZRGBZget_clipboardÚset)r<   rb   rc   Úfrn   ro   ZpbZ	clipboardr#   r#   r$   rõ   £  s   
þý
zToolCopyToClipboardGTK4.triggerNrö   r#   r#   r#   r$   r	  ¢  rô   r	  c                   @   s   e Zd ZeZeZdS )Ú_BackendGTK4N)rt   ru   rv   r&   ZFigureCanvasrx   ZFigureManagerr#   r#   r#   r$   r  ·  s    r  )HrÐ   r  rÍ   Zpathlibr   ÚsysZ
matplotlibrŒ   r   r   r   Zmatplotlib._pylab_helpersr   Zmatplotlib.backend_basesr   r   r	   r
   r   r   Zmatplotlib.backend_toolsr   Zmatplotlib.figurer   Zmatplotlib.widgetsr   ZgiÚImportErrorÚerrZrequire_versionÚ
ValueErrorrÈ   Zgi.repositoryr   r   r   r   r   r   Z_backend_gtkr   r   r   r   r   r   rw   r   ZConfigureSubplotsGTK4r   ZRubberbandGTK4r%   ZDrawingArear&   rx   r   r•   r–   ZSaveFigureBaserò   ZToolHelpBaser÷   ZToolCopyToClipboardBaser	  ZToolSaveFigureZToolConfigureSubplotsZToolRubberbandZToolHelpZToolCopyToClipboardZToolbarZexportr  r#   r#   r#   r$   Ú<module>   sV     
€ÿ€ý (	 \rjd	I