a
    ضa                  &   @   s  d dl Z d dlZd dlZ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 d dlmZmZmZmZmZmZmZmZ d dlm  m  mZ ddlmZ ddlmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& eZ'dd	 d
dddddddddddddddddddej(dkrdnd fd!ej(dkr0d"ndfd#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2f%D Z)d3d4 d5D Z*d6d	 ej+d7fej,d8fej-d9fej.d:fej/d;fej0d<fej1d=ffD Z2da3d>d? Z4d@dA Z5G dBdC dCeZ6G dDdE dEej7eZ8G dFdG dGej9Z:G dHdI dIeZ;G dJdK dKeej<Z=G dLdM dMej>Z?G dNdO dOeej<Z@G dPdQ dQe	jAZBG dRdS dSe	jCZDejEdTdUdVG dWdX dXe	jFZGG dYdZ dZe	jHZIG d[d\ d\e	jJZKG d]d^ d^e	jLZMeDe	_NeBe	_OeIe	_PeKe	_QeMe	_RejSG d_d` d`eZTdS )a    N)_apibackend_toolscbook)Gcf)_BackendFigureCanvasBaseFigureManagerBaseNavigationToolbar2	TimerBasecursorsToolContainerBaseMouseButton   )	qt_compat)QtCoreQtGui	QtWidgets__version__QT_API_enum_to_int_devicePixelRatioF
_isdeleted_setDevicePixelRatio_maybe_allow_interruptc                 C   s$   i | ]\}}t ttd ||qS )QtCore.Qt.Keyr   getattrr   .0kv r"   n/Users/vegardjervell/Documents/master/model/venv/lib/python3.9/site-packages/matplotlib/backends/backend_qt.py
<dictcomp>   s   r$   )Z
Key_Escapeescape)ZKey_Tabtab)ZKey_BackspaceZ	backspace)Z
Key_Returnenter)Z	Key_Enterr'   )Z
Key_Insertinsert)Z
Key_Deletedelete)Z	Key_Pausepause)Z
Key_SysReqZsysreq)Z	Key_Clearclear)ZKey_Homehome)ZKey_Endend)ZKey_Leftleft)ZKey_UpZup)Z	Key_Rightright)ZKey_DownZdown)Z
Key_PageUpZpageup)ZKey_PageDownZpagedown)	Key_ShiftshiftKey_ControldarwincontrolcmdKey_Metameta)Key_AltZalt)ZKey_CapsLockZ	caps_lock)ZKey_F1f1)ZKey_F2f2)ZKey_F3Zf3)ZKey_F4Zf4)ZKey_F5Zf5)ZKey_F6Zf6)ZKey_F7Zf7)ZKey_F8Zf8)ZKey_F9Zf9)Key_F10Zf10)r;   Zf11)ZKey_F12Zf12)ZKey_Super_Lsuper)ZKey_Super_Rr<   c                 C   s4   g | ],\}}t ttd |t ttd|fqS )zQtCore.Qt.KeyboardModifierr   r   r   modkeyr"   r"   r#   
<listcomp>I   s   r@   ))ZControlModifierr2   )ZAltModifierr8   )ZShiftModifierr0   )ZMetaModifierr6   c                 C   s    i | ]\}}|t td |qS )zQtCore.Qt.CursorShaper   r   r   r"   r"   r#   r$   S   s   ZSizeAllCursorZPointingHandCursorZArrowCursorZCrossCursorZ
WaitCursorZSizeHorCursorZSizeVerCursorc                  C   s   t du rtj } | du rtj s,tdztjt	j
j W n tyR   Y n0 ztjt	j
jj W n ty|   Y n0 tdga t jt j t  n| a zt t	j
j W n ty   Y n0 dS )zJ
    Only one qApp can exist at a time, so check before creating one.
    NzInvalid DISPLAY variable
matplotlib)qAppr   QApplicationinstancemplZ_c_internal_utilsZdisplay_is_validRuntimeErrorsetAttributer   QtZAA_EnableHighDpiScalingAttributeErrorZ#setHighDpiScaleFactorRoundingPolicyZ HighDpiScaleFactorRoundingPolicyZPassThroughZlastWindowClosedconnectquitr   Z_setup_new_guiappZAA_UseHighDpiPixmaps)Zappr"   r"   r#   _create_qAppd   s2    


rM   c                    s@   t dv r S tjjfddt  fdd}|S dS )zN
    Decorator for ``__init__`` to allow ``super().__init__`` on PySide2.
    )ZPyQt5PyQt6c                    sT    |  t | j}tdd ||tjd d  D }|j| g|R i | d S )Nc                 s   s&   | ]}|j d d dvr|V  qdS ).r   )ZPySide2PySide6ZShibokenN)
