a
    ض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y Z zed	eW Y dZ[n
dZ[0 0 zed
d W n, ey Z zeeW Y dZ[n
dZ[0 0 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defaultZ	crosshairwaitz	ew-resizez	ns-resize)cursor)
r   Zcheck_getitemr   ZMOVEZHANDPOINTERZSELECT_REGIONZWAITZRESIZE_HORIZONTALZRESIZE_VERTICAL)Z
mpl_cursor r%   p/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/site-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+   cssZ	style_ctxr%   r%   r&   r,   ;   sF    








zFigureCanvasGTK4.__init__c                 C   s   t | | d S N)r   pick)r>   Z
mouseeventr%   r%   r&   rC   g   s    zFigureCanvasGTK4.pickc                 C   s   |    d S rB   )Zclose_eventr>   r%   r%   r&   destroyl   s    zFigureCanvasGTK4.destroyc                 C   s   |  t| d S rB   )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 rB   )rK   r   r4   get_current_button
grab_focusr>   rL   Zn_pressrI   rJ   r%   r%   r&   r4      s
    
z#FigureCanvasGTK4.button_press_eventc                 C   s(   |  ||\}}t| |||  d S rB   )rK   r   r5   rM   rO   r%   r%   r&   r5      s    
z%FigureCanvasGTK4.button_release_eventc                 C   s   |  |||}t| | dS NT)_get_keyr   r6   r>   rL   keyvalkeycodestater@   r%   r%   r&   r6      s    z FigureCanvasGTK4.key_press_eventc                 C   s   |  |||}t| | dS rP   )rQ   r   r7   rR   r%   r%   r&   r7      s    z"FigureCanvasGTK4.key_release_eventc                 C   s"   |  ||\}}t| || d S rB   )rK   r   r8   r>   rL   rI   rJ   r%   r%   r&   r8      s    z$FigureCanvasGTK4.motion_notify_eventc                 C   s   t |  d S rB   )r   r:   )r>   rL   r%   r%   r&   r:      s    z#FigureCanvasGTK4.leave_notify_eventc                 C   s&   |  ||\}}tj| ||fd d S )N)Zxy)rK   r   r9   rV   r%   r%   r&   r9      s    z#FigureCanvasGTK4.enter_notify_eventc                 C   sT   |    | jj}|| j | }|| j | }| jj||dd t|  |   d S )NF)Zforward)r3   r?   dpirG   Zset_size_inchesr   r2   	draw_idle)r>   areawidthrH   rW   ZwinchZhinchr%   r%   r&   r2      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 ].\}}||@ rP|dkrp| sP| d| }qP|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>   rS   rT   rU   Zunikeyr@   	modifiersZkey_maskprefixr%   r%   r&   rQ      s    



zFigureCanvasGTK4._get_keyc                 O   s   |  |  r|   d S rB   )Z_set_device_pixel_ratioZget_scale_factordraw)r>   argskwargsr%   r%   r&   r3      s    z+FigureCanvasGTK4._update_device_pixel_ratioc                 C   s   || _ |   d S rB   )r/   
queue_draw)r>   Zrectr%   r%   r&   _draw_rubberband   s    z!FigureCanvasGTK4._draw_rubberbandc                 C   s   |  | | | | | d S rB   )on_draw_event
_post_draw)r>   Zdrawing_areactxrZ   rH   r%   r%   r&   r0      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 rB   )rG   ).0ZdimrD   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)r>   widgetri   ZlwZdashZx0Zy0whx1y1r%   rD   r&   rh      s:    





