
    Je                    j   d 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 ddl	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mZ ddlm Z 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/m0Z0m1Z1m2Z2m3Z3 dd
l4m5Z5 ddl6m7Z7 ddl8m9Z9m:Z: ddl;m<Z< ddl=m>Z> ddl?m@Z@mAZAmBZB ddlCmDZD ddlEmFZF ddlGmHZHmIZImJZJmKZK ddlLmMZMmNZN ddlOmPZP ddlQmRZR ddlSmTZT ddlUmVZV ddlWmXZX ddlYmZZZ dZ[dZ\dZ]e^e_f e+       z   Z`d Za G d deb      Zc G d  d!e
      Zd G d" d#ed      Ze G d$ d%e      Zf G d& d'ee5      Zg G d( d)eg      Zh G d* d+e      Zi G d, d-eV      Zj G d. d/eP      Zk G d0 d1eg      Zl G d2 d3eT      Zmd4 Znd5 Zod6 Zpeqd7k(  r,dd8lGmrZr  er       Zs eo         ep        esj                          yy)9zN
Collections (i.e. dictionary, list, set and tuple) editor widget and dialog.
    N)getsavefilenameto_qvariant)QAbstractTableModelQItemSelectionModelQModelIndexQtSignalSlot)QColorQKeySequence)QApplicationQHBoxLayoutQHeaderViewQInputDialog	QLineEditQMenuQMessageBoxQPushButton
QTableViewQVBoxLayoutQWidget)
FakeObjectnumpypandasPIL)fix_reference_name)display_to_valueget_human_readable_typeget_numeric_numpy_typesget_numpy_type_stringget_object_attrsget_sizeget_type_stringsort_againsttry_to_evalunsorted_uniquevalue_to_display)SpyderConfigurationAccessor)SpyderToolbar)_running_under_pytest)DEFAULT_SMALL_DELTA)get_font)is_binary_stringto_text_stringis_type_text_string)ima)getcwd_or_home)add_actionscreate_actionMENU_SEPARATORmimedata2url)get_search_scoresget_search_regex)CollectionsDelegate)ImportWizard)CustomSortFilterProxy)
BaseDialog)SpyderPalette)PANES_TOOLBAR_STYLESHEETg    .Ad   2   c                     t        | t        t        f      s| S t        j                  d|       D cg c]-  }|j                         rt        |      n|j                         / }}|S c c}w )zw
    Natural sorting, e.g. test3 comes before test100.
    Taken from https://stackoverflow.com/a/16090640/3110740
    z([0-9]+))
isinstancestrbytesresplitisdigitintlower)stxs      B/usr/lib/python3/dist-packages/spyder/widgets/collectionseditor.pynatsortrN   N   sW    
 a#u&79xx
A7NO!199;QAGGI	-OAOH 	Ps   2A'c                   (    e Zd ZdZd Zd Zd Zd Zy)ProxyObjectz&Dictionary proxy to an unknown object.c                     || _         y)zConstructor.N)__obj__)selfobjs     rM   __init__zProxyObject.__init__\   s	        c                 >    t        t        | j                              S )z)Get len according to detected attributes.)lenr!   rR   rS   s    rM   __len__zProxyObject.__len__`   s    #DLL122rV   c                 x    	 t        | j                  |      }|S # t        t        t        t
        f$ r d}Y |S w xY w)z1Get the attribute corresponding to the given key.N)getattrrR   NotImplementedErrorAttributeError	TypeError
ValueError)rS   keyattribute_toreturns      rM   __getitem__zProxyObject.__getitem__d   sF    	&!(s!; "! $^Y
K 	&!%!!	&s    99c                     	 t        | j                  ||       y# t        t        t        f$ r Y yt
        $ r}dt        |      vr Y d}~yd}~ww xY w)z.Set attribute corresponding to key with value.zcannot set values forN)setattrrR   r_   r^   r]   	ExceptionrC   )rS   ra   valuees       rM   __setitem__zProxyObject.__setitem__t   sN    	DLL#u->+>? 	 	&c!f4 5	s    AAAAN)__name__
__module____qualname____doc__rU   rZ   rc   ri    rV   rM   rP   rP   Y   s    03" rV   rP   c                   *   e Zd ZdZ e       Z	 	 ddZd ZddZddZ	d Z
ej                  fdZ e       fd	Z e       fd
Z e       fdZ e       dfdZd Zd Zd Zd ZddZd Zd Zej4                  fdZej4                  fdZd Zd Zy)ReadOnlyCollectionsModelz'CollectionsEditor Read-Only Table Modelc                 b   t        j                  | |       |i }|| _        g | _        || _        || _        || _        d | _        d | _        d | _	        d | _
        d | _        t        |      | _        | j                  r| j                  dz   | _        g | _        g | _        | j!                  |       y )Nz - )r   rU   _parentscoresnamesminmaxremoteheader0_data
total_rows	showndatakeysr/   titlesizestypesset_data)rS   parentdatar|   rt   ru   rv   s          rM   rU   z!ReadOnlyCollectionsModel.__init__   s    $$T62<D

	#E*
::e+DJ

drV   c                     | j                   S )zReturn model data)rx   rY   s    rM   get_dataz!ReadOnlyCollectionsModel.get_data   s    zzrV   Nc                 f   || _         |4| j                  s(t        |t        t        t
        t        f      r ||      }|| _        t        d      | _	        | j                  rt        d      | _	        t        |t              rBt	        t        t        |                  | _        | xj                  t        d      z  c_        nqt        |t              rBt	        t        t        |                  | _        | xj                  t        d      z  c_        nt        |t              rQt	        t        t        |                  | _        | xj                  t        d      z  c_        t	        |      | _         nt        |t
              ri	 t        t	        |j                               t               | _        | xj                  t        d      z  c_        | j                  sVt        d	      | _	        nEt%        |      | _        t'        |      x| _         x}| _        | j                  st        d
      | _	        t        | j                   t&              smt        | j                        dkD  rt        d      }nt        d      }| xj                  dt)        t        | j                              z   dz   |z   dz   z  c_        n t+        |      }| xj                  |z  c_        t        | j                        | _        | j,                  t.        kD  rt0        | _        n| j,                  | _        | j4                  j7                          | j9                          t        | j                        r| j;                          | j=                          y# t"        $ r" t	        |j                               | _        Y w xY w)zSet model dataNIndexNameTupleListSet)ra   
DictionaryKey	Attribute   elementselementz ( ))rx   rv   rB   tuplelistdictsetrz   r*   rw   rt   rangerX   r{   r|   sortedrN   r_   r!   rP   rC   r#   ry   LARGE_NROWSROWS_TO_LOADrows_loadedsig_setting_dataemitset_size_and_typeupdate_search_lettersreset)rS   r   coll_filterr   	data_types        rM   r   z!ReadOnlyCollectionsModel.set_data   s   
#DKK4%tS!9:t$Dz::V9DLdE"U3t9-.DIJJ!G*$Jd#U3t9-.DIJJ!F)#Jc"U3t9-.DIJJ!E("JdDJd#."4		#4'B	 JJ!L/)J:: x(.DI1<T1BBDJB:: ~$**k2499~!Z=Y<JJ4#c$))n"55;hFLMJ'-IJJ)#Jdii.??[(+D#D""$ tyy> &&(

C  . !-		.s   -N 'N0/N0c           	         | j                   }||d}| j                  }d}nd}t        j                         5  t        j                  dd       | j
                  rYt        ||      D cg c]  }|| j                  |      d    }}t        ||      D cg c]  }|| j                  |      d    }}ndt        ||      D cg c]  }t        || j                  |             }}t        ||      D cg c]  }t        || j                  |             }}d d d        |r)| j                  z   | _
        | j                  z   | _        y | _
        | _        y c c}w c c}w c c}w c c}w # 1 sw Y   WxY w)	Nr   FTignorez?^\w+\.\w+ is deprecated and will be removed in a future version)messagesizetype)rx   r   warningscatch_warningsfilterwarningsrv   r   r{   r"   r   r}   r~   )rS   startstopr   
fetch_moreindexr}   r~   s           rM   r   z*ReadOnlyCollectionsModel.set_size_and_type   s   zz=T\E##DJJ $$& 	:## $IK {{&+E4&8:" dii./7 : : ',E4&8:" dii./7 : : ',E4&8:" "$tyy'7"89 : : ',E4&8:" 1dii6F1GH : :	: e+DJe+DJDJDJ::::	: 	:sA   2E/*EE/E 2E/"E%%E/5"E*E/E//E8c                 <    | j                  | j                         y)zLoad all the data.)number_to_fetchN)	fetchMorery   rY   s    rM   load_allz!ReadOnlyCollectionsModel.load_all   s    t7rV   c                    d }|t         j                  k(  } || j                        rt        nd}|dk(  rxt	        | j
                  | j                  |t              | _        t	        | j                  | j                  |t              | _        	 | j                  j                  ||       n|dk(  rt	        | j                  | j                  |      | j                  d| j                   t	        | j
                  | j                  |      | _        	 | j                  j                  |       n|dk(  r~t	        | j                  | j
                  |      | j                  d| j                   t	        | j                  | j
                  |      | _        	 | j
                  j                  |       n|d	v r}| j                  D cg c]  }| j                  |    }}t	        | j                  ||      | _        t	        | j
                  ||      | _        t	        | j                  ||      | _        | j                          | j                          y#  Y %xY w#  Y ,xY w#  Y 3xY wc c}w )
