
    G8cEP                     \   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mZ 	 d dlZ	  ej&                  dd       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"  G d de	ejF                        Z$ G d de ejJ                        Z& G d de
ejJ                        Z' ejP                  e$       G d dejR                               Z* ejP                  e$       G d dejV                               Z, ejP                  e$       G d dejZ                               Z. ejP                  e$ej^                          ejP                  e$ej`                         e'Z1 G d de      Z2ejf                   G d de             Z4y# e$ rZ ed      edZ[ww xY w# e$ rZeedZ[ww xY w)    N)_apibackend_toolscbook)FigureCanvasBaseToolContainerBaseKeyEventLocationEvent
MouseEventResizeEvent
CloseEventz#The GTK4 backends require PyGObjectGtkz4.0)GioGLibr   Gdk	GdkPixbuf   )_backend_gtk)_BackendGTK_FigureManagerGTK_NavigationToolbar2GTKTimerGTKc                        e Zd ZdZdZeZ ej                  d       Z	dZ
d fd	Zd Zd ZddZd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z  xZ!S )FigureCanvasGTK4gtk4Fc                     t         S N)FigureManagerGTK4)clss    B/usr/lib/python3/dist-packages/matplotlib/backends/backend_gtk4.py<lambda>zFigureCanvasGTK4.<lambda>&   s    3D     c                 j   t         |   |       | j                  d       | j                  d       d| _        d | _        | j                  | j                         | j                  d| j                         | j                  d| j                         t        j                         }|j                  d       |j                  d| j                         |j                  d| j                         | j!                  |       t        j"                         }|j                  d| j$                         |j                  d	| j&                         | j!                  |       t        j(                         }|j                  d
| j*                         |j                  d| j,                         |j                  d| j.                         | j!                  |       t        j0                  j3                  t        j4                  j6                        }|j                  d| j8                         | j!                  |       | j;                  d       t        j<                         }|j?                  d       | jA                         }|jC                  |t        jD                         |jG                  d       y )N)figureTr   resizeznotify::scale-factorpressedreleasedzkey-pressedzkey-releasedmotionenterleavescrolls/   .matplotlib-canvas { background-color: white; }z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load_from_dataget_style_contextadd_provider#STYLE_PROVIDER_PRIORITY_APPLICATION	add_class)	selfr#   clickkeyr'   r*   css	style_ctx	__class__s	           r   r,   zFigureCanvasGTK4.__init__)   s   ' $4??+Xt001+T-L-LM  "i!8!89j$";";<E"$$&M4#7#78ND$:$:;C **,x!9!9:w 7 78w 7 78F#**..**335x!2!23F#4 ooMN**,	sC$K$KL/0r!   c                 8    t        d|       j                          y )Nclose_event)r   _processrN   s    r   destroyzFigureCanvasGTK4.destroyT   s    =$'002r!   c                 L    | j                  t        j                  |             y r   )set_cursor_from_namer   mpl_to_gtk_cursor_name)rN   cursors     r   
set_cursorzFigureCanvasGTK4.set_cursorW   s    !!,"E"Ef"MNr!   c                 T   |_| j                         j                         }|j                  | j                         j	                         j                               \  }}}}n|\  }}|| j                  z  }| j                  j                  j                  || j                  z  z
  }||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.
        )

get_nativeget_surfaceget_device_positionget_displayget_default_seatget_pointerdevice_pixel_ratior#   bboxheight)rN   xysurfaceis_overxymasks          r   _mpl_coordszFigureCanvasGTK4._mpl_coords[   s     :oo'335G")"="=  "335AAC#EGQ4 DAq'''KK##a$*A*A&AA!tr!   c                 \    t        d| g| j                         d|ij                          y)NrF   stepTr
   rn   rV   )rN   
controllerdxdys       r   rF   zFigureCanvasGTK4.scroll_eventq   s1    >4 	1$$&	1-/	119r!   c                     t        d| g| j                  ||f      |j                          j                          | j	                          y )Nr8   )r
   rn   get_current_buttonrV   
