o
    ĎiH                  	   @   s8  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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& dd	 g d
dddddddddddddddddddej'dkrdnd fd!ej'dkrd"ndfd#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2R D Z(d3d4 d5D Z)d6d	 ej*d7fej+d8fej,d9fej-d:fej.d;fej/d<fej0d=ffD Z1e 2dd>d? Z3d@dA Z4G dBdC dCeZ5G dDdE dEee"j6Z7G dFdG dGe"j8Z9G dHdI dIeZ:G dJdK dKee"j;Z<G dLdM dMe"j=Z>G dNdO dOee"j;Z?e@e7G dPdQ dQejAZBe@e7G dRdS dSejCZDe@e7G dTdU dUejEZFe@e7G dVdW dWejGZHe@e7G dXdY dYejIZJe<e:_Ke?e:_LejMG dZd[ d[eZNdS )\    N)_apibackend_toolscbook)Gcf)_BackendFigureCanvasBaseFigureManagerBaseNavigationToolbar2	TimerBasecursorsToolContainerBaseMouseButton
CloseEventKeyEventLocationEvent
MouseEventResizeEvent_allow_interrupt   )	qt_compat)QtCoreQtGui	QtWidgets__version__QT_API_to_int
_isdeletedc                 C   s$   i | ]\}}t ttjj||qS  )r   getattrr   QtKey.0kvr   r   Z/home/jeff/fluffinator/venv/lib/python3.10/site-packages/matplotlib/backends/backend_qt.py
<dictcomp>   s    r&   )
Key_Escapeescape)Key_Tabtab)Key_Backspace	backspace)
Key_Returnenter)	Key_Enterr.   )
Key_Insertinsert)
Key_Deletedelete)	Key_Pausepause)
Key_SysReqsysreq)	Key_Clearclear)Key_Homehome)Key_Endend)Key_Leftleft)Key_Upup)	Key_Rightright)Key_Downdown)
Key_PageUppageup)Key_PageDownpagedown)	Key_ShiftshiftKey_ControldarwincontrolcmdKey_Metameta)Key_Altalt)Key_CapsLock	caps_lock)Key_F1f1)Key_F2f2)Key_F3f3)Key_F4f4)Key_F5f5)Key_F6f6)Key_F7f7)Key_F8f8)Key_F9f9)Key_F10f10)rh   f11)Key_F12f12)Key_Super_Lsuper)Key_Super_Rrn   c                 C   s4   g | ]\}}t ttjj|t ttjj|fqS r   )r   r   r   r   KeyboardModifierr    )r"   modkeyr   r   r%   
<listcomp>C   s    rs   ))ControlModifierrL   )AltModifierrR   )ShiftModifierrJ   )MetaModifierrP   c                 C   s    i | ]\}}|t tjj|qS r   )r   r   r   CursorShaper!   r   r   r%   r&   M       SizeAllCursorPointingHandCursorArrowCursorCrossCursor
WaitCursorSizeHorCursorSizeVerCursorc                  C   s  t j } | d u rtj stdtdv rd}d}ntdv r$d}d}ntd|D ]7}tj	
| d	}|d ura|j d uratj	
| d
}tdt dt  d| d|  d	  nq*|dkrzz
t jtjj W n	 tyy   Y nw zt jtjjj W n	 ty   Y nw t dg} tjdkrttd}t|}| | | d t  |dkr| tjj | S )NzInvalid DISPLAY variable>   PyQt6PySide6)PyQt5PySide2   >   r   r   )r   r      zShould never be herez
.QtWidgetsz.QtCorezMatplotlib is using z which wraps z+ however an instantiated QApplication from z< exists.  Mixing Qt major versions may not work as expected.
matplotlibrM   images/matplotlib.svgT) r   QApplicationinstancempl_c_internal_utilsdisplay_is_validRuntimeErrorr   sysmodulesgetr   warn_externalr   qVersionsetAttributer   AA_EnableHighDpiScalingAttributeError#setHighDpiScaleFactorRoundingPolicy HighDpiScaleFactorRoundingPolicyPassThroughplatformstrr   _get_data_pathr   QIconsetWindowIconsetQuitOnLastWindowClosed_setup_new_guiappAA_UseHighDpiPixmaps)appother_bindings
qt_versionbindingrq   
other_coreimageiconr   r   r%   _create_qApp\   sb   