zOverriding sort methodc           	      Z    t        | D cg c]  }t        |t               c}      S c c}w N)allrB   rC   )listlikerL   s     rM   
all_stringz1ReadOnlyCollectionsModel.sort.<locals>.all_string  s"    H=q
1c*=>>=s   (Nr   )reversesort_key)r   ra   r   r      )      )r   DescendingOrderr{   rN   r$   r}   r~   sortr   rx   beginResetModelendResetModel)rS   columnorderr   r   r   ra   valuess           rM   r   zReadOnlyCollectionsModel.sort  s   	? B...(37Q;%djj$)).5/68DJ &djj$)).5/68DJ		wH= q[+7		8<

@G,IDII't''( &djj$**gNDJ

0 q[+7		8<

@G,IDII't''( &djj$**gNDJ

0 v15;#djjo;F;$TYYHDI%djj&'JDJ%djj&'JDJ5;s*   I I I% I,II"%I)c                 2    | j                   j                  ryy)zArray column number   r   )rr   proxy_model)rS   qindexs     rM   columnCountz$ReadOnlyCollectionsModel.columnCount2  s    <<##rV   c                 d    | j                   | j                  k  r| j                   S | j                  S )zArray row numberry   r   rS   r   s     rM   rowCountz!ReadOnlyCollectionsModel.rowCount9  s*    ??d...??"###rV   c                 8    | j                   | j                  kD  ryy)NTFr   r   s     rM   canFetchMorez%ReadOnlyCollectionsModel.canFetchMore@  s    ??T---rV   c                 z   | j                   | j                  z
  }|t        ||      }nt        |t              }| j	                  | j                  | j                  |z          | j                  t               | j                  | j                  |z   dz
         | xj                  |z  c_        | j                          y )Nr   )ry   r   minr   r   beginInsertRowsr   endInsertRows)rS   r   r   reminderitems_to_fetchs        rM   r   z"ReadOnlyCollectionsModel.fetchMoreF  s    ??T%5%55& ?;N <8Nt//#//.@	B[]D,<,<!-->B	DN*rV   c                     	 | j                  | j                  j                  |      d      S # t        t        f$ r t               cY S w xY w)Nr   )createIndexr{   r   RuntimeErrorr`   r   rS   ra   s     rM   get_index_from_keyz+ReadOnlyCollectionsModel.get_index_from_keyS  sC    	!##DIIOOC$8!<<j) 	!= 	!s   *- A	A	c                 <    | j                   |j                            S )zReturn current key)r{   rowr   s     rM   get_keyz ReadOnlyCollectionsModel.get_keyY  s    yy%%rV   c                 v   |j                         dk(  r| j                  |j                            S |j                         dk(  r| j                  |j                            S |j                         dk(  r| j                  |j                            S | j
                  | j                  |j                               S )zReturn current valuer   r   r   )r   r{   r   r~   r}   rx   r   s     rM   	get_valuez"ReadOnlyCollectionsModel.get_value]  s    <<>Q99UYY[))\\^q ::eiik**\\^q ::eiik**::dii		455rV   c                 V   |j                         dk(  r,t        t        j                        }|j	                  d       |S |j                         dk  r,t        t        j                        }|j	                  d       |S t        t        j                        }|j	                  d       |S )z#Background color depending on valuer   g?r   g?g333333?)r   r   r   	lightGray	setAlphaF)rS   r   colors      rM   get_bgcolorz$ReadOnlyCollectionsModel.get_bgcolorh  s    <<>Q2<<(EOOC   \\^a2<<(EOOB  2<<(EOOBrV   c                     || _         | j                  D cg c]  }t        |       }}t        ||d      }|r't	        | \  | _        }| _        | j                          yyc c}w )z4Update search letters with text input in search box.z
<b>{0}</b>)templateN)lettersr{   rC   r7   zipnormal_textrs   r   )rS   textra   rt   resultsr*   s         rM   r   z.ReadOnlyCollectionsModel.update_search_lettersu  s]    %)YY/cS//#D%,G/2G},DaJJL  0s   A"c                      | j                   |   S )z_
        Get row name based on model index.
        Needed for the custom proxy model.
        )r{   rS   row_nums     rM   row_keyz ReadOnlyCollectionsModel.row_key~  s    
 yy!!rV   c                      | j                   |   S )z_
        Get row type based on model index.
        Needed for the custom proxy model.
        )r~   r   s     rM   row_typez!ReadOnlyCollectionsModel.row_type  s    
 zz'""rV   c                 t   |j                         s
t               S | j                  |      }|j                         dk(  r9|t        j
                  k(  r&t        | j                  |j                                  S |j                         dk(  r| j                  r|d   }|j                         dk(  rt        || j                        }n7t        |      rt        |d      }nt        |t              st        |      }n|}|t        j                  k(  r&t        |t              rt        |      S t        |      S |t        j
                  k(  rt        |      S |t        j                   k(  rt        t        |            S |t        j"                  k(  r|j                         dk(  rt%        |j'                               dk  r3t        t)        t        j*                  t        j,                  z              S t        t)        t        j*                  t        j.                  z              S t        t)        t        j*                  t        j,                  z              S |t        j0                  k(  rt        | j3                  |            S |t        j4                  k(  rt        t7        t8                    S t               S )zCell contentr   r   view)ru   utf-8)encoding)font_size_delta)isValidr   r   r   r   DisplayRolers   r   rv   r'   ru   r0   r/   rB   NUMERIC_TYPESUserRoleEditRoleTextAlignmentRolerX   
splitlinesrH   	AlignLeftAlignVCenterAlignTopBackgroundColorRoler   FontRoler-   r,   )rS   r   rolerg   displays        rM   r   zReadOnlyCollectionsModel.data  s   }}= u%<<>Q42>>#9 t{{599;788<<>Q4;;&ME<<>Q&uT[[AG"5)(A}5(/2;;%/"5))"7++R^^#w''R[[ /677R)))||~"w))+,q0&s2<<"//+I'JKK&s2<<"+++E'FGG"3r||boo'E#FGGR+++t//677R[[ x8KLMM}rV   c                    |t         j                  k7  r
t               S t        |      }|t         j                  k(  rC| j
                  t        d      t        d      t        d      t        d      f}t        ||         S t               S )zOverriding method headerDataTypeSizeValueScore)r   r   r   rH   
Horizontalrw   r*   )rS   sectionorientationr  i_columnheaderss         rM   
headerDataz#ReadOnlyCollectionsModel.headerData  sj    2>>!= w<"--'||QvY&	1W:z#Gwx011= rV   c                     |j                         st        j                  S t        j                  t	        t        j                  | |      t        j                  z              S )zOverriding method flags)r   r   ItemIsEnabled	ItemFlagsrH   r   flagsItemIsEditabler   s     rM   r  zReadOnlyCollectionsModel.flags  sO     }}###||C 3 9 9$ F " 1 1!2 3 4 	4rV   c                 D    | j                          | j                          y r   )r   r   rY   s    rM   r   zReadOnlyCollectionsModel.reset  s    rV   ) FFFr   )NN)r  )rj   rk   rl   rm   r	   r   rU   r   r   r   r   r   AscendingOrderr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r   rn   rV   rM   rp   rp      s    1x5:&+,:x D8 "$!2!2 ,\ "-  )] $ "-  *mT !&	6"#  "~~ ,\ 57NN 
!4rV   rp   c                   @    e Zd ZdZd Zd Zd Zej                  fdZ	y)CollectionsModelzCollections Table Modelc                 x   || j                   | j                  |j                            <   || j                  | j                  |j                            <   t	        |      | j
                  |j                         <   t        |      | j                  |j                         <   | j                  j                          y)z	Set valueN)
rx   r{   r   rz   r"   r}   r   r~   r   r   )rS   r   rg   s      rM   	set_valuezCollectionsModel.set_value  s    -2

499UYY[)*16tyy-."*5/

599;"9%"@

599;""$rV   c                    t         j                  }|dk7  r.|dk(  rt         j                  }|S |dk(  rt         j                  }|S |dk(  rt         j                  }|S |dv rt         j                  }|S |dv rt         j
                  }|S d|v rt         j                  }|S |dk(  rt         j                  }|S |d	k(  rt         j                  }|S |d
