
    G@d:                        d Z ddlZddlmZ ddlZddlmZmZ ddl	m
Z
 ddlmZ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Z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$ dd	l%m&Z& dd
l'm(Z( ddl)m*Z* ddl+m,Z, d Z-ddZ. G d de$e(          Z/ G d dee(          Z0 G d de          Z1 G d de$          Z2 G d de          Z3dS )zI
Figure browser widget

This is the main widget used in the Plots plugin
    N)svg_to_clipboardsvg_to_image)PYQT5)getexistingdirectorygetsavefilename)QEventQPointQRectQSizeQtQTimerSignalSlot)QPainterQPixmap)
QApplicationQFrameQGridLayoutQHBoxLayoutQScrollArea
QScrollBar	QSplitterQStyleQVBoxLayoutQWidget)_)SpyderWidgetMixin)getcwd_or_home)QStylePalettec                 t   t          j        |          \  }}|dk    r,|dk    r&t          |           }|                    |           dS |dk    r*t	          | t
                    r|                     d          } t          |d          5 }|                    |            ddd           dS # 1 swxY w Y   dS )z1Save fig to fname in the format specified by fmt..pngimage/svg+xmlzutf-8wbN)	ospsplitextr   save
isinstancestrencodeopenwrite)figfmtfnamerootextqimgfs          Jlib/python3.11/site-packages/spyder/plugins/plots/widgets/figurebrowser.pysave_figure_tofiler4   '   s    U##ID#
f}}//C  		%/!!jc&:&:!**W%%C% 	!GGCLLL	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   
B--B14B1Fc                    d}d                     ||          }|rd}d                     |||          }	 t          j        t          j        | |                    rd                     |||          }|dz  }nt          j        | |          S Z)zd
    Append a number to "root" to form a filename that does not already exist
    in "dirname".
       z{}{}r   z	{} ({}){})formatr$   existsjoin)dirnamer/   r0   start_at_zeroifignames         r3   get_unique_fignamer>   5   s    
 	
AmmD#&&G 3$$T1c22.:chw0011 	.!((q#66GFAA8GW---.    c                       e Zd ZdZ e            Z	  ee          Z	  ee          Z		  ee
          Z	  eee          Z	  ee          Z	 d f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 )FigureBrowserzt
    Widget to browse the figures that were sent by the kernel to the IPython
    console to be plotted inline.
    Nc                    t           r$t                                          ||           n+t          j        | |           t	          j        | |           d | _        d| _        d | _        d| _        || _	        d | _
        d | _        t          | | j	                  | _        | j        j                            | j                   | j        j                            | j                   | j        j                            | j                   | j        j                            | j                   t'          | j        | | j	                  | _        | j        j                            | j                   | j        j                            | j                   | j        j                            | j                   t1          |           x| _        }|                    | j                   |                    | j                   |                    t9                                                                 |                    dddd           t?          |           }|                    |           |                      |           |                    dddd           |!                    d           |                     dddd           d S )N)parentclass_parentrD   TFrC   background_color)rC   r   )"r   super__init__r   r   shellwidget
