
    e,                         d dl mZ d dlZddlmZ ddlmZ ddlmZ	 ddl
mZ ddlmZmZ d	d
lmZ d	dlmZ d	dlmZ dgZ G d dej*                        Zy)    )OrderedDictN   )	functions)getConfigOption)parametertree)TextItem)QtCore	QtWidgets   )ColorMapParameter)DataFilterParameter)
PlotWidgetScatterPlotWidgetc                       e Zd ZdZ ej
                  eee      Z ej
                  eee      Zd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y)r   a2  
    This is a high-level widget for exploring relationships in tabular data.
        
    Given a multi-column record array, the widget displays a scatter plot of a
    specific subset of the data. Includes controls for selecting the columns to
    plot, filtering data, and determining symbol color and shape.
    
    The widget consists of four components:
    
    1) A list of column names from which the user may select 1 or 2 columns
       to plot. If one column is selected, the data for that column will be
       plotted in a histogram-like manner by using :func:`pseudoScatter()
       <pyqtgraph.pseudoScatter>`. If two columns are selected, then the
       scatter plot will be generated with x determined by the first column
       that was selected and y by the second.
    2) A DataFilter that allows the user to select a subset of the data by 
       specifying multiple selection criteria.
    3) A ColorMap that allows the user to determine how points are colored by
       specifying multiple criteria.
    4) A PlotWidget for displaying the data.
    Nc                    t         j                  j                  | t        j                  j
                  j                         t        j                  t        j                  j
                  j                        | _        | j                  | j                         t        j                         | _        | j                  j                  | j                  j                  j                         t        j                   d      | _        t#               | _        t'               | _        t        j*                  j-                  dd| j$                  | j(                  g      | _        | j                  j1                  | j.                  d       t3               | _        | j                  j                  | j                         | j                  j                  | j                         | j                  | j4                         t7        j8                  t;        d            }|j=                  d       t?        t;        d      |	      | _         | j@                  jC                  d
d       | j@                  jE                  | j4                  jF                         d | _$        d | _%        d | _&        d | _'        d | _(        g | _)        tU        d d      | _+        d | _,        d | _-        d | _.        d | _/        | j                  j`                  jc                  | jd                         | j$                  jf                  jc                  | jh                         | j(                  jj                  jc                  | jl                         y )NF)
showHeaderparamsgroup)nametypechildren)showTop
foreground   )bordercolor<      o)pensymbol)7r
   	QSplitter__init__r	   QtOrientation
HorizontalVertical	ctrlPanel	addWidgetQListWidget	fieldListsetSelectionModeSelectionModeExtendedSelectionptreeParameterTreer   filterr   colorMap	Parametercreater   setParametersr   plotfnmkColorr   setAlphar   
filterTextsetPossetParentItemplotItemdataindicesmouseOverFieldscatterPlotselectionScatterselectedIndicesdictstyle
_visibleXY_visibleData_visibleIndices	_indexMapitemSelectionChangedconnectfieldSelectionChangedsigFilterChangedfilterChangedsigColorMapChanged
updatePlot)selfparentfgs      E/usr/lib/python3/dist-packages/pyqtgraph/widgets/ScatterPlotWidget.pyr#   zScatterPlotWidget.__init__)   sV   $$T699+@+@+K+KL",,VYY-B-B-K-KLt~~&"..0''(D(D(V(VW((E:
)+)+oo,,(TXT_T_aeananSo,p

  e <L	  0  ,tyy!ZZ56
C"/,*GrRr"%%%dii&8&89	" $!d3/
 #++33D4N4NO$$,,T-?-?@((00A    c                 T   t        |      | _        || _        | j                  j	                          |D ]<  \  }}t        j                  |      }||_        | j                  j                  |      }> | j                  j                  |       | j                  j                  |       y)z
        Set the list of field names/units to be processed.
        
        The format of *fields* is the same as used by 
        :meth:`~pyqtgraph.widgets.ColorMapWidget.ColorMapParameter.setFields`
        N)r   fieldsr@   r+   clearr
   QListWidgetItemoptsaddItemr1   	setFieldsr2   )rQ   rW   r@   frZ   items         rT   r\   zScatterPlotWidget.setFieldsP   s     "&), 	0FAd,,Q/DDI>>))$/D	0 	f%'rU   c                 J   | j                   j                  j                  | j                         	 | j                   j	                          |D ]`  }t        | j                  j                               j                  |      }| j                   j                  |      }|j                  d       b 	 | j                   j                  j                  | j                         | j                          y # | j                   j                  j                  | j                         w xY w)NT)r+   rJ   