r   c                    s   dd } fdd}t ||S )zEA context manager that allows terminating a plot by sending a SIGINT.c                    s.   t   t jjj}|jj fdd}|S )Nc                      s&   z  d W d S  ty   Y d S w Nr   )recvBlockingIOErrorr   rsockr   r%   _may_clear_sock   s
   zF_allow_interrupt_qt.<locals>.prepare_notifier.<locals>._may_clear_sock)r   QSocketNotifierfilenoTypeRead	activatedconnect)r   snr   r   r   r%   prepare_notifier   s   z-_allow_interrupt_qt.<locals>.prepare_notifierc                    s:   |    tj| tjjj t dr    	  d S )NcloseAllWindows)
deleteLaterr   QCoreApplicationsendPostedEventsQEventr   DeferredDeletehasattrr   quit)r   qapp_or_eventloopr   r%   handle_sigint   s
   
z*_allow_interrupt_qt.<locals>.handle_sigint)r   )r   r   r   r   r   r%   _allow_interrupt_qt   s   
r   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timeoutr   	_on_timerrn   __init__selfargskwargs	__class__r   r%   r      s   
zTimerQT.__init__c                 C   s   t | js|   d S d S r   )r   r   _timer_stopr   r   r   r%   __del__   s   
zTimerQT.__del__c                 C      | j | j d S r   )r   setSingleShot_singler   r   r   r%   _timer_set_single_shot      zTimerQT._timer_set_single_shotc                 C   r   r   )r   setInterval	_intervalr   r   r   r%   _timer_set_interval   r   zTimerQT._timer_set_intervalc                 C      | j   d S r   )r   startr   r   r   r%   _timer_start      zTimerQT._timer_startc                 C   r   r   )r   stopr   r   r   r%   r      r   zTimerQT._timer_stop)__name__
__module____qualname____doc__r   r   r   r   r   r   __classcell__r   r   r   r%   r      s    r   c                       s  e Zd ZdZeZedd 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dJ fdd	Ze dd Zeejdd Z fddZdd Zdd ZdJd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&e'd2d3 Z(e'dJdd4d5d6Z)d7d8 Z*d9d: Z+dKd<d=Z,dJd>d?Z- fd@dAZ.dBdC Z/dJdDdEZ0dFdG Z1dHdI Z2  Z3S )LFigureCanvasQTqtc                 C   s   t S r   )FigureManagerQT)clsr   r   r%   <lambda>       zFigureCanvasQT.<lambda>c                 C   s    i | ]\}}t tjj||qS r   )r   r   r   r   r!   r   r   r%   r&      ry   zFigureCanvasQT.<dictcomp>
LeftButtonRightButtonMiddleButtonXButton1XButton2Nc                    sv   t   t j|d d| _d| _dd | _d| _| tj	j
j | d | j|    ttd}| | d S )N)figureFc                 S      d S r   r   painterr   r   r%   r      r   z)FigureCanvasQT.__init__.<locals>.<lambda>Twhite)r   rn   r   _draw_pending_is_drawing_draw_rect_callback_in_resize_eventr   r   r   WidgetAttributeWA_OpaquePaintEventsetMouseTrackingresizeget_width_heightr   QPaletteQColor
setPalette)r   r   paletter   r   r%   r      s   

zFigureCanvasQT.__init__c                 C   s8   |  |  pdrt|  |  }| | d S d S r   )_set_device_pixel_ratiodevicePixelRatioFr   QResizeEventsizeresizeEventr   eventr   r   r%   _update_pixel_ratio   s   
z"FigureCanvasQT._update_pixel_ratioc                 C   s4   |    |d ur|j| j  |j| j  d S d S r   )r
  physicalDotsPerInchChangedr   logicalDotsPerInchChanged)r   screenr   r   r%   _update_screen  s
   zFigureCanvasQT._update_screenc                    s(   |  tjjjkr|   t ||S r   )typer   r   r   DevicePixelRatioChanger
  rn   eventFilter)r   sourcer	  r   r   r%   r  	  s   zFigureCanvasQT.eventFilterc                 C   sp   |    }tdd t ddd d D }|dkr(|   ||  d S |j	| j
 | 
|  d S )Nc                 s   s    | ]}t |V  qd S r   int)r"   xr   r   r%   	<genexpr>  s    z+FigureCanvasQT.showEvent.<locals>.<genexpr>.   )r   r   )windowwindowHandletupler   r   splitr
  installEventFilterscreenChangedr   r  r  )r   r	  r  current_versionr   r   r%   	showEvent  s   &zFigureCanvasQT.showEventc                 C   s   |  tjt|d d S )N)cursor)	setCursorr   check_getitemcursord)r   r!  r   r   r%   