is_visible	figviewersetup_in_progressrG   mute_inline_plottingzoom_disp_valueFigureViewersig_context_menu_requestedconnectsig_figure_menu_requestedsig_figure_loadedsig_zoom_changed_update_zoom_valueThumbnailScrollBarthumbnails_sbsig_thumbnail_menu_requestedsig_save_dir_changedsig_redirect_stdio_requestedr   splitter	addWidgetsetFrameStyler   
frameStylesetContentsMarginsr   	setLayout
setSpacing)selfrC   rG   r\   layout	__class__s        r3   rI   zFigureBrowser.__init__   s    	BGGF@@@@T6***&t&AAAA!& 0$(!# &T7;7LN N N199*	, 	, 	,(001GHHH'//0EFFF'//0GHHH 0N!2
 
 

 	5==-	/ 	/ 	//77%	' 	' 	'7??-	/ 	/ 	/ $-D#9#9#994>***4-...{}}7799:::##Aq!Q///T"""""v!!!Q1---!1a+++++r?   c                     || _         dS )z"
        Used in testing.
        N)rO   rc   values     r3   rV   z FigureBrowser._update_zoom_value   s      %r?   c                 $   | j                             dddd           |                                D ]]\  }}|dk    r|                     |           !|dk    r|| _        /|dk    r|                     |           K|dk    r|| j        _        ^dS )z/Setup the figure browser with provided options.r   auto_fit_plottingrN   show_plot_outlinesave_dirN)r\   r`   itemschange_auto_fit_plottingrN   show_fig_outline_in_viewerrX   rl   )rc   optionsoptionrh   s       r3   setupzFigureBrowser.setup   s    ((Aq!444$]]__ 	4 	4MFE,,,--e4444111,1))...//6666:%%.3"+	4 	4r?   c                 r    | j         j        }||z
  dk    r!| j                            ||z
  |g           dS dS )z
        Update the widths to provide the scrollbar with a fixed minimum width.

        Parameters
        ----------
        base_width: int
            The available splitter width.
        r   N)rX   _min_scrollbar_widthr\   setSizes)rc   
base_widthmin_sb_widths      r3   update_splitter_widthsz$FigureBrowser.update_splitter_widths   sM     )>$q((M""J$=|#LMMMMM )(r?   c                     |du r.| j         j                            dt          j        z             dS | j         j                            d           dS )z7Draw a frame around the figure viewer if state is True.T#FigureCanvas{border: 2px solid %s;}zFigureCanvas{border: 0px;}N)rL   	figcanvassetStyleSheetr   COLOR_BACKGROUND_4rc   states     r3   ro   z(FigureBrowser.show_fig_outline_in_viewer   sl    D==N$22501    
 N$22,. . . . .r?   c                     || j         _        dS )z5Change the auto_fit_plotting option and scale images.N)rL   rj   r~   s     r3   rn   z&FigureBrowser.change_auto_fit_plotting   s    +0(((r?   c                 |    || _         |                    |            |j                            | j                   dS )z3Bind the shellwidget instance to the figure browserN)rJ   set_figurebrowsersig_new_inline_figurerR   _handle_new_figure)rc   rJ   s     r3   set_shellwidgetzFigureBrowser.set_shellwidget   s>    &%%d+++)11$2IJJJJJr?   c                 <    | j                             ||           dS )z`
        Handle when a new figure is sent to the IPython console by the
        kernel.
        N)rX   add_thumbnailrc   r,   r-   s      r3   r   z FigureBrowser._handle_new_figure   s#    
 	((c22222r?   c                 8    | j                                          dS )z9Zoom the figure in by a single step in the figure viewer.N)rL   zoom_inrc   s    r3   r   zFigureBrowser.zoom_in   s         r?   c                 8    | j                                          dS )z:Zoom the figure out by a single step in the figure viewer.N)rL   zoom_outr   s    r3   r   zFigureBrowser.zoom_out   s    !!!!!r?   c                 8    | j                                          dS )zq
        Select the thumbnail previous to the currently selected one in the
        thumbnail scrollbar.
        N)rX   go_previous_thumbnailr   s    r3   r   z#FigureBrowser.go_previous_thumbnail   s    
 	0022222r?   c                 8    | j                                          dS )zm
        Select the thumbnail next to the currently selected one in the
        thumbnail scrollbar.
        N)rX   go_next_thumbnailr   s    r3   r   zFigureBrowser.go_next_thumbnail  s    
 	,,.....r?   c                 8    | j                                          dS )z>Save the currently selected figure in the thumbnail scrollbar.N)rX   save_current_figure_asr   s    r3   save_figurezFigureBrowser.save_figure  s    1133333r?   c                 4    | j                                         S )z-Save all the figures in a selected directory.)rX   save_all_figures_asr   s    r3   save_all_figureszFigureBrowser.save_all_figures  s    !55777r?   c                 8    | j                                          dS )z?Close the currently selected figure in the thumbnail scrollbar.N)rX   remove_current_thumbnailr   s    r3   close_figurezFigureBrowser.close_figure  s    3355555r?   c                 8    | j                                          dS )z1Close all the figures in the thumbnail scrollbar.N)rX   remove_all_thumbnailsr   s    r3   close_all_figureszFigureBrowser.close_all_figures  s    0022222r?   c                 z    | j         r1| j         j        j        r"| j         j                                         dS dS dS )z(Copy figure from figviewer to clipboard.N)rL   r{   r,   copy_figurer   s    r3   r   zFigureBrowser.copy_figure  sL    > 	3dn6: 	3N$0022222	3 	3 	3 	3r?   NN)"__name__
__module____qualname____doc__r   rT   r	   rS   boolr[   r(   rZ   objectrY   intrU   rI   rV   rr   rx   ro   rn   r   r   r   r   r   r   r   r   r   r   r   __classcell__re   s   @r3   rA   rA   H   s        
 = &v $*6$<<  "6#;; $*6&&#9#9 	 vc{{1, 1, 1, 1, 1, 1,f% % %4 4 4N N N	. 	. 	.1 1 1K K K3 3 3! ! !" " "3 3 3/ / /4 4 48 8 86 6 63 3 33 3 3 3 3 3 3r?   rA   c                        e Zd ZdZ ee          Z	  ee          Z	  e            Z		 d fd	Z
ed             Zej        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 )rP   z
    A scrollarea that displays a single FigureCanvas with zooming and panning
    capability with CTRL + Mouse_wheel and Left-press mouse button event.
    Nc                 h   t           r$t                                          ||           n+t          j        | |           t	          j        | |           |                     t          j                   |                                 	                    d           |                                 
                    dt          |          z   dz              |                     d           || _        d| _        d| _        d| _        d| _        |                                  d	| _        d	| _        d S )
