
    e8                         d dl mZmZ ddgZ G d dej                        Z G d dej                        Z G d de      Z	y)	   )QtCore	QtWidgets
TreeWidgetTreeWidgetItemc                   T    e Zd ZdZ ej
                  eee      Z ej
                  ee      Z ej
                  ee      Z	 ej
                  ee      Z
ddZd Zd Zd Zd Zd Zd Zd	 Zd
 ZddZ fdZd Zed        Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z# xZ$S )r   zExtends QTreeWidget to allow internal drag/drop with widgets in the tree.
    Also maintains the expanded state of subtrees as they are moved.
    This class demonstrates the absurd lengths one must go to to make drag/drop work.c                    t         j                  j                  | |       t        t         j                  j	                  |             | _        | j                  d       | j                  d       | j                  t         j                  j                  j                  t         j                  j                  j                  z         g | _        d | _        | j                  j!                  | j"                         y )NT)r   QTreeWidget__init__InvisibleRootIteminvisibleRootItem_invRootItemsetAcceptDropssetDragEnabledsetEditTriggersQAbstractItemViewEditTriggerEditKeyPressedSelectedClickedplaceholderschildNestingLimititemClickedconnect_itemClicked)selfparents     >/usr/lib/python3/dist-packages/pyqtgraph/widgets/TreeWidget.pyr
   zTreeWidget.__init__   s    &&tV4 .i.C.C.U.UVZ.[\D!D!Y88DDSST]ToToT{T{  UL  UL  L  	M!%  !2!23    c                    t        j                         }t        j                         }|j                  dddd       |j	                  |       |j                  |j                                |j                  |j                                |j                  |j                                |j                  |       ||_        | j                  j                  |       t         j                  j!                  | |||       y)z
        Overrides QTreeWidget.setItemWidget such that widgets are added inside an invisible wrapper widget.
        This makes it possible to move the item in and out of the tree without its widgets being automatically deleted.
            N)r   QWidgetQVBoxLayoutsetContentsMargins	setLayoutsetSizePolicy
sizePolicysetMinimumHeightminimumHeightsetMinimumWidthminimumWidth	addWidget	realChildr   appendr	   setItemWidget)r   itemcolwidwls         r   r-   zTreeWidget.setItemWidget   s    
 !!#	Qq1%	A	()	3,,./	#**,-	C  #++D$Q?r   c                 |    t         j                  j                  | ||      }|t        |d      r|j                  }|S )Nr+   )r   r	   
itemWidgethasattrr+   )r   r.   r/   r1   s       r   r4   zTreeWidget.itemWidget/   s8    !!,,T4==WQ4Ar   c                    | j                         }|}	 |n||u ry|j                         }| j                  |||      sy|j                         }|| j                         }|| j                         }||u r||j	                  |      kD  r|dz  }| j                  |       |j                  |       |j                  ||       | j                  |       | j                  |       | j                  j                  |||       y)NTF   )currentItemr   
itemMovingr   indexOfChildprepareMoveremoveChildinsertChildsetCurrentItemrecoverMovesigItemMovedemit)r   r   indexdataactionr.   pcurrentParents           r   dropMimeDatazTreeWidget.dropMimeData5   s   !yDy
A  tVU3  224M>++-FF"uv/B/B4/H'HQJE!!$'5$'D!tVU3r   c                      y)zqCalled when item has been dropped elsewhere in the tree.
        Return True to accept the move, False to reject.T )r   r.   r   rB   s       r   r9   zTreeWidget.itemMovingY   s     r   c                 v   g |_         |j                         |_        t        | j	                               D ]C  }| j                  ||      }|j                   j                  |       |3|j                  d        E t        |j                               D ]"  }| j                  |j                  |             $ y N)_TreeWidget__widgets