disconnectrL   clearSelectionlistrW   keysindexr^   setSelectedrK   )rQ   rW   r]   ir^   s        rT   setSelectedFieldsz#ScatterPlotWidget.setSelectedFieldsa   s    ++66t7Q7QR	TNN))+ '))+,2215~~**1-  &'
 NN//778R8RS""$ NN//778R8RSs   A?C1 11D"c                     || _         t        j                  t        |            | _        d| _        d| _        | j                          y)zm
        Set the data to be processed and displayed. 
        Argument must be a numpy record array.
        N)r>   nparangelenr?   filteredfilteredIndicesrP   )rQ   r>   s     rT   setDatazScatterPlotWidget.setDatam   s8    
 	yyT+#rU   c                 2    || _         | j                          y)zMark the specified indices as selected.

        Must be a sequence of integers that index into the array given in setData().
        N)rC   updateSelected)rQ   indss     rT   setSelectedIndicesz$ScatterPlotWidget.setSelectedIndicesx   s    
  $rU   c                 `    | j                  |D cg c]  }|j                   c}       yc c}w )zMark the specified points as selected.

        Must be a list of points as generated by the sigScatterPlotClicked signal.
        N)rr   originalIndex)rQ   pointspts      rT   setSelectedPointsz#ScatterPlotWidget.setSelectedPoints   s&    
 	F Cb!1!1 CD Cs   +c                 Z   | j                   j                         }t        |      dkD  rS| j                   j                  d       	 |dd D ]  }|j	                  d        	 | j                   j                  d       | j                          y # | j                   j                  d       w xY w)Nr   Tr   F)r+   selectedItemsrk   blockSignalsre   rP   )rQ   selr^   s      rT   rL   z'ScatterPlotWidget.fieldSelectionChanged   s    nn**,s8a<NN''-3"I ,D$$U+, ++E2 ++E2s   B B*c                 D   d | _         | j                          | j                  j                         }t	        |      dk(  r| j
                  j                  d       y | j
                  j                  dj                  |             | j
                  j                  d       y )Nr   F
T)	rl   rP   r1   describerk   r:   
setVisiblesetTextjoin)rQ   r]   descs      rT   rN   zScatterPlotWidget.filterChanged   sn    {{##%t9>OO&&u-OO##DIIdO4OO&&t,rU   c           
         | j                   j                          | j                  t        | j                        dk(  ry | j                  M| j
                  j                  | j                        }| j                  |   | _        | j                  |   | _        | j                  }t        |      dk(  ry t        j                  | j                  j                  |      D cg c]  }t        j                  |  c}      }| j                  j!                         }t#        | j$                  j'                         D cg c]  }t)        |j+                                c}      }t#        | j$                  j'                         D cg c]  }|j,                  j/                  dd        c}      }t        |      dk(  r| j                   j1                  d       y t        |      dk(  r@| j                   j3                  d|d   |d   fd       t        |      dk(  ry ||d      d g}	nZt        |      dk(  rL| j                   j3                  |d   |d   f|d   |d   f       t        |      dk(  ry ||d      ||d      g}	d	d	g}
d
D ](  }| j                   j5                  ddg|         }	|   | j6                  ||      j/                  dd       dk(  s|	|   j8                  j:                  dv r| j6                  ||      j/                  dt#        t=        |	|                     }t        j                  |	|   D cg c]"  }||v r|j?                  |      n
t        |      $ c}t@              |	|<   |jC                  t#        tE        |            g       d|
|<   |jC                  d        + t        jF                  t        	d         tH              }|	d   j8                  j:                  dk(  r|t        jJ                  |	d         z  }|	d   7|	d   j8                  j:                  dk(  r|t        jJ                  |	d         z  }|	d   |   |	d<   ||   |d<   ||   }| j                  |   }|	d   t        jL                  |	d         |	d<   n|	d   |   |	d<   d
D ]  }|
|   s	t        |	|         dkD  rtO        |	|   jQ                               nd}tS        |dz         D ]y  }|	|   |k(  }t        jL                  |	d|z
     |   d      }t        |      dk(  r:t        jT                  |      jQ                         }|dk7  r|d|z  z  }|	|   |xx   |z  cc<   {  | jV                  0	 | jV                  jX                  j[                  | j\                         |	| _/        || _0        || _1        d | _2         | j                   j                   |	d   |	d   fd|i|| _+        | jV                  jX                  jg                  | j\                         | jV                  jh                  jg                  | jj                         | jm                          y c c}w c c}w c c}w c c}w #  Y xY w)Nr   units r   )Nr   )leftbottomtitler   )r   r   F)r   r   r   r   modeenum)SOvalues)dtypeTr]   symbolBrush)bidirg?r>   )7r6   rX   r>   rk   rl   r1   generateMaskr?   rm   ri   arrayr2   mapr7   mkBrushrE   copyrb   r+   rz   strtextrZ   getsetTitle	setLabelsgetAxisrW   r   kindsetrd   floatsetTicks	enumerateonesboolisfinitepseudoScatterintmaxrangeabsrA   sigPointsClickedr`   plotClickedrF   rG   rH   rI   rK   sigPointsHoveredplotHoveredrp   )rQ   maskr>   xcolorsrE   r^   r|   r   xyr   rf   axisvalsr?   aximaxkeymaskscattersmaxs                       rT   rP   zScatterPlotWidget.updatePlot   s   		99DII! 3== ;;++DII6D IIdODM#'<<#5D }}t9>4==3D3DT3JKa2::q>KL

