o
    liT                  
   @   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FigureCanvasGTK4gtk4Fc                 C   s   t S N)FigureManagerGTK4)cls r   ^/home/ubuntu/SoloSpeech/.venv/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   resizeznotify::scale-factorpressedreleasedzkey-pressedzkey-releasedmotionenterleavescrollz/.matplotlib-canvas { background-color: white; }   	      zutf-8zmatplotlib-canvas)&super__init__set_hexpandset_vexpand_idle_draw_id_rubberband_rectset_draw_func
_draw_funcconnectresize_event_update_device_pixel_ratior   GestureClick
set_buttonbutton_press_eventbutton_release_eventadd_controllerEventControllerKeykey_press_eventkey_release_eventEventControllerMotionmotion_notify_evententer_notify_eventleave_notify_eventEventControllerScrollnewEventControllerScrollFlagsVERTICALscroll_eventset_focusableCssProvidercheck_versionload_from_dataencodeget_style_contextadd_provider#STYLE_PROVIDER_PRIORITY_APPLICATION	add_class)	selfr   clickkeyr#   r&   cssstyle	style_ctx	__class__r   r   r,   '   sH   







zFigureCanvasGTK4.__init__c                 C   s   t d|   d S )Nclose_event)r
   _processrP   r   r   r   destroyV   s   zFigureCanvasGTK4.destroyc                 C   s   |  t| d S r   )set_cursor_from_namer   mpl_to_gtk_cursor_name)rP   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   bboxheight)rP   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 )NrF   )step	modifiersTr   ro   _mpl_modifiersrY   )rP   