set_cursor  s   zFigureCanvasQT.set_cursorc                 C   st   |du r|  tj }nt|dr| }n	t|dr | }| }| 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.
        Npositionpos)mapFromGlobalr   QCursorr'  r   r&  r  r   bboxheightdevice_pixel_ratioy)r   r'  r  r-  r   r   r%   mouseEventCoords  s   



zFigureCanvasQT.mouseEventCoordsc                 C   sJ   t j  }| jd u rd S td| g| |R | ||d  d S )Nfigure_enter_event	modifiersguiEvent)	r   r   r   queryKeyboardModifiersr   r   r.  _mpl_modifiers_process)r   r	  modsr   r   r%   
enterEvent4  s   

zFigureCanvasQT.enterEventc                 C   sB   t j  | jd u rd S td| g|  R |  |d  d S )Nfigure_leave_eventr0  )r   r   restoreOverrideCursorr   r   r.  r4  r5  r  r   r   r%   
leaveEvent?  s   


zFigureCanvasQT.leaveEventc                 C   Z   | j | }|d ur)| jd ur+td| g| ||R |  |d  d S d S d S )Nbutton_press_eventr0  buttondr   buttonr   r   r.  r4  r5  r   r	  r?  r   r   r%   mousePressEventH     
zFigureCanvasQT.mousePressEventc                 C   s\   | j | }|d ur*| jd ur,td| g| ||R d|  |d  d S d S d S )Nr<  T)dblclickr1  r2  r=  r@  r   r   r%   mouseDoubleClickEventP  s   
z$FigureCanvasQT.mouseDoubleClickEventc                 C   sF   | j d u rd S td| g| |R | | |  |d  d S )Nmotion_notify_event)buttonsr1  r2  )r   r   r.  _mpl_buttonsrF  r4  r5  r  r   r   r%   mouseMoveEventX  s   

zFigureCanvasQT.mouseMoveEventc                 C   r;  )Nbutton_release_eventr0  r=  r@  r   r   r%   mouseReleaseEventa  rB  z FigureCanvasQT.mouseReleaseEventc                 C   s   |   stj  dkr|  d }n|   }|r<| jd ur>t	d| g| 
|R ||  |d  d S d S d S )Nxcbx   scroll_event)stepr1  r2  )
pixelDeltaisNullr   r   r   platformName
angleDeltar-  r   r   r.  r4  r5  )r   r	  stepsr   r   r%   
wheelEventi  s   
zFigureCanvasQT.wheelEventc                 C   J   |  |}|d ur!| jd ur#td| |g|  R d|i  d S d S d S )Nkey_press_eventr2  _get_keyr   r   r.  r5  r   r	  rr   r   r   r%   keyPressEventw     

zFigureCanvasQT.keyPressEventc                 C   rU  )Nkey_release_eventr2  rW  rY  r   r   r%   keyReleaseEvent~  r[  zFigureCanvasQT.keyReleaseEventc                 C   s   | j rd S | jd u rd S d| _ z?|  | j }|  | j }| jj}|| }|| }| jj||dd tj	
| | td|   |   W d| _ d S d| _ w )NTF)forwardresize_event)r   r   r  widthr,  r+  dpiset_size_inchesr   QWidgetr  r   r5  	draw_idle)r   r	  whdpivalwinchhinchr   r   r%   r    s    

zFigureCanvasQT.resizeEventc                 C   s   |   \}}t||S r   )r   r   QSize)r   re  rf  r   r   r%   sizeHint     zFigureCanvasQT.sizeHintc                 C   s   t ddS )N
   )r   rj  r   r   r   r%   minimumSizeHint  s   zFigureCanvasQT.minimumSizeHintc                    s    t    fddtj D S )Nc                    s    h | ]\}}t | @ r|qS r   )r   )r"   maskr?  rF  r   r%   	<setcomp>  s    