k(  rt         j                  }|S |dk(  rt         j                  }|S |dv rt         j                  }|S |dv sd|v rt         j                  }|S |dk(  rt         j                  }|S t         j                  }|S )z0Get the color that corresponds to a Python type.UnknownArrayScalarbool)rH   floatcomplex)rC   unicodedatetimer   r   r   r   )MaskedArrayMatrixNDArray)	DataFrameSeriesr   zPIL.Image.Image)r=   GROUP_12GROUP_9GROUP_2GROUP_1GROUP_3GROUP_4GROUP_5GROUP_6GROUP_7GROUP_8GROUP_10GROUP_11)rS   python_type
numpy_typer   s       rM   type_to_colorzCollectionsModel.type_to_color  s    &&"W$%--: 9 x'%--6 5 F"!))E2 1 77!))E. - ..!))E* ) ;&!))E& % F"!))E" ! E!!))E  G#!))E  F"!))E  @@!))E  44;&!**E  --!**E  "**ErV   c                 4   | j                  |      }|j                         dk  rt        j                  | |      }|S | j                  r|d   }|d   }nt        |      }t        |      }| j                  ||      }t        |      }|j                  d       |S )z$Background color depending on value.r   r6  r7  g      ?)
r   r   rp   r   rv   r#   r    r8  r   r   )rS   r   rg   r   r6  r7  
color_names          rM   r   zCollectionsModel.get_bgcolor  s    u%<<>A,88uEE  {{#M2"<0
-e4259
++KDJ:&EOOC rV   c                     |j                         sy|j                         dk  ryt        || j                  |      d      }| j	                  ||       | j
                  j                  ||       y)zCell content changeFr   T)ignore_errors)r   r   r   r   r  dataChangedr   )rS   r   rg   r  s       rM   setDatazCollectionsModel.setData  s`    }}<<>A u(=/35ue$eU+rV   N)
rj   rk   rl   rm   r  r8  r   r   r   r>  rn   rV   rM   r  r    s#    !%$L" *, 
rV   r  c                   R     e Zd ZdZ eeee      Zd fd	Z fdZ fdZ	d Z
 xZS )BaseHeaderViewz
    A header view for the BaseTableView that emits a signal when the width of
    one of its sections is resized by the user.
    c                     t         t        |   t        j                  |       d| _        | j                  j                  | j                         | j                  d       y )NFT)
superr@  rU   r   r
  _handle_section_is_pressedsectionResizedconnectsectionResizeEventsetSectionsClickablerS   r   	__class__s     rM   rU   zBaseHeaderView.__init__*  sJ    nd,R]]FC*/'##D$;$;< 	!!$'rV   c                     t         t        |   |       | j                         j	                         t
        j                  k(  | _        y r   )rB  r@  mousePressEventcursorshaper   SplitHCursorrC  rS   rh   rI  s     rM   rK  zBaseHeaderView.mousePressEvent2  s5    nd3A6+/;;=+>+>+@+-??,;'rV   c                 :    t         t        |   |       d| _        y NF)rB  r@  mouseReleaseEventrC  rO  s     rM   rR  z BaseHeaderView.mouseReleaseEvent7  s    nd5a8*/'rV   c                 X    | j                   r| j                  j                  |||       y y r   )rC  sig_user_resized_sectionr   )rS   logicalIndexoldSizenewSizes       rM   rF  z!BaseHeaderView.sectionResizeEvent;  s(    **))..|WgN +rV   r   )rj   rk   rl   rm   r	   rH   rT  rU   rK  rR  rF  __classcell__rI  s   @rM   r@  r@  #  s.      &c34(<
0OrV   r@  c                   D    e Zd ZdZdZ ee      Z ee      Z	 e       Z
 e       Z e       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$d Z%d Z&d Z'd Z(d Z)d  Z* e+       d!        Z, e+       d/d"       Z-d0d#Z. e+       d$        Z/ e+       d1d%       Z0 e+       d2d&       Z1 e+       d'        Z2d( Z3d) Z4 e+       d*        Z5 e+       d+        Z6 e+       d,        Z7d1d-Z8 e+       d.        Z9 xZ:S )3BaseTableViewz!Base collection editor table viewvariable_explorerc                 4   t         |   |       d | _        d | _        g | _        d | _        d | _        d | _        d | _        d | _	        d | _
        d | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _        d | _        d| _        d | _        d | _        d | _        d | _        | j3                  d       d| _        | j7                  t9        |              | j;                         j<                  j?                  | j@                         y )N)r   r  T)!rB  rU   array_filenamemenumenu_actionsempty_ws_menupaste_actioncopy_actionedit_actionplot_actionhist_actionimshow_actionsave_array_actioninsert_actioninsert_action_aboveinsert_action_belowremove_actionminmax_actionrename_actionduplicate_action
last_regexview_actiondelegater   source_modelsetAcceptDropsautomatic_column_widthsetHorizontalHeaderr@  horizontalHeaderrT  rE  user_resize_columnsrH  s     rM   rU   zBaseTableView.__init__J  s   '"	! !!%!#' #' !!! $ D!&*#  t!<=88@@$$	&rV   c                 h   | j                         j                  d       | j                         j                  d       | j                          | j	                  d       | j                  dt        j                         | j                         j                  j                  | j                         y)zSetup tableTr   N)rw  setStretchLastSectionsetSectionsMovableadjust_columnssetSortingEnabledsortByColumnr   r  selectionModelselectionChangedrE  refresh_menurY   s    rM   setup_tablezBaseTableView.setup_tablej  s    55d;2248t$!R../..66t7H7HIrV   c                 	    t         t        d      t        j                  d       j                        }t         t        d      t        j                  d       j
                        }t         t        d      t        j                  d       j                         _        t         t        d      t        j                  d	       j                         _	        t         t        d
      t        j                  d       j                         _        t         t        d      t        j                  d       fd       _         j                  j                  d       t         t        d      t        j                  d       fd       _         j                  j                  d       t         t        d      t        j                  d       j                         _         j                   j                  d       t         t        d      t        j                  d       j"                         _         j$                  j                  d       t         t        d      t        j                  d       fd       _        t         t        d      t        j                  d       fd       _        t         t        d      t        j                  d       fd       _        t         t        d       t        j                  d!       j,                         _        t         t        d"      t        j                  d#       j0                         _        t         t        d$      t        j                  d%       j4                         _        t         t        d&      t        j                  d'       j8                         _        t=               } j                   j                   j                   j2                   j.                   j$                  t>         j&                   j(                   j*                   j6                  t>         j:                   j                   j                   j                   t>        ||g _         tC        | j@                         t=                _"        tC         jD                   j&                   j                  g       |S )(zSetup context menuzResize rows to contentscollapse_row)icon	triggeredzResize columns to contentscollapse_columnPaste	editpasteCopyeditcopyEditeditPlotplotc                  &     j                  d      S )Nr  	plot_itemrY   s   rM   <lambda>z*BaseTableView.setup_menu.<locals>.<lambda>      dnnV4 rV   F	Histogramhistc                  &     j                  d      S )Nr  r  rY   s   rM   r  z*BaseTableView.setup_menu.<locals>.<lambda>  r  rV   z
Show imageimshow
Save arrayfilesaveInsertinsertc                  (     j                  d      S NFbelowinsert_itemrY   s   rM   r  z*BaseTableView.setup_menu.<locals>.<lambda>      d..U.; rV   zInsert aboveinsert_abovec                  (     j                  d      S r  r  rY   s   rM   r  z*BaseTableView.setup_menu.<locals>.<lambda>  r  rV   zInsert belowinsert_belowc                  (     j                  d      S )NTr  r  rY   s   rM   r  z*BaseTableView.setup_menu.<locals>.<lambda>  s    d..T.: rV   Remove
editdeleteRenamerename	Duplicateedit_addzView with the Object Exploreroutline_explorer)#r4   r*   r1   r  resizeRowsToContentsresize_column_contentspasterb  copyrc  	edit_itemrd  re  
setVisiblerf  imshow_itemrg  
save_arrayrh  ri  rj  rk  remove_itemrl  rename_itemrn  duplicate_itemro  	view_itemrq  r   r5   r`  r3   ra  )rS   resize_actionresize_columns_actionr_  s   `   rM   
setup_menuzBaseTableView.setup_menut  s   %dA.G,H+.88N+C040I0IK !.*++,11	!3
 *$'
/2xx/D48JJ@ )qy.1hhz.B3799> )qy.1hhv.>37>>C )!F)&!4

 	##E*(!K.&!4

 	##E**4<030B595E5EG 	%%e,!.tQ|_47HHZ4H9="J 	))%0*!H+(#;

 $1!N#.);$
 
 $1!N#.):$
 
 +48030F595E5EG +48030B595E5EG !.dAkN3688J3G8<8K8K!M )-.,-nn	& T{""$$$$!!!'
* 	D$++,"4[!2!23	

 rV   c                     t         )Remove values from datar]   )rS   r{   s     rM   remove_valueszBaseTableView.remove_values      !!rV   c                     t         )
Copy valuer  )rS   orig_keynew_keys      rM   
copy_valuezBaseTableView.copy_value  r  rV   c                     t         )Create new value in datar  )rS   ra   rg   s      rM   	new_valuezBaseTableView.new_value  r  rV   c                     t         )z3Return True if variable is a list, a set or a tupler  r   s     rM   is_listzBaseTableView.is_list  r  rV   c                     t         Return sequence lengthr  r   s     rM   get_lenzBaseTableView.get_len  r  rV   c                     t         z(Return True if variable is a numpy arrayr  r   s     rM   is_arrayzBaseTableView.is_array  r  rV   c                     t         ,Return True if variable is a PIL.Image imager  r   s     rM   is_imagezBaseTableView.is_image  r  rV   c                     t         'Return True if variable is a dictionaryr  r   s     rM   is_dictzBaseTableView.is_dict  r  rV   c                     t         Return array's shaper  r   s     rM   get_array_shapezBaseTableView.get_array_shape  r  rV   c                     t         Return array's ndimr  r   s     rM   get_array_ndimzBaseTableView.get_array_ndim  r  rV   c                     t         )	Edit itemr  r   s     rM   oeditzBaseTableView.oedit  r  rV   c                     t         )	Plot itemr  )rS   ra   funcnames      rM   r  zBaseTableView.plot  r  rV   c                     t         )Show item's imager  r   s     rM   r  zBaseTableView.imshow
  r  rV   c                     t         ) Show image (item is a PIL image)r  r   s     rM   
show_imagezBaseTableView.show_image  r  rV   c                 	     j                         } j                  j                         }t        |t              }t        |t
              } fd}t        |t        t        f       xrF |j                         xr4 t         j                               dkD  xr  |       xr  j                   } j                  j                  |        j                  j                  |        j                  j                  |        j                   j                  |        j"                  j                  |        j$                  j                  |        j&                  j                  |        j(                  j                  |        j*                  j                  |       |j                         xr t         j                               dkD  } j,                  j                  |xr  |               j.                  j                  |       t        |t        t        f       xr= |j                         xr+ t         j                               dkD  xr  j                   } j0                  j                  |        j2                  j                  |xr  j                           j4                  j                  |xr  j                          |j                         r j6                  r j6                  j9                  |      }	n j                  j9                  |      }	 j;                  |	      }
 j=                  |	      xr  j?                  |	      dk7  }|xr t         jA                  |	            dk  }|xr  jC                  |	      dk(  }|xr  jC                  |	      dk(  }|xs  jE                  |	      }n
dx}x}x}x}
} j$                  jG                  |xs |
        j&                  jG                  |xs |
        j2                  jG                  |        j                  jG                  |        j                  jG                  |        j"                  jG                  |        j4                  jG                  |        j(                  jG                  |        j*                  jG                  |       y)zRefresh context menuc                      j                         } t        |       dkD  r4| D cg c]  }|j                          }}t        t        |            dk(  S yc c}w )Nr   T)selectedIndexesrX   r   r   )indexesidxrowsrS   s      rM   indexes_in_same_rowz7BaseTableView.refresh_menu.<locals>.indexes_in_same_row  sQ    **,G7|a-45c	553t9~** 6s   Ar   r   r   FN)$currentIndexrs  r   rB   r   r   r   r   r   rX   r  readonlyrd  
setEnabledrj  rk  ro  rn  re  rf  rg  rh  rq  rc  rl  ri  rb  r   r   r  r  r  r  r  r  r  )rS   r   r   is_list_instanceis_dict_instancer  condition_editcondition_selectcondition_removera   r  r  condition_plotcondition_histcondition_imshows   `              rM   r  zBaseTableView.refresh_menu  s*   !!#  ))+%dD1%dD1	 D5#,// MMO%%'(1,  !  	 	##N3  ++N;  ++N;((8%%n5##N3##N3%%n5)).9 MMO .%%'(1, 	 	##6!4!6	8##$45 D5#,// MMO%%'(1, 	 	 	%%&67%%2T]]!2	4$$2T]]!2	4 ==?&&..u5''//6ll3'G}}S)Ddll3.?1.DH&N3t/C/CC/H+IQ+NN&H4+>+>s+Cq+HN-O$2E2Ec2Ja2O/E4==3E )..H .~ .(8 .7%##N$=g>##N$=g>%%&67  ++,<=  ++,<=%%&67$$%56%%&67))(3rV   c                 2    d| _         | j                          y)zResize columns to contents.TN)ru  r|  rY   s    rM   r  z$BaseTableView.resize_column_contentsc  s    &*#rV   c                     d| _         y)zHandle the user resize action.FN)ru  )rS   logical_indexold_sizenew_sizes       rM   rx  z!BaseTableView.user_resize_columnsh  s
    &+#rV   c                 `    | j                   r"t        d      D ]  }| j                  |        yy)z$Resize two first columns to contentsr   N)ru  r   resizeColumnToContents)rS   cols     rM   r|  zBaseTableView.adjust_columnsl  s1    &&Qx 1++C01 'rV   c                     |a| j                   j                  || j                         | j                   j                          | j	                  dt
        j                         yy)zSet table dataNr   )rs  r   