NrE   figviewportz#figviewport {background-color:}r   g333333?
   iF)r   rH   rI   r   r   setAlignmentr   AlignCenterviewportsetObjectNamer|   r(   r^   rG   _scalefactor
_scalestep_sfmax_sfminsetup_figcanvasrj   
_ispanningrc   rC   rG   re   s      r3   rI   zFigureViewer.__init__A  s     	BGGV&9999 v...&t&AAAA".)))%%m444%%-4D0E0EEK	M 	M 	M1 0!&  r?   c                     | j         S )zW
        Return whether to automatically fit the plot to the scroll area size.
        )_auto_fit_plottingr   s    r3   rj   zFigureViewer.auto_fit_plottingZ  s    
 &&r?   c                 :   || _         |r?|                     t          j                   |                     t          j                   n>|                     t          j                   |                     t          j                   |                                  dS )zT
        Set whether to automatically fit the plot to the scroll area size.
        N)r   setVerticalScrollBarPolicyr   ScrollBarAlwaysOffsetHorizontalScrollBarPolicyScrollBarAsNeededscale_imagerg   s     r3   rj   zFigureViewer.auto_fit_plottinga  s    
 #( 	D++B,ABBB--b.CDDDD++B,@AAA--b.BCCCr?   c                     t          | | j                  | _        | j                            |            | j        j                            | j                   |                     | j                   dS )zSetup the FigureCanvas.rF   N)FigureCanvasrG   r{   installEventFiltercustomContextMenuRequestedrR   show_context_menu	setWidgetr   s    r3   r   zFigureViewer.setup_figcanvaso  sv    %T7;7LN N N))$///199"	$ 	$ 	$t~&&&&&r?   c                     | j         rB| j         j        8| j                             |          }| j                            |           dS dS dS )z3Only emit context menu signal if there is a figure.N)r{   r,   mapToGlobalrQ   emit)rc   qpointpoints      r3   r   zFigureViewer.show_context_menux  sX    > 	8dn0<N..v66E+0077777	8 	8<<r?   c                     | j                             ||           | j                                         |                                  | j                                          dS )z&Set a new figure in the figure canvas.N)r{   load_figurerT   r   r   repaintr   s      r3   r   zFigureViewer.load_figure  s[    ""3,,,##%%%     r?   c                    |                                 t          j        k    r| j        szt	          j                    }|t          j        k    rU|                                	                                dk    r| 
                                 n|                                  dS dS |                                 t          j        k    r| j        r|                                  n|                                 t          j        k    r{|                                t          j        k    rWt	          j        t          j                   d| _        |                                | _        |                                | _        nM|                                 t          j        k    rt	          j                     d| _        n|                                 t          j        k    r| j        r| j        |                                z
  }|                                | _        | j        |                                z
  }|                                | _        |                                 }|                    |                                |z              |                                 }|                    |                                |z              t?          j         | ||          S )zAA filter to control the zooming and panning of the figure canvas.r   TF)!typer   Wheelrj   r   keyboardModifiersr   ControlModifier
angleDeltayr   r   Paintr   MouseButtonPressbutton
LeftButtonsetOverrideCursorClosedHandCursorr   globalXxclickglobalYyclickMouseButtonReleaserestoreOverrideCursor	MouseMovehorizontalScrollBarsetValuerh   verticalScrollBarr   eventFilter)rc   widgetevent	modifiersdxdy
scrollBarH
scrollBarVs           r3   r   zFigureViewer.eventFilter  s:    ::<<6<''0F'$688IB...##%%''))A--LLNNNNMMOOOtu ZZ\\V\))d.D) ZZ\\V444||~~...r/BCCC"&#mmoo#mmoo ZZ\\V666.000#DOO ZZ\\V--- =[5==??2#mmoo[5==??2#mmoo!5577
##J$4$4$6$6$;<<<!3355
##J$4$4$6$6$;<<<"4777r?   c                     | j         | j        k    r@| xj         dz  c_         |                                  |                     | j                   dS dS )z%Scale the image up by one scale step.r6   N)r   r   r   _adjust_scrollbarr   r   s    r3   r   zFigureViewer.zoom_in  s\    ++"""4?33333 ,+r?   c                     | j         | j        k    rC| xj         dz  c_         |                                  |                     d| j        z             dS dS )z'Scale the image down by one scale step.r6   N)r   r   r   r   r   r   s    r3   r   zFigureViewer.zoom_out  sa    ++"""1T_#455555 ,+r?   c                    | j         j        }| j         j        }| j        s@t	          || j        | j        z  z            }t	          || j        | j        z  z            }n|                                 }|                                 }|	                                |
                    t          j                  z
  |
                    t          j                  z
  }|                                |
                    t          j                  z
  |
                    t          j                  z
  }| j                             d           	 ||z  ||z  k    r%t	          |          }t	          ||z  |z            }n$t	          |          }t	          ||z  |z            }np# t$          $ rc |                     d          }	|	                    ||          | j         _        | j                             t-          d                     |}|}Y nw xY w| j                                         t/          ||          k    rI| j                             ||           | j                            |                                            dS dS )zScale the image size. broken_imagez4The image is broken, please try to generate it againN)r{   fwidthfheightrj   r   r   r   sizestylewidthpixelMetricr   PM_LayoutLeftMarginPM_LayoutRightMarginheightPM_LayoutTopMarginPM_LayoutBottomMargin