isExpanded_TreeWidget__expandedrangecolumnCountr4   r,   	setParent
childCountr;   childr   r.   ir1   s       r   r;   zTreeWidget.prepareMove^   s    //+t'')* 	Aa(ANN!!!$yKK	 t() 	,ATZZ]+	,r   c                    t        | j                               D ]'  }|j                  |   }|| j                  |||       ) t        |j	                               D ]"  }| j                  |j                  |             $ |j                  d       t        j                  j                         j                          |j                  |j                         y NF)rO   rP   rL   r-   rR   r?   rS   setExpandedr   QApplicationinstanceprocessEventsrN   rT   s       r   r?   zTreeWidget.recoverMovej   s    t'')* 	+Aq!AytQ*		+
 t() 	,ATZZ]+	, 	'')779)r   c                     |j                  d       t        |j                               D ]"  }| j                  |j	                  |             $ y rW   )rX   rO   rR   collapseTreerS   r   r.   rU   s      r   r]   zTreeWidget.collapseTreew   sA    t() 	-Adjjm,	-r   c                     t        | j                               D ](  }| j                  |      |u s| j                  |        y  t	        dt        |      z        )Nz!Item '%s' not in top-level items.)rO   topLevelItemCounttopLevelItemtakeTopLevelItem	Exceptionstrr^   s      r   removeTopLevelItemzTreeWidget.removeTopLevelItem|   sZ    t--/0 	A  #t+%%a(	 ;c$iGHHr   c                     g }||j                  |       n| j                         }t        |j                               D ];  }| j	                  |j                  |            }|D ]  }|j                  |        = |S )N)r.   )r,   r   rO   rR   listAllItemsrS   )r   r.   itemscindex
foundItemsfs         r   rg   zTreeWidget.listAllItems   s    LL))+DDOO-. 	 F**

60B*CJ  Q 	  r   c                 D    t         |   |       | j                          y rK   )super	dropEventupdateDropFlags)r   ev	__class__s     r   rn   zTreeWidget.dropEvent   s    "r   c                    | j                   y | j                         }|D ]  }d}|j                         }||dz  }|j                         }||| j                   k\  rF|j                  |j	                         t
        j                  j                  j                   z         |j                  |j	                         t
        j                  j                  j                  z          y )Nr   r7   )	r   rg   r   setFlagsflagsr   QtItemFlagItemIsDropEnabled)r   rh   r.   parentCountrE   s        r   ro   zTreeWidget.updateDropFlags   s     !!)%%'E 	WKKMm1$K
A m $"8"88MM$**,6993E3E3W3W2W"XYMM$**,1C1C1U1U"UV	Wr   c                     t        | d      r| j                          t        | j                               D ]&  }t        j                  | j                  |             ( y )NtreeWidgetChanged)r5   rz   rO   rR   r   informTreeWidgetChangerS   )r.   rU   s     r   r{   z!TreeWidget.informTreeWidgetChange   sJ    4,-""$t() 	=A--djjm<	=r   c                 f    t         j                  j                  | |       | j                  |       y rK   )r   r	   addTopLevelItemr{   r   r.   s     r   r}   zTreeWidget.addTopLevelItem   s&    --dD9##D)r   c                 t    t         j                  j                  | |       |D ]  }| j                  |        y rK   )r   r	   addTopLevelItemsr{   r   rh   r.   s      r   r   zTreeWidget.addTopLevelItems   s5    ..tU; 	.D''-	.r   c                 h    t         j                  j                  | ||       | j                  |       y rK   )r   r	   insertTopLevelItemr{   r   rB   r.   s      r   r   zTreeWidget.insertTopLevelItem   s(    00udC##D)r   c                 v    t         j                  j                  | ||       |D ]  }| j                  |        y rK   )r   r	   insertTopLevelItemsr{   )r   rB   rh   r.   s       r   r   zTreeWidget.insertTopLevelItems   s7    11$uE 	.D''-	.r   c                     | j                  |      }|| j                  |       t        j                  j	                  | |      }| j                  |       | j                  |       |S rK   )ra   r;   r   r	   rb   r{   r   s      r   rb   zTreeWidget.takeTopLevelItem   s_      'T"$$55dEB##D)r   c                 x    t        | j                               D cg c]  }| j                  |       c}S c c}w rK   )rO   r`   ra   r   rU   s     r   topLevelItemszTreeWidget.topLevelItems   s/    .3D4J4J4L.MN!!!$NNN   7c                     | j                         }|D ]  }| j                  |        t        j                  j	                  |        y rK   )r   r;   r   r	   clearr   s      r   r   zTreeWidget.clear   sA    ""$ 	#DT"	###D)r   c                     | j                   S rK   )r   r   s    r   r   zTreeWidget.invisibleRootItem   s       r   c                 :   |j                         }g }|j                         dk\  rD|j                  d|j                                |j                         }|j                         dk\  rD| j	                  |d         }|dd D ]  }|j                  |      } ||fS )zCReturn the item and column corresponding to a QModelIndex.
        r   r7   N)columnrowinsertr   ra   rS   )r   rB   r/   rowsr.   r   s         r   itemFromIndexzTreeWidget.itemFromIndex   s     llniikQKK599;'LLNE iikQ   a)8 	#C::c?D	#Syr   c                 |    t         j                  j                  | |       | j                  j	                  | |       y rK   )r   r	   setColumnCountsigColumnCountChangedrA   )r   cs     r   r   zTreeWidget.setColumnCount   s.    ,,T15""''a0r   c                 @    t        |d      r|j                  |       y y )Nr   )r5   r   )r   r.   r/   s      r   r   zTreeWidget._itemClicked   s    4'S! (r   rK   )%__name__