controllerdxdyr   r   r   rF   s   s   zFigureCanvasGTK4.scroll_eventc                 C   s@   t d| g| ||f| R d| |i  |   d S )Nr8   rq   )r   ro   get_current_buttonrs   rY   
grab_focusrP   rt   n_pressrl   rm   r   r   r   r8   z   s   z#FigureCanvasGTK4.button_press_eventc                 C   s8   t d| g| ||f| R d| |i  d S )Nr9   rq   )r   ro   rw   rs   rY   ry   r   r   r   r9      s   
z%FigureCanvasGTK4.button_release_eventc                 C   *   t d| | |||g|  R    dS )Nr<   Tr   _get_keyro   rY   rP   rt   keyvalkeycodestater   r   r   r<         z FigureCanvasGTK4.key_press_eventc                 C   r{   )Nr=   Tr|   r~   r   r   r   r=      r   z"FigureCanvasGTK4.key_release_eventc                 C   s0   t d| g| ||fR d| |i  d S )Nr?   rq   rr   rP   rt   rl   rm   r   r   r   r?      s   
z$FigureCanvasGTK4.motion_notify_eventc                 C   s.   t d| g| ||fR d|  i  d S )Nfigure_enter_eventrq   r   ro   rs   rY   r   r   r   r   r@      s   
z#FigureCanvasGTK4.enter_notify_eventc                 C   s(   t d| g|  R d|  i  d S )Nfigure_leave_eventrq   r   )rP   rt   r   r   r   rA      s   
z#FigureCanvasGTK4.leave_notify_eventc                 C   sX   |    | jj}|| j | }|| j | }| jj||dd td|   |   d S )NF)forwardr4   )r5   r   dpirf   set_size_inchesr	   rY   	draw_idle)rP   areawidthrh   r   winchhinchr   r   r   r4      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namern   event_stater   r   
<listcomp>   s    z3FigureCanvasGTK4._mpl_modifiers.<locals>.<listcomp>)r`   ra   rb   rc   rd   re   get_current_event_stater   ModifierTypeCONTROL_MASKALT_MASK
SHIFT_MASK
SUPER_MASK)rP   rt   rj   rk   rl   rm   	mod_tabler   r   r   rs      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 )	Nr   controlr   r   r+   c                    s6   g | ]\}}}| kr|@ r|d kr  s|qS )r   )isprintable)r   modrn   mod_keyrR   r   unikeyr   r   r      s    z-FigureCanvasGTK4._get_key.<locals>.<listcomp>+)chrr   keyval_to_unicoder   _unikey_or_keysym_to_mplkeykeyval_namer   r   r   r   r   join)rP   r   r   r   rq   modsr   r   r   r}      s   zFigureCanvasGTK4._get_keyc                 O   s   |  |  r|   d S d S r   )_set_device_pixel_ratioget_scale_factordrawrP   argskwargsr   r   r   r5      s   z+FigureCanvasGTK4._update_device_pixel_ratioc                 C   s   || _ |   d S r   )r0   
queue_draw)rP   rectr   r   r   _draw_rubberband   s   z!FigureCanvasGTK4._draw_rubberbandc                 C   s   |  | | | | | d S r   )on_draw_event
_post_draw)rP   drawing_areactxr   rh   r   r   r   r2      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   )rf   )r   dimrZ   r   r   	<genexpr>   s    z.FigureCanvasGTK4._post_draw.<locals>.<genexpr>r   )r0   _context_is_scaledrf   move_toline_toset_antialiasset_line_widthset_dashset_source_rgbstroke_preservestroke)rP   widgetr   lwdashx0y0whx1y1r   rZ   r   r      s:   





zFigureCanvasGTK4._post_drawc                 C   s   d S r   r   )rP   r   r   r   r   r   r     s   zFigureCanvasGTK4.on_draw_eventc                 C   s   |   r
|   d S d S r   )is_drawabler   rZ   r   r   r   r   
  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)r   r/   )r   rZ   r   r   	idle_draw  s
   
z-FigureCanvasGTK4.draw_idle.<locals>.idle_draw)r/   r   idle_add)rP   r   r   rZ   r   r     s   
zFigureCanvasGTK4.draw_idlec                 C   s,   t j }| r|d | s	d S d S )NT)r   MainContextdefaultpending	iteration)rP   contextr   r   r   flush_events  s   

zFigureCanvasGTK4.flush_eventsr   )!__name__
__module____qualname__required_interactive_frameworksupports_blitr   classpropertymanager_classr   r,   r[   r_   ro   rF   r8   r9   r<   r=   r?   r@   rA   r4   rs   r}   r5   r   r2   r   r   r   r   r   __classcell__r   r   rV   r   r   !   s8    /

	%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 )NavigationToolbar2GTK4z3.6windowNc           
      C   s8  || _ 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jj | | j t| | d S )
Ntoolbarimages-symbolic.svg)zoompanflatimage-buttonclicked   <small> 
 </small>T) _winr   Boxr,   add_css_class_gtk_ids	toolitemsappend	SeparatorImagenew_from_giconr   Iconnew_for_stringstrr   _get_data_pathToggleButtonButton	set_childr3   getattr_signal_handlerset_tooltip_textLabel
set_markupr-   messageset_justifyJustificationRIGHTr   )
rP   canvasr   texttooltip_text
image_filecallbackimagebuttonlabelr   r   r   r,   #  sH   








zNavigationToolbar2GTK4.__init__c                 C   s   | j S r   )r   rZ   r   r   r   r   O  s    zNavigationToolbar2GTK4.<lambda>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)title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
  message_typebuttonsr  r  )get_file
get_choicer  get_supported_filetypes_groupedr[   _save_dialogr   ResponseTypeACCEPTmplrcParams
get_parentget_pathr   savefig	ExceptionMessageDialogget_rootMessageTypeERRORButtonsTypeOKr   show)dialogr  filefmtparentemsgrZ   r   r   on_responsev  s,   

z7NavigationToolbar2GTK4.save_figure.<locals>.on_response)"r   FileChooserNativer  r   FileChooserActionSAVEr  
FileFilterset_nameadd_pattern
add_filter
set_filter	enumerater  itemsr   get_default_filetype
add_choice
set_choiceset_current_folderr   Filenew_for_pathospath
expanduserr  r  set_current_nameget_default_filename	functoolspartialr3   r%  )rP   r   r&  ffformatsdefault_formatir   fmtsr(  r,  r   rZ   r   save_figureQ  sL   







z"NavigationToolbar2GTK4.save_figurer   )
r   r   r   r   delete_parameterr,   
deprecatedpropertywinrI  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Orientation
HORIZONTAL	_tool_boxr   _groups
_toolitemsr   r   r-   _messager   r   r   )rP   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_buttonr3   
_call_toolr   rU  
setdefaultr   )
rP   r   grouppositionr  description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   )rT  get_first_childr   get_next_sibling)rP   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   )rT  _add_separatorr   r   rS  r   insert_child_afterrf  )rP   r  r\  r]  	group_boxr   r   r   rY    s   


zToolbarGTK4._add_buttonc                 C   s   |  | d S r   )trigger_tool)rP   btnr   r   r   r   rZ    s   zToolbarGTK4._call_toolc                 C   sD   || j vrd S | j | D ]\}}|| || || qd S r   )rU  handler_block
set_activehandler_unblock)rP   r   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)rU  rW  message_eventrT  remove)rP   r   r\  rp  _signalr   r   r   remove_toolitem  s   

zToolbarGTK4.remove_toolitemc                 C   s(   t  }|dt jj | j| d S )NrO  )r   r   rP  rQ  rE   rS  r   )rP   sepr   r   r   rg    s   zToolbarGTK4._add_separatorc                 C   s   | j | d S r   )rV  rX  )rP   sr   r   r   set_message  s   zToolbarGTK4.set_messageN)r   r   r   _icon_extensionr,   ra  rf  rY  rZ  rq  ru  rg  rx  r   r   r   r   rN    s    
rN  c                   @      e Zd Zdd ZdS )SaveFigureGTK4c                 O   s   t |   d S r   )r   rI  "_make_classic_style_pseudo_toolbarr   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`.
        	BackSpace	Page_DownPage_UpScroll_Lock)	backspacepagedownpageupscroll_lockr   c                 S   s   g | ]}d | d qS )<>r   )r   r   r   r   r   r     s    z0HelpGTK4._normalize_shortcut.<locals>.<listcomp>Nr*   r   z<shift> )splitlen