! 1M1M1OPC		$PQT^^=Y=Y=[\TdiimmGR0\]s8q=IIr" s8q=IIYAa7IQST4yA~ s1v,%BX]IIc!fU1X%6AuQx?PQ4yA~s1v,SV-B u~ 	$A99$$h%7%:;D!u dkk#a&&9&=&=fd&Kv&UY[\]Y^YdYdYiYimwYw{{3q6*..xc"Q%j9IJUWXYUZ![PQ19$**Q-#d)"K![chi1tIdO456Qd#	$ wws2a5z.a5;;s"BKK1&&Da5A!1!1S!8BKK1&&D1d1%d|mDz&&t, a5=$$RU+BqE qE$KBqE /Bx,/2K!Os2b6::<(tAv /A fkG ..r!B$x/@MG7|q( 66'?..0Dqy3:-rF7Ow.O/	/ '  11<<T=M=MN  &)499>>"Q%AKTKUK))11$2B2BC))11$2B2BC} L
 Q\F "\Vs$    Y; Y#Y ;'Y%
1/Y* *Y.c           	         | j                   y | j                         }| j                  D cg c]  }||v s||    }}| j                   d   |   | j                   d   |   }}| j                  /| j                  j
                  j                  | j                         t        |      dk(  ry | j                  j	                  ||d ddd d      | _        y c c}w )Nr   r   s   y)r    r!   
symbolSizer   	symbolPen)rF   _getIndexMaprC   rB   r6   r=   
removeItemrk   )rQ   indMaprf   rq   r   r   s         rT   rp   z ScatterPlotWidget.updateSelected
  s    ??"""$#'#7#7Ga1;q	GGooa &(:4(@!  ,II))$*?*?@q6Q; $		q!cVXfjvy z Hs
   	CCc                     | j                   .t        | j                        D ci c]  \  }}||
 c}}| _         | j                   S c c}}w N)rI   r   rH   )rQ   rf   js      rT   r   zScatterPlotWidget._getIndexMap  sA    >>!-6t7K7K-LMcaacMDN~~ Ns   Ac                     |D ]$  }| j                   |j                            |_        & | j                  j	                  | ||       y r   )rH   rd   rt   sigScatterPlotClickedemit)rQ   r6   ru   evrv   s        rT   r   zScatterPlotWidget.plotClicked  sD     	@B#33BHHJ?B	@""''fb9rU   c                 >    | j                   j                  | ||       y r   )sigScatterPlotHoveredr   )rQ   r6   ru   r   s       rT   r   zScatterPlotWidget.plotHovered$  s    ""''fb9rU   r   )__name__
__module____qualname____doc__r	   Signalobjectr   r   r#   r\   rg   rn   rr   rw   rL   rN   rP   rp   r   r   r    rU   rT   r   r      sz    * *FMM&&&A)FMM&&&A%BN("
%	E
-kZ{::rU   )collectionsr   numpyri   r   r   r7   r   r   r/   graphicsItems.TextItemr   r$   r	   r
   ColorMapWidgetr   DataFilterWidgetr   r   __all__r"   r   r   rU   rT   <module>r      s?    #    % - " - 1 "
U:	++ U:rU   