o
    liAY                  
   @   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yK Z zededZ[ww zedd W n eye 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% 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!   ^/home/ubuntu/SoloSpeech/.venv/lib/python3.10/site-packages/matplotlib/backends/backend_gtk3.py<lambda>)      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&   window_iconr!   r!   r!   r"   r   &   s    
r   c                 C   s   t jt j t| S N)r   Cursornew_from_nameDisplayget_defaultr   mpl_to_gtk_cursor_name)
mpl_cursorr!   r!   r"   _mpl_to_gtk_cursor0   s   r6   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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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 )5FigureCanvasGTK3gtk3c                 C   s   t S r/   )FigureManagerGTK3)clsr!   r!   r"   r#   9   s    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connectr<   r=   r>   r?   _update_device_pixel_ratioon_draw_event
_post_drawrA   rB   rC   rD   rE   rF   
set_events	__class__
event_maskset_can_focusr   CssProviderload_from_dataget_style_contextadd_provider#STYLE_PROVIDER_PRIORITY_APPLICATION	add_class)r    r;   css	style_ctxrP   r!   r"   rH   F   s0   

zFigureCanvasGTK3.__init__c                 C   s   t d|   d S )Nclose_event)r   _processr   r!   r!   r"   destroye   r$   zFigureCanvasGTK3.destroyc                 C   s<   |  d}|d ur|t| tj }|d d S d S )NwindowT)get_property
set_cursorr6   r   MainContextdefault	iteration)r    cursorr_   contextr!   r!   r"   ra   h   s   

zFigureCanvasGTK3.set_cursorc                 C   sd   |du r|   }||   \}}}}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_windowget_device_positionget_displayget_device_managerget_client_pointerxydevice_pixel_ratior;   bboxheight)r    eventr_   trl   rm   stater!   r!   r"   _mpl_coordsp   s   
zFigureCanvasGTK3._mpl_coordsc                 C   sH   |j tjjkr	dnd}td| g| |R || |j|d  dS )Nr   r<   )step	modifiersguiEventF)		directionr   ScrollDirectionUPr
   rt   _mpl_modifiersrs   r]   )r    widgetrq   rv   r!   r!   r"   r<      s   
zFigureCanvasGTK3.scroll_eventc                 C   6   t d| g| ||jR | |j|d  dS )Nr=   rw   rx   Fr
   rt   buttonr|   rs   r]   r    r}   rq   r!   r!   r"   r=         
z#FigureCanvasGTK3.button_press_eventc                 C   r~   )Nr>   r   Fr   r   r!   r!   r"   r>      r   z%FigureCanvasGTK3.button_release_eventc                 C   ,   t d| | |g|  R d|i  dS )NrA   rx   Tr   _get_keyrt   r]   r   r!   r!   r"   rA         z FigureCanvasGTK3.key_press_eventc                 C   r   )NrB   rx   Tr   r   r!   r!   r"   rB      r   z"FigureCanvasGTK3.key_release_eventc                 C   s0   t d| g| |R | |j|d  dS )NrC   r   F)r
   rt   r|   rs   r]   r   r!   r!   r"   rC      s   
