o
    tBh>_                  
   @   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movepointerdefault	crosshairwaitz	ew-resizez	ns-resize)cursor)
r   check_getitemr   MOVEHANDPOINTERSELECT_REGIONWAITRESIZE_HORIZONTALRESIZE_VERTICAL)
mpl_cursor r.   w/var/www/html/riverr-enterprise-integrations-main/venv/lib/python3.10/site-packages/matplotlib/backends/backend_gtk4.py_mpl_to_gtk_cursor)   s   r0   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FigureCanvasGTK4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-factorpressedreleasedzkey-pressedzkey-releasedmotionenterleavescrolls/   .matplotlib-canvas { background-color: white; }zmatplotlib-canvas)&r   __init__r   set_hexpandset_vexpand_idle_draw_id_lastCursor_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load_from_dataget_style_contextadd_provider#STYLE_PROVIDER_PRIORITY_APPLICATION	add_class)selffigureclickkeyr6   r9   css	style_ctxr.   r.   r/   r:   ;   sF   








zFigureCanvasGTK4.__init__c                 C   s   t | | d S N)r   pick)r]   
mouseeventr.   r.   r/   rd   g   s   zFigureCanvasGTK4.pickc                 C   s   |    d S rc   )close_eventr]   r.   r.   r/   destroyl   s   zFigureCanvasGTK4.destroyc                 C   s   |  t| d S rc   )set_cursor_from_namer0   )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^   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   rU   )r]   
controllerdxdyr.   r.   r/   rU      s   zFigureCanvasGTK4.scroll_eventc                 C   s0   |  ||\}}t| |||  |   d S rc   )rp   r   rG   get_current_button
grab_focusr]   rq   n_pressrn   ro   r.   r.   r/   rG      s
   
z#FigureCanvasGTK4.button_press_eventc                 C   s(   |  ||\}}t| |||  d S rc   )rp   r   rH   rt   rv   r.   r.   r/   rH      s   
z%FigureCanvasGTK4.button_release_eventc                 C      |  |||}t| | dS NT)_get_keyr   rK   r]   rq   keyvalkeycodestater`   r.   r.   r/   rK         z FigureCanvasGTK4.key_press_eventc                 C   rx   ry   )rz   r   rL   r{   r.   r.   r/   rL      r   z"FigureCanvasGTK4.key_release_eventc                 C   s"   |  ||\}}t| || d S rc   )rp   r   rN   r]   rq   rn   ro   r.   r.   r/   rN      s   z$FigureCanvasGTK4.motion_notify_eventc                 C   s   t |  d S rc   )r   rP   )r]   rq   r.   r.   r/   rP         z#FigureCanvasGTK4.leave_notify_eventc                 C   s&   |  ||\}}tj| ||fd d S )N)xy)rp   r   rO   r   r.   r.   r/   rO      s   z#FigureCanvasGTK4.enter_notify_eventc                 C   sT   |    | jj}|| j | }|| j | }| jj||dd t|  |   d S )NF)forward)rD   r^   dpirk   set_size_inchesr   rC   	draw_idle)r]   areawidthrm   r   winchhinchr.   r.   r/   rC      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 )Nctrlaltshiftsuper+)chrr   keyval_to_unicoder   _unikey_or_keysym_to_mplkeykeyval_nameModifierTypeCONTROL_MASKALT_MASK
SHIFT_MASK
SUPER_MASKisprintable)	r]   r|   r}   r~   unikeyr`   	modifierskey_maskprefixr.   r.   r/   rz      s    



zFigureCanvasGTK4._get_keyc                 O   s   |  |  r|   d S d S rc   )_set_device_pixel_ratioget_scale_factordraw)r]   argskwargsr.   r.   r/   rD      s   z+FigureCanvasGTK4._update_device_pixel_ratioc                 C   s   || _ |   d S rc   )r?   
queue_draw)r]   rectr.   r.   r/   _draw_rubberband   s   z!FigureCanvasGTK4._draw_rubberbandc                 C   s   |  | | | | | d S rc   )on_draw_event
_post_draw)r]   drawing_areactxr   rm   r.   r.   r/   rA      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 rc   )rk   ).0dimrg   r.   r/   	<genexpr>   s    z.FigureCanvasGTK4._post_draw.<locals>.<genexpr>r   )r?   _context_is_scaledrk   move_toline_toset_antialiasset_line_widthset_dashset_source_rgbstroke_preservestroke)r]   widgetr   lwdashx0y0whx1y1r.   rg   r/   r      s:   