__module__split)r   clsr"   r"   r#   	<genexpr>   s   zF_allow_super_init.<locals>.cooperative_qwidget_init.<locals>.<genexpr>r   )type__mro__nextindexr   QWidget__init__)selfargskwargsmroZnext_coop_init)qwidget_initr"   r#   cooperative_qwidget_init   s    
z3_allow_super_init.<locals>.cooperative_qwidget_initc                    sJ   t jtjd&  | g|R i | W d    n1 s<0    Y  d S )N)rZ   )r   _setattr_cmr   rY   r[   r\   r]   )rZ   r`   r"   r#   wrapper   s    z"_allow_super_init.<locals>.wrapperN)r   r   rY   rZ   	functoolswraps)rZ   rc   r"   )rZ   r`   r_   r#   _allow_super_init   s    
rf   c                       sH   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	  Z
S )TimerQTz-Subclass of `.TimerBase` using QTimer events.c                    s0   t  | _| jj| j t j|i | d S N)r   QTimer_timertimeoutrK   Z	_on_timerr<   rZ   rb   	__class__r"   r#   rZ      s    
zTimerQT.__init__c                 C   s   t | js|   d S rh   )r   rj   _timer_stopr[   r"   r"   r#   __del__   s    
zTimerQT.__del__c                 C   s   | j | j d S rh   )rj   ZsetSingleShotZ_singlero   r"   r"   r#   _timer_set_single_shot   s    zTimerQT._timer_set_single_shotc                 C   s   | j | j d S rh   )rj   ZsetIntervalZ	_intervalro   r"   r"   r#   _timer_set_interval   s    zTimerQT._timer_set_intervalc                 C   s   | j   d S rh   )rj   startro   r"   r"   r#   _timer_start   s    zTimerQT._timer_startc                 C   s   | j   d S rh   )rj   stopro   r"   r"   r#   rn      s    zTimerQT._timer_stop)__name__rQ   __qualname____doc__rZ   rp   rq   rr   rt   rn   __classcell__r"   r"   rl   r#   rg      s   rg   c                       sP  e Zd ZdZeZdd dejfdejfdej	fdej
fdejffD ZedD fd
d	Zdd Zdd Zdd Zdd Zdd Zdd Zeedv rdn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/d0 Z#d1d2 Z$d3d4 Z%dEd6d7Z&dFd8d9Z' fd:d;Z(d<d= Z)dGd>d?Z*d@dA Z+dBdC Z,  Z-S )HFigureCanvasQTZqtc                 C   s    i | ]\}}t td ||qS )zQtCore.Qt.MouseButtonrA   r   r"   r"   r#   r$      s   zFigureCanvasQT.<dictcomp>Z
LeftButtonZRightButtonZMiddleButtonZXButton1ZXButton2Nc                    sp   t   t j|d d| _d| _dd | _| tdj | 	d | j
|    ttd}| | d S )N)figureFc                 S   s   d S rh   r"   painterr"   r"   r#   <lambda>       z)FigureCanvasQT.__init__.<locals>.<lambda>zQtCore.Qt.WidgetAttributeTwhite)rM   r<   rZ   _draw_pending_is_drawing_draw_rect_callbackrH   r   ZWA_OpaquePaintEventZsetMouseTrackingresizeget_width_heightr   ZQPaletteQColorZ
setPalette)r[   r{   paletterl   r"   r#   rZ      s    

zFigureCanvasQT.__init__c                 C   s0   |  t| r,t|  |  }| | d S rh   )Z_set_device_pixel_ratior   r   ZQResizeEventsizeresizeEventr[   eventr"   r"   r#   _update_pixel_ratio   s    z"FigureCanvasQT._update_pixel_ratioc                 C   s0   |    |d ur,|j| j  |j| j  d S rh   )r   ZphysicalDotsPerInchChangedrK   ZlogicalDotsPerInchChanged)r[   screenr"   r"   r#   _update_screen   s    zFigureCanvasQT._update_screenc                 C   s,   |    }|j| j | |  d S rh   )windowZwindowHandleZscreenChangedrK   r   r   )r[   r   r   r"   r"   r#   	showEvent   s    zFigureCanvasQT.showEventc                 C   s   |  tjt|d d S )N)cursor)Z	setCursorr   Zcheck_getitemcursordr[   r   r"   r"   r#   
set_cursor  s    zFigureCanvasQT.set_cursorc                 C   s,   |  | |\}}tj| |||fd d S )N)guiEventZxy)mouseEventCoords_get_positionr   Zenter_notify_eventr[   r   xyr"   r"   r#   
enterEvent  s    zFigureCanvasQT.enterEventc                 C   s   t j  tj| |d d S Nr   )r   rD   ZrestoreOverrideCursorr   Zleave_notify_eventr   r"   r"   r#   
leaveEvent	  s    
zFigureCanvasQT.leaveEvent)rN   rP   positionposc                 C   s4   |  }| jjj| j |  }|| j || j fS )aI  
        Calculate mouse coordinates in physical pixels.

        Qt uses 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.
        )r   r{   bboxheightdevice_pixel_ratior   )r[   r   r   r   r"   r"   r#   r     s    
zFigureCanvasQT.mouseEventCoordsc                 C   sD   |  | |\}}| j| }|d ur@tj| ||||d d S r   r   r   buttondgetbuttonr   Zbutton_press_eventr[   r   r   r   r   r"   r"   r#   mousePressEvent  s    zFigureCanvasQT.mousePressEventc                 C   sF   |  | |\}}| j| }|d urBtj| |||d|d d S )NT)Zdblclickr   r   r   r"   r"   r#   mouseDoubleClickEvent&  s    
z$FigureCanvasQT.mouseDoubleClickEventc                 C   s*   |  | |\}}tj| |||d d S r   )r   r   r   Zmotion_notify_eventr   r"   r"   r#   mouseMoveEvent.  s    zFigureCanvasQT.mouseMoveEventc                 C   sD   |  | |\}}| j| }|d ur@tj| ||||d d S r   )r   r   r   r   r   r   Zbutton_release_eventr   r"   r"   r#   mouseReleaseEvent2  s    z FigureCanvasQT.mouseReleaseEventc                 C   sl   |  | |\}}|  s2tj  dkrD| 	 d }n| 	 }|rht
j| ||||d d S )NZxcbx   r   )r   r   Z
pixelDeltaZisNullr   rD   rE   ZplatformNameZ
angleDeltar   r   Zscroll_event)r[   r   r   r   Zstepsr"   r"   r#   
wheelEvent9  s    
zFigureCanvasQT.wheelEventc                 C   s&   |  |}|d ur"tj| ||d d S r   )_get_keyr   Zkey_press_eventr[   r   r?   r"   r"   r#   keyPressEventF  s    
zFigureCanvasQT.keyPressEventc                 C   s&   |  |}|d ur"tj| ||d d S r   )r   r   Zkey_release_eventr   r"   r"   r#   keyReleaseEventK  s    
zFigureCanvasQT.keyReleaseEventc                 C   s   t  }|jt|jdd u r d S |  | j }|  | j }| j	j
}|| }|| }| j	j||dd tj| | t|  d S )Nf_codeF)forward)sys	_getframer   r   f_backr   widthr   r   r{   ZdpiZset_size_inchesr   rY   r   r   Zresize_event)r[   r   framewhZdpivalZwinchZhinchr"   r"   r#   r   P  s    zFigureCanvasQT.resizeEventc                 C   s   |   \}}t||S rh   )r   r   QSize)r[   r   r   r"   r"   r#   sizeHinta  s    zFigureCanvasQT.sizeHintc                 C   s   t ddS )N
   )r   r   ro   r"   r"   r#   minumumSizeHinte  s    zFigureCanvasQT.minumumSizeHintc                    s   |   t|  fddtD }zt  }W nF tyz    tjkrRY d S t }d|v rn|	d n|
 }Y n0 d||g S )Nc                    s0   g | ](\}} |kr|@ rt | d dqS )r4   Zctrl)SPECIAL_KEYSreplacer=   Z	event_keyZ