dictfilterr   r~  r   r  rS   r   s     rM   r   zBaseTableView.set_datar  sO    &&tT__=##%a!2!23 rV   c                    |j                         t        j                  k7  rt        j                  | |       y| j                  |j                               }|j                         rM|| j                         k(  r#|| j                         v r| j                          yt        j                  | |       y| j                          |j                          yReimplement Qt methodN)buttonr   
LeftButtonr   rK  indexAtposr   r  r  clearSelectionaccept)rS   eventindex_clickeds      rM   rK  zBaseTableView.mousePressEventy  s    <<>R]]*&&tU3UYY[1  " 1 1 33 D$8$8$::##%**47!LLNrV   c                     | j                  |j                               }|j                         r4|j                         }|j	                  |d      }| j                  |       y|j                          y)r  r   N)r  r  r   r   childr  r  )rS   r  r  r   s       rM   mouseDoubleClickEventz#BaseTableView.mouseDoubleClickEvent  sW    UYY[1  "##%C)//Q7MIIm$LLNrV   c                    |j                         t        j                  k(  r| j                          y|j                         t        j                  k(  r| j                          y|t        j                  k(  r| j                          y|t        j                  k(  r| j                          yt        j                  | |       y)zReimplement Qt methodsN)ra   r   
Key_Deleter  Key_F2r  r   r  r  r  r  r   keyPressEventrS   r  s     rM   r  zBaseTableView.keyPressEvent  s|    99;"--'YY[BII%l'''IIKl(((JJL$$T51rV   c                 6   | j                   j                  rJ| j                          | j                  j	                  |j                                |j                          y| j                  j	                  |j                                |j                          yr  )rs  rz   r  r_  popup	globalPosr  ra  r  s     rM   contextMenuEventzBaseTableView.contextMenuEvent  sa    &&IIOOEOO-.LLN$$U__%67LLNrV   c                 x    t        |j                               r|j                          y|j                          y)zAllow user to drag filesN)r6   mimeDatar  r   r  s     rM   dragEnterEventzBaseTableView.dragEnterEvent  s#    ()LLNLLNrV   c                     t        |j                               r0|j                  t        j                         |j                          y|j                          y)zAllow user to move filesN)r6   r$  setDropActionr   
CopyActionr  r   r  s     rM   dragMoveEventzBaseTableView.dragMoveEvent  s5    ().LLNLLNrV   c                     t        |j                               }|rK|j                  t        j                         |j                          | j                  j                  |       y|j                          y)z"Allow user to drop supported filesN)	r6   r$  r'  r   r(  r  sig_files_droppedr   r   )rS   r  urlss      rM   	dropEventzBaseTableView.dropEvent  sN    ENN,-.LLN""''-LLNrV   c                     | j                         j                  |t        j                         | j                         j                  |t        j                         y)a  
        Deselect index after any operation that adds or removes rows to/from
        the editor.

        Notes
        -----
        * This avoids showing the wrong buttons in the editor's toolbar when
          the operation is completed.
        * Also, if we leave something selected, then the next operation won't
          introduce the item in the expected row. That's why we need to force
          users to select a row again after this.
        N)r  selectr   SelectDeselectr   s     rM   _deselect_indexzBaseTableView._deselect_index  sD     	$$U,?,F,FG$$U,?,H,HIrV   c                     | j                         }|j                         sy| j                  |j                  |j	                         d             y)r  Nr   )r  r   r  r  r   r   s     rM   r  zBaseTableView.edit_item  s;     !!#}}		%++eiik1-.rV   c                 "   | j                         }| j                         }|sy|D ]  }|j                         r y |sft        d      }t        d      }t	        j
                  | t        d      t        |      dk(  r|n|t        j                  t        j                  z        }|st        j                  k(  r| j                  rAt        |D cg c]+  }| j                  j                  |      j                         - c}      }	n't        |D cg c]  }|j                          c}      }	|	D 
cg c]  }
| j                  j                  |
    }}