zFigureCanvasGTK4._post_drawc                 C   s   d S rc   r.   )r]   r   r   r.   r.   r/   r      s   zFigureCanvasGTK4.on_draw_eventc                 C   s   |   r
|   d S d S rc   )is_drawabler   rg   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   rg   r.   r/   	idle_draw  s
   
z-FigureCanvasGTK4.draw_idle.<locals>.idle_draw)r=   r   idle_add)r]   r   r.   rg   r/   r      s   
zFigureCanvasGTK4.draw_idlec                 C   s,   t j }| r|d | s	d S d S ry   )r   MainContextr!   pending	iteration)r]   contextr.   r.   r/   flush_events	  s   

zFigureCanvasGTK4.flush_eventsrc   )__name__
__module____qualname__required_interactive_frameworksupports_blit	TimerGTK4
_timer_clsr   r:   rd   rh   rj   rp   rU   rG   rH   rK   rL   rN   rP   rO   rC   rz   rD   r   rA   r   r   r   r   r   r.   r.   r.   r/   r1   5   s8    
,	%r1   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)vscrollbar_policyFrh   c                     
   t  S rc   r   rh   r   rg   r.   r/   <lambda>?     
 z,FigureManagerGTK4.__init__.<locals>.<lambda>zclose-requestc                     r   rc   r   r   rg   r.   r/   r   @  r   )$r   r   Windowwindow
add_windowr   r:   Boxvboxset_propertyOrientationrT   	set_childprependcanvasget_width_height_get_toolbartoolbartoolmanagerr   add_tools_to_manageradd_tools_to_containerScrolledWindow
PolicyTypeNEVERappendget_preferred_sizerm   set_default_size_destroyingrB   mplis_interactiveshowr   ru   )	r]   r   numappr   r   swmin_sizenat_size	__class__rg   r/   r:      s8   






zFigureManagerGTK4.__init__c                 G   s(   | j rd S d| _ | j  | j  d S ry   )r   r   rh   r   )r]   r   r.   r.   r/   rh   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   r   r   rcParamsget_surfacepresentr   warn_externalrg   r.   r.   r/   r   R  s   



zFigureManagerGTK4.showc                 C   s&   | j  s| j   d S | j   d S rc   )r   is_fullscreen
fullscreenunfullscreenrg   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   toolbar2r   )r   r   NavigationToolbar2GTK4r   r   ToolbarGTK4r   )r]   r   r.   r.   r/   r   f  s   
zFigureManagerGTK4._get_toolbarc                 C   s
   | j  S rc   )r   	get_titlerg   r.   r.   r/   get_window_titleq  s   
z"FigureManagerGTK4.get_window_titlec                 C      | j | d S rc   )r   	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   rk   r   r   rm   get_allocationr   r   )r]   r   rm   r   r   canvas_sizer.   r.   r/   r3   w  s   

zFigureManagerGTK4.resize)r   r   r   __doc__r:   rh   r   r   r   r  r  r3   __classcell__r.   r.   r   r/   r     s    'r   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   images-symbolic.svg)zoompanflatimage-buttonclicked   <small> 
 </small>T)winr   r   r:   add_css_class_gtk_ids	toolitemsr   	SeparatorImagenew_from_giconr   Iconnew_for_stringstrr   _get_data_pathToggleButtonButtonr   rB   getattr_signal_handlerset_tooltip_textLabel
set_markupr;   messager
   )