event_modsr"   r#   r@   q  s   z+FigureCanvasQT._get_key.<locals>.<listcomp>r1   +)r?   r   	modifiers_MODIFIER_KEYSr   KeyErrorr   
maxunicodechrremovelowerjoin)r[   r   Zmodsr?   r"   r   r#   r   h  s    
zFigureCanvasQT._get_keyc                 C   s   t   d S rh   )rC   ZprocessEventsro   r"   r"   r#   flush_events  s    zFigureCanvasQT.flush_eventsr   c                 C   s   t | dr| j rtdt  | _}|dkrJtjt|d |j	}t
| t| W d    n1 sr0    Y  d S )N_event_loopzEvent loop already runningr   i  )hasattrr   Z	isRunningrG   r   Z
QEventLoopri   
singleShotintrL   r   r   _exec)r[   rk   Z
event_looptimerr"   r"   r#   start_event_loop  s    
zFigureCanvasQT.start_event_loopc                 C   s   t | dr| j  d S )Nr   )r   r   rL   r   r"   r"   r#   stop_event_loop  s    
zFigureCanvasQT.stop_event_loopc                    sN   | j r
dS tj| dd t   W d   n1 s80    Y  |   dS )z5Render the figure, and queue a request for a Qt draw.NT)r   )r   r   ra   r<   drawupdatero   rl   r"   r#   r     s
    (zFigureCanvasQT.drawc                 C   s2   t | dds.t | dds.d| _tjd| j dS )z9Queue redraw of the Agg buffer and request Qt paintEvent.r   Fr   Tr   N)r   r   r   ri   r   