| j                  |       t!               s| j#                  |       yyc c}w c c}w c c}
w )zRemove itemNz(Do you want to remove the selected item?z)Do you want to remove all selected items?r  r   )r  r  r   r*   r   questionrX   YesNor   r&   mapToSourcer   rs  r{   r  r+   r2  )rS   forcecurrent_indexr  r   onemoreanswerr  idx_rowsidx_rowr{   s               rM   r  zBaseTableView.remove_item  s`    ))+&&( 	E==?	 >?C@AD ))$(14W1B#*5//KNN*JLF Fkoo-* ') %%11#6::< )* ++I#CGGI+IJCKLD%%**73LDLt$ $%  / &) ,JLs   0FF2 Fc                 .   | j                         }| j                         }|sy| j                  rAt        |D cg c]+  }| j                  j	                  |      j                         - c}      }n't        |D cg c]  }|j                          c}      }t        |      dkD  s|d   j                         sy| j                  j                  |d      }|rQt        |t              s*t        j                  | t        d      t        d             yt        d      }t        d      }	nt        d      }t        d	      }	| j                  j                         }
t        |
t         t"        f      rt        |
      d
}}n1||d
}}n*t%        j&                  | ||	t(        j*                  |      \  }}|rKt-        |      r@t/        t-        |            }||k(  ry| j1                  ||       |r| j3                  |g       | j5                  |       yc c}w c c}w )z	Copy itemNr   r   Warningz)You can only rename keys that are stringsr  zNew variable name:r  zVariable name:T)r  r  r   r&   r8  r   rX   r   rs  r{   rB   rC   r   warningr*   r   r   r   r   getTextr   Normalr/   r%   r  r  r2  )rS   erase_originalnew_namer:  r  r  r>  r  r|   
field_textr   r  valids                rM   	copy_itemzBaseTableView.copy_item   s   ))+&&(&DKLS!!--c2668LNH 'W'Ec	'EFHx=1GAJ$6$6$8$$))(1+6h,##iLAB
 hKE/0JkNE+,J  ))+dT3K( YUG!%tUG)11$z2;2B2BHNNGU ^G,!."9:G("OOHg.""H:.]+Q M'Es   0H:Hc                 $    | j                          y)zDuplicate itemNrI  rY   s    rM   r  zBaseTableView.duplicate_item4  s     	rV   c                 *    | j                  d|       y)zRename itemT)rE  rF  NrK  )rS   rF  s     rM   r  zBaseTableView.rename_item9  s     	dX>rV   c                    | j                         }|j                         s| j                  j                         }n| j                  rY|r-| j                  j                  |      j                         dz   }nP| j                  j                  |      j                         }n&|r|j                         dz   }n|j                         }| j                  j                         }t        |t              r|}|j                  |d       not        |t              r^t        j                  | t        d      t        d      t        j                         \  }}|r t#        |      rt%        t#        |            }nyyt        j                  | t        d      t        d      t        j                         \  }}|r1t#        |      r%| j'                  |t%        t#        |                   yyy)zInsert itemr   r  r  zKey:NzValue:)r  r   rs  r   r   r8  r   r   rB   r   r  r   r   rC  r*   r   rD  r/   r%   r  )rS   r  r   r   r   ra   rH  rg   s           rM   r  zBaseTableView.insert_item>  sw    !!#}}##,,.C**66u=AACaGC**66u=AACC))+/C))+C  ))+dD!CKKR d#%--dAhK6.7.>.>@JC,!."56#++D!H+q{,5,<,<>u ^E*NN3N5,A BC +5rV   c                     | j                         }|j                         sy|j                  |j                         d      }| j                  j                  | d|d       y)z"View item with the Object ExplorerNr   T)object_explorer)r  r   r  r   rr  createEditorr   s     rM   r  zBaseTableView.view_itemd  sO     !!#}}EIIK+""4ud"KrV   c           	          	 dd l }y#  	 dt        j                  vrdd l}Y y# t        $ r- t        j                  | t        d      t        d             Y Y y w xY wxY w)Nr   T
matplotlibzImport errorz2Please install <b>matplotlib</b> or <b>guiqwt</b>.)guiqwt.pyplotsysmodulesrR  rf   r   rB  r*   )rS   guiqwtrR  s      rM   __prepare_plotzBaseTableView.__prepare_plotn  s]    	= 	==s{{2% =##D!N*;$% '; %<==s$    A"2AAAAc           	         | j                         }| j                         rp| j                  r5| j                  j	                  | j                  j                  |            }n| j                  j	                  |      }	 | j                  ||       yy# t        t        f$ r?}t        j                  | t        d      t        d      t        |      z         Y d}~yd}~ww xY w)r  r  z7<b>Unable to plot data.</b><br><br>Error message:<br>%sN)r  _BaseTableView__prepare_plotr   rs  r   r8  r  r`   r_   r   criticalr*   rC   )rS   r  r   ra   errors        rM   r  zBaseTableView.plot_item|  s    !!# ''//$$0079 ''//67		#x( ! 	* 7$$T1f:%& (F &)+.u:&67 77s   >B C !5CC c           	      
   | j                         }| j                         r| j                  r5| j                  j	                  | j                  j                  |            }n| j                  j	                  |      }	 | j                  |      r| j                  |       y| j                  |       yy# t        t        f$ r?}t        j                  | t        d      t        d      t        |      z         Y d}~yd}~ww xY w)zImshow itemr  z8<b>Unable to show image.</b><br><br>Error message:<br>%sN)r  rY  r   rs  r   r8  r  r  r  r`   r_   r   rZ  r*   rC   )rS   r   ra   r[  s       rM   r  zBaseTableView.imshow_item  s     !!# ''//$$0079 ''//6	7==%OOC(KK$ ! 	* 7$$T1f:%& (F &)+.u:&67 77s   >"B4 !B4 4D5C==Dc           	      8   t        d       }| j                  t               | _        | j                  j	                  d       t        | || j                  t        d      dz         \  }}| j                  j	                  d       |rS|| _        | j                  j                  | j                               }	 ddl	} |j                  | j                  |       yy# t        $ r6}t        j                  | |t        d      t        |      z         Y d}~yd}~ww xY w)r  NFzNumPy arraysz (*.npy)Tr   z7<b>Unable to save array</b><br><br>Error message:<br>%s)r*   r^  r2   redirect_stdior   r   rr  r   r  r   saverf   r   rZ  rC   )rS   r|   filename