r]   r   r   text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 )Nr5  r   r6  )r5  T)r1  message_typebuttonsr3  r*  )get_file
get_choicer   get_supported_filetypes_groupedrh   _save_dialogr   ResponseTypeACCEPTr   r   
get_parentget_pathr^   savefig	ExceptionMessageDialogget_rootMessageTypeERRORButtonsTypeOKr   r   )dialogr7  filefmtparentemsgrg   r.   r/   on_response  s,   

z7NavigationToolbar2GTK4.save_figure.<locals>.on_response)"r   FileChooserNativer   rE  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partialrB   r   )r]   r   rJ  ffformatsdefault_formatinamefmtsrL  rP  r.   rg   r/   save_figure  sL   







z"NavigationToolbar2GTK4.save_figureN)r   r   r   r:   rn  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 )Nr   r  T)r   r:   r   r   r   r   
HORIZONTAL	_tool_boxr   _groups
_toolitemsr'  r(  r;   _message)r]   r   r0  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_buttonrB   
_call_toolr&  rr  
setdefaultr   )
r]   rl  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 rc   )rq  get_first_childr   get_next_sibling)r]   ry  rz  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 rc   )rq  _add_separatorr   r   rp  r   insert_child_afterr  )r]   r/  ry  rz  	group_boxr.   r.   r/   rv  '  s   


zToolbarGTK4._add_buttonc                 C   s   |  | d S rc   )trigger_tool)r]   btnrl  r.   r.   r/   rw  1  r   zToolbarGTK4._call_toolc                 C   sD   || j vrd S | j | D ]\}}|| || || qd S rc   )rr  handler_block
set_activehandler_unblock)r]   rl  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)rr  r   message_eventrq  remove)r]   rl  ry  r  _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   rT   rp  r   )r]   sepr.   r.   r/   r  G  s   zToolbarGTK4._add_separatorc                 C   r  rc   )rs  ru  )r]   sr.   r.   r/   set_messageL  r	  zToolbarGTK4.set_messageN)r   r   r   _icon_extensionr:   r~  r  rv  rw  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)r   r   r   r^   r   r.   rg   r.   r/   PseudoToolbarS      r  )r  rn  )r]   r   r   r  r.   rg   r/   triggerQ  s   zSaveFigureGTK4.triggerNr   r   r   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`.
        	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/   
<listcomp>h  s    z0HelpGTK4._normalize_shortcut.<locals>.<listcomp>Nrt  r   z<shift> )splitlen
capitalizeisupperjoin)r]   r`   specialparts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 rc   )r  r  )r   r`   rg   r.   r/   r     s    
z#HelpGTK4.trigger.<locals>.<genexpr>)acceleratorr  subtitleHelpT)r  r3  r1  )r   ShortcutsSectionsortedr   toolsrZ  r{  ShortcutsGroupr   r  set_visibler  ShortcutsShortcutr  get_tool_keymaprl  ShortcutsWindow_figurer   rE  r   r   )	r]   r   sectionrl  toolry  r  shortcutr   r.   rg   r/   r  }  s4   




zHelpGTK4.triggerN)r   r   r   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   
print_rgbar   r   Pixbufnew_from_data	getbuffer
ColorspaceRGBget_clipboardset)r]   r   r   fr   r   pb	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)r   r   r   r1   FigureCanvasr   FigureManagerr.   r.   r.   r/   r    s    r  )Hrf  r  ra  pathlibr   sys
matplotlibr   r   r   r   matplotlib._pylab_helpersr   matplotlib.backend_basesr   r   r	   r
   r   r   matplotlib.backend_toolsr   matplotlib.figurer   matplotlib.widgetsr   giImportErrorerrrequire_version
ValueErrorrN  gi.repositoryr   r   r   r   r   r   _backend_gtkr   r   r   r   r   r   r   r   ConfigureSubplotsGTK4r   RubberbandGTK4r0   DrawingArear1   r   r   r  r  SaveFigureBaser  ToolHelpBaser  ToolCopyToClipboardBaser  ToolSaveFigureToolConfigureSubplotsToolRubberbandToolHelpToolCopyToClipboardToolbarexportr  r.   r.   r.   r/   <module>   sV     
 (	 \rjd	I