setToolTipZeroDivisionErrorcreate_iconpixmap
_qpix_origr   r   setFixedSizerU   r   get_scaling)
rc   r   r   	new_width
new_heightr   r   r   r   icons
             r3   r   zFigureViewer.scale_image  s`   &.( % 	%FT_8I%IIJJIWt$:K'KKLLJJ
 99;;DJJLLEZZ\\&&v'ABBC&&v'BCCDE kkmm''(ABBC''(DEEFF N%%b)))%W$88 #E

I!$UV^g%=!>!>JJ!$VJ #FW$4v$= > >I$ % % %''77,0KK,H,H)))LMMO O O"	$


% >  E)Z$@$@@@N''	:>>>!&&t'7'7'9'9::::: A@s   AF! !A*HHc                     | j                                         }| j         j        }|dk    rt          ||z  dz            S dS )z1Get the current scaling of the figure in percent.r   d   )r{   r   r   round)rc   r   r   s      r3   r  zFigureViewer.get_scaling  sD    $$&&&Q;;#-...3r?   c                 <    d| _         |                                  dS )z%Reset the image to its original size.r   N)r   r   r   s    r3   reset_original_imagez!FigureViewer.reset_original_image  s"    r?   c                    |                                  }|                    t          ||                                z  |dz
  |                                z  dz  z                        |                                 }|                    t          ||                                z  |dz
  |                                z  dz  z                        dS )zg
        Adjust the scrollbar position to take into account the zooming of
        the figure.
        r6      N)r   r   r   rh   pageStepr   )rc   r2   hbvbs       r3   r   zFigureViewer._adjust_scrollbar  s     %%''
CBHHJJ1q5BKKMM*A!*CDEEFFF ##%%
CBHHJJ1q5BKKMM*A!*CDEEFFFFFr?   r   )r   r   r   r   r   r   rU   r	   rQ   rT   rI   propertyrj   setterr   r   r   r   r   r   r   r  r  r   r   r   s   @r3   rP   rP   $  s[        
 vc{{ "( =           2 ' ' X'   ' ' '8 8 8! ! !08 08 08f4 4 46 6 6'; '; ';R    
G G G G G G Gr?   rP   c                       e Zd ZdZdZ ee          Z	  ee          Z		  ee
e          Z	 d  fd	Zd Zd Zd Z f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#d Z$d Z%d Z&d Z'd Z( xZ)S )!rW   z
    A widget that manages the display of the FigureThumbnails that are
    created when a figure is sent to the IPython console by the kernel and
    that controls what is displayed in the FigureViewer.
    r  Nc                 f   t                                          |           g | _        || _        t	                      | _        d | _        |                     |           |                                  d| _	        | j
                                        j                            | j                   d S )NF)rH   rI   _thumbnailsrG   r   rl   current_thumbnailset_figureviewer	setup_gui_new_thumbnail_added
scrollarear   rangeChangedrR   _scroll_to_newest_item)rc   figure_viewerrC   rG   re   s       r3   rI   zThumbnailScrollBar.__init__5  s        0&((!%m,,, %*!))++8@@'	) 	) 	) 	) 	)r?   c                     t          |           }|                    dddd           |                    d           |                    |                                            dS z$Setup the main layout of the widget.r   N)r   r`   rb   r]   setup_scrollarearc   rd   s     r3   r  zThumbnailScrollBar.setup_guiK  sc    T""!!!Q1---!..0011111r?   c                    t                      | _        t          | j                  | _        | j                            dddd           | j                            d           t                      | _        | j                            | j                   | j        	                    d           | j        
                    d           | j                            dddd           | j                            t          j                   | j                            | j                   | j                            t%                                 | j                            |            |                                                     dddd           |                                                     d           | j        S )z<Setup the scrollarea that will contain the FigureThumbnails.r      Tr  )r   viewr   scener`   rb   r   r  r   setWidgetResizabler^   setViewportMarginsr   r   r   setMinimumWidthrt   setVerticalScrollBarr   r   rd   r   s    r3   r#  z#ThumbnailScrollBar.setup_scrollareaR  si   II	 ++

%%aAq111 	
a   %--!!$),,,**4000%%a(((**1aA66644R5JKKK''(ABBB
 	,,Z\\::: 	**4000((Aq!444  ###r?   c                     || _         dS )z'Set the namespace for the FigureViewer.N)r   )rc   r   s     r3   r  z#ThumbnailScrollBar.set_figureviewerr  s    *r?   c                    |                                 t          j        k    r`|                                }|t          j        k    r|                                  dS |t          j        k    r|                                  dS |                                 t          j	        k    r| 
                                 t                                          ||          S )z
        An event filter to trigger an update of the thumbnails size so that
        their width fit that of the scrollarea and to remap some key press
        events to mimick navigational behaviour of a Qt widget list.
        T)r   r   KeyPresskeyr   Key_Upr   Key_Downr   Resize_update_thumbnail_sizerH   r   )rc   r   r   r0  re   s       r3   r   zThumbnailScrollBar.eventFilterv  s     ::<<6?**))++Cbi**,,,t##&&(((t::<<6=(('')))ww""65111r?   c                     | j                             d           t          | d| j                  }| j                             d           |r/| j                            |           |                     |          S dS )zSave all the figures to a file.FzSave all figuresTN)r[   r   r   rl   rZ   save_all_figures_todir)rc   r:   s     r3   r   z&ThumbnailScrollBar.save_all_figures_as  s    )..u555&t-?'+}6 6)..t444 	8%**7333..w777	8 	8r?   c                 @   g }dt           j                                                             d          z   }| j        D ]_}|j        j        }|j        j        }dddd|         }t          |||d          }t          |||           |	                    |           `|S )	zSave all figure in dirname.Figure %Y-%m-%d %H%M%Sr!   .jpg.svg	image/png