_draw_idlero   r"   r"   r#   	draw_idle  s
    
zFigureCanvasQT.draw_idlec                    sZ   |d u r j r j j} fdd|jD \}}}}|| } |   | || d S )Nc                    s   g | ]}t | j qS r"   r   r   r   ptro   r"   r#   r@     r   z'FigureCanvasQT.blit.<locals>.<listcomp>)r{   r   ZboundsZrepaintrectr   )r[   r   lbr   r   tr"   ro   r#   blit  s
    zFigureCanvasQT.blitc              	   C   s   |   | | js W d    d S d| _|  dk s>|  dk rNW d    d S z|   W n tyt   t  Y n0 W d    n1 s0    Y  d S )NFr   )Z_idle_draw_cntxr   r   r   r   	Exception	traceback	print_excro   r"   r"   r#   r     s    
zFigureCanvasQT._draw_idlec                    sb   |d urH fdd|D \}}| |  fdd}ndd }| _    d S )Nc                    s   g | ]}t | j qS r"   r   r   ro   r"   r#   r@     r   z0FigureCanvasQT.drawRectangle.<locals>.<listcomp>c                    s   t t dd j }|ddg t ddft ddffD ]f\}}|| || | | |  |  |  |  qBd S )Nblackr      r   r   )	r   ZQPenr   r   ZsetDashPatternZsetDashOffsetZsetColorZsetPenZdrawLine)r}   Zpencoloroffsetr[   x0x1y0y1r"   r#   r     s    


z9FigureCanvasQT.drawRectangle.<locals>._draw_rect_callbackc                 S   s   d S rh   r"   r|   r"   r"   r#   r     s    )r   r   )r[   r   r   r   r   r"   r   r#   drawRectangle  s    zFigureCanvasQT.drawRectangle)N)r   )N)N).rv   rQ   rw   Zrequired_interactive_frameworkrg   Z
_timer_clsr   LEFTRIGHTZMIDDLEBACKFORWARDr   rf   rZ   r   r   r   r   r   r   operatormethodcallerr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ry   r"   r"   rl   r#   rz      sR   
#



	rz   c                       s$   e Zd Ze Z fddZ  ZS )
MainWindowc                    s   | j   t | d S rh   )closingemitr<   
closeEventr   rl   r"   r#   r     s    
zMainWindow.closeEvent)rv   rQ   rw   r   Signalr   r   ry   r"   r"   rl   r#   r     s   r   c                       s`   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dd Z  ZS )FigureManagerQTz
    Attributes
    ----------
    canvas : `FigureCanvas`
        The FigureCanvas instance
    num : int or str
        The Figure number
    toolbar : qt.QToolBar
        The qt.QToolBar
    window : qt.QMainWindow
        The qt.QMainWindow
    c                    s<  t  | _t || | jj|j | jj| j tt	