z.FigureCanvasQT._mpl_buttons.<locals>.<setcomp>)r   r   r>  itemsrp  r   rp  r%   rG    s   zFigureCanvasQT._mpl_buttonsexcludec                   s2   d u rt j  t fddtD S )Nc                    s0   g | ]\}} |kr|@ rt | d dqS )rN   ctrl)SPECIAL_KEYSreplace)r"   ro  rr   rt  r1  r   r%   rs     s
    z1FigureCanvasQT._mpl_modifiers.<locals>.<listcomp>)r   r   r   keyboardModifiersr   _MODIFIER_KEYS)r1  rt  r   rx  r%   r4    s   zFigureCanvasQT._mpl_modifiersc                 C   sx   |  }| j|d}zt| }W n# ty3   |tjkrY d S t|}d|v r-|d n| }Y nw d	||g S )Nrs  rK   +)
rr   r4  rv  KeyErrorr   
maxunicodechrremovelowerjoin)r   r	  	event_keyr6  rr   r   r   r%   rX    s   
zFigureCanvasQT._get_keyc                 C   s   t j   d S r   )r   r   r   processEventsr   r   r   r%   flush_events  s   zFigureCanvasQT.flush_eventsr   c                 C   s   t | dr| j rtdt  | _}|dkr%tjt|d |j	}t
| t| W d    d S 1 s:w   Y  d S )N_event_loopzEvent loop already runningr   i  )r   r  	isRunningr   r   
QEventLoopr   
singleShotr  r   r   r   _exec)r   r   
event_loop_r   r   r%   start_event_loop  s   
"zFigureCanvasQT.start_event_loopc                 C   s   t | dr| j  d S d S )Nr  )r   r  r   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 sw   Y  |   dS )z5Render the figure, and queue a request for a Qt draw.NT)r   )r   r   _setattr_cmrn   drawupdater   r   r   r%   r    s   zFigureCanvasQT.drawc                 C   s:   t | ddst | ddsd| _tjd| j dS dS dS )z9Queue redraw of the Agg buffer and request Qt paintEvent.r   Fr   Tr   N)r   r   r   r   r  
_draw_idler   r   r   r%   rd    s   
zFigureCanvasQT.draw_idlec                    sZ   |d u r j r j j} fdd|jD \}}}}|| } |   | || d S )Nc                 3       | ]
}t | j V  qd S r   r  r,  r"   ptr   r   r%   r        z&FigureCanvasQT.blit.<locals>.<genexpr>)r   r*  boundsrepaintrectr+  )r   r*  lbre  rf  tr   r   r%   blit  s
    zFigureCanvasQT.blitc              	   C   s   |   M | js	 W d    d S d| _t| s$|  dks$|  dkr-	 W d    d S z|   W n ty@   t  Y n	w W d    d S W d    d S 1 sTw   Y  d S )NFr   )	_idle_draw_cntxr   r   r+  r`  r  	Exception	traceback	print_excr   r   r   r%   r    s"   
 
"zFigureCanvasQT._draw_idlec                    sb   |d ur$ fdd|D \}}| |  fdd}ndd }| _    d S )Nc                 3   r  r   r  r  r   r   r%   r    r  z/FigureCanvasQT.drawRectangle.<locals>.<genexpr>c                    s   t t dd j }|ddg t ddft ddffD ]3\}}|| || | | |  |  |  |  q!d S )Nblackr      r   r   )	r   QPenr   r,  setDashPatternsetDashOffsetsetColorsetPendrawLine)r   pencoloroffsetr   x0x1y0y1r   r%   r     s    


z9FigureCanvasQT.drawRectangle.<locals>._draw_rect_callbackc                 S   r   r   r   r   r   r   r%   r   ,  s   )r   r  )r   r  re  rf  r   r   r  r%   drawRectangle  s   zFigureCanvasQT.drawRectangler   )r   )4r   r   r   required_interactive_frameworkr   
_timer_clsr   classpropertymanager_classr   LEFTRIGHTMIDDLEBACKFORWARDr>  r   r   Slotr
  r   QScreenr  r  r   r%  r.  r7  r:  rA  rD  rH  rJ  rT  rZ  r]  r  rk  rn  staticmethodrG  r4  rX  r  r  r  r  rd  r  r  r  r   r   r   r   r%   r      s\    


	

		




	r   c                       s$   e Zd Ze Z fddZ  ZS )
MainWindowc                    s   | j   t | d S r   )closingemitrn   
closeEventr  r   r   r%   r  5  s   
zMainWindow.closeEvent)r   r   r   r   Signalr  r  r   r   r   r   r%   r  2  s    r  c                       sd   e Zd ZdZ fddZdd Zdd Zdd	 Zed
d Z	dd Z
dd Zdd Zdd Z  ZS )r   z
    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 tjdkr*t	t
d}t|}| j| d| j_| jr@| j| j | j  }nd}| }| }|| }| j| | | j| j t rl| j  | j  | jtjjj  | j!  | j"  d S )NrM   r   Fr   )#r  r  rn   r   r  r   _widgetclosedr   r   r   r   r   r   r   r   _destroyingtoolbar
addToolBarrk  r+  r   r`  setCentralWidgetcanvasr   is_interactiveshowrd  setFocusPolicyr   r   FocusPolicyStrongFocussetFocusraise_)	r   r  numr   r   
tbs_heightcs	cs_heightr+  r   r   r%   r   H  s.   