_selfilterr   npr[  s          rM   r  zBaseTableView.save_array  s    < &"0"2D  '.tU/3/B/B/0/@:/M O* 	  &"*D==**4+<+<+>?D7"++T2   7$$T5%& (F &)+.u:&67 77s   7!C 	D#,DDc           	         t        j                         }g }| j                         D ]  }|j                         s| j                  j                  |      }t        |t        j                  t        j                  j                  f      rst        j                  t        ur]t        j                         }	 t        j                  ||d       |j'                         j)                  d      }|j+                          nt        |t,        j.                  t,        j0                  f      rat,        j.                  t        urKt        j2                         }	 |j5                  |ddd       |j'                         }|j+                          n#t7        |      rt9        |d
      }nt9        |      }|j;                  |        |j=                  dj?                  |             y# t        $ r- t!        j"                  | t%        d      t%        d             Y  yw xY w# t        $ r- t!        j"                  | t%        d      t%        d	             Y  yw xY w)zCopy text to clipboard	)	delimiterrA  z&It was not possible to copy this arrayNr   T)sepr   headerz*It was not possible to copy this dataframeutf8
) r   	clipboardr  r   rr  r   rB   rb  ndarraymar%  r   ioBytesIOsavetxtrf   r   rB  r*   getvaluedecodeclosepdr(  r)  StringIOto_csvr.   r/   appendsetTextjoin)rS   rj  cliplr  rT   outputs         rM   r  zBaseTableView.copy  s    !**,	'') "	C;;=--))#.C 3RUU->-> ?@JJj0JJvsd; oo'..w7S2<<";<LL
2JJv4tDJI oo'!#&$S&1$S)LLE"	F 	$))E*+1 ! ''a	l() +7 )89 	 ! ''a	l() +; )<= 	s$   6G!H!2HH2IIc                 4   | j                   j                         }t        |d      syt        | ||t	        d      t        dt        |j                                           }|j                         r&|j                         \  }}| j                  ||       yy)zImport data from stringr{   NzClipboard contentsr   )	blacklist)r|   contents_titlevarname)
rs  r   hasattrr:   r*   r   r   r{   exec_r  )rS   r   r|   r   editorvar_name	clip_datas          rM   import_from_stringz BaseTableView.import_from_string  s      ))+tV$$eA6J4K&vdiik9JKM <<>"(//"3HiNN8Y/ rV   c                 J   t        j                         }d}|j                         j                         rt	        |j                               }|j                         r| j                  |t        d             yt        j                  | t        d      t        d             y)z$Import text/data/code from clipboardr  zImport from clipboard)r|   zEmpty clipboardz&Nothing to be imported from clipboard.N)r   rj  r$  hasTextr/   r   stripr  r*   r   rB  )rS   rj  cliptexts      rM   r  zBaseTableView.paste  s     !**,	'')%inn&67H>>##HA6M4N#Oa):&; !"J KMrV   )F)FNr   )T);rj   rk   rl   rm   CONF_SECTIONr	   r   r+  r   r^  sig_free_memory_requestedsig_editor_creation_startedsig_editor_shownrU   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rx  r|  r   rK  r  r  r"  r%  r)  r-  r2  r
   r  r  rI  r  r  r  r  rY  r  r  r  r  r  r  rX  rY  s   @rM   r[  r[  @  s   +&LtD\N &"((x&@JcL""""""""""""""
N4`
,14 	2J  
V/ / 
V 0  0D2,h 
V  
V? ? 
V#D #DJ 
VL L=7" 
V7 7( 
V7 7, 
V', ',R0 
V
M 
MrV   r[  c                   ~    e Zd ZdZ	 	 ddZd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd ZddZy)CollectionsEditorTableViewzCollectionsEditor table viewc           	      F   t         j                  | |       d | _        |xs t        |t        t
        f      | _        | j                  rt        nt        } || |||| j                  d            | _
        | j                  | _        | j                  | j                         t        |       | _        | j                  | j                         | j!                          | j#                         | _        t        |t
              r | j'                         j)                  d       y y )Nru   )rt   ru   r   )r[  rU   r
  rB   r   r   r  rp   r  get_confrs  modelsetModelr9   rr  setItemDelegater  r  r_  rw  hideSection)rS   r   r   r  r|   rt   CollectionsModelClasss          rM   rU   z#CollectionsEditorTableView.__init__  s    tV, BJteS\$B=A]]!9&6 	1==*
 &&
d''(+D1T]]+OO%	dC !!#//2 !rV   c                     | j                   j                         }t        |d      D ]  }|j                  |        | j	                  |       y)r  Tr   N)rs  r   r   popr   )rS   r{   r   ra   s       rM   r  z(CollectionsEditorTableView.remove_values  sC      ))+$- 	CHHSM	drV   c                     | j                   j                         }t        |t              r|j	                  ||          t        |t
              r|j                  ||          n||   ||<   | j                  |       yr  N)rs  r   rB   r   rv  r   addr   )rS   r  r  r   s       rM   r  z%CollectionsEditorTableView.copy_value!  sc      ))+dD!KKX'dC HHT(^$ NDMdrV   c                     | j                         }| j                  j                         }|||<   | j                  |       | j	                  |       y)r  N)r  rs  r   r   r2  )rS   ra   rg   r   r   s        rM   r  z$CollectionsEditorTableView.new_value,  sG    !!#  ))+S	dU#rV   c                 h    | j                   j                         }t        ||   t        t        f      S )z,Return True if variable is a list or a tuple)rs  r   rB   r   r   rS   ra   r   s      rM   r  z"CollectionsEditorTableView.is_list4  s+      ))+$s)eT]33rV   c                 \    | j                   j                         }t        ||   t              S )z Return True if variable is a set)rs  r   rB   r   r  s      rM   is_setz!CollectionsEditorTableView.is_set9  s'      ))+$s)S))rV   c                     | j                   j                         }| j                  |      r| j                  |      S t	        ||         S r  )rs  r   r  r  rX   r  s      rM   r  z"CollectionsEditorTableView.get_len>  sA      ))+==&&s++tCy>!rV   c                     | j                   j                         }t        ||   t        j                  t        j
                  j                  f      S r  )rs  r   rB   rb  rk  rl  r%  r  s      rM   r  z#CollectionsEditorTableView.is_arrayF  s:      ))+$s)bjj"%%2C2C%DEErV   c                     | j                   j                         }t        ||   t        j                  j                        S r  )rs  r   rB   r   Imager  s      rM   r  z#CollectionsEditorTableView.is_imageK  s/      ))+$s)SYY__55rV   c                 \    | j                   j                         }t        ||   t              S r  )rs  r   rB   r   r  s      rM   r  z"CollectionsEditorTableView.is_dictP  s'      ))+$s)T**rV   c                 T    | j                   j                         }||   j                  S r  )rs  r   rM  r  s      rM   r  z*CollectionsEditorTableView.get_array_shapeU  s$      ))+CyrV   c                 T    | j                   j                         }||   j                  S r  )rs  r   ndimr  s      rM   r  z)CollectionsEditorTableView.get_array_ndimZ  s$      ))+Cy~~rV   c                 Z    | j                   j                         }ddlm}  |||          y)r  r   )r  N)rs  r   4spyder.plugins.variableexplorer.widgets.objecteditorr  )rS   ra   r   r  s       rM   r  z CollectionsEditorTableView.oedit_  s'      ))+	d3irV   c                     | j                   j                         }ddlm} |j	                           t        ||      ||          |j                          y)r  r   N)rs  r   spyder.pyplotpyplotfigurer\   show)rS   ra   r  r   plts        rM   r  zCollectionsEditorTableView.plotf  s@      ))+#

XtCy)
rV   c                     | j                   j                         }ddlm} |j	                          |j                  ||          |j                          y)r  r   N)rs  r   r  r  r  r  r  )rS   ra   r   r  s       rM   r  z!CollectionsEditorTableView.imshown  s;      ))+#



49
rV   c                 ^    | j                   j                         }||   j                          y)r  N)rs  r   r  r  s      rM   r  z%CollectionsEditorTableView.show_imagev  s$      ))+S	rV   Nc                     || _         y)zSet table dict filterN)r
  )rS   r
  s     rM   
set_filterz%CollectionsEditorTableView.set_filter|  s	    $rV   Fr  Fr   )rj   rk   rl   rm   rU   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rn   rV   rM   r  r    sa    &;=32	$4
*
"F
6
+


%rV   r  c                   $    e Zd ZdZddZd Zd Zy)CollectionsEditorWidgetzDictionary Editor Widgetc                    t        j                  | |       |rt        | ||      | _        nt	        | |||      | _        t        d d      }|j                  t        t                     | j                  j                  D ]  }||j                  |        | j                  j                          t               }|j                  |       |j                  | j                         | j                  |       y )NzEditor toolbar)r   r|   )r   rU    RemoteCollectionsEditorTableViewr  r  r)   setStyleSheetrC   r>   r`  	addActionr  r   	addWidget	setLayout)	rS   r   r   r  r|   rv   toolbaritemlayouts	            rM   rU   z CollectionsEditorWidget.__init__  s    v&:4;CEDK 5T45:<DK  t3CDc":;<KK,, 	(D!!$'	(
 	  "!%vrV   c                 :    | j                   j                  |       y)zSet DictEditor dataN)r  r   r  s     rM   r   z CollectionsEditorWidget.set_data  s    T"rV   c                 B    | j                   j                  j                  S )zGet model title)r  rs  r|   rY   s    rM   	get_titlez!CollectionsEditorWidget.get_title  s    {{''---rV   Nr  )rj   rk   rl   rm   rU   r   r  rn   rV   rM   r  r    s    ".#.rV   r  c                   P     e Zd ZdZd fd	Z	 	 ddZ e       d        Zd Z xZ	S )CollectionsEditorzCollections Editor Dialogc                     t         |   |       | j                  t        j                         d | _        d | _        d | _        d | _        y r   )	rB  rU   setAttributer   WA_DeleteOnClose	data_copywidgetbtn_save_and_close	btn_closerH  s     rM   rU   zCollectionsEditor.__init__  sC      	"--."&rV   c                    t        |t        t        f      r|j                         | _        n<t        |t
        t        f      r|dd | _        nddl}	 |j                  |      | _        t        | j                        t        |      k7  rd}t        | | j                  |||      | _        | j                  j                  j                  j                   j#                  | j$                         t'               }|j)                  | j                         | j+                  |       t-               }	|	j/                  dddd       |	j1                          |s~t3        t5        d            | _        | j6                  j9                  d       | j6                  j:                  j#                  | j<                         |	j)                  | j6                         t3        t5        d            | _        | j>                  jA                  d       | j>                  jC                  d       | j>                  j:                  j#                  | jD                         |	j)                  | j>                         |jG                  |	       | jI                  | j                  jK                                |$| jM                  tO        jP                  d             tR        jT                  d	k(  r | jW                  tX        jZ                         y| jW                  tX        j\                         y# t        $ r |j                  |      | _        Y t        t        f$ r d}|| _        Y w xY w)