d}| jt| d| j_| | j| j| _| jrt| j | jrt| j | jr| j| j | j  }nd}| }| }|| }| j| | | j| j t r| j  | j  | j t!dj" | j#  | j$  d S )Nzimages/matplotlib.svgFr   zQtCore.Qt.FocusPolicy)%r   r   r<   rZ   r   rK   close_event_widgetclosedstrr   _get_data_pathsetWindowIconr   QIcon_destroying_get_toolbarcanvastoolbartoolmanagerr   Zadd_tools_to_managerZadd_tools_to_containerZ
addToolBarr   r   r   r   ZsetCentralWidgetrF   Zis_interactiveshowr   ZsetFocusPolicyr   ZStrongFocussetFocusraise_)r[   r  numimageZ
tbs_heightcsZ	cs_heightr   rl   r"   r#   rZ     s6    



zFigureManagerQT.__init__c                 C   s$   | j  r| j   n
| j   d S rh   )r   ZisFullScreenZ
showNormalZshowFullScreenro   r"   r"   r#   full_screen_toggle2  s    
z"FigureManagerQT.full_screen_togglec                 C   s:   | j jrd S d| j _zt|  W n ty4   Y n0 d S NT)r   r   r   destroyrJ   ro   r"   r"   r#   r   8  s    zFigureManagerQT._widgetclosedc                 C   sB   t jd dkrt||d}n"t jd dkr:t| j| j}nd }|S )Nr  Ztoolbar2Tr  )rF   rcParamsNavigationToolbar2QT	ToolbarQtr  r   )r[   r  parentr  r"   r"   r#   r  D  s    zFigureManagerQT._get_toolbarc                 C   sp   t || jj }t || jj }| j | j  }| j | j  }| j|| | j|| ||  d S rh   )r   r  r   r   r   r   r   )r[   r   r   Zextra_widthZextra_heightr"   r"   r#   r   O  s    zFigureManagerQT.resizec                 C   s,   | j   tjd r(| j   | j   d S )Nzfigure.raise_window)r   r  rF   r  ZactivateWindowr  ro   r"   r"   r#   r  Y  s    


zFigureManagerQT.showc                 G   sD   t j d u rd S | jjrd S d| j_| jr6| j  | j  d S r  )r   rD   rE   r   r   r  r  closer[   r\   r"   r"   r#   r  _  s    
zFigureManagerQT.destroyc                 C   s
   | j  S rh   )r   ZwindowTitlero   r"   r"   r#   get_window_titlej  s    z FigureManagerQT.get_window_titlec                 C   s   | j | d S rh   )r   ZsetWindowTitle)r[   titler"   r"   r#   set_window_titlem  s    z FigureManagerQT.set_window_title)rv   rQ   rw   rx   rZ   r  r   r  r   r  r  r  r  ry   r"   r"   rl   r#   r     s   .
r   c                       s   e Zd ZeeZg ejZe	dd eD 
dd d dddZd	d
 Zdd Zdd Z fddZ fddZdd Zdd Zdd Zdd Zdd Zdd Z  ZS ) r  c                 C   s   g | ]^}}|qS r"   r"   )r   name_r"   r"   r#   r@   w  r   zNavigationToolbar2QT.<listcomp>ZSubplotsr   )	Customizez%Edit axis, curve and image parametersZqt4_editor_optionsedit_parametersTc           
      C   sD  t j| | | tjttdj	ttdj
B  || _i | _d| _| jD ]j\}}}}|du rn|   qP| | |d |t| |}|| j|< |dv r|d |durP|| qP| jr4t d| | _| jtjttdjttdjB  | jt tdjtdj | | j}	|	 d t!| | dS )	z9coordinates: should we show the coordinates on the right?QtCore.Qt.ToolBarAreaN.png)zoompanT QtCore.Qt.AlignmentFlagQtWidgets.QSizePolicy.Policy)"r   QToolBarrZ   setAllowedAreasr   rI   ToolBarArear   r   TopToolBarAreaBottomToolBarAreacoordinates_actions_subplot_dialog	toolitemsZaddSeparatorZ	addAction_iconr   setCheckable
setToolTipQLabellocLabelsetAlignmentAlignmentFlag
AlignRightAlignVCentersetSizePolicyQSizePolicy	ExpandingIgnored	addWidgetZ
setVisibler	   )
r[   r  r  r'  textZtooltip_text
image_filecallbackaZlabelActionr"   r"   r#   rZ   {  sD    






zNavigationToolbar2QT.__init__c                 C   s   | dd}tttd|}t|t|  |  	| 
  dk r|  	|  }|tdtdj}|| || t|S )z
        Construct a `.QIcon` from an image file *name*, including the extension
        and relative to Matplotlib's "images" data directory.
        r  z
_large.pngZimages   r   zQtCore.Qt.MaskMode)r   r   ZQPixmapr   r   r   r   r   r   r   ZbackgroundRolevalueZforegroundRoleZcreateMaskFromColorr   r   ZMaskOutColorfillZsetMaskr   )r[   r  ZpmZ
icon_colormaskr"   r"   r#   r+    s    

zNavigationToolbar2QT._iconc                    s   | j j }|s*tj| j  dd d S t|dkr>|\}ndd |D   fdd D }t|D ]2\}} | |v rf |  dt	|dd	7  < qftj
| j  d
d dd\}}|sd S | | }t||  d S )NErrorzThere are no axes to edit.r   c              	   S   s^   g | ]V}|  pX| pX|d pX|dpXdtd| | gpXdt|j dqS )r.   r/   z - Nz<anonymous >)Z	get_labelZ	get_titler   filterZ
get_xlabelZ
get_ylabelrU   rv   )r   axr"   r"   r#   r@     s   z8NavigationToolbar2QT.edit_parameters.<locals>.<listcomp>c                    s   g | ]}  |d kr|qS )r   )count)r   r  titlesr"   r#   r@     s   z (id: z#x)r  zSelect axes:r   F)r  r{   Zget_axesr   QMessageBoxwarningr  len	enumerateidZQInputDialogZgetItemrX   figureoptionsZfigure_edit)r[   ZaxesrD  Zduplicate_titlesiitemokr"   rF  r#   r    s2    
 