zFigureManagerQT.__init__c                 C   s&   | j  r| j   d S | j   d S r   )r  isFullScreen
showNormalshowFullScreenr   r   r   r%   full_screen_togglep  s   
z"FigureManagerQT.full_screen_togglec                 C   sJ   t d| j  | jjrd S d| j_zt|  W d S  ty$   Y d S w )Nclose_eventT)r   r  r5  r  r  r   destroyr   r   r   r   r%   r  v  s   zFigureManagerQT._widgetclosedc                 C   sp   t || jj }t || jj }| j | j  }| j | j  }| j|| | j|| ||  d S r   )r  r  r,  r  r`  r+  r   )r   r`  r+  extra_widthextra_heightr   r   r%   r     s   zFigureManagerQT.resizec                 C   sJ   t j }|r#t| t| W d    d S 1 sw   Y  d S d S r   )r   r   r   r   r   r  )r   qappr   r   r%   start_main_loop  s   

"zFigureManagerQT.start_main_loopc                 C   s8   d| j _| j   tjd r| j   | j   d S d S )NFzfigure.raise_window)r  r  r  r   rcParamsactivateWindowr  r   r   r   r%   r    s   


zFigureManagerQT.showc                 G   sD   t j d u r	d S | jjrd S d| j_| jr| j  | j  d S NT)r   r   r   r  r  r  r  closer   r   r   r   r%   r    s   
zFigureManagerQT.destroyc                 C   s
   | j  S r   )r  windowTitler   r   r   r%   get_window_title  s   
z FigureManagerQT.get_window_titlec                 C   s   | j | d S r   )r  setWindowTitle)r   titler   r   r%   set_window_title     z FigureManagerQT.set_window_title)r   r   r   r   r   r  r  r   classmethodr  r  r  r  r  r   r   r   r   r%   r   :  s    (

r   c                       s   e Zd 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 )!NavigationToolbar2QTc                 C   s   g | ]^}}|qS r   r   )r"   namer  r   r   r%   rs         zNavigationToolbar2QT.<listcomp>Subplotsr   )	Customizez%Edit axis, curve and image parametersqt4_editor_optionsedit_parametersNTc                 C   sf  t j| | | tjttjjjttjjj	B  || _
i | _d| _| jD ]G\}}}}|du r7|   q(t| |}t|t|}t |}| | |d ||}	|	| j|< |dv rf|	d |duro|	| q(| j
rt d| | _| jtjttjjjttjjjB  | jt t jj j!t jj j" | #| j}
|
$d t%| | dS )z9coordinates: should we show the coordinates on the right?N.png)zoompanT )&r   QToolBarr   setAllowedAreasr   r   ToolBarArear   TopToolBarAreaBottomToolBarAreacoordinates_actions_subplot_dialog	toolitemsaddSeparatorr   	functoolswrapspartialr  	addAction_iconsetCheckable
setToolTipQLabellocLabelsetAlignmentAlignmentFlag
AlignRightAlignVCentersetSizePolicyQSizePolicyPolicy	ExpandingIgnored	addWidget
setVisibler	   )r   r  parentr  texttooltip_text
image_filecallbackslotalabelActionr   r   r%   r     sL   