z$FigureCanvasGTK3.motion_notify_eventc                 C   B   t j|   }td| g| |R | ||d  d S )Nfigure_enter_eventr   	r   Keymapget_for_displayri   get_modifier_stater	   rt   r|   r]   r    r}   rq   gtk_modsr!   r!   r"   rD         
z#FigureCanvasGTK3.enter_notify_eventc                 C   r   )Nfigure_leave_eventr   r   r   r!   r!   r"   rE      r   z#FigureCanvasGTK3.leave_notify_eventc                 C   sT   | j j}|j| j | }|j| j | }| j j||dd td|   |   d S )NFforwardresize_event)	r;   dpiwidthrn   rp   set_size_inchesr   r]   	draw_idle)r    r}   
allocationdpivalwinchhinchr!   r!   r"   rF      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 )NctrlcontrolaltshiftrG   c                    s&   g | ]\}}}|kr |@ r|qS r!   r!   ).0namemaskkeyevent_stater   r!   r"   
<listcomp>   s    z3FigureCanvasGTK3._mpl_modifiers.<locals>.<listcomp>)r   ModifierTypeCONTROL_MASK	MOD1_MASK
SHIFT_MASK	MOD4_MASK)r   r   rw   r!   r   r"   r|      s   zFigureCanvasGTK3._mpl_modifiersc                 C   s`   t t|j}t|t|j}| j|j|d}d|v r'|	 r'|
d dg ||S )Nr   r   +)chrr   keyval_to_unicodekeyvalr   _unikey_or_keysym_to_mplkeykeyval_namer|   rs   isprintableremovejoin)r    rq   unikeyr   modsr!   r!   r"   r      s   
zFigureCanvasGTK3._get_keyc                 O   s&   |  |  r|   |   d S d S r/   )_set_device_pixel_ratioget_scale_factorqueue_resize
queue_drawr    argskwargsr!   r!   r"   rL      s   z+FigureCanvasGTK3._update_device_pixel_ratioc                 C   sd   | dd u r	d S |j| j }|j| j }|dk s|dk rd S | jj}| jj|| || dd dS )Nr_      Fr   )r`   r   rn   rp   r;   r   r   )r    r}   rq   whr   r!   r!   r"   r?      s   z FigureCanvasGTK3.configure_eventc                 C   s   || _ |   d S r/   )rJ   r   )r    rectr!   r!   r"   _draw_rubberband   s   z!FigureCanvasGTK3._draw_rubberbandc           	         s    j d u 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/   )rn   )r   dimr   r!   r"   	<genexpr>   s    z.FigureCanvasGTK3._post_draw.<locals>.<genexpr>r   )r   r   r   r   )	rJ   move_toline_toset_antialiasset_line_widthset_dashset_source_rgbstroke_preservestroke)	r    r}   ctxx0y0r   r   x1y1r!   r   r"   rN      s.   



zFigureCanvasGTK3._post_drawc                 C   s   d S r/   r!   )r    r}   r   r!   r!   r"   rM     s   zFigureCanvasGTK3.on_draw_eventc                 C   s   |   r
|   d S d S r/   )is_drawabler   r   r!   r!   r"   r@     s   zFigureCanvasGTK3.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@   rI   )r   r   r!   r"   	idle_draw  s
   
z-FigureCanvasGTK3.draw_idle.<locals>.idle_draw)rI   r   idle_add)r    r   r!   r   r"   r     s   
zFigureCanvasGTK3.draw_idlec                 C   s,   t j }| r|d | s	d S d S )NT)r   rb   rc   pendingrd   )r    rf   r!   r!   r"   flush_events&  s   

zFigureCanvasGTK3.flush_eventsr/   ),r)   r*   r+   required_interactive_frameworkr   classpropertymanager_classr   	EventMaskBUTTON_PRESS_MASKBUTTON_RELEASE_MASKEXPOSURE_MASKKEY_PRESS_MASKKEY_RELEASE_MASKENTER_NOTIFY_MASKLEAVE_NOTIFY_MASKPOINTER_MOTION_MASKSCROLL_MASKrQ   rH   r^   ra   rt   r<   r=   r>   rA   rB   rC   rD   rE   rF   staticmethodr|   r   rL   r?   r   rN   rM   r@   r   r   __classcell__r!   r!   r[   r"   r7   7   sX    


	
r7   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   r_   Nc                 C   sl  || _ tj|  | tjj i | _| jD ]Y\}}}}|d u r)| 	t
 d qtjtjttd| dtjj}|dv rGt nt  | j|< }|| || |dt| ||_|| | 	|d qt }	| 	|	d t }