zFigureCanvasGTK4._post_drawc                 C   s   d S rB   r%   )r>   rn   ri   r%   r%   r&   rg      s    zFigureCanvasGTK4.on_draw_eventc                 C   s   |   r|   d S rB   )Zis_drawablere   rD   r%   r%   r&   rb      s    zFigureCanvasGTK4.drawc                    s*    j dkrd S  fdd}t| _ d S )Nr   c                     s    z    W d _nd _0 dS )Nr   F)rb   r.   rc   rD   r%   r&   	idle_draw  s    
z-FigureCanvasGTK4.draw_idle.<locals>.idle_draw)r.   r   Zidle_add)r>   rt   r%   rD   r&   rX      s    
zFigureCanvasGTK4.draw_idlec                 C   s"   t j }| r|d q
d S rP   )r   ZMainContextr!   pending	iteration)r>   contextr%   r%   r&   flush_events	  s    
zFigureCanvasGTK4.flush_events)N)__name__
__module____qualname__Zrequired_interactive_frameworkZsupports_blit	TimerGTK4Z
_timer_clsrm   r,   rC   rE   rF   rK   r=   r4   r5   r6   r7   r8   r:   r9   r2   rQ   r3   rf   r0   rh   rg   rb   rX   rx   r%   r%   r%   r&   r(   5   s6   
,	%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           	         sT  t  }t  _| j t || t  _ j	dtj
j  j j  j j  j \}}   _ jrt j  jrt j  jd urtjtjjd}| j  j|  j \}}||j7 } j|| d _ jd fdd  jd fdd t  rF j!   j"   j#  d S )	Norientation)Zvscrollbar_policyFrE   c                     s
   t  S rB   r   rE   rs   rD   r%   r&   <lambda>?      z,FigureManagerGTK4.__init__.<locals>.<lambda>zclose-requestc                     s
   t  S rB   r   rs   rD   r%   r&   r   @  r   )$r   r   ZWindowwindowZ
add_windowr\   r,   BoxZvboxset_propertyOrientationr<   	set_childprependcanvasget_width_height_get_toolbartoolbartoolmanagerr   Zadd_tools_to_managerZadd_tools_to_containerZScrolledWindowZ
PolicyTypeZNEVERappendget_preferred_sizerH   set_default_size_destroyingr1   mplZis_interactiveshowrX   rN   )	r>   r   numZappro   rp   swmin_sizenat_size	__class__rD   r&   r,      s8    







zFigureManagerGTK4.__init__c                 G   s(   | j r
d S d| _ | j  | j  d S rP   )r   r   rE   r   )r>   rc   r%   r%   r&   rE   G  s
    
zFigureManagerGTK4.destroyc                 C   sB   | j   | j  tjd r>| j  r4| j   n
t	d d S )Nzfigure.raise_windowz#Cannot raise window yet to be setup)
r   r   r   rb   r   rcParamsZget_surfaceZpresentr   Zwarn_externalrD   r%   r%   r&   r   R  s    