zSetup editor.Nr   T)r|   r  rv   r   zSave and CloseClosedicteditdarwin)/rB   r   r   r  r  r   r   deepcopyr]   r_   r^   r   r  r  r  rs  r   rE  save_and_close_enabler   r  r  r   setContentsMargins
addStretchr   r*   r  setDisabledclickedr  r  setAutoDefault
setDefaultreject	addLayoutsetWindowTitler  setWindowIconr1   r  rT  platformsetWindowFlagsr   ToolWindow)
rS   r   r|   r  rv   r  r   r  r  
btn_layouts
             rM   setupzCollectionsEditor.setup  sv    dT3K(!YY[DNudm,!!WDN &!%t!4 4:-H-dDNN49H5;= 	''88@@&&	(%v !]
%%aAq1&1!4D2E&FD###//5##++33DKK@  !8!89$QwZ0%%d+!!$'&&t{{3T^^,$DKK1134<sxx
34<<8#( 		*a ' 1!%4~. &!%&s   L M MMc                     | j                   rR| j                   j                  d       | j                   j                  d       | j                   j                  d       yy)zAHandle the data change event to enable the save and close button.TN)r  r  r  r  rY   s    rM   r  z'CollectionsEditor.save_and_close_enable  sN     ""##..t4##2248##..t4 #rV   c                     | j                   S )z*Return modified copy of dictionary or list)r  rY   s    rM   r   zCollectionsEditor.get_value  s     ~~rV   r   )r  FFNN)
rj   rk   rl   rm   rU   r  r
   r  r   rX  rY  s   @rM   r  r    s5    # <A $>+@ 
V5 5rV   r  c                   $    e Zd ZdZddZd Zd Zy)RemoteCollectionsDelegatezCollectionsEditor Item DelegateNc                 0    t        j                  | |       y r   )r9   rU   )rS   r   s     rM   rU   z"RemoteCollectionsDelegate.__init__
  s    $$T62rV   c                     |j                         ri|j                         j                  |      }|j                         j                  |j	                            }| j                         j                  |      S y r   )r   r  r8  r{   r   r   r   )rS   r   source_indexnames       rM   r   z#RemoteCollectionsDelegate.get_value  s_    ==? ;;=44U;L%%',,\-=-=-?@D;;=**400 rV   c                     |j                         rk|j                         j                  |      }|j                         j                  |j	                            }| j                         j                  ||       y y r   )r   r  r8  r{   r   r   r  )rS   r   rg   r  r  s        rM   r  z#RemoteCollectionsDelegate.set_value  s^    ==? ;;=44U;L%%',,\-=-=-?@DKKM##D%0 rV   r   )rj   rk   rl   rm   rU   r   r  rn   rV   rM   r  r    s    )311rV   r  c                        e Zd ZdZ	 	 ddZd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Z fdZddZd Zd Z xZS )r  zDictEditor table viewc                    t         j                  | |       || _        i | _        d | _        d | _        d| _        d | _        t        | |d| j                  d      d      | _
        | j                         j                  j                  | j                  j                         t        |       | _        | j                   | _        | j                   j%                  | j                         | j                   j'                  d       | j                   j)                  d       | j                   j+                  t,        j.                         | j                   j1                  t,        j2                         | j5                  | j                          | j7                  d       t9        |       | _        | j
                  j:                  j                  | j:                         | j
                  j<                  j                  | j<                         | j
                  j>                  j                  | j>                         | jA                  | j
                         | jC                          |r| jE                         | _#        y y )NFTru   )rt   ru   rv   r   r   )$r[  rU   shellwidgetvar_propertiesr
  rr  r  finderr  r  rs  rw  sectionClickedrE  r    CollectionsCustomSortFilterProxyr   r  setSourceModelsetDynamicSortFiltersetFilterKeyColumnsetFilterCaseSensitivityr   CaseInsensitivesetSortRoler   r  
hideColumnr  r  r  r  r  r  r  r_  )rS   r   r   r  remote_editingcreate_menus         rM   rU   z)RemoteCollectionsEditorTableView.__init__  s   tV,& ,$d==*
 	..66&&	( <DA%%
''(9(9:--d3++A.11"2D2DE$$R[[1d&&'1$7//77**	,1199,,	.&&..t/D/DET]]+)DI rV   c                 <    | j                   j                  |      }|S )zGet the value of a variable)r  r   )rS   r  rg   s      rM   r   z*RemoteCollectionsEditorTableView.get_valueJ  s      **40rV   c           	          	 | j                   j                  ||       | j                   j                          y# t        $ r6}t        j                  | t        d      dt        |      z         Y d}~Ud}~ww xY w)r  ErrorzTypeError: %sN)r  r  r_   r   rZ  r*   r/   refresh_namespacebrowser)rS   r  rg   rh   s       rM   r  z*RemoteCollectionsEditorTableView.new_valueO  sp    	F&&tU3 	113  	F  qz!0>!3D!DF F	Fs   9 	A8,A33A8c                 |    |D ]  }| j                   j                  |        | j                   j                          y)r  N)r  remove_valuer  )rS   rt   r  s      rM   r  z.RemoteCollectionsEditorTableView.remove_valuesX  s7     	0D))$/	0113rV   c                 p    | j                   j                  ||       | j                   j                          yr  )r  r  r  )rS   	orig_namerF  s      rM   r  z+RemoteCollectionsEditorTableView.copy_value^  s*    ##Ix8113rV   c                 &    | j                   |   d   S )z3Return True if variable is a list, a tuple or a setr  r  rS   r  s     rM   r  z(RemoteCollectionsEditorTableView.is_listc      ""4(33rV   c                 &    | j                   |   d   S )r  r  r  r  s     rM   r  z(RemoteCollectionsEditorTableView.is_dictg  r  rV   c                 &    | j                   |   d   S )r  rX   r  r  s     rM   r  z(RemoteCollectionsEditorTableView.get_lenk  s    ""4(//rV   c                 &    | j                   |   d   S )z(Return True if variable is a NumPy arrayr  r  r  s     rM   r  z)RemoteCollectionsEditorTableView.is_arrayo      ""4(44rV   c                 &    | j                   |   d   S )r  r  r  r  s     rM   r  z)RemoteCollectionsEditorTableView.is_images  r
  rV   c                 &    | j                   |   d   S )z&Return True if variable is a DataFrameis_data_framer  r  s     rM   r  z.RemoteCollectionsEditorTableView.is_data_framew  s    ""4(99rV   c                 &    | j                   |   d   S )z#Return True if variable is a Series	is_seriesr  r  s     rM   r  z*RemoteCollectionsEditorTableView.is_series{  s    ""4(55rV   c                 &    | j                   |   d   S )r  array_shaper  r  s     rM   r  z0RemoteCollectionsEditorTableView.get_array_shape  s    ""4(77rV   c                 &    | j                   |   d   S )r  
array_ndimr  r  s     rM   r  z/RemoteCollectionsEditorTableView.get_array_ndim  s    ""4(66rV   c                 J    | j                   }|j                  d|d|       y)r  z
%varexp --r   Nr  execute)rS   r  r  sws       rM   r  z%RemoteCollectionsEditorTableView.plot  s    


489rV   c                 D    | j                   }|j                  d|z         y)r  z%%varexp --imshow %sNr  )rS   r  r  s      rM   r  z'RemoteCollectionsEditorTableView.imshow  s    


)D01rV   c                 H    d|z  }| j                   }|j                  |       y)r  z	%s.show()Nr  )rS   r  commandr  s       rM   r  z+RemoteCollectionsEditorTableView.show_image  s#    $


7rV   c                 0    t         j                  |       }|S )zSetup context menu.)r[  r  )rS   r_  s     rM   r  z+RemoteCollectionsEditorTableView.setup_menu  s    ''-rV   c                 <    | j                   rt        | 	          y y r   )r  rB  r  )rS   rI  s    rM   r  z-RemoteCollectionsEditorTableView.refresh_menu  s    G " rV   c                    |s&| j                   | j                   j                         sd}n8| j                   j                         j                  dd      j                         }| j                  j                  |       | j                  j                  |       |r | j                  dt        j                         || _        y)z.Update the regex text for the variable finder.Nr  r   r   )r  r   replacerI   r   r  rs  r   r~  r   r   rp  )rS   regexr   r   s       rM   	set_regexz*RemoteCollectionsEditorTableView.set_regex  s    DKK't{{/?/?/AD;;##%--c26<<>D##D)//5a!3!34rV   c                     | j                         j                         }| j                  j                         }|dz   |k(  rd}| j	                  |dz          y)z-Move to next row from currently selected row.r   Nr  r   r   r   	selectRowrS   r   r  s      rM   next_rowz)RemoteCollectionsEditorTableView.next_row  sM    !%%'((*7d?CsQwrV   c                     | j                         j                         }| j                  j                         }|dk(  r|}| j	                  |dz
         y)z1Move to previous row from currently selected row.r   r   Nr#  r%  s      rM   previous_rowz-RemoteCollectionsEditorTableView.previous_row  sI    !%%'((*!8CsQwrV   )NFFrQ  )rj   rk   rl   rm   rU   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r&  r(  rX  rY  s   @rM   r  r    s{    FK"**Z
444
44055:687:
2