grab_focusrN   rr   n_pressrk   rl   s        r   r8   z#FigureCanvasGTK4.button_press_eventv   sH    ' 	$$aV,	.8.K.K.M	XZr!   c                 |    t        d| g| j                  ||f      |j                          j                          y )Nr9   )r
   rn   rv   rV   rx   s        r   r9   z%FigureCanvasGTK4.button_release_event|   s>    )4 	$$aV,	.8.K.K.M	XZr!   c           	      z    t        d| | j                  |||      g| j                          j                          y)Nr<   Tr   _get_keyrn   rV   rN   rr   keyvalkeycodestates        r   r<   z FigureCanvasGTK4.key_press_event   s:    "Dvw6	9=9I9I9K	8:r!   c           	      z    t        d| | j                  |||      g| j                          j                          y)Nr=   Tr|   r~   s        r   r=   z"FigureCanvasGTK4.key_release_event   s:    $dvw6	9=9I9I9K	8:r!   c                 \    t        d| g| j                  ||f       j                          y )Nr?   rq   rN   rr   rk   rl   s       r   r?   z$FigureCanvasGTK4.motion_notify_event   s-    ($ 	.$$aV,	..6hjr!   c                 V    t        d| g| j                          j                          y )Nfigure_leave_eventr	   rn   rV   )rN   rr   s     r   rA   z#FigureCanvasGTK4.leave_notify_event   s'    *D 	+'')	++38:r!   c                 \    t        d| g| j                  ||f       j                          y )Nfigure_enter_eventr   r   s       r   r@   z#FigureCanvasGTK4.enter_notify_event   s-    *D 	1''A/	119r!   c                 (   | j                          | j                  j                  }|| j                  z  |z  }|| j                  z  |z  }| j                  j	                  ||d       t        d|       j                          | j                          y )NF)forwardr4   )r5   r#   dpire   set_size_inchesr   rV   	draw_idle)rN   areawidthrg   r   winchhinchs          r   r4   zFigureCanvasGTK4.resize_event   s{    '')kkoo///#500036##E5%#@ND)224r!   c                    t        t        j                  |            }t        j                  |t        j
                  |            }t        j                  j                  dft        j                  j                  dft        j                  j                  dft        j                  j                  dfg}|D ](  \  }}||z  s|dk(  r|j                         r"| d| }* |S )Nctrlaltshiftr+   +)chrr   keyval_to_unicoder   _unikey_or_keysym_to_mplkeykeyval_nameModifierTypeCONTROL_MASKALT_MASK
SHIFT_MASK
SUPER_MASKisprintable)	rN   r   r   r   unikeyrP   	modifierskey_maskprefixs	            r   r}   zFigureCanvasGTK4._get_key   s    S**623//OOF#% **F3&&.(('2(('2	
	 !* 	,Hfx')f.@.@.B#HAcU+C	, 
r!   c                 d    | j                  | j                               r| j                          y y r   )_set_device_pixel_ratioget_scale_factordrawrN   argskwargss      r   r5   z+FigureCanvasGTK4._update_device_pixel_ratio   s*     ''(=(=(?@IIK Ar!   c                 2    || _         | j                          y r   )r0   
queue_draw)rN   rects     r   _draw_rubberbandz!FigureCanvasGTK4._draw_rubberband   s     $r!   c                 L    | j                  | |       | j                  | |       y r   )on_draw_event
_post_draw)rN   drawing_areactxr   rg   s        r   r2   zFigureCanvasGTK4._draw_func   s     4%c"r!   c                 (     j                   y d}d} j                  s fd j                   D        \  }}}}n/ j                   \  }}}}| j                  z  }| j                  z  }||z   }	||z   }
|j                  ||       |j	                  ||
       |j                  ||       |j	                  |	|       |j                  ||
       |j	                  |	|
       |j                  |	|       |j	                  |	|
       |j                  d       |j                  |       |j                  ||fd       |j                  ddd       |j                          |j                  ||f|       |j                  ddd       |j                          y )Nr      c              3   <   K   | ]  }|j                   z    y wr   )re   ).0dimrN   s     r   	<genexpr>z.FigureCanvasGTK4._post_draw.<locals>.<genexpr>   s$      > #  $"9"99 >s   r   )r0   _context_is_scaledre   move_toline_toset_antialiasset_line_widthset_dashset_source_rgbstroke_preservestroke)rN   widgetr   lwdashx0y0whx1y1s   `          r   r   zFigureCanvasGTK4._post_draw   st     (&&>'+'<'<>LBAq  00LBAq$)))BD+++D!V!V 	BBBBBBBB!2dD\1%1a#dD\4(1a#