z$NavigationToolbar2QT.edit_parametersc                 C   sH   d| j v r"| j d | jjdk d| j v rD| j d | jjdk d S )Nr  ZPANr  ZZOOM)r(  
setCheckedmoder  ro   r"   r"   r#   _update_buttons_checked  s    

z,NavigationToolbar2QT._update_buttons_checkedc                    s   t  j|  |   d S rh   )r<   r  rT  r  rl   r"   r#   r    s    zNavigationToolbar2QT.panc                    s   t  j|  |   d S rh   )r<   r  rT  r  rl   r"   r#   r    s    zNavigationToolbar2QT.zoomc                 C   s"   | j | | jr| j| d S rh   )messager   r'  r/  setTextr[   sr"   r"   r#   set_message  s    z NavigationToolbar2QT.set_messagec                 C   sJ   | j jjj}|| }|| }dd |||| || fD }| j | d S )Nc                 S   s   g | ]}t |qS r"   )r   )r   valr"   r"   r#   r@     r   z8NavigationToolbar2QT.draw_rubberband.<locals>.<listcomp>)r  r{   r   r   r   )r[   r   r   r   r   r   r   r   r"   r"   r#   draw_rubberband  s
    z$NavigationToolbar2QT.draw_rubberbandc                 C   s   | j d  d S rh   )r  r   ro   r"   r"   r#   remove_rubberband  s    z&NavigationToolbar2QT.remove_rubberbandc                    sP    j d u r6t jj j  _  jd fdd  j    j    j S )Nr   c                    s
    j  S rh   )r)  Zreject)ero   r"   r#   r~     r   z9NavigationToolbar2QT.configure_subplots.<locals>.<lambda>)r)  SubplotToolQtr  r{   r  Zmpl_connectupdate_from_current_subplotparsr  ro   r"   ro   r#   configure_subplots  s    


z'NavigationToolbar2QT.configure_subplotsc              
   G   s6  | j  }t| }| j  }tjtj	d }tj
|| j  }g }d }|D ]>\}	}
d
dd |
D }d|	|f }||
v r|}|| qRd
|}t| j  d|||\}}|r2|dkrtj|tj	d< z| j j| W nF ty0 } z,tj| d	t|tjjtjj W Y d }~n
d }~0 0 d S )
Nzsavefig.directory c                 S   s   g | ]}d | qS )z*.%sr"   )r   extr"   r"   r#   r@     r   z4NavigationToolbar2QT.save_figure.<locals>.<listcomp>z%s (%s)z;;zChoose a filename to save tor  zError saving file)r  Zget_supported_filetypes_groupedsorteditemsZget_default_filetypeospath
expanduserrF   r  r   Zget_default_filenameappendr   Z_getSaveFileNamer  dirnamer{   Zsavefigr   r   rI  criticalr   ZOkZNoButton)r[   r\   	filetypesZsorted_filetypesZdefault_filetypeZ	startpathrs   filtersZselectedFilterr  extsZ	exts_listrC  fnamer]  r"   r"   r#   save_figure  s8    