image/jpegr"   T)r;   )
datetimenowstrftimer  canvasr,   r-   r>   r4   append)	rc   r:   fignamesfigname_root	thumbnailr,   r-   fextr=   s	            r3   r6  z)ThumbnailScrollBar.save_all_figures_todir  s    ! )--//889JKKL) 
	% 
	%I"&C"&C!'"(%+- --02D ),7;= = =GsC111OOG$$$$r?   c                     | j         6|                     | j         j        j        | j         j        j                   dS dS z#Save the currently selected figure.N)r  save_figure_asrB  r,   r-   r   s    r3   r   z)ThumbnailScrollBar.save_current_figure_as  sQ    !- 6 = A $ 6 = AC C C C C .-r?   c                 Z    |                      |j        j        |j        j                   dS rI  )rJ  rB  r,   r-   rc   rF  s     r3   save_thumbnail_figure_asz+ThumbnailScrollBar.save_thumbnail_figure_as  s*    I,0)2B2FGGGGGr?   c                    dddd|         \  }}t          | j        dt          j                                                            d          z   |          }| j                            d           t          |                                 d||d	d
          \  }}| j                            d           |r?| j	                            t          j        |                     t          |||           d
S d
S )zSave the figure to a file.)r!   zPNG (*.png))r:  z JPEG (*.jpg;*.jpeg;*.jpe;*.jfif))r;  zSVG (*.svg);;PNG (*.png)r<  r8  r9  FzSave Figurer   N)rC   captionbasedirfiltersselectedfilterrp   T)r>   rl   r?  r@  rA  r[   r   r   rC   rZ   r$   r:   r4   )rc   r,   r-   rG  ffiltr=   r.   s          r3   rJ  z!ThumbnailScrollBar.save_figure_as  s    1FAC C DGHe
 %M)--//889JKKK 
 	)..u555%;;==-Ut- - -t 	)..t444 	0%**3;u+=+=>>>sC/////	0 	0r?   c                    t           j        dk    rdnd}| j                                        d|                                 z  z
  | j                                                                        z
  | j                                                                        z
  |z
  | j                                        	                                                                z
  }|dz
  }|S )zX
        Calculate the width the thumbnails need to have to fit the scrollarea.
        darwinr   r   r     )
sysplatformr  r   	lineWidthviewportMarginsleftrightr   sizeHint)rc   extra_paddingfigure_canvas_widths      r3   _calculate_figure_canvas_widthz1ThumbnailScrollBar._calculate_figure_canvas_width  s     "lh66AO!!##   !O++--22445 O++--33556 	
 O--//88::@@BBC 	 2A5""r?   c                 X    |                                  }|                    |           dS )zl
        Scale the thumbnail's canvas size so that it fits the thumbnail
        scrollbar's width.
        N)r`  scale_canvas_size)rc   rF  max_canvas_sizes      r3   _setup_thumbnail_sizez(ThumbnailScrollBar._setup_thumbnail_size  s/    
 ==??##O44444r?   c                     | j                                          | j        D ]}|                     |           | j                                          dS )zd
        Update the thumbnails size so that their width fit that of
        the scrollarea.
        N)r'  hider  rd  showrL  s     r3   r4  z)ThumbnailScrollBar._update_thumbnail_size  sW     		) 	2 	2I&&y1111	r?   c                 p    |j                             |          }| j                            ||           dS )zV
        Emit global positioned point and thumbnail for context menu request.
        N)rB  r   rQ   r   )rc   r   rF  s      r3   r   z$ThumbnailScrollBar.show_context_menu  s9      ,,U33',,UI>>>>>r?   c                 Z    t            j                  j                            ||           j                             j                   j                             j                   j	                             j
                   j                             fd            j                                       d _         j                             j                                        dz
  d            j                             j                                        dz
  d            j                             j                                        d                                                                                                            dS )zB
        Add a new thumbnail to that thumbnail scrollbar.
        rF   c                 0                         |           S N)r   )r   rc   rF  s    r3   <lambda>z2ThumbnailScrollBar.add_thumbnail.<locals>.<lambda>  s    $00	BB r?   Tr6   r   r  N)FigureThumbnailrG   rB  r   sig_canvas_clickedrR   set_current_thumbnailsig_remove_figure_requestedremove_thumbnailsig_save_figure_requestedrJ  rQ   r  rC  r  r(  setRowStretchrowCountr]   rg  rd  )rc   r,   r-   rF  s   `  @r3   r   z ThumbnailScrollBar.add_thumbnail  s    $$*?A A A	$$S#...$,,T-GHHH-55d6KLLL+33D4GHHH,44BBBBB	D 	D 	D	***$(!
  !4!4!6!6!:A>>>