r!   c                      y r    )rN   r   r   s      r   r   zFigureCanvasGTK4.on_draw_event   s    r!   c                 F    | j                         r| j                          y y r   )is_drawabler   rW   s    r   r   zFigureCanvasGTK4.draw   s    OO r!   c                 d      j                   dk7  ry  fd}t        j                  |       _         y )Nr   c                  N    	 j                          d_        y# d_        w xY w)Nr   F)r   r/   )r   rN   s    r   	idle_drawz-FigureCanvasGTK4.draw_idle.<locals>.idle_draw   s(    '		%&" &'"s    	$)r/   r   idle_add)rN   r   s   ` r   r   zFigureCanvasGTK4.draw_idle   s,    "	 "]]95r!   c                     t         j                  j                         }|j                         r#|j	                  d       |j                         r"y y )NT)r   MainContextdefaultpending	iteration)rN   contexts     r   flush_eventszFigureCanvasGTK4.flush_events   s:    ""**,ood# oor!   r   )"__name__
__module____qualname__required_interactive_frameworksupports_blit	TimerGTK4
_timer_clsr   classpropertymanager_classr   r,   rX   r]   rn   rF   r8   r9   r<   r=   r?   rA   r@   r4   r}   r5   r   r2   r   r   r   r   r   __classcell__)rS   s   @r   r   r   "   s    %+"MJ&D&&'DEM)1V3O,
 
96<"
##J

6$r!   r   c                       e Zd Z ej                  dd      dd       Z  ej                  d       ed             Zd Z	y)NavigationToolbar2GTK4z3.6windowNc                    || _         t        j                  j                  |        | j	                  d       i | _        | j                  D ];  \  }}}}|$| j                  t        j                                /t        j                  j                  t        j                  j                  t        t        j                   d| d                        }|dv rt        j"                         nt        j$                         x| j
                  |<   }|j'                  |       |j	                  d       |j	                  d       |j)                  dt+        | |            |_        |j/                  |       | j                  |       > t        j0                         }	|	j3                  d       |	j5                  d	       | j                  |	       t        j0                         | _        | j6                  j9                  t        j:                  j<                         | j                  | j6                         t?        j                  | |       y )
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   )
rN   canvasr   texttooltip_text
image_filecallbackimagebuttonlabels
             r   r,   zNavigationToolbar2GTK4.__init__  s   	9%8< 	 4D,
H|CMMO,II,,'',,X0:|=-IK LMNE
 '//&A  "

DMM$& U#  (  0%+^^742&4F"##L1KK%	 0 		C	E$Eyy{  !2!2!8!89DLL!''f5r!   c                     | j                   S r   )r   rW   s    r   r    zNavigationToolbar2GTK4.<lambda>0  s
    tyy r!   c                     t        j                  d j                  j                         t         j                  j
                  d      }| _        t        j                         }|j                  d       |j                  d       |j                  |       |j                  |       g }d }t         j                  j                         j                               D ]  \  }\  }}t        j                         }|j                  |       |D ]  }	|j                  d|	         |j                  |       |j                  |        j                  j!                         |v s|} ||   g|d | ||dz   d  }|j#                  dd	||       |j%                  d||          |j'                  t(        j*                  j-                  t.        j0                  j3                  t4        j6                  d
                      |j9                   j                  j;                                t=        j>                  |j@                  d       fd       }
|jC                          y )NzSave the figureT)titletransient_foractionmodalz	All files*z*.r   formatzFile formatsavefig.directoryresponsec           
         | j                         }| j                  d      }j                  j                         |   d   }| j	                          d _        |t        j                  j                  k7  ry t        j                  d   r1|j                         }|j                         t        j                  d<   	 j                  j                  j                  |j                         |       y # t        $ r}t        j                   j                  j#                         t        j$                  j&                  t        j(                  j*                  dt-        |            }|j/                          Y d }~y d }~ww xY w)Nr  r   r  )r  T)r  message_typebuttonsr  r  )get_file
get_choicer  get_supported_filetypes_groupedrX   _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msgrN   s          r   on_responsez7NavigationToolbar2GTK4.save_figure.<locals>.on_responseW  s   ??$D##H-C++==?DQGCNN $D3++222||/0*4:OO4E01""**4==?3*G ''"&++"6"6"8!$!6!6OO..dQ	!
 

s   =5C3 3	F<A;E<<F)"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   r4  )rN   r   r5  ffformatsdefault_formatinamefmtsr7  r;  s   `          r   save_figurez"NavigationToolbar2GTK4.save_figure2  s   &&#++..0((--	
 #^^