zNavigationToolbar2QT.__init__c                 C   s   t d|}||jdd}t| r|n|}t|}|	| 
 p&d |  |   dk rT|  |  }|tdtjjj}|| || t|S )z
        Construct a `.QIcon` from an image file *name*, including the extension
        and relative to Matplotlib's "images" data directory.
        imagesr  z
_large.pngr      r  )r   r   	with_namer  rw  r   existsr   QPixmapsetDevicePixelRatior  r  r  backgroundRolevalueforegroundRolecreateMaskFromColorr   r   r   MaskModeMaskOutColorfillsetMaskr   )r   r  path_regular
path_largefilenamepm
icon_colorro  r   r   r%   r    s$   




zNavigationToolbar2QT._iconc                    s   | j j }|stj| j  dd d S t|dkr|\}nIdd |D   fdd D }t|D ]\}} | |v rL |  dt	|dd	7  < q3tj
| j  d
d dd\}}|sad S | | }t||  d S )NErrorzThere are no Axes to edit.r   c              	   S   s^   g | ]+}|  p,| p,|d p,|dp,dtd| | gp,dt|j dqS )r?   rC   z - Nz<anonymous >)	get_label	get_titler  filter
get_xlabel
get_ylabelr  r   )r"   axr   r   r%   rs     s    z8NavigationToolbar2QT.edit_parameters.<locals>.<listcomp>c                    s   g | ]}  |d kr|qS )r   )count)r"   r  titlesr   r%   rs     s    z (id: z#x)r  zSelect Axes:r   F)r  r   get_axesr   QMessageBoxwarningr  len	enumerateidQInputDialoggetItemindexfigureoptionsfigure_edit)r   axesr6  duplicate_titlesiitemokr   r8  r%   r    s4   

z$NavigationToolbar2QT.edit_parametersc                 C   sL   d| j v r| j d | jjdk d| j v r$| j d | jjdk d S d S )Nr  PANr  ZOOM)r  
setCheckedmoder  r   r   r   r%   _update_buttons_checked  s
   

z,NavigationToolbar2QT._update_buttons_checkedc                       t  j|  |   d S r   )rn   r  rO  r  r   r   r%   r    rl  zNavigationToolbar2QT.panc                    rP  r   )rn   r  rO  r  r   r   r%   r  #  rl  zNavigationToolbar2QT.zoomc                 C   s   | j r| j| d S d S r   )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%   rs   /  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 r   )r  r  r   r   r   r%   remove_rubberband2  r  z&NavigationToolbar2QT.remove_rubberbandc                    s\    j d u rt jj j  _  jd fdd  j    j d  j    j S )Nr  c                    s
    j  S r   )r  reject)er   r   r%   r   :  s   
 z9NavigationToolbar2QT.configure_subplots.<locals>.<lambda>T)	r  SubplotToolQtr  r   r  mpl_connectupdate_from_current_subplotparssetModalr  r   r   r   r%   configure_subplots5  s   


z'NavigationToolbar2QT.configure_subplotsc              
   G   s@  | j  }t| }| j  }tjtj	d }tj
|| j  }g }d }|D ]!\}	}
d
dd |
D }|	 d| d}||
v rE|}|| q)d
|}tj| j  d|||\}}|r|d	krntj|tj	d< z
| j j| W |S  ty } ztj| d
t|tjjjtjjj W Y d }~|S d }~ww |S )Nzsavefig.directory c                 S   s   g | ]}d | qS )z*.%sr   )r"   extr   r   r%   rs   J  r  z4NavigationToolbar2QT.save_figure.<locals>.<listcomp>z (r:  z;;zChoose a filename to save tor  zError saving file)r  get_supported_filetypes_groupedsortedrr  get_default_filetypeospath
expanduserr   r  r  get_default_filenameappendr   QFileDialoggetSaveFileNamer  dirnamer   savefigr  r<  criticalr   StandardButtonOkNoButton)r   r   	filetypessorted_filetypesdefault_filetype	startpathr   filtersselectedFilterr  exts	exts_listr3  fnamerY  r   r   r%   save_figure@  sD   