Y
(;(;(=(=(A1EEE
  !4!4!6!6<<<""9---""9-----r?   c                 L    | j         |                     | j                    dS dS )z(Remove the currently selected thumbnail.N)r  rq  r   s    r3   r   z+ThumbnailScrollBar.remove_current_thumbnail  s0    !-!!$"899999 .-r?   c                    | j         D ]}|j                                         |j                                         |j                                         |                                                     |           |                    d           |                                 |	                                 g | _         d| _
        | j        j                                         dS )zRemove all thumbnails.N)r  rn  
disconnectrp  rr  rd   removeWidget	setParentrf  closer  r   r{   clear_canvasrL  s     r3   r   z(ThumbnailScrollBar.remove_all_thumbnails  s    ) 	 	I(335551<<>>>/::<<<KKMM&&y111%%%NNOO!%$1133333r?   c                 "     j         v r j                                       }	 j                                         j                                         j                                         n# t          $ r Y nw xY w j         v r j                                         j        k    rvt           j                   dk    r9 
                    t          |t           j                   dz
                       n% j        j                                         d _                                                                                                                                          t'          j        d fd           dS )zRemove thumbnail.r   r6   N   c                  .                                    S rk  )_remove_thumbnail_parentrL  s   r3   rl  z5ThumbnailScrollBar.remove_thumbnail.<locals>.<lambda>D  s    66yAA r?   )r  indexrn  rw  rp  rr  	TypeErrorremover  lenset_current_indexminr   r{   r{  rd   rx  rf  rz  r   
singleShot)rc   rF  r  s   `` r3   rq  z#ThumbnailScrollBar.remove_thumbnail#  s   ((($**955E	(335551<<>>>/::<<<< 	 	 	D	 (((##I... ...4#$$q((&&s4#344q899    ",99;;;)-& 	""9--- 	AAAAA	C 	C 	C 	C 	Cs   AA3 3
B ?B c                 T    	 |                     d            d S # t          $ r Y d S w xY wrk  )ry  RuntimeErrorrL  s     r3   r  z+ThumbnailScrollBar._remove_thumbnail_parentF  sC    	%%%%% 	 	 	DD	s    
''c                 F    |                      | j        |                    dS )z2Set the currently selected thumbnail by its index.N)ro  r  rc   r  s     r3   r  z$ThumbnailScrollBar.set_current_indexM  s$    ""4#3E#:;;;;;r?   c                 d    	 | j                             | j                  S # t          $ r Y dS w xY w)z5Return the index of the currently selected thumbnail.)r  r  r  
ValueErrorr   s    r3   get_current_indexz$ThumbnailScrollBar.get_current_indexQ  sC    	#))$*@AAA 	 	 	22	s   ! 
//c                    | j         |k    rdS | j         | j                             d           || _         | j                            |j        j        |j        j                   | j                             d           dS )z%Set the currently selected thumbnail.NFT)r  highlight_canvasr   r   rB  r,   r-   rL  s     r3   ro  z(ThumbnailScrollBar.set_current_thumbnailX  s    !Y..F!-"33E:::!*&& )"2"6	8 	8 	8//55555r?   c                     | j         m| j                            | j                   dz
  }|dk    r|nt          | j                  dz
  }|                     |           |                     |           dS dS )z<Select the thumbnail previous to the currently selected one.Nr6   r   r  r  r  r  r  scroll_to_itemr  s     r3   r   z(ThumbnailScrollBar.go_previous_thumbnailc  s    !-$**4+ABBQFE"aZZEES1A-B-BQ-FE""5)))&&&&&	 .-r?   c                     | j         j| j                            | j                   dz   }|t          | j                  k    rdn|}|                     |           |                     |           dS dS )z4Select thumbnail next to the currently selected one.Nr6   r   r  r  s     r3   r   z$ThumbnailScrollBar.go_next_thumbnailk  s}    !-$**4+ABBQFE#d&6"7"777AAUE""5)))&&&&&	 .-r?   c                 T   | j                                         }| j                                                                        }| j                             |                                                                          }t          d||z
            }|}t          |          D ]J}| j                             |          }||                                                                z  }||z  }K||dz  z
  }	| j        	                                }