K 
s""(;;=CCE G 		#OA|d!BKK +C5z*+b!NN4 {{//1T9!"		# >* 0W_n-E 0N1,-.0(M7GD(GN$;<!!#(("7"7GGs||,?@A#C 	D @ @ BC			6>>:	6	 
7	, 	r!   r   )
r   r   r   r   delete_parameterr,   
deprecatedpropertywinrY  r   r!   r   r   r     sH    T5(+)6 ,)6V !/$//%
 *@!A
BC<r!   r   c                   F    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zy)ToolbarGTK4r   c                    t        j                  | |       t        j                  j                  |        | j	                  dt        j
                  j                         t        j                         | _        | j                  | j                         i | _	        i | _
        t        j                         }|j                  d       |j                  d       | j                  |       t        j                         | _        | j                  j                  t        j                   j"                         | j                  | j                         y )Norientationr   T)r   r,   r   r   set_propertyOrientation
HORIZONTAL	_tool_boxr   _groups
_toolitemsr  r  r-   _messager
  r  r  )rN   toolmanagerr  s      r   r,   zToolbarGTK4.__init__t  s    ""45-)C)CD DNN# 		C	E$E		!!#"3"3"9"9:DMM"r!   c                 `   |rt        j                         }nt        j                         }|j                  |       |j	                  d       |^t         j
                  j                  t        j                  j                  |            }|j                  |       |j	                  d       |d}| j                  |||       |j                  d| j                  |      }	|j                  |       | j                  j!                  |g        | j                  |   j#                  ||	f       y )Nr   r   r   )r   r  r  	set_labelr   r   r   r   r   r   r  _add_buttonr3   
_call_toolr  rg  
setdefaultr   )
rN   rW  grouppositionr  descriptiontoggler  r  signals
             r   add_toolitemzToolbarGTK4.add_toolitem  s    %%'FZZ\FV$!II,,''
35EU#  0H1	4??DA,""4,$$ff%56r!   c                     d g}| j                   |   j                         }|$|j                  |       |j                         }|$||   S r   )rf  get_first_childr   get_next_sibling)rN   rp  rq  childrenchilds        r   _find_child_at_positionz#ToolbarGTK4._find_child_at_position  sU    6U#335OOE"**,E  !!r!   c                 2   || j                   vrZ| j                   r| j                          t        j                         }| j                  j                  |       || j                   |<   | j                   |   j                  || j                  ||             y r   )rf  _add_separatorr   r   re  r   insert_child_afterr{  )rN   r  rp  rq  	group_boxs        r   rm  zToolbarGTK4._add_button  sv    $||##%	INN!!),"+DLLU..D00A	Cr!   c                 &    | j                  |       y r   )trigger_tool)rN   btnrW  s      r   rn  zToolbarGTK4._call_tool  s    $r!   c                     || j                   vry | j                   |   D ]8  \  }}|j                  |       |j                  |       |j                  |       : y r   )rg  handler_block
set_activehandler_unblock)rN   rW  toggledtoolitemrt  s        r   toggle_toolitemzToolbarGTK4.toggle_toolitem  sX    t& $ 5 	-Hf""6*($$V,	-r!   c                 *   || j                   vr | j                  j                  | d|        y | j                  D ]I  }| j                   |   D ]5  \  }}|| j                  |   v s| j                  |   j	                  |       7 K | j                   |= y )Nz not in toolbar)rg  ri  message_eventrf  remove)rN   rW  rp  r  _signals        r   remove_toolitemzToolbarGTK4.remove_toolitem  s    t&**dV?+CTJ\\ 	9E%)__T%: 9!'t||E22LL'..x89	9 OOD!r!   c                     t        j                         }|j                  dt         j                  j                         | j
                  j                  |       y )Nra  )r   r   rb  rc  rE   re  r   )rN   seps     r   r}  zToolbarGTK4._add_separator  s9    mmo(@(@Ac"r!   c                 :    | j                   j                  |       y r   )rh  rl  )rN   ss     r   set_messagezToolbarGTK4.set_message  s    "r!   N)r   r   r   _icon_extensionr,   ru  r{  rm  rn  r  r  r}  r  r   r!   r   r_  r_  q  s5    %O#270"C -	"#
#r!   r_  c                       e Zd Zd Zy)SaveFigureGTK4c                 J    t         j                  | j                                y r   )r   rY  "_make_classic_style_pseudo_toolbarr   s      r   triggerzSaveFigureGTK4.trigger  s    **335	7r!   Nr   r   r   r  r   r!   r   r  r    s    7r!   r  c                       e Zd Zd Zd Zd Zy)HelpGTK4c                    ddddd}|j                  d      }|dd D cg c]
  }d	|z   d