|
d |	 d |	!|
 t }	| 	|	d t | _"| j"#tj$j% |	!| j" | &  t'| | d S )Nru   r%   -symbolic.svg)zoompanclickedu   <small> 
 </small>T)(_winr   rH   	set_styler   ToolbarStyleICONS_gtk_ids	toolitemsinsertSeparatorToolItemImagenew_from_giconr   Iconnew_for_stringr'   r   r(   IconSizeLARGE_TOOLBARToggleToolButton
ToolButton	set_labelset_icon_widgetrK   getattr_signal_handlerset_tooltip_textToolItemLabel
set_markup
set_expandaddmessageset_justifyJustificationRIGHTshow_allr   )r    canvasr_   texttooltip_text
image_filecallbackimager   toolitemlabelr!   r!   r"   rH   .  sR   






zNavigationToolbar2GTK3.__init__c                 C   s   | j S r/   )r   r   r!   r!   r"   r#   `  s    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 ]+\}}t  }|| |D ]
}|d|  q. | j |v rJ | qt jd fdd} tjd   j   d   }  }  }j |  d	 }    |t jj
krd S tjd rt!j"#|tjd< zjj$j%||d
 W d S  t&y }	 z!t j'j t(|	t j)j*t j+j
d        W Y d }	~	d S d }	~	ww )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   get_current_namewith_suffix)r   r   fmtdialogr    r!   r"   on_notify_filtert  s
   z<NavigationToolbar2GTK3.save_figure.<locals>.on_notify_filterzsavefig.directoryTr   )format)r  message_formattyper  ),r   FileChooserDialogr  get_toplevelFileChooserActionSAVESTOCK_CANCELResponseTypeCANCEL
STOCK_SAVEOKr  items
FileFilterset_nameadd_pattern
add_filterget_default_filetype
set_filter	functoolspartialrK   set_current_foldermplrcParamsr  get_default_filenameset_do_overwrite_confirmationrunget_filenamer  r  r^   ospathdirnamer;   savefig	ExceptionMessageDialogr'   MessageTypeERRORButtonsType)
r    r   r   fmtsffr   r#  responsefnameer!   r!  r"   save_figureb  sV   







z"NavigationToolbar2GTK3.save_figurer/   )
r)   r*   r+   r   delete_parameterrH   r,   r-   winrN  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   rH   r   Boxset_propertyOrientation
HORIZONTALr  _messager	  r
  r  pack_endr  _groups
_toolitems)r    toolmanagerr!   r!   r"   rH     s   

zToolbarGTK3.__init__c           
      C   s   |rt  }nt  }|| |d ur&t jtj|t j	j
}|| |d u r,d}| ||| |d| j|}	|| |  | j|g  | j| ||	f d S )Nru   r   )r   r   r   r   r   r   r   r   r   r   r   r   _add_buttonrK   
_call_toolr  r  rZ  
setdefaultappend)
r    r   grouppositionr  descriptiontoggler   r  signalr!   r!   r"   add_toolitem  s$   




zToolbarGTK3.add_toolitemc                 C   sf   || j vr(| j r|   t }|tjj | |ddd |  || j |< | j | 	|| d S )NFr   )
rY  _add_separatorr   Toolbarr   r   r   
pack_startr  r   )r    r   r`  ra  toolbarr!   r!   r"   r\    s   

zToolbarGTK3._add_buttonc                 C   s   |  | d S r/   )trigger_tool)r    btnr   r!   r!   r"   r]    s   zToolbarGTK3._call_toolc                 C   sD   || j vrd S | j | D ]\}}|| || || qd S r/   )rZ  handler_block
set_activehandler_unblock)r    r   toggledr  rd  r!   r!   r"   toggle_toolitem  s   


zToolbarGTK3.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)rZ  r[  message_eventrY  r   )r    r   r`  r  _signalr!   r!   r"   remove_toolitem  s   