z NavigationToolbar2QT.save_figurec                 C   s^   | j jdk}| j jt| j d k }d| jv r| jd | d| jv r-| jd | d S d S )Nr   r   backr^  )
_nav_stack_posr>  r  
setEnabled)r   can_backwardcan_forwardr   r   r%   set_history_buttonsa  s   

z(NavigationToolbar2QT.set_history_buttonsr  )r   r   r   r	   r  r1   rC  r   r  r  rO  r  r  rT  rV  rW  r^  rz  r  r   r   r   r   r%   r    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 )rZ  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 ]v\}}}t
 }|| t
|}|| t
|}	|D ]-}
t
  | j	|
< }|dd |d |d |d |j| j |	|
| qa|d |D ]!\}
}t
 |
}|!d |j"| || |
dkr|#  qqB|| _$i | _%d | _&| '  d S )Nzimages/matplotlib.pngSubplotToolBorders)topbottomr?   rC   zExport valuesSpacingshspacewspacezTight layoutResetCloser   r   r  g{Gzt?F)(rn   r   r   r   r   r   r   r   setObjectName
_spinboxesr   QHBoxLayout	setLayout_export_values_tight_layout_resetr  QVBoxLayout	addLayout	QGroupBoxr  QFormLayoutQDoubleSpinBoxsetRangesetDecimalssetSingleStepsetKeyboardTrackingvalueChangedr   _on_value_changedaddRow
addStretchQPushButtonsetAutoDefaultclickedr  _figure	_defaults_export_values_dialogr\  )r   	targetfigr  main_layoutgroup	spinboxesrF  layoutboxinnerr  spinboxmethodr?  r   r   r%   r   k  s^   


	










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  r   r   r%   r&     s    zASubplotToolQt.update_from_current_subplotpars.<locals>.<dictcomp>)r  rr  r  r  r   r   r   r%   r\    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%   r    s    z/SubplotToolQt._export_values.<locals>.<genexpr>r      )r   QDialogr  r  r  QPlainTextEditsetReadOnlyr  setPlainTextr  r  rr  maximumSize	setHeightr   QFontMetricsdocumentdefaultFontr  toPlainTextr+  setMaximumSizer  )r   r  r  r  r   r   r%   r    s&   




zSubplotToolQt._export_valuesc                 C   sx   | j }dD ]\}}|| ||  d  || ||  d  q| jjdi dd | D  | jj  d S )N))r  r  )r?   rC   gMbP?c                 S   s   i | ]	\}}||  qS r   r  r  r   r   r%   r&     s    z3SubplotToolQt._on_value_changed.<locals>.<dictcomp>r   )	r  
setMinimumr#  
setMaximumr  subplots_adjustrr  r  rd  )r   r  r  higherr   r   r%   r    s   
zSubplotToolQt._on_value_changedc                 C   sV   | j   | j D ]\}}|d |t| j j| |d q
| j j	  d S )NTF)
r  tight_layoutr  rr  blockSignalssetValuer   r  r  rd  )r   r  r  r   r   r%   r    s   

zSubplotToolQt._tight_layoutc                 C   sJ   | j  D ]\}}|dd |d || |d q|   d S )Nr   r   TF)r  rr  r  r  r  r  )r   r  r#  r   r   r%   r    s   

zSubplotToolQt._reset)
r   r   r   r   r\  r  r  r  r  r   r   r   r   r%   rZ  j  s    ,
rZ  c                   @   s>   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd ZdS )	ToolbarQtNc                 C   s   t | | tj| | | tjttjjj	ttjjj
B  td}|tjttjjjttjjjB  |ttjjjtjjj | || _i | _i | _d S )Nr  )r   r   r   r  r  r   r   r  r   r  r  r  r	  r
  r  r  r  r  r  r  r  r  _message_action