z    }}|d   }||v r||   }n5t        |      dkD  r|j                         }n|j                         r|dgz  }dj	                  |      |z   S c c}w )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   Nrk  <>r   z<shift> )splitlen
capitalizeisupperjoin)rN   rP   specialpartsmodmodss         r   _normalize_shortcutzHelpGTK4._normalize_shortcut  s     %#(	
 		#+0":6Cc	C66Bi'>#,CX\.."C[[]YKDwwt}s"" 7s   B	c                 2    d|vxr |j                  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)rN   rP   s     r   _is_valid_shortcutzHelpGTK4._is_valid_shortcut  s      S G)G%GGr!   c           	          t        j                         }t         j                  j                  j                               D ]  \  }}|j                  st        j                         }|j                  |       |j                         }|$|j                  d       |j                         }|$t        j                  dj                   fd j                  j                  |      D              |j                  |j                        }|j                  |        t        j                   dd j"                  j$                  j'                               }|j)                  |       |j+                          y )NF c              3   b   K   | ]&  }j                  |      rj                  |       ( y wr   )r  r  )r   rP   rN   s     r   r   z#HelpGTK4.trigger.<locals>.<genexpr>  s2      %5..s3 ,,S1%5s   ,/)acceleratorr  subtitleHelpT)r  r  r  )r   ShortcutsSectionsortedri  toolsrE  rr  ShortcutsGroupr   rw  set_visiblerx  ShortcutsShortcutr  get_tool_keymaprW  ShortcutsWindow_figurer  r/  r  r4  )	rN   r   sectionrW  toolrp  rz  shortcutr   s	   `        r   r  zHelpGTK4.trigger  sA   &&( !1!1!7!7!=!=!?@ 	#JD$## &&(ENN5!))+E#!!%(..0 # ,,HH %5#//??E%5 5 ii))+H LL"/	#2 $$,,--668: 	!r!   N)r   r   r   r  r  r  r   r!   r   r  r    s    #4H"r!   r  c                       e Zd Zd Zy)ToolCopyToClipboardGTK4c                    t        j                         5 }| j                  j                  |       | j                  j	                         \  }}t
        j                  j                  |j                         t
        j                  j                  dd|||dz        }d d d        | j                  j                         }|j                         y # 1 sw Y   5xY w)NT      )ioBytesIOr  
print_rgbaget_width_heightr   Pixbufnew_from_data	getbuffer
ColorspaceRGBget_clipboardset)rN   r   r   fr   r   pb	clipboards           r   r  zToolCopyToClipboardGTK4.trigger)  s    ZZ\ 	>QKK""1%;;//1DAq!!//090D0D0H0H$011a1>B	> KK--/	b	> 	>s   BCCNr  r   r!   r   r  r  '  s    r!   r  c                       e Zd ZeZeZy)r   N)r   r   r   r   _toolbar2_classr_  _toolmanager_toolbar_classr   r!   r   r   r   ;  s    ,O!,r!   r   c                       e Zd ZeZeZy)_BackendGTK4N)r   r   r   r   FigureCanvasr   FigureManagerr   r!   r   r  r  @  s    #L%Mr!   r  )5rQ  r  rL  
matplotlibr(  r   r   r   matplotlib.backend_basesr   r   r   r	   r
   r   r   giImportErrorerrrequire_version
ValueErrorr9  gi.repositoryr   r   r   r   r   r  r   r   r   r   r   r   DrawingArear   r   r   r_  _register_tool_classSaveFigureBaser  ToolHelpBaser  ToolCopyToClipboardBaser  ConfigureSubplotsGTKRubberbandGTKToolbarr   exportr  r   r!   r   <module>r     s    	 	  1 1  
F Bue$ 9 8  ^$' ^$Bk3SWW k\b##SWW b#J $##$457]11 7 67 $##$45F})) F 6FR $##$45	mCC 	 6	 # " "l779 " " "l002
-) -
 &; & &g  F
;
<#EF   1s.   F F F	FFF+#F&&F+