|

                    |	           dS )z2Scroll to the selected item of ThumbnailScrollBar.r   r  N)r(  verticalSpacingr  r   r   itemAtr]  maxranger   r   )rc   r  spacing_between_itemsheight_viewheight_itemheight_view_excluding_itemheight_of_top_itemsr<   item
pos_scrollvsbs              r3   r  z!ThumbnailScrollBar.scroll_to_items  s    $
 : : < <o..007799j''..7799@@BB%(K+,E%F%F"3u 	9 	9A:$$Q''D4==??#9#9#;#;;#88(+E+JJ
o//11Z     r?   c                 ~    | j         r5d| _         | j                                                            |           dS dS )z
        Scroll to the newest item added to the thumbnail scrollbar.

        Note that this method is called each time the rangeChanged signal
        is emitted by the scrollbar.
        FN)r  r  r   r   )rc   vsb_minvsb_maxs      r3   r  z)ThumbnailScrollBar._scroll_to_newest_item  sL     $ 	B(-D%O--//88AAAAA	B 	Br?   c                     | j                                         }|                    t          |                                |                                z
                       dS )z;Scroll the scrollbar of the scrollarea up by a single step.Nr  r   r   r   rh   
singleSteprc   r  s     r3   go_upzThumbnailScrollBar.go_up  L    o//11Ss~~'7'778899999r?   c                     | j                                         }|                    t          |                                |                                z                        dS )z=Scroll the scrollbar of the scrollarea down by a single step.Nr  r  s     r3   go_downzThumbnailScrollBar.go_down  r  r?   r   )*r   r   r   r   rt   r   r   r[   r(   rZ   r	   r   rQ   rI   r  r#  r  r   r   r6  r   rM  rJ  r`  rd  r4  r   r   r   r   rq  r  r  r  ro  r   r   r  r  r  r  r   r   s   @r3   rW   rW     s?        
  $*6$<<  "6#;; "(!7!7) ) ) ) ) ),2 2 2  @+ + +2 2 2 2 2&	8 	8 	8  $C C CH H H0 0 00# # # 5 5 5  "? ? ?. . ..: : :