__module____qualname____doc__r   Signalobjectr@   sigItemCheckStateChangedsigItemTextChangedr   r
   r-   r4   rG   r9   r;   r?   r]   re   rg   rn   ro   staticmethodr{   r}   r   r   r   rb   r   r   r   r   r   r   __classcell__)rq   s   @r   r   r      s    Y !6==8L,v}}VV<&vv6)FMM&&94@""H

,*-
IW& = =*.
*.
O*!1"r   c                   |    e 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y)r   aV  
    TreeWidgetItem that keeps track of its own widgets and expansion state.
    
      * Widgets may be added to columns before the item is added to a tree.
      * Expanded state may be set before item is added to a tree.
      * Adds setCheked and isChecked methods.
      * Adds addChildren, insertChildren, and takeChildren methods.
    c                 n    t        j                  j                  | g|  i | _        d | _        d| _        y rW   )r   QTreeWidgetItemr
   _widgets_tree	_expanded)r   argss     r   r
   zTreeWidgetItem.__init__   s0    !!**47$7
r   c                     | j                  ||r)t        j                  j                  j                         y t        j                  j                  j
                         y rK   )setCheckStater   ru   
CheckStateChecked	Unchecked)r   r   checkeds      r   
setCheckedzTreeWidgetItem.setChecked   s<    67699#7#7#?#?oPVPYPYPdPdPnPnor   c                 n    | j                  |      t        j                  j                  j                  k(  S rK   )
checkStater   ru   r   r   r   r/   s     r   	isCheckedzTreeWidgetItem.isChecked  s&    s#vyy';';'C'CCCr   c                 R    || _         t        j                  j                  | |       y rK   )r   r   r   rX   )r   exps     r   rX   zTreeWidgetItem.setExpanded  s    !!--dC8r   c                     | j                   S rK   )r   r   s    r   rM   zTreeWidgetItem.isExpanded  s    ~~r   c                     || j                   v r| j                  |       || j                   |<   | j                         }|y |j                  | ||       y rK   )r   removeWidget
treeWidgetr-   )r   r   widgettrees       r   	setWidgetzTreeWidgetItem.setWidget  sP    T]]"f% &f <tVV4r   c                 h    | j                   |= | j                         }|y |j                  | |       y rK   )r   r   removeItemWidget)r   r   r   s      r   r   zTreeWidgetItem.removeWidget  s2    MM&! <dF+r   c                 0   | j                         }| j                  |u ry | j                         | _        |y | j                  j                         D ]  \  }}|j	                  | ||        t
        j                  j                  | | j                         y rK   )	r   r   r   rh   r-   r   r   rX   r   )r   r   r/   r   s       r   rz   z TreeWidgetItem.treeWidgetChanged  s     ::__&
<==..0 	2KCtS&1	2!!--dDNNCr   c                 x    t        | j                               D cg c]  }| j                  |       c}S c c}w rK   )rO   rR   rS   r   s     r   
childItemszTreeWidgetItem.childItems'  s*    ',T__->'?@!