#    rV   r  c                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
r  z
    Custom column filter based on regex and model data.

    Reimplements 'filterAcceptsRow' to follow NamespaceBrowser model.
    Reimplements 'set_filter' to allow sorting while filtering
    c                 b    | j                  |      }| j                         j                  |      S )z%Return current key from source model.)r8  sourceModelr   rS   r   r  s      rM   r   z(CollectionsCustomSortFilterProxy.get_key  s,    ''.!)),77rV   c                 b    | j                         j                  |      }| j                  |      S )z)Return index using key from source model.)r+  r   mapFromSource)rS   ra   r  s      rM   r   z3CollectionsCustomSortFilterProxy.get_index_from_key  s,    '')<<SA!!,//rV   c                 b    | j                  |      }| j                         j                  |      S )z'Return current value from source model.)r8  r+  r   r,  s      rM   r   z*CollectionsCustomSortFilterProxy.get_value  s,    ''.!++L99rV   c                     	 | j                  |      }| j                         j                  ||       y# t        $ r Y yw xY w)zSet value in source model.N)r8  r+  r  r^   )rS   r   rg   r  s       rM   r  z*CollectionsCustomSortFilterProxy.set_value  sB    	++E2L((u= 		s   14 	A A c                 D    t        |      | _        | j                          y)z"Set regular expression for filter.N)r8   patterninvalidateFilter)rS   r   s     rM   r  z+CollectionsCustomSortFilterProxy.set_filter  s    '-rV   c                    | j                         }t        |j                  |            }t        |j                  |            }t	        j
                  | j                  |      }t	        j
                  | j                  |      }||yy)z
        Qt override.

        Reimplemented from base class to allow the use of custom filtering
        using to columns (name and type).
        FT)r+  r/   r   r   rE   searchr2  )rS   r   r   r  r  variable_typer_namer_types           rM   filterAcceptsRowz1CollectionsCustomSortFilterProxy.filterAcceptsRow  so       "emmG45&u~~g'>?4<<.4<<7>fnrV   c                    | j                         j                  |      }| j                         j                  |      }	 t        |t              r't        |t              rt	        |      t	        |      k  S ||k  S # t
        $ r Y yw xY w)z
        Implements ordering in a natural way, as a human would sort.
        This functions enables sorting of the main variable editor table,
        which does not rely on 'self.sort()'.
        T)r+  r   rB   rC   rN   r_   )rS   leftrightleftData	rightDatas        rM   lessThanz)CollectionsCustomSortFilterProxy.lessThan  s     ##%**40$$&++E2			(C(Z	3-Gx(79+===)++ 	 		s    6A< 7A< <	BBN)rj   rk   rl   rm   r   r   r   r  r  r9  r?  rn   rV   rM   r  r    s*    8
0
:
 
$rV   r  c                    
 t         j                  j                  t        j                  j                  dd      d      } dt        j                  j                  dd      ddgd	t        j                  d
dd      
t        j                  ddd      }	 ddl
} |j                  d      } |j                  dd      } |j                  ddd      } |j                  dg di      } |j                  g dg dg dg d d!      } G 
fd"d#t$              } |       }	i d$|	d%t        d&d'd(t'        d)d*      d+dd,t(        dd-gd.dgd/h d0d1d
|gd.dfd2d3d4d5d6d7d8d9t        j                  j                  dd      j+                  t        j,                        d:t        j.                  j1                  ddgddggd8d;gd;d;gg<      d=t        j2                  d>d      j+                  t        j4                        d?t        j                  j                  dd@      j+                  t        j6                        dAt        j0                  g       dB| i dC
dDt        j                  d
dddEddt9        dF            dG|dHdIdJt        j:                  dI      dKt        j<                  dL      dMt        j>                  d      dNt        j@                  dO      dPt        jB                  dQ      dRt        j,                  dS      dTt        j4                  dO      dUt        jD                  dQ      dVt        jF                  dS      dWt        j6                  d      dX|dY|dZ|||dt        jH                  t        jJ                  t        jL                  d[d\d]g^      d_S # t         t"        f$ r d}dx}x}x}}Y w xY w)`zCreate test data.   )r?   r?   )r   P)moder   
   r   )dabi  r      r"  *      )daysminutessecondsr   Nz1945-05-08T23:01:00.12345i     )rK  hoursz1939-09-01Tz
1939-10-0612H)r   endfreqseries_name)r   r   r   r   r   r   )rF  rG  crE  )r   r   r   r   )g?g@gffffff
@g@)TFFT)
string_colint_col	float_colbool_colc                       e Zd Z fdZy)get_test_data.<locals>.Foobarc                 0    d| _         | _        | _        y )Ntoto)r   testdicttestdate)rS   r^  r]  s    rM   rU   z&get_test_data.<locals>.Foobar.__init__+  s    DI$DM$DMrV   N)rj   rk   rl   rU   )r^  r]  s   rM   FoobarrZ  )  s    	%rV   r_  objectmodulerC   zkjkj kj k j j kj k jkjr#  u   éùr   r   r      kjkjr   >   FNABCr   r   r   r   r   r!  g&S?rH      r   Tarraymasked_arrayF)maskz1D-arrayiz3D-array)r   r   r   empty_arrayimagedater$     g    OA	timedeltar"  y       @      ?	complex64
complex128y              "@int8_scalarint16_scalar   int32_scalar    int64_scalar@   float16_scalarfloat32_scalarfloat64_scalarbool__scalar	timestamptimedelta_pddatetimeindexi  )IDf8)param1r  i  )dtype)series
ddataframeNoneunsupported1unsupported2big_struct_array)'r   r  	fromarrayrb  randomrandintrandr$  rm  ro  r   	Timestamp	Timedelta
date_ranger)  r(  ModuleNotFoundErrorImportErrorr`  r/   r   astypeint64rl  rh  linspacefloat16bool_rH   rp  rq  int8int16int32float32float64arccoscastzeros)rl  test_timedeltars  test_timestamp
test_pd_tdtest_dtindextest_seriestest_dfr_  foobarr^  r]  s             @@rM   get_test_datar    sH   II		 1 1#J 1 G%(   *ERYY^^B31a&AH}}T1a(H''RRHNI
 &&AB!R\\t26
$r}}=)5*/1  bii0B CD",,.B+7-A,F H I
% % XF+Hf +b+++ ~fg6+ QFAq>648	+
 A+ q(Hn=vtL+ H+ V+ 3+ D+ RYY^^B+22288<+ BEEKK!Q!Q(8/3UmeU^-L ( N+ C,33BJJ?+ 		))!))<CCBHHM+  288B<!+" U#+$ H%+& ))$1b!QE
K'+( )+* v++, f--+. "--+/+0 2771:1+2 BHHRL3+4 BHHRL5+6 BHHRL7+8 bjjn9+: bjjn;+< bjjn=+> BHHQK?+@ A+B JC+D \E+F "!IIGG "l6L6N !OS+ +/  - HCGGGGl[Hs   N5 5OOc                  j    t               } | j                  t                      | j                          y)zTest Collections editor.N)r  r  r  r  )dialogs    rM   editor_testr  _  s!     F
LL!
KKMrV   c                      ddl m}  ddlm}m} i }|D ]  }| j                  d|      ||<     |t               |      }t               }|j                  |d       |j                          y)zTest remote collections editor.r   )CONF)make_remote_viewREMOTE_SETTINGSr\  T)rv   N)
spyder.config.managerr  spyder_kernels.utils.nsviewr  r  getr  r  r  r  )r  r  r  settingsr  rv   r  s          rM   remote_editor_testr  f  sf    *> H ="5t<= mox8F F
LLL%
KKMrV   __main__)qapplication)urm   r$  rm  rE   rT  r   qtpy.compatr   r   qtpy.QtCorer   r   r   r   r	   r
   
qtpy.QtGuir   r   qtpy.QtWidgetsr   r   r   r   r   r   r   r   r   r   r    spyder_kernels.utils.lazymodulesr   r   rb  r   rs  r   spyder_kernels.utils.miscr   r  r   r   r   r    r!   r"   r#   r$   r%   r&   r'   spyder.api.config.mixinsr(   spyder.api.widgets.toolbarsr)   spyder.config.baser*   r+   spyder.config.fontsr,   spyder.config.guir-   spyder.py3compatr.   r/   r0   spyder.utils.icon_managerr1   spyder.utils.miscr2   spyder.utils.qthelpersr3   r4   r5   r6   spyder.utils.stringmatchingr7   r8   ;spyder.plugins.variableexplorer.widgets.collectionsdelegater9   4spyder.plugins.variableexplorer.widgets.importwizardr:   spyder.widgets.helperwidgetsr;   2spyder.plugins.variableexplorer.widgets.basedialogr<   spyder.utils.paletter=   spyder.utils.stylesheetr>   MAX_SERIALIZED_LENGHTr   r   rH   r!  r   rN   r`  rP   rp   r  r@  r[  r  r  r  r  r  r  r  r  r  rj   r  appr  rn   rV   rM   <module>r     s    	 	 
  5M M +@ @ @ @0 0 8    A 5 6 3 &3 3 ) ,> > K M > I . <    e688'& 'TN2 Nb
L/ L^O[ O:{
MJ ; {
M|@% @%F .g  .F]
 ]F1 3 1&e } e PH'< H\L^  z3
.CMIIK rV   