_toolitems_groups)r   toolmanagerr  message_labelr   r   r%   r     s(   



zToolbarQt.__init__c           	         s   t }|r|t| |  |r||  fdd}|r1|d |j	| n|j
	| j g  | || j  ||f d S )Nc                      s      d S r   )trigger_toolr   r  r   r   r%   handler  r   z'ToolbarQt.add_toolitem.<locals>.handlerT)r   QToolButtonsetIconr  r  rQ  r  r  toggledr   r  r  
setdefault_add_to_grouprh  )	r   r  r  r&  r  descriptiontoggler?  r  r   r  r%   add_toolitem  s   



zToolbarQt.add_toolitemc           	      C   sV   | j |g }|s| | j}|| || }| ||}||| || j |< d S r   )r  r   insertSeparatorr  rh  insertWidgetr1   )	r   r  r  r?  r&  grsepbeforewidgetr   r   r%   r    s   
zToolbarQt._add_to_groupc                 C   sH   || j vrd S | j | D ]\}}|j| || |j| qd S r   )r  r  
disconnectrM  r   )r   r  r  r?  r  r   r   r%   toggle_toolitem  s   

zToolbarQt.toggle_toolitemc                 C   s&   | j |g D ]	\}}|d  qd S r   )r  pop	setParent)r   r  r?  r  r   r   r%   remove_toolitem  s   zToolbarQt.remove_toolitemc                 C   s   |  | j| d S r   )widgetForActionr  rQ  rR  r   r   r%   rT    s   zToolbarQt.set_messager   )	r   r   r   r   r  r  r  r  rT  r   r   r   r%   r    s    

r  c                       s$   e Zd Z fddZdd Z  ZS )ConfigureSubplotsQtc                    s   t  j|i | d | _d S r   )rn   r   r  r   r   r   r%   r     s   
zConfigureSubplotsQt.__init__c                 G   s   t |  d S r   )r  r^  r  r   r   r%   trigger  r   zConfigureSubplotsQt.trigger)r   r   r   r   r  r   r   r   r   r%   r    s    r  c                   @      e Zd Zdd ZdS )SaveFigureQtc                 G      t |   d S r   )r  rz  "_make_classic_style_pseudo_toolbarr  r   r   r%   r       zSaveFigureQt.triggerNr   r   r   r  r   r   r   r%   r        r  c                   @   s   e Zd Zdd Zdd ZdS )RubberbandQtc                 C   s   t |  d |||| d S r   )r  rV  r  )r   r  r  r  r  r   r   r%   rV  "  s   zRubberbandQt.draw_rubberbandc                 C   r  r   )r  rW  r  r   r   r   r%   rW  &  r  zRubberbandQt.remove_rubberbandN)r   r   r   rV  rW  r   r   r   r%   r     s    r  c                   @   r  )HelpQtc                 G   s   t jd d|   d S )NHelp)r   r<  information_get_help_htmlr  r   r   r%   r  -  s   zHelpQt.triggerNr  r   r   r   r%   r  +  r  r  c                   @   r  )ToolCopyToClipboardQTc                 O   s"   | j  }tj  | d S r   )r  grabr   r   r   	clipboard	setPixmap)r   r   r   pixmapr   r   r%   r  3  s   
zToolCopyToClipboardQT.triggerNr  r   r   r   r%   r  1  r  r  c                   @   s   e Zd ZeZeZeZej	Z
dS )
_BackendQTN)r   r   r   r   backend_versionr   FigureCanvasr   FigureManagerr  mainloopr   r   r   r%   r  <  s
    
r  )Or   rd  r   r  r   r   r   r   r   matplotlib._pylab_helpersr   matplotlib.backend_basesr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   +matplotlib.backends.qt_editor.figureoptionsbackends	qt_editorrD  r  r   r   r   r   r   r   r   r   r   rv  rz  MOVEHANDPOINTERSELECT_REGIONWAITRESIZE_HORIZONTALRESIZE_VERTICALr$  	lru_cacher   r   r   rc  r   QMainWindowr  r   r  r  r  rZ  r  _register_tool_classConfigureSubplotsBaser  SaveFigureBaser  RubberbandBaser  ToolHelpBaser  ToolCopyToClipboardBaser  _toolbar2_class_toolmanager_toolbar_classexportr  r   r   r   r%   <module>   s    @$	
 !"#$%&-

9%  \s >bC	