1@@@r   c                 n    t         j                  j                  | |       t        j	                  |       y rK   )r   r   addChildr   r{   r   rS   s     r   r   zTreeWidgetItem.addChild*  s&    !!**47))%0r   c                 |    t         j                  j                  | |       |D ]  }t        j	                  |        y rK   r   r   addChildrenr   r{   r   childsrS   s      r   r   zTreeWidgetItem.addChildren.  s5    !!--dF; 	5E--e4	5r   c                 p    t         j                  j                  | ||       t        j	                  |       y rK   )r   r   r=   r   r{   r   rB   rS   s      r   r=   zTreeWidgetItem.insertChild3  s(    !!--dE5A))%0r   c                 ~    t         j                  j                  | ||       |D ]  }t        j	                  |        y rK   r   r   rB   r   rS   s       r   insertChildrenzTreeWidgetItem.insertChildren7  s7    !!--dE6B 	5E--e4	5r   c                 n    t         j                  j                  | |       t        j	                  |       y rK   )r   r   r<   r   r{   r   s     r   r<   zTreeWidgetItem.removeChild<  s&    !!--dE:))%0r   c                 p    t         j                  j                  | |      }t        j	                  |       |S rK   )r   r   	takeChildr   r{   r   s      r   r   zTreeWidgetItem.takeChild@  s-    ))33D%@))%0r   c                 |    t         j                  j                  |       }|D ]  }t        j	                  |        |S rK   )r   r   takeChildrenr   r{   r   s      r   r   zTreeWidgetItem.takeChildrenE  s:    **77= 	5E--e4	5r   c                 Z   | j                  |      }| j                  |      }t        j                  j	                  | |||       | j                         }|y |t        j                  j                  j                  k(  r1|| j                  |      k7  r|j                  j                  | |       y |t        j                  j                  j                  t        j                  j                  j                  fv r2|| j                  |      k7  r|j                  j                  | |       y y y rK   )r   textr   r   setDatar   r   ru   ItemDataRoleCheckStateRoler   rA   DisplayRoleEditRoler   )r   r   rolevalue
checkstater   
treewidgets          r   r   zTreeWidgetItem.setDataK  s     __V,
yy !!))$eD__&
FII**999jDOO\bLc>c//44T6Bvyy--99699;Q;Q;Z;Z[[`dhlhqhqrxhy`y))..tV< az[r   c                      y)zlCalled when this item is clicked on.
        
        Override this method to react to user clicks.
        NrI   r   s     r   r   zTreeWidgetItem.itemClickedZ  s    r   N)r   r   r   r   r
   r   r   rX   rM   r   r   rz   r   r   r   r=   r   r<   r   r   r   r   rI   r   r   r   r      se    pD95,	DA15
15
1
=r   c                   F    e 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   zWrapper around a TreeWidget's invisible root item that calls
    TreeWidget.informTreeWidgetChange when child items are added/removed.
    c                     || _         y rK   )
_real_itemr~   s     r   r
   zInvisibleRootItem.__init__e  s	    r   c                 d    | j                   j                  |       t        j                  |       y rK   )r   r   r   r{   r   s     r   r   zInvisibleRootItem.addChildh  s"      '))%0r   c                 r    | j                   j                  |       |D ]  }t        j                  |        y rK   r   r   r   r{   r   s      r   r   zInvisibleRootItem.addChildrenl  s1    ##F+ 	5E--e4	5r   c                 f    | j                   j                  ||       t        j                  |       y rK   )r   r=   r   r{   r   s      r   r=   zInvisibleRootItem.insertChildq  s$    ##E51))%0r   c                 t    | j                   j                  ||       |D ]  }t        j                  |        y rK   r   r   s       r   r   z InvisibleRootItem.insertChildrenu  s3    ##E62 	5E--e4	5r   c                 d    | j                   j                  |       t        j                  |       y rK   )r   r<   r   r{   r   s     r   r<   zInvisibleRootItem.removeChildz  s"    ##E*))%0r   c                 f    | j                   j                  |      }t        j                  |       |S rK   )r   r   r   r{   r   s      r   r   zInvisibleRootItem.takeChild~  s)    ))%0))%0r   c                 r    | j                   j                         }|D ]  }t        j                  |        |S rK   )r   r   r   r{   r   s      r   r   zInvisibleRootItem.takeChildren  s6    --/ 	5E--e4	5r   c                 .    t        | j                  |      S rK   )getattrr   )r   attrs     r   __getattr__zInvisibleRootItem.__getattr__  s    t--r   N)r   r   r   r   r
   r   r   r=   r   r<   r   r   r   rI   r   r   r   r   a  s4    15
15
1
.r   r   N)
ru   r   r   __all__r	   r   r   r   r   r   rI   r   r   <module>r      sI    ")
*f"&& f"RoY.. od). ).r   