zToolbarGTK3.remove_toolitemc                 C   s4   t  }|dt jj | |ddd |  d S )NrR  FTr   )r   	SeparatorrT  rU  VERTICALrh  r  )r    sepr!   r!   r"   rf    s   zToolbarGTK3._add_separatorc                 C   s   | j | d S r/   )rW  r   )r    sr!   r!   r"   set_message  s   zToolbarGTK3.set_messageN)r)   r*   r+   _icon_extensionrH   re  r\  r]  rp  rs  rf  rx  r!   r!   r!   r"   rQ    s    rQ  c                   @      e Zd Zdd ZdS )SaveFigureGTK3c                 O   s   t |   d S r/   )r   rN  "_make_classic_style_pseudo_toolbarr   r!   r!   r"   trigger  s   zSaveFigureGTK3.triggerNr)   r*   r+   r}  r!   r!   r!   r"   r{        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
 }||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 `FigureCanvasGTK3._get_key`.
        	BackSpace	Page_DownPage_UpScroll_Lock)	backspacepagedownpageupscroll_lockr   c                 S   s   g | ]}d | d qS )<>r!   )r   modr!   r!   r"   r     s    z0HelpGTK3._normalize_shortcut.<locals>.<listcomp>Nru   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|v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 ]6\}}|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)set_visible)r}   datar!   r!   r"   r#     s   
 z1HelpGTK3._show_shortcuts_window.<locals>.<lambda> c                 3   s$    | ]}  |r |V  qd S r/   )r  r  )r   r   r   r!   r"   r   !  s    
z2HelpGTK3._show_shortcuts_window.<locals>.<genexpr>)acceleratorr  subtitleHelpT)r  modaltransient_for)r   ShortcutsSectionsortedr[  toolsr0  rb  ShortcutsGroupr  forallShortcutsShortcutr   get_tool_keymapr   ShortcutsWindow_figurer  r(  showr  )r    sectionr   toolr`  shortcutr_   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   rE  r  r  r(  rF  INFOrH  r/  _get_help_textr>  r^   )r    r"  r!   r!   r"   _show_shortcuts_dialog2  s   
zHelpGTK3._show_shortcuts_dialogc                 G   s*   t dddd u r|   d S |   d S )Nr      r   )r   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                   @   rz  )ToolCopyToClipboardGTK3c           
      O   sH   t jtj}| j }| \}}}}t|||||}	|	|	 d S r/   )
r   	Clipboardgetr   SELECTION_CLIPBOARDr  rg   get_geometrypixbuf_get_from_window	set_image)
r    r   r   	clipboardr_   rl   rm   r   rp   pbr!   r!   r"   r}  C  s
   
zToolCopyToClipboardGTK3.triggerNr~  r!   r!   r!   r"   r  A  r  r  r   c                 C   sd   |d ur|  }| sd }t| tsdtt| } tj|tjj	tj
j| d}|  |  d S )N,)r  r&  r  r%  )r(  is_toplevel
isinstancer'   r   mapr   rE  rF  rG  rH  r/  r>  r^   )msgr  r"  r!   r!   r"   error_msg_gtkK  s   
r  c                   @      e Zd ZeZeZdS )r9   N)r)   r*   r+   r   _toolbar2_classrQ  _toolmanager_toolbar_classr!   r!   r!   r"   r9   a  s    r9   c                   @   r  )_BackendGTK3N)r)   r*   r+   r7   FigureCanvasr9   FigureManagerr!   r!   r!   r"   r  f  s    r  r/   )Ar7  loggingr@  pathlibr   r   
matplotlibr:  r   r   r   matplotlib.backend_basesr   r   r   r	   r
   r   giImportErrorerrrequire_version
ValueErrorrM  gi.repositoryr   r   r   r   r   r   r   r   r   r   r   r   	TimerGTK3	getLoggerr)   _logcaching_module_getattrr   	lru_cacher6   DrawingArear7   rg  r   rS  rQ  _register_tool_classSaveFigureBaser{  ToolHelpBaser  ToolCopyToClipboardBaser  r,   r  ConfigureSubplotsGTKRubberbandGTKr9   exportr  r!   r!   r!   r"   <module>   sd     


	
 wfQU	