4 4 4!C !C !CF  < < <  	6 	6 	6' ' '' ' '! ! !$	B 	B 	B: : :
: : : : : : :r?   rW   c                        e Zd ZdZ ee          Z	  ee          Z	  eee          Z		  ee
          Z	 d fd	Zd Zd Zd Z fdZ xZS )	rm  z
    A widget that consists of a FigureCanvas, a side toolbar, and a context
    menu that is used to show preview of figures in the ThumbnailScrollBar.
    Nc                    t                                          |           t          | |          | _        | j        j                            | j                   | j                            |            |                                  d S )NrF   )rH   rI   r   rB  rQ   rR   r   r  r   s      r3   rI   zFigureThumbnail.__init__  s       "$4DF F F.66+	- 	- 	-&&t,,,r?   c                     t          |           }|                    dddd           |                    | j        ddt          j                   |                    |j                   dS r"  )r   r`   r]   rB  r   r   setSizeConstraintSetFixedSizer$  s     r3   r  zFigureThumbnail.setup_gui  sd    T""!!!Q1---aBN;;;  !455555r?   c                     |r)| j                             dt          j        z             dS | j                             d           dS )zS
        Set a colored frame around the FigureCanvas if highlight is True.
        rz   zFigureCanvas{}N)rB  r|   r   COLOR_ACCENT_3)rc   	highlights     r3   r  z FigureThumbnail.highlight_canvas  s_      	8 K%%5,-    
 K%%&677777r?   c                 8   | j         j        }| j         j        }|dk    rS||z  dk    r|}||z  |z  }n
|}||z  |z  }| j                             t	          |          t	          |                     |                                                     d|           dS )zs
        Scale this thumbnail canvas size, while respecting its associated
        figure dimension ratio.
        r   r6   N)rB  r   r   r  r   rd   setColumnMinimumWidth)rc   rc  r   r   canvas_widthcanvas_heights         r3   rb  z!FigureThumbnail.scale_canvas_size  s    
 #+%a<<!##. ,v 5 ? /,w6?K$$S%6%6M8J8JKKK++A?????r?   c                    |                                 t          j        k    r<|                                t          j        k    r| j                            |            t                      	                    ||          S )zc
        A filter that is used to send a signal when the figure canvas is
        clicked.
        )
r   r   r   r   r   r   rn  r   rH   r   )rc   r   r   re   s      r3   r   zFigureThumbnail.eventFilter  sa    
 ::<<6222||~~..',,T222ww""65111r?   r   )r   r   r   r   r   r   rn  rp  r(   rr  r	   rQ   rI   r  r  rb  r   r   r   s   @r3   rm  rm    s         
   #)&.. !'vs 3 3
 "(     6 6 68 8 8@ @ @"	2 	2 	2 	2 	2 	2 	2 	2 	2r?   rm  c                   ~     e Zd ZdZ ee          Z	 d	 fd	Z e            d             Z	d Z
d Zd Z fdZ xZS )
r   zQ
    A basic widget on which can be painted a custom png, jpg, or svg image.
    Nc                    t                                          |           |                     d           |                     d           |                     d           |                     dt          |          z   dz              d | _        d | _        d\  | _	        | _
        d| _        |                     t          j                   | j                            | j                   d S )Nr  r6   r{   z#figcanvas {background-color:r   )   r  F)rH   rI   setLineWidthsetMidLineWidthr   r|   r(   r,   r-   r   r   _blink_flagsetContextMenuPolicyr   CustomContextMenur   rR   rQ   r   s      r3   rI   zFigureCanvas.__init__  s       !Q;'''+c2B.C.CCcI	K 	K 	K $,!T\ !!""6777'//+	- 	- 	- 	- 	-r?   c                 v   | j         dv ryt                      }|                    | j        | j                                                    t          j                                        |                                           n"| j         dk    rt          | j                   ndS | 
                                 dS )zCopy figure to clipboard.r=  r>  r"   N)r-   r   loadFromDatar,   upperr   	clipboardsetImagetoImager   blink_figure)rc   qpixmaps     r3   r   zFigureCanvas.copy_figure)  s     8222iiG  48>>+;+;<<<"$$--goo.?.?@@@@X((TX&&&&Fr?   c                     | j         rS| j         | _        |                                  | j        r-t                      }|                    d| j                   dS dS dS )zBlink figure once.(   N)r,   r  r   r   r  r  )rc   timers     r3   r  zFigureCanvas.blink_figure7  sn    8 	8#'#33DLLNNN 8  T%677777	8 	88 8r?   c                 X    d| _         d| _        d| _        |                                  dS )z0Clear the figure that was painted on the widget.N)r,   r-   _qpix_scaledr   r   s    r3   r{  zFigureCanvas.clear_canvas@  s)     r?   c                    || _         || _        |dv rAt                      | _        | j                            ||                                           n'|dk    r!t          t          |                    | _        | j        | _        | j                                        | _	        | j        
                                | _        dS )z
        Load the figure from a png, jpg, or svg image, convert it in
        a QPixmap, and force a repaint of the widget.
        r  r"   N)r,   r-   r   r  r  r  r   r  r   r   r   r   r   s      r3   r   zFigureCanvas.load_figureG  s    
 ---%iiDOO((ciikk::::O##%l3&7&788DO Oo++----//r?   c                    t                                          |           |                                 }t          d|z   d|z   |                                                                 d|z  z
  |                                                                 d|z  z
            }| j        | j        rdS | j	        A| j	                                                                        |                                k    r| j
        dv r>| j                            |                                t          j                  | _	        nD| j
        dk    r9t          t!          | j        |                                                    | _	        | j	        Tt#                      }|                    |            |                    || j	                   |                                 dS dS )z9Qt method override to paint a custom image on the Widget.r   r  Nr  )moder"   )rH   
paintEvent
frameWidthr
   r   r   r   r,   r  r  r-   r  scaledToWidthr   SmoothTransformationr   r   r   begin
drawPixmapend)rc   r   fwrectqpre   s        r3   r  zFigureCanvas.paintEventY  s   5!!!__QVQVYY[[&&((1r61YY[[''))AF24 4 8t/F %!&&((..00DJJLL@@x666$(O$A$AJJLLr'> %B %@ %@!!_,,$+LHdiikk-+ -+ %, %,! (BHHTNNNMM$ 1222FFHHHHH )(r?   r   )r   r   r   r   r   r	   rQ   rI   r   r   r  r{  r   r  r   r   s   @r3   r   r   	  s          "(- - - - - -" 
TVV  V8 8 8  0 0 0$        r?   r   )F)4r   r?  os.pathpathr$   rW  qtconsole.svgr   r   qtpyr   qtpy.compatr   r   qtpy.QtCorer   r	   r
   r   r   r   r   r   
qtpy.QtGuir   r   qtpy.QtWidgetsr   r   r   r   r   r   r   r   r   r   spyder.api.translationsr   spyder.api.widgets.mixinsr   spyder.utils.miscr   spyder.utils.paletter   r4   r>   rA   rP   rW   rm  r    r?   r3   <module>r     s           



 9 8 8 8 8 8 8 8       = = = = = = = = N N N N N N N N N N N N N N N N N N N N ( ( ( ( ( ( ( (2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
 & % % % % % 7 7 7 7 7 7 , , , , , , . . . . . .  . . . .&Y3 Y3 Y3 Y3 Y3G. Y3 Y3 Y3xeG eG eG eG eG; 1 eG eG eGPM: M: M: M: M: M: M: M:bi2 i2 i2 i2 i2g i2 i2 i2Xk k k k k6 k k k k kr?   