capitalizeisupperr   )rP   rR   specialpartsr   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)rP   rR   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  )r   rR   rZ   r   r   r   5  s    
z#HelpGTK4.trigger.<locals>.<genexpr>)acceleratorr	  subtitleHelpT)r	  r  r
  )r   ShortcutsSectionsortedrW  toolsr6  r^  ShortcutsGroupr   rb  set_visiblerc  ShortcutsShortcutr   get_tool_keymapr   ShortcutsWindow_figurer  r   r   r%  )	rP   r   sectionr   toolr\  re  shortcutr   r   rZ   r   r}  !  s4   




zHelpGTK4.triggerN)r   r   r   r  r  r}  r   r   r   r   r    s    	r  c                   @   rz  )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  
print_rgbaget_width_heightr   Pixbufnew_from_data	getbuffer
ColorspaceRGBget_clipboardset)rP   r   r   fr   r   pb	clipboardr   r   r   r}  H  s   

zToolCopyToClipboardGTK4.triggerNr~  r   r   r   r   r  F  r  r  c                   @      e Zd ZeZeZdS )r   N)r   r   r   r   _toolbar2_classrN  _toolmanager_toolbar_classr   r   r   r   r   Z  s    r   c                   @   r  )_BackendGTK4N)r   r   r   r   FigureCanvasr   FigureManagerr   r   r   r   r  _  s    r  )5rB  r  r=  
matplotlibr  r   r   r   matplotlib.backend_basesr   r   r   r   r	   r
   giImportErrorerrrequire_version
ValueErrorr*  gi.repositoryr   r   r   r   r   r  r   r   r   r   r   r   	TimerGTK4DrawingArear   r   r   rN  _register_tool_classSaveFigureBaser{  ToolHelpBaser  ToolCopyToClipboardBaser  ConfigureSubplotsGTKRubberbandGTKToolbarr   exportr  r   r   r   r   <module>   sT     

  neI