z NavigationToolbar2QT.save_figurec                 C   s\   | j jdk}| j jt| j jd k }d| jv r>| jd | d| jv rX| jd | d S )Nr   r   backr   )Z
_nav_stack_posrK  Z	_elementsr(  Z
setEnabled)r[   Zcan_backwardZcan_forwardr"   r"   r#   set_history_buttons  s    

z(NavigationToolbar2QT.set_history_buttons)T)rv   rQ   rw   r   r   r   rU  r	   r*  r(   rX   rZ   r+  r  rT  r  r  rY  r[  r\  r`  ro  rr  ry   r"   r"   rl   r#   r  q  s$   


(
r  c                       sD   e Zd Z fddZdd Zdd Zdd Zd	d
 Zdd Z  Z	S )r^  c                    s  t    | tttd | d i | _	t
 }| | dg dd| jfgfdddgd	| jfd
| jfd| jfgffD ]\}}}t
 }|| t
|}|| t
|}	|D ]Z}
t
  | j	|
< }|dd |d |d |d |j| j |	|
| q|d |D ]F\}
}t
 |
}|!d |j"| || |
dkr*|#  q*q|| _$i | _%d | _&| '  d S )Nzimages/matplotlib.pngZSubplotToolZBorders)topbottomr.   r/   zExport valuesZSpacingsZhspaceZwspacezTight layoutZResetCloser   r   r   g{Gzt?F)(r<   rZ   r   r   r   r   r   r   ZsetObjectName
_spinboxesr   ZQHBoxLayout	setLayout_export_values_tight_layout_resetr  QVBoxLayoutZ	addLayoutZ	QGroupBoxr8  ZQFormLayoutZQDoubleSpinBoxsetRangeZsetDecimalsZsetSingleStepZsetKeyboardTrackingZvalueChangedrK   _on_value_changedZaddRowZ
addStretchZQPushButtonZsetAutoDefaultclickedr  _figure	_defaults_export_values_dialogr_  )r[   Z	targetfigr  Zmain_layoutgroup	spinboxesZbuttonslayoutZboxinnerr  spinboxmethodr   rl   r"   r#   rZ   #  sZ    



	











zSubplotToolQt.__init__c                    s&    fdd j  D  _   d S )Nc                    s    i | ]\}}|t  jj|qS r"   )r   r  subplotpars)r   r  r  ro   r"   r#   r$   P  s   zASubplotToolQt.update_from_current_subplotpars.<locals>.<dictcomp>)rv  rd  r  rz  ro   r"   ro   r#   r_  O  s    
z-SubplotToolQt.update_from_current_subplotparsc                 C   s   t  | _t  }| j| t  }|d || |d	dd | j
 D  | }|t|  d|  d  || | j  d S )NTz,
c                 s   s&   | ]\}}| d |  dV  qdS )=z.3Nr>  r   attrr  r"   r"   r#   rT   ^  s   z/SubplotToolQt._export_values.<locals>.<genexpr>r      )r   QDialogr  r{  rw  ZQPlainTextEditZsetReadOnlyr8  ZsetPlainTextr   rv  rd  ZmaximumSizeZ	setHeightr   ZQFontMetricsdocumentZdefaultFontr   ZtoPlainTextr   ZsetMaximumSizer  )r[   r  r9  r   r"   r"   r#   rx  T  s*    




zSubplotToolQt._export_valuesc                 C   sx   | j }dD ]<\}}|| ||  d  || ||  d  q
| jjf i dd | D  | jj  d S )N))rt  rs  )r.   r/   gMbP?c                 S   s   i | ]\}}||  qS r"   r  r  r"   r"   r#   r$   p  r   z3SubplotToolQt._on_value_changed.<locals>.<dictcomp>)	rv  Z
setMinimumr>  Z
setMaximumr  Zsubplots_adjustrd  r  r   )r[   r  r   Zhigherr"   r"   r#   r}  i  s    
zSubplotToolQt._on_value_changedc                 C   sX   | j   | j D ]2\}}|d |t| j j|  |d q| j j	  d S )NTF)
r  Ztight_layoutrv  rd  blockSignalssetValuevarsr  r  r   )r[   r  r  r"   r"   r#   ry  s  s    

zSubplotToolQt._tight_layoutc                 C   sJ   | j  D ]2\}}|dd |d || |d q
|   d S )Nr   r   TF)r  rd  r|  r  r  r}  )r[   r  r>  r"   r"   r#   rz  {  s    

zSubplotToolQt._reset)
rv   rQ   rw   rZ   r_  rx  r}  ry  rz  ry   r"   r"   rl   r#   r^  "  s   ,
r^  c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )r  c                 C   s   t | | tj| | | tjtt	dj
tt	djB  td}|tjtt	djtt	djB  |tt	djt	dj | || _i | _i | _d S )Nr  r  r   r!  )r   rZ   r   r"  r#  r   rI   r$  r   r   r%  r&  r.  r0  r1  r2  r3  r4  r5  r6  r7  r8  _message_action
_toolitems_groups)r[   r  r  Zmessage_labelr"   r"   r#   rZ     s(    


zToolbarQt.__init__c           	         s   t }|r |t| |  |r8||  fdd}|rb|d |j	| n|j
	| j g  | || j  ||f d S )Nc                      s      d S rh   )Ztrigger_toolr"   r  r[   r"   r#   handler  s    z'ToolbarQt.add_toolitem.<locals>.handlerT)r   ZQToolButtonZsetIconr  r+  rV  r-  r,  toggledrK   r~  r  
setdefault_add_to_grouprh  )	r[   r  r  r   r:  descriptionZtoggler   r  r"   r  r#   add_toolitem  s    



zToolbarQt.add_toolitemc           	      C   sV   | j |g }|s(| | j}|| || }| ||}||| || j |< d S rh   )r  r   ZinsertSeparatorr  rh  ZinsertWidgetr(   )	r[   r  r  r   r   ZgrsepbeforeZwidgetr"   r"   r#   r    s    
zToolbarQt._add_to_groupc                 C   sH   || j vrd S | j | D ]*\}}|j| || |j| qd S rh   )r  r  Z
disconnectrR  rK   )r[   r  r  r   r  r"   r"   r#   toggle_toolitem  s    

zToolbarQt.toggle_toolitemc                 C   s*   | j | D ]\}}|d  q
| j |= d S rh   )r  	setParent)r[   r  r   r  r"   r"   r#   remove_toolitem  s    zToolbarQt.remove_toolitemc                 C   s   |  | j| d S rh   )ZwidgetForActionr  rV  rW  r"   r"   r#   rY    s    zToolbarQt.set_messageN)	rv   rQ   rw   rZ   r  r  r  r  rY  r"   r"   r"   r#   r    s   
r  c                   @   s   e Zd Zdd ZdS )ConfigureSubplotsQtc                 G   s   t |   d S rh   )r  r`  "_make_classic_style_pseudo_toolbarr  r"   r"   r#   trigger  s    zConfigureSubplotsQt.triggerNrv   rQ   rw   r  r"   r"   r"   r#   r    s   r  c                   @   s   e Zd Zdd ZdS )SaveFigureQtc                 G   s   t |   d S rh   )r  ro  r  r  r"   r"   r#   r    s    zSaveFigureQt.triggerNr  r"   r"   r"   r#   r    s   r  z3.5ZToolSetCursor)alternativec                   @   s   e Zd Zdd ZdS )SetCursorQtc                 C   s   t |  | d S rh   )r  r   r  r   r"   r"   r#   r     s    zSetCursorQt.set_cursorN)rv   rQ   rw   r   r"   r"   r"   r#   r    s   r  c                   @   s   e Zd Zdd Zdd ZdS )RubberbandQtc                 C   s   t |  d |||| d S rh   )r  r[  r  )r[   r   r   r   r   r"   r"   r#   r[    s    zRubberbandQt.draw_rubberbandc                 C   s   t |   d S rh   )r  r\  r  ro   r"   r"   r#   r\    s    zRubberbandQt.remove_rubberbandN)rv   rQ   rw   r[  r\  r"   r"   r"   r#   r    s   r  c                   @   s   e Zd Zdd ZdS )HelpQtc                 G   s   t jd d|   d S )NZHelp)r   rI  informationZ_get_help_htmlr  r"   r"   r#   r    s    zHelpQt.triggerNr  r"   r"   r"   r#   r    s   r  c                   @   s   e Zd Zdd ZdS )ToolCopyToClipboardQTc                 O   s   | j  }t | d S rh   )r  ZgrabrC   Z	clipboardZ	setPixmap)r[   r\   r]   Zpixmapr"   r"   r#   r    s    
zToolCopyToClipboardQT.triggerNr  r"   r"   r"   r#   r    s   r  c                   @   s    e Zd ZeZeZedd ZdS )
_BackendQTc                   C   s6   t t tt W d    n1 s(0    Y  d S rh   )r   rC   r   r   r"   r"   r"   r#   mainloop  s    
z_BackendQT.mainloopN)	rv   rQ   rw   rz   ZFigureCanvasr   ZFigureManagerstaticmethodr  r"   r"   r"   r#   r    s   r  )Urd   r   re  signalr   r   rB   rF   r   r   r   Zmatplotlib._pylab_helpersr   Zmatplotlib.backend_basesr   r   r   r	   r
   r   r   r   Z+matplotlib.backends.qt_editor.figureoptionsbackendsZ	qt_editorrN  r  r   r   r   r   r   r   r   r   r   r   r   r   Zbackend_versionplatformr   r   ZMOVEZHANDPOINTERZSELECT_REGIONZWAITZRESIZE_HORIZONTALZRESIZE_VERTICALr   rC   rM   rf   rg   rY   rz   ZQMainWindowr   r   r"  r  r  r^  r  ZConfigureSubplotsBaser  ZSaveFigureBaser  
deprecatedZSetCursorBaser  ZRubberbandBaser  ZToolHelpBaser  ZToolCopyToClipboardBaser  ZToolSaveFigureZToolConfigureSubplotsZToolRubberbandZToolHelpZToolCopyToClipboardZexportr  r"   r"   r"   r#   <module>   s   (4-
#(  ${ 2bD
