
    e                     `    d dl 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)	    N   )	functions)	QtWidgets   )DataTreeWidgetDiffTreeWidgetc                   :    e Zd ZdZd	dZd Zd
dZd ZddZd Z	y)r   z
    Widget for displaying differences between hierarchical python data structures
    (eg, nested dicts, lists, and arrays)
    Nc                 d   t         j                  j                  | |       t        j                         | _        | j                  | j                         t        |       t        |       g| _        | j                  D ]  }| j                  j                  |        || j                  ||       y y N)
r   QWidget__init__QHBoxLayoutlayout	setLayoutr   trees	addWidgetsetData)selfparentabts        B/usr/lib/python3/dist-packages/pyqtgraph/widgets/DiffTreeWidget.pyr   zDiffTreeWidget.__init__   s    ""40++-t{{#$T*N4,@A
 	%AKK!!!$	%=LLA     c                     ||f| _         | j                  d   j                  |       | j                  d   j                  |       | j                  ||      S )z=
        Set the data to be compared in this widget.
        r   r   )datar   r   compare)r   r   r   s      r   r   zDiffTreeWidget.setData   sL     F	

1a 

1a ||Aq!!r   c                 n   d}| j                   d   j                  |      \  }}}}| j                   d   j                  |      \  }	}
}}||	k7  r| j                  |d|       ||
k7  r| j                  |d|       t        |t              rt        |t              rt        |j                               }t        |j                               }||z
  D ]  }| j                  ||fz   d|d        ||z
  D ]  }| j                  ||fz   d|d        ||z  D ]  }| j                  ||   ||   ||fz          ! yt        |t        t        f      rt        |t        t        f      rt        t        t        |      t        |                  D ]o  }t        |      |k  r| j                  ||fz   d|d       +t        |      |k  r| j                  ||fz   d|d       S| j                  ||   ||   ||fz          q yt        |t        j                        rt        |t        j                        r{|j                  |j                  k(  r`| j                   D cg c]   }|j                   |   j#                  d      " }}|j$                  j&                  k|j$                  j&                  U| j)                  ||      }t        j*                  |      s-|D ]'  }|j-                  dt/        j0                  |             ) yy|j$                  |j$                  k(  rt3        |j$                  j&                  j                               D ]_  \  }}| j)                  ||   ||         }t        j*                  |      r4|D ]'  }|j-                  dt/        j0                  |             ) a yyyyyc c}w )a  
        Compare data structure *a* to structure *b*. 
        
        Return True if the objects match completely. 
        Otherwise, return a structure that describes the differences:
        
            { 'type': bool
              'len': bool,
              'str': bool,
              'shape': bool,
              'dtype': bool,
              'mask': array,
              }
        
                
        )      r    r   r   r   )treeN)r   parsesetColor
isinstancedictsetkeysr   listtuplerangemaxlennpndarrayshapenodeschilddtypefieldscompareArraysallsetBackgroundfnmkBrush	enumerate)r   r   r   pathbadtypeAdescAchildsA_typeBdescBchildsBkeysAkeysBkeyir!   
tableNodeseqnks                        r   r   zDiffTreeWidget.compare#   s7   " #'::a=#6#6q#9 ugq#'::a=#6#6q#9 ugqE>MM$3'E>MM$3'a:a#6MEMEu} ;dC6k1c:;u} ;dC6k1c:;u} :QsVQsVT3&[9: D%=)jT5M.J3s1vs1v./ 8q6Q;MM$t)Q!M<Vq[MM$t)Q!M<LL1qtT1$Y78 2::&:a+DTUT[T[I[@D

K$**T*003KJKww~~%!''..*@''1-vvbz' <2::c?;< " 77agg%()<)<)>? D!!//!ad;!vvbz%/ D !2::c? CDD & J\+D&Ks   %N2c                     d}t        j                  |      ||k(  z  }t        j                  |      ||k(  z  }||k(  }| }t        j                  ||   ||         ||<   |S )N         )r-   isnanallclose)r   r   r   intnananansbnansrH   masks           r   r4   zDiffTreeWidget.compareArraysg   sd    %qF{+qF{+e^v;;qw$04	r   c                     t        j                  |      }|| j                  }n| j                  |   g}|D ]#  }|j                  |   }|j	                  ||       % y r   )r7   r8   r   r0   r6   )r   r:   columncolorr!   brushr   items           r   r#   zDiffTreeWidget.setColorp   s^    

5! <JJEZZ%&E 	.D::d#Dvu-	.r   c                 *   t        t              t        t              u sJ t        t        d      r!t	        t              t	        t              k(  sJ t        t        t              rKt        D ]  }|t        v rJ  t        D ],  }|t        v sJ | j                  t        |   t        |          . yt        t        t              r>t        t	        t                    D ]"  }| j                  t        |   t        |          $ yt        t        t        j                        r:t        j                  t        j                  k(  sJ t        j                  t        j                  k(  sJ t        j                  j                  d}t        j                  t              t        |k(  z  }t        j                  t              t        |k(  z  }t        j                   ||k(        sJ | }t        j"                  t        |   t        |         sPJ t        j                  j                  j%                         D ]"  }| j                  t        |   t        |          $ yy	 t        t        k(  sJ y# t&        $ r t)        dt        t              z        w xY w)z?
        Compare data structure *a* to structure *b*. 
        __len__NrL   z!Cannot compare objects of type %s)typeinfoexpecthasattrr,   r$   r%   compare_resultsr(   r*   r-   r.   r/   r2   r3   rM   r5   rN   r'   	ExceptionNotImplementedError)	r   r   r   rJ   rF   rO   inansenansrR   s	            r   _comparezDiffTreeWidget._compare}   s   
 DzT&\)))4#t9F+++dD! #F{"{# 9Dy y$$T!WfQi89 d#3t9% 9$$T!WfQi89bjj)::---::---zz  (-$&.9(Ff,<=vveun---v{{4:vd|<<<**//1 =A((a&)<= =
\v~%~ \)*MPTUYPZ*Z[[\s   I- -%J)NNN) r   )
__name__
__module____qualname____doc__r   r   r   r4   r#   rc   rd   r   r   r   r   
   s(    "=DH.#\r   )numpyr-    r   r7   Qtr   r   __all__r   r   rd   r   r   <module>rm      s/       *
V\Y&& V\r   