zFigureManagerGTK4.showc                 C   s$   | j  s| j   n
| j   d S rB   )r   Zis_fullscreenZ
fullscreenZunfullscreenrD   r%   r%   r&   full_screen_toggle`  s    
z$FigureManagerGTK4.full_screen_togglec                 C   s@   t jd dkrt| j| j}nt jd dkr8t| j}n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 rB   )r   Z	get_titlerD   r%   r%   r&   get_window_titleq  s    z"FigureManagerGTK4.get_window_titlec                 C   s   | j | d S rB   )r   	set_title)r>   titler%   r%   r&   set_window_titlet  s    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   rG   r   r   rH   Zget_allocationr   r   )r>   rZ   rH   r   r   Zcanvas_sizer%   r%   r&   r)   w  s    

zFigureManagerGTK4.resize)ry   rz   r{   __doc__r,   rE   r   r   r   r   r   r)   __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 ]\}}}}|d u rL| t  q(tj	
tjttd| d}|dv rt 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   r1   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|	  q|
| ||  j |v rl|}ql|| 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rBd S t	j
d rb| }| t	j
d< z jjj| |d W nR ty } z:tj j tjjtjjdt|d}|  W Y d }~n
d }~0 0 d S )Nr   r   r   )r   T)r   Zmessage_typeZbuttonsr   r   )Zget_fileZ
get_choicer   get_supported_filetypes_groupedrE   _save_dialogr   ZResponseTypeZACCEPTr   r   Z
get_parentget_pathr?   Zsavefig	ExceptionZMessageDialogget_rootZMessageTypeERRORZButtonsTypeOKr   r   )dialogr   filefmtparentemsgrD   r%   r&   on_response  s(    

z7NavigationToolbar2GTK4.save_figure.<locals>.on_response)"r   ZFileChooserNativer   r   ZFileChooserActionZSAVEr   Z
FileFilterset_nameZadd_patternZ
add_filterZ
set_filter	enumerater   itemsr   Zget_default_filetypeZ
add_choiceZ
set_choiceZset_current_folderr   FileZnew_for_pathospath
expanduserr   r   Zset_current_nameZget_default_filename	functoolspartialr1   r   )r>   rc   r   ffformatsdefault_formatinameZfmtsr   r   r%   rD   r&   save_figure  sJ    







z"NavigationToolbar2GTK4.save_figureN)ry   rz   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 )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   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rZt jtj	|}|
| |d |d u rfd}| ||| |d| j|}	|| | j|g  | j| ||	f d S )Nr   r   r   )r   r   r   	set_labelr   r   r   r   r   r   r   _add_buttonr1   
_call_toolr   r   
setdefaultr   )
r>   r   grouppositionr   descriptionZtoggler   r   signalr%   r%   r&   add_toolitem  s$    






zToolbarGTK4.add_toolitemc                 C   s8   d g}| j |  }|d ur0|| | }q|| S rB   )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r6| j r|   t }| j| || j |< | j | || || d S rB   )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 rB   )Ztrigger_tool)r>   Zbtnr   r%   r%   r&   r   1  s    zToolbarGTK4._call_toolc                 C   sD   || j vrd S | j | D ]&\}}|| || || qd S rB   )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 ]6}| j | D ]&\}}|| j| v r6| j| | q6q(| j |= d S )Nz not in toolbar)r   r   Zmessage_eventr   remove)r>   r   r   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   r<   r   r   )r>   sepr%   r%   r&   r   G  s    zToolbarGTK4._add_separatorc                 C   s   | j | d S rB   )r   r   )r>   sr%   r%   r&   set_messageL  s    zToolbarGTK4.set_messageN)ry   rz   r{   Z_icon_extensionr,   r   r   r   r   r   r   r   r   r%   r%   r%   r&   r     s   
r   c                   @   s   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)ry   rz   r{   r?   r   r%   rD   r%   r&   PseudoToolbarS  s   r   )r   r   )r>   rc   rd   r   r%   rD   r&   triggerQ  s    zSaveFigureGTK4.triggerNry   rz   r{   r   r%   r%   r%   r&   r   P  s   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 rH|| }n(t|dkr^| }n| rp|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%   )rk   modr%   r%   r&   
<listcomp>h  r   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 ]\}}|js(qt  }|| |	 }|d ur^|
d | }qBt 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 rB   )r  r  )rk   r@   rD   r%   r&   rl     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>   rc   sectionr   Ztoolr   r   Zshortcutr   r%   rD   r&   r   }  s2    





zHelpGTK4.triggerN)ry   rz   r{   r  r  r   r%   r%   r%   r&   r  Y  s   	r  c                   @   s   e Zd Zdd ZdS )ToolCopyToClipboardGTK4c                 O   s~   t  N}| j| | j \}}tj| tj	j
dd|||d }W d    n1 s\0    Y  | j }|| d S )NT      )ioBytesIOr   Z
print_rgbar   r   ZPixbufZnew_from_data	getbufferZ
ColorspaceZRGBZget_clipboardset)r>   rc   rd   fro   rp   ZpbZ	clipboardr%   r%   r&   r     s    
"
zToolCopyToClipboardGTK4.triggerNr  r%   r%   r%   r&   r    s   r  c                   @   s   e Zd ZeZeZdS )_BackendGTK4N)ry   rz   r{   r(   ZFigureCanvasr}   ZFigureManagerr%   r%   r%   r&   r    s   r  )Hr   r  r   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   r|   r   ZConfigureSubplotsGTK4r   ZRubberbandGTK4r'   ZDrawingArear(   r}   r   r   r   ZSaveFigureBaser   ZToolHelpBaser  ZToolCopyToClipboardBaser  ZToolSaveFigureZToolConfigureSubplotsZToolRubberbandZToolHelpZToolCopyToClipboardZToolbarZexportr  r%   r%   r%   r&   <module>   sL      (	 \rjd	I