
    ey                     h   g d Z ddlZddl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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dlmZ ddlmZ d Z G d de      Z G d de      Z G d dej>                        Z  G d dejB                        Z" G d de      Z#y))	FlowchartFlowchartGraphicsItemFlowchartNode    N)OrderedDict)ndarray   )DataTreeWidget
FileDialog)
configfile)dockarea)	functions)printExc)GraphicsObject)QtCore	QtWidgets   )FlowchartCtrlTemplate_generic)FlowchartGraphicsView)LIBRARY)Node)Terminalc           	      |    t        | j                         D cg c]  \  }}t        |      |f c}}      S c c}}w N)dictitemsstr)dkvs      ?/usr/lib/python3/dist-packages/pyqtgraph/flowchart/Flowchart.pystrDictr!      s-    3A#a&!3443s   8
c                      e Zd Z ej                  e      Z ej                  e      Z ej                         Z ej                         Z	 ej                  eee      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#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%dZ&d#dZ'd&dZ(d  Z)d! Z*y)'r   Nc                    |xs t         | _        |d}|i }|| _        t        j                  | |dd       d| _        i | _        d| _        d | _        d | _	        d| _
        | j                          t        ddd      | _        t        ddd	      | _        | j                  | j                  dd
dg       | j                  | j                  dddg       | j                  j                  j!                  | j"                         | j                  j$                  j!                  | j&                         | j                  j$                  j!                  | j&                         | j                  j(                  j!                  | j*                         | j                  j(                  j!                  | j*                         | j                  j,                  j!                  | j.                         | j                  j,                  j!                  | j.                         | j0                  j3                  d       |j5                         D ]  \  }} | j6                  |fi |  y )Nr   T)allowAddInputallowAddOutputF
   Input)allowRemover%   Output)r(   r$   ijr   i,  g{Gz?)padding)r   libraryfilePathr   __init__inputWasSet_nodesnextZVal_widget_scene
processingwidget	inputNode
outputNodeaddNodesigOutputChangedconnectoutputChangedsigTerminalRenamedinternalTerminalRenamedsigTerminalRemovedinternalTerminalRemovedsigTerminalAddedinternalTerminalAddedviewBox	autoRanger   addTerminal)self	terminalsnamer,   r+   optss         r    r-   zFlowchart.__init__&   s   )'<DI dDTJ ! g5NxU$OT^^WtQi8T__ha9((001C1CD**2243O3OP))11$2N2NO**2243O3OP))11$2N2NO((001K1KL''//0J0JK.#//+ 	+JD$DT*T*	+    c                 b    || _         | j                         j                  j                          y r   )r+   r4   chartWidget	buildMenu)rD   libs     r    
setLibraryzFlowchart.setLibraryM   s!    !!++-rH   c                 J    d| _          | j                  j                  di | y)zSet the input values of the flowchart. This will automatically propagate
        the new values throughout the flowchart, (possibly) causing the output to change.
        TN )r.   r5   	setOutputrD   argss     r    setInputzFlowchart.setInputQ   s#         (4(rH   c                     | j                   j                         }| j                         j                  |        | j                  di | y )NrO   )r6   inputValuesr4   r:   rP   )rD   valss     r    r:   zFlowchart.outputChanged[   s9    **,##D)rH   c                 6    | j                   j                         S )zIReturn a dict of the values on the Flowchart's output terminals.
        )r6   rU   rD   s    r    outputzFlowchart.outputb   s     **,,rH   c                     | j                   S r   )r/   rX   s    r    nodeszFlowchart.nodesg       {{rH   c                 F   t        j                  | |fi |}|j                         }|d   dk(  rd|d<   d|d<   | j                  j                  j                  | j                         	  | j                  j                  |fi | | j                  j                  j                  | j                         |S d|d<   | j                  j                  j                  | j                         	  | j                  j                  |fi | | j                  j                  j                  | j                         |S # | j                  j                  j                  | j                         w xY w# | j                  j                  j                  | j                         w xY w)NioinoutFmulti)	r   rC   rF   r5   r?   
disconnectr@   r9   r6   )rD   rF   rG   terms       r    rC   zFlowchart.addTerminalj   sR   d3d3yy{:DJ!DMNN++66t7Q7QRT***4848//778R8RS  DJOO,,778R8RSU+++D9D900889S9ST //778R8RS 00889S9STs   *D; -E/ ;1E,/1F c                     | |   }| j                  |      }t        j                  | |       |j                         j                  |j	                                y r   )internalTerminalr   removeTerminalnoderF   )rD   rF   rc   inTerms       r    rf   zFlowchart.removeTerminal   sE    Dz&&t,D$'$$V[[]3rH   c                 H    | |   j                  |j                                y r   )renamerF   )rD   rc   oldNames      r    r<   z!Flowchart.internalTerminalRenamed   s    WTYY[)rH   c           	          |j                   dk(  rd}nd}t        j                  | |j                         ||j	                         |j                         |j                                y )Nr_   r`   )r^   	renamable	removable	multiable)_ior   rC   rF   isRenamableisRemovableisMultiable)rD   rg   rc   r^   s       r    r@   zFlowchart.internalTerminalAdded   sb    88tBBtyy{rT=M=M=O[_[k[k[my}  zJ  zJ  zL  	MrH   c                 l    	 t        j                  | |j                                y # t        $ r Y y w xY wr   )r   rf   rF   KeyError)rD   rg   rc   s      r    r>   z!Flowchart.internalTerminalRemoved   s/    	diik2 		s   $' 	33c                     |j                         }t        j                  | | |   |       | j                  | j                  fD ]%  }||j
                  v s||   j                  |       ' y r   )rF   r   terminalRenamedr5   r6   rE   rj   )rD   rc   rk   newNamens        r    rw   zFlowchart.terminalRenamed   s_    ))+ 	T4=':..$//2 	+A!++%'
!!'*	+rH   c                     |d}	 d||fz  }|| j                   vrn|dz  } | j                  j                  |      |      }| j                  |||       |S )z8Create a new Node and add it to this flowchart.
        r   z%s.%dr   )r/   r+   getNodeTyper7   )rD   nodeTyperF   posry   rg   s         r    
createNodezFlowchart.createNode   sn     <A(A.t{{*Q	  2t||''1$7T4%rH   c                 ,   |ddg}t        |      t        j                  t        j                  fv r |j	                         |j                         g}|j                         }|j                  | j                  dz         | xj                  dz  c_        | j                  j                  |        |j                  |  || j                  |<   || j                  ur-|| j                  ur| j                         j!                  |       |j"                  j%                  | j&                         |j(                  j%                  | j*                         |j,                  j%                  | j.                         | j0                  j3                  | d|       y)zXAdd an existing Node to this flowchart.
        
        See also: createNode()
        Nr   r   r   add)typer   QPointQPointFxygraphicsItem	setZValuer0   rA   addItemmoveByr/   r5   r6   r4   r7   	sigClosedr9   
nodeClosed
sigRenamednodeRenamedr8   nodeOutputChangedsigChartChangedemit)rD   rg   rF   r}   items        r    r7   zFlowchart.addNode   s*   
 ;a&C977557CEEG$C  "t}}Q'T"S Dt~~%$doo*EKKM!!$'t/ 0 01%%d&<&<=!!$t4rH   c                 $    |j                          y)z+Remove a Node from this flowchart.
        N)close)rD   rg   s     r    
removeNodezFlowchart.removeNode   s     	

rH   c                 v   | j                   |j                         = | j                         j                  |       d| j                  fd| j
                  fd| j                  ffD ]!  \  }}	 t        ||      j                  |       # | j                  j                  | d|       y # t        t        f$ r Y Sw xY w)Nr   r   r8   remove)r/   rF   r4   r   r   r   r   getattrrb   	TypeErrorRuntimeErrorr   r   )rD   rg   signalslots       r    r   zFlowchart.nodeClosed   s    KK		$  &)4??;*D,<,<=0$2H2HIK 	LFDf%006		 	!!$$7 |, s   +B&&B87B8c                 
   | j                   |= || j                   |j                         <   || j                  ur.|| j                  ur | j	                         j                  ||       | j                  j                  | d|       y )Nrj   )r/   rF   r5   r6   r4   r   r   r   rD   rg   rk   s      r    r   zFlowchart.nodeRenamed   sg    KK #'DIIK t~~%$doo*EKKM%%dG4!!$$7rH   c                      y r   rO   rX   s    r    arrangeNodeszFlowchart.arrangeNodes       rH   c                     |j                         | u rJ|j                         r| j                  |j                            S | j                  |j                            S |S )zXIf the terminal belongs to the external Node, return the corresponding internal terminal)rg   isInputr5   rF   r6   )rD   rc   s     r    re   zFlowchart.internalTerminal   sH    99;$||~~~diik22tyy{33KrH   c                 j    | j                  |      }| j                  |      }|j                  |       y)z5Connect two terminals together within this flowchart.N)re   	connectTo)rD   term1term2s      r    connectTerminalszFlowchart.connectTerminals   s.    %%e,%%e,rH   c           
         i }| j                         }| j                  j                         j                         D ]  \  }}||v s||   ||<    i }|D ]j  \  }}|dk(  rN|}	|	| j                  u rt	        |	j                         j                               }
t	        |	j                         j                               }i }|D ]  }|j                         }t        |      dk(  r"|j                         r5t        |D cg c]  }||v s|||   f c}      ||j                         <   g||d      ||j                         <    |	| j                  u r|}	 |	j                         r|	j                  |      }n |	j                  dddi|}|
D ]  }	 ||j                            ||<    [|dk(  sb||v sh||= m |S c c}w #  t!        dt#        |	      dt#        |              xY w# t$        $ r Y lw xY w)	z
        Process data through the flowchart, returning the output.
        
        Keyword arguments must be the names of input terminals. 
        The return value is a dict with one key per output terminal.
        
        pr   displayFzError processing node z. Args are: r   rO   )processOrderr5   outputsr   listvaluesinputsinputTerminalslenisMultiValuer   rF   r6   
isBypassedprocessBypassedprocessprintr   ru   )rD   rR   dataorderry   tretcargrg   outsinsinpr   iresultr`   s                    r    r   zFlowchart.process   s    
 !!# NN**,224 	"DAq Dyq'Q		"   -	"FAsCx4>>) DLLN11344;;=//12  ;C //1F6{a' '')+/v0[!QRVZQZ!T!W0[+\SXXZ(+/q	?SXXZ(; 4??*C??,%)%9%9$%?F%1T\\%H%%H4%HF  $ !!(.sxxz(:DI	! c$;S	[-	"^ 
7 1\#d)UXY]U^_`  ( ! !s*   ?	G		G6G	G2	&G/2	G>=G>c                    i }i }| j                   j                         D ]N  \  }}|j                         ||<   |j                         j	                         D ]  }|j                         ||<    P t        j                  |      }|D cg c]  }d|f }}g }	|j                         D ]O  \  }}
d}d}|
D ](  }|| u rd} n 	 |j                  |      }|||kD  s%|}|}* |:|	j                  |dz   |f       Q |	j                  d d       |	D ]  \  }}|j                  |d|f        |S c c}w # t        $ r Y w xY w)	a  Return the order of operations required to process this chart.
        The order returned should look like [('p', node1), ('p', node2), ('d', terminal1), ...] 
        where each tuple specifies either (p)rocess this node or (d)elete the result from this terminal
        r   r   Nr   c                     | d   S Nr   rO   as    r    <lambda>z(Flowchart.processOrder.<locals>.<lambda>e  s
    ! rH   T)keyreverser   )r/   r   dependentNodesr   r   fntoposortindex
ValueErrorappendsortinsert)rD   depstdepsrF   rg   r   r   ry   opsdelsr[   lastIndlastNodeindr   s                  r    r   zFlowchart.processOrder<  s|    ++++- 	.JD$,,.DJ\\^**, .++-a.	. D! "''AQx''  	,HAuGH "9"G!#kk!n #sW} H!G" "WQYN+!	," 			nd	3 	$DAqJJq3(#	$
1 ( & ! !s   	D. D33	D?>D?c                    | j                   ryd| _         	 i }| j                  j                         D ]O  \  }}g ||<   |j                         j	                         D ]$  }||   j                  |j                                & Q t        j                  ||g      }|j                          t        |j                         j	                               }|dd D ]  }d}t        |j                         j	                               D ]M  }	t        |	j                         j                               }|D ]  }
|
|v s|dz  }|	j                  |
d       ! O |s|j!                          |t        |j                         j	                               z  } 	 d| _         | j"                  rd| _        y| j$                  j'                          y# d| _         | j"                  rd| _        w | j$                  j'                          w xY w)zTriggered when a node's output values have changed. (NOT called during process())
        Propagates new data forward through network.NT)r[   r   F)r   )r3   r/   r   r   r   extendr   r   r   r   setr   r   connectionskeysinputChangedupdater.   sigStateChangedr   )rD   	startNoder   rF   rg   r   r   termsr   rc   r   s              r    r   zFlowchart.nodeOutputChangedk  s   
 ??%	,D"kk//1 :
dT
..0 :AJ%%a&6&6&89:: KKYK8EMMO 	))+2245E ab	 : !5!5!78 @D 0 0 2 7 7 9:D! @:"dNF --a-?	@@ KKMS!6!6!899E:" $DO#( $$))+	 $DO#( $$))+s   D!G
 8G
 <G
 
7Hc                     | j                   S )a  Return the graphicsItem that displays the internal nodes and
        connections of this flowchart.
        
        Note that the similar method `graphicsItem()` is inherited from Node
        and returns the *external* graphical representation of this flowchart.)rA   rX   s    r    chartGraphicsItemzFlowchart.chartGraphicsItem  s     ||rH   c                     | j                   Nt        |       | _         | j                   j                         | _        | j                   j                         | _        | j                   S )zReturn the control widget for this flowchart.
        
        This widget provides GUI access to the parameters for each node and a
        graphical representation of the flowchart.
        )r1   FlowchartCtrlWidgetscenerA   rX   s    r    r4   zFlowchart.widget  sL     <<.t4DL++-DJ<<//1DL||rH   c                     t               }| j                  j                         D ]O  }|j                         }|j                         D ]*  }|j	                         D ]  }|j                  ||f        , Q |S r   )r   r/   r   r   r   r   )rD   connry   r   r   r   s         r    listConnectionszFlowchart.listConnections  sq    u##% 	%AIIKE\\^ % %AHHaV$%%	%
 rH   c                    t        j                  |       }g |d<   g |d<   | j                  j                         D ]  \  }}t	        |      }t        |d      s|j                  }|j                         j                         }|||j                         |j                         f|j                         d}|d   j                  |        | j                         }|D ]q  \  }	}
|d   j                  |	j                         j                         |	j                         |
j                         j                         |
j                         f       s | j                  j                         |d<   | j                   j                         |d<   |S )z`Return a serializable data structure representing the current state of this flowchart. 
        r[   connectsnodeName)classrF   r}   stater5   r6   )r   	saveStater/   r   r   hasattrr   r   r}   r   r   r   r   rg   rF   r5   r6   )rD   r   rF   rg   clsclsNamer}   nsr   r   bs              r    r   zFlowchart.saveState  sQ    t$gj++++- 	*JD$t*CsJ',,'')--/&ceegsuuw=OZ^ZhZhZjkg%%b)	* ##% 	]DAq*$$affhmmoqvvxRSRXRXRZ%[\	] "^^557k"oo779lrH   c                    | j                  d       	 |r| j                          t        j                  | |       |d   }|j	                  d        |D ]f  }|d   | j
                  v r%| j
                  |d      j                  |d          9	 | j                  |d   |d         }|j                  |d          h | j                  j                  |j                  d
i              | j                  j                  |j                  di              |d   D ]:  \  }}}}		 | j                  | j
                  |   |   | j
                  |   |	          < 	 | j                  d       | j                          | j                  j!                          | j"                  j!                          y#  t        d	|d   z         Y nxY w#  t        | j
                  |   j                         t        | j
                  |   j                         t        d|d|d|d|	d	       Y xY w# | j                  d       w xY w)zSRestore the state of this flowchart from a previous call to `saveState()`.
        Tr[   c                     | d   d   S )Nr}   r   rO   r   s    r    r   z(Flowchart.restoreState.<locals>.<lambda>  s    QuXa[ rH   )r   rF   r   r   )rF   z+Error creating node %s: (continuing anyway)r5   r6   r   zError connecting terminals .z - :FN)blockSignalsclearr   restoreStater   r/   r~   r   r5   getr6   r   r   rE   r:   sigChartLoadedr   r   )
rD   r   r   r[   ry   rg   n1t1n2t2s
             r    r   zFlowchart.restoreState  s    	$	%

dE*'NEJJ0J1 XV9+KK&	*77'
CX??1W:AfI?FD%%aj1X NN''		+r(BCOO((<)DE #(
"3 ]BB]))$++b/"*=t{{2r?RS] e$  "!!#)XJQvYVW]$++b/334$++b/334BPRTVXZ[\ e$s>   A;H* -F-<A%H* "2GH* -G H* AH'$H* *H=c                    |o|| j                   }|d}t        dd|d      | _        | j                  j                          | j                  j                  j                  | j                         yt        j                  |      }| j                  |d       | j                  j                          | j                  j                  |       y)z*Load a flowchart (``*.fc``) file.
        Nr   zLoad Flowchart..Flowchart (*.fc)T)r   )r,   r
   
fileDialogshowfileSelectedr9   loadFiler   readConfigFiler   rA   rB   sigFileLoadedr   )rD   fileNamestartDirr   s       r    r  zFlowchart.loadFile  s     ==(/A8M_`DOOO  "OO((00?))(3%t, )rH   c                    ||| j                   }|d}t        dd|d      | _        | j                  j                  d       | j                  j	                  t
        j                  j                  j                         | j                  j                          | j                  j                  j                  | j                         yt        j                  | j                         |       | j                   j#                  |       y)z*Save this flowchart to a .fc file
        Nr   zSave Flowchart..r  fc)r,   r
   r  setDefaultSuffixsetAcceptModer   QFileDialog
AcceptMode
AcceptSaver  r  r9   saveFiler   writeConfigFiler   sigFileSavedr   )rD   r  r  suggestedFileNames       r    r  zFlowchart.saveFile  s     ==(/A8M_`DOOO,,T2OO)))*?*?*J*J*U*UVOO  "OO((00?""4>>#3X>x(rH   c                     t        | j                  j                               D ]/  }|| j                  u s|| j                  u r |j                          1 | j                         j                          y)zURemove all nodes from this flowchart except the original input/output nodes.
        N)r   r/   r   r5   r6   r   r4   r   )rD   ry   s     r    r   zFlowchart.clear  s\     dkk((*+ 	ADNN"a4??&:GGI	
 	rH   c                     t        j                  |        | j                  j                          | j                  j                          y r   )r   clearTerminalsr5   r6   rX   s    r    r  zFlowchart.clearTerminals#  s0    D!%%'&&(rH   )NNNN)NNr   )F)NNzflowchart.fc)+__name__
__module____qualname__r   Signalobjectr
  r  r   r   r   r-   rM   rS   r:   rY   r[   rC   rf   r<   r@   r>   rw   r~   r7   r   r   r   r   re   r   r   r   r   r   r4   r   r   r   r  r  r   r  rO   rH   r    r   r      s    !FMM&)M 6==(L #V]]_N#fmmoO#fmmFFF;O%+N.)-
,4*M+5,

88IV,^-,^
0%$N*$)")rH   r   c                   $    e Zd Zd Zd Zd Zd Zy)r   c                 \    t        j                  |        || _        | j                          y r   )r   r-   chartupdateTerminals)rD   r"  s     r    r-   zFlowchartGraphicsItem.__init__+  s#    %
rH   c                    i | _         | j                         }| j                  j                         }|j	                         t        |      dz   z  }|}|j                         D ]Z  \  }}|j                         }|| j                   |<   |j                  |        |j                  |j                         |       ||z  }\ | j                  j                         }|j	                         t        |      dz   z  }|}|j                         D ]L  \  }}|j                         }|| j                   |<   |j                  |        |j                  d|       ||z  }N y )Nr   r   )rE   boundingRectr"  r   heightr   r   r   setParentItem	setAnchorwidthr   )	rD   boundsr   dyr   ry   r   r   r`   s	            r    r#  z%FlowchartGraphicsItem.updateTerminals0  s-   ""$jj!]]_C
+IIK 	DAq>>#D $DNN1t$NN6<<>1-GA	 jj  "]]_C
+IIK 	DAq>>#D $DNN1t$NN1a GA	rH   c                 *    t        j                         S r   )r   QRectFrX   s    r    r%  z"FlowchartGraphicsItem.boundingRectF  s    }}rH   c                      y r   rO   )rD   r   rR   s      r    paintzFlowchartGraphicsItem.paintJ  s    rH   N)r  r  r  r-   r#  r%  r/  rO   rH   r    r   r   )  s    
,rH   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d Zd Zy)r   zThe widget that contains the list of all the nodes in a flowchart and their controls, as well as buttons for loading/saving flowcharts.c                    i | _         d | _        t        j                  j	                  |        || _        t        j                         | _        | j                  j                  |        | j                  j                  j                  d       | j                  j                  j                  dd       | j                  j                  j                  | j                  j                  j                  j                         | j                  j                  j!                  t"        j$                  j&                  j(                         t+        ||       | _        t        j.                         | _        | j0                  j3                  d       | j0                  j5                  | j,                         | j0                  j7                  dd       | j                  j                  j9                         }|j;                  d|j<                  j>                         | j                  j                  j@                  jC                  | j@                         | j                  jD                  jF                  jC                  | jH                         | j                  jJ                  jF                  jC                  | jL                         | j                  jN                  jF                  jC                  | jP                         | j                  jR                  jT                  jC                  | jV                         | j
                  jX                  jC                  | jZ                         | j                  j\                  jF                  jC                  | j^                         | j
                  j`                  jC                  | jb                         y )Nr   r      r     i   r   )2r   currentFileNamer   QWidgetr-   r"  FlowchartCtrlTemplateUi_FormuisetupUictrlListsetColumnCountsetColumnWidthsetVerticalScrollMode
ScrollModeScrollPerPixelsetHorizontalScrollBarPolicyr   QtScrollBarPolicyScrollBarAlwaysOffFlowchartWidgetrJ   QMainWindowcwWinsetWindowTitlesetCentralWidgetresizeheadersetSectionResizeMode
ResizeModeStretchitemChangedr9   loadBtnclickedloadClickedsaveBtnsaveClicked	saveAsBtnsaveAsClickedshowChartBtntoggledchartToggledr
  setCurrentFile	reloadBtnreloadClickedr  	fileSaved)rD   r"  hs      r    r-   zFlowchartCtrlWidget.__init__S  sq   
#""4(
'//1''*''2...tww/?/?/J/J/Y/YZ55fii6O6O6b6bc*5$7**,


!!+.

##D$4$45

$s#GG##%	q!,,"6"67$$,,T-=-=>''(8(89''(8(89!!))$*<*<=$$,,T->->?

  (()<)<=!!))$*<*<=

''7rH   c                 r    |r| j                   j                          y | j                   j                          y r   )rF  r  hide)rD   r   s     r    rX  z FlowchartCtrlWidget.chartToggledz  s!    JJOOJJOOrH   c                     	 | j                   j                          | j                  j                  j	                  d       y #  | j                  j                  j	                  d        xY w)Nz	Reloaded.zError.)rJ   reloadLibraryr8  rZ  successrX   s    r    r[  z!FlowchartCtrlWidget.reloadClicked  sS    	**,GG%%k2	GG%%h/s   ?A (A*c                 8    | j                   j                          y r   )r"  r  rX   s    r    rQ  zFlowchartCtrlWidget.loadClicked  s    

rH   c                 p    | j                  |       | j                  j                  j                  d       y )NzSaved.)rY  r8  rR  rb  rD   r  s     r    r\  zFlowchartCtrlWidget.fileSaved  s&    H%)rH   c                     | j                   | j                          y 	 | j                  j                  | j                          y #  | j                  j
                  j                  d        xY w)NError)r4  rU  r"  r  r8  rR  failurerX   s    r    rS  zFlowchartCtrlWidget.saveClicked  sW    ' 

##D$8$89''0s   %A (A-c                     	 | j                   | j                  j                          y | j                  j                  | j                          y #  | j                  j                  j                  d        xY w)N)r  rg  )r4  r"  r  r8  rR  rh  rX   s    r    rU  z!FlowchartCtrlWidget.saveAsClicked  s^    	##+

##%

##d6J6J#K	GGOO##G,s   &A &A (A8c                 (   || _         |&| j                  j                  j                  d       nR| j                  j                  j                  dt        j
                  j                  | j                         d   z         | j                  d        y )Nz<b>[ new ]</b>z	<b>%s</b>r   )r4  r8  fileNameLabelsetTextospathsplitresizeEventre  s     r    rY  z"FlowchartCtrlWidget.setCurrentFile  sm    'GG!!))*:;GG!!))+dFZFZ8[\]8^*^_rH   c                      y r   rO   rQ   s     r    rN  zFlowchartCtrlWidget.itemChanged  r   rH   c                 6    | j                   j                         S r   )rJ   r   rX   s    r    r   zFlowchartCtrlWidget.scene  s    %%''rH   c                 6    | j                   j                         S r   )rJ   rA   rX   s    r    rA   zFlowchartCtrlWidget.viewBox  s    ''))rH   c                 ^    | j                   |   j                  d|j                                y r   )r   rl  rF   r   s      r    r   zFlowchartCtrlWidget.nodeRenamed  s!    

4  DIIK0rH   c                    |j                         }t        j                  |j                         ddg      }| j                  j
                  j                  |       t        j                  d      }|j                  d       |j                  d       ||_
        | j                  j
                  j                  |d|       ||_        ||_        |j                  |j                                |j                   j#                  | j$                         |Lt        j                         }|j'                  |       | j                  j
                  j                  |d|       || j(                  |<   y )N XTr2  r   r   )
ctrlWidgetr   QTreeWidgetItemrF   r8  r:  addTopLevelItemQPushButtonsetCheckablesetFixedWidth	bypassBtnsetItemWidgetrg   bypassButton
setCheckedr   rP  r9   bypassClickedaddChildr   )rD   rg   ctrlr   bypitem2s         r    r7   zFlowchartCtrlWidget.addNode  s     (($))+r2)>?((.##C("&&tQ4t()D../--/EMM% GG**5!T:

4rH   c                    || j                   v re| j                   |   }	 |j                  j                  j                  | j                         | j                  j                  j                  |       y y # t
        t        f$ r Y 8w xY wr   )
r   r~  rP  rb   r  r   r   r8  r:  removeTopLevelItemrD   rg   r   s      r    r   zFlowchartCtrlWidget.removeNode  sw    4::::d#D&&11$2D2DE GG//5 
 |, s   /A5 5BBc                     t         j                  j                  |       }|j                  j	                  |j                                y r   )r   QObjectsenderrg   bypass	isChecked)rD   btns     r    r  z!FlowchartCtrlWidget.bypassClicked  s,    nn##D)(rH   c                     | j                   S r   )rJ   rX   s    r    rJ   zFlowchartCtrlWidget.chartWidget  s    rH   c                      y r   rO   )rD   r   s     r    r:   z!FlowchartCtrlWidget.outputChanged  r   rH   c                 8    | j                   j                          y r   )rJ   r   rX   s    r    r   zFlowchartCtrlWidget.clear  s     rH   c                 l    | j                   |   }| j                  j                  j                  |       y r   )r   r8  r:  setCurrentItemr  s      r    selectzFlowchartCtrlWidget.select  s(    zz$''-rH   c                 h    | j                   j                  j                         j                          y r   )r8  r:  selectionModelclearSelectionrX   s    r    r  z"FlowchartCtrlWidget.clearSelection  s!    '')88:rH   N)r  r  r  __doc__r-   rX  r[  rQ  r\  rS  rU  rY  rN  r   rA   r   r7   r   r  rJ   r:   r   r  r  rO   rH   r    r   r   P  sm     R8N*	(*1 .6) !.;rH   r   c                   T    e Zd ZdZd Zd ZddZd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zy)rD  z?Includes the actual graphical flowchart and debugging interfacec                    t         j                  j                  |        || _        || _        d | _        t        j                  |       | _        t        j                  dd      | _	        | j                  j                  | j                         | j                  j                          | j                  | j                         t        j                         | _        | j                  j!                  d       t        j                  dd      | _        | j"                  j                  | j                         | j                  | j"                  d       t        j$                         | _        t        j(                         | _        | j&                  j-                  | j*                         t        j.                         | _        t        j.                         | _        | j0                  j5                  d       t7               | _        | j*                  j                  | j0                         | j*                  j                  | j8                         t        j                  dd	      | _        | j:                  j                  | j&                         | j                  | j:                  d       | j                  j=                         | _        | j                  jA                         | _!        | jE                          | j>                  jF                  jI                  | jF                         | j>                  jJ                  jI                  | jL                         y )
Nview)r3  iX  )sizeTz
Hover Info)r3  r2  bottomzSelected Node)r3     )'r   DockArear-   r"  r  	hoverItemr   r  DockviewDock	addWidgethideTitleBaraddDockr   	QTextEdit	hoverTextsetReadOnly	hoverDockr5  selInfoQGridLayoutselInfoLayout	setLayoutQLabelselDescLabelselNameLabelsetWordWrapr	   selectedTreeselDockr   r2   rA   _viewBoxrK   selectionChangedr9   sigMouseHover	hoverOver)rD   r"  r  s      r    r-   zFlowchartWidget.__init__  s=   ""4(
	
 *??E	 f:>		*""$T]]# #,,.""4(!|)D  0T^^X. ((*&224t112%,,.%,,.%%d+*, 	$$T%6%67$$T%6%67}}_:Ft||,T\\8,iioo'		))+
 	 	$$,,T-B-BC!!))$..9rH   c                     | j                   j                  j                  | j                         d | _         g | _        | j
                  j                  j                          | j                          y r   )	nodeMenu	triggeredrb   nodeMenuTriggeredsubMenusr"  r+   reloadrK   rX   s    r    ra  zFlowchartWidget.reloadLibrary(  sN    **4+A+AB

!!#rH   Nc                 J   dfd	t        j                         | _        g | _         | j                  j
                  j                         | j                  | j                  |       | j                  j                  j                  | j                         | j                  S )Nc                    | j                         D ]x  \  }} t        | t              rDt        j                  |      }|j                  |        | |||       |j                  |       Z|j                  |      }||_        ||_	        z y Nr}   )
r   
isinstancer   r   QMenuaddMenur   	addActionr|   r}   )rg   rootMenur  r}   sectionmenuactbuildSubMenus          r    r  z/FlowchartWidget.buildMenu.<locals>.buildSubMenu1  sz    !% 	"dK0$??73D$$T* tX3?OOD)",,W5C#*CL!CG	"rH   r  r   )
r   r  r  r  r"  r+   getNodeTreer  r9   r  )rD   r}   r  s     @r    rK   zFlowchartWidget.buildMenu0  sq    
	" ")TZZ''335t}}dmmY\]''(>(>?}}rH   c                     || _         y r   )menuPos)rD   r}   s     r    menuPosChangedzFlowchartWidget.menuPosChangedB  s	    rH   c                     | j                  |j                                | j                  j                  |j	                                y r   )rK   scenePosr  popup	screenPos)rD   evs     r    showViewMenuzFlowchartWidget.showViewMenuE  s.     	r{{}%BLLN+rH   c                     | j                   S r   )r2   rX   s    r    r   zFlowchartWidget.sceneP  r\   rH   c                     | j                   S r   )r  rX   s    r    rA   zFlowchartWidget.viewBoxS  s    }}rH   c                     |j                   }|j                  |j                  }n| j                  }| j                         j	                  |      }| j
                  j                  ||       y r  )r|   r}   r  rA   mapSceneToViewr"  r~   )rD   actionr|   r}   s       r    r  z!FlowchartWidget.nodeMenuTriggeredV  sT    ??::!**C,,Clln++C0

hC0rH   c                 B   | j                   j                         }t        |      dk(  rd }nV|d   }t        |d      rBt	        |j
                  t              r'|j
                  }|| j                  j                  v r| j                  j                  |       n| j                  j                          |j                         |j                         d}| j                  j                  |j                                t        |d      r@| j                   j                  d|j"                  d|j$                  j&                         n| j                   j                  d       |j(                  |j(                  |d<   nd }| j*                  j-                  |d	
       y )Nr   rg   )r   r   r   z<b>z</b>: rv  	exceptionT)hideRoot)r2   selectedItemsr   r   r  rg   r   r  r   r  r  outputValuesrU   r  rl  rF   r  r   	__class__r  r  r  setData)rD   r   r   r   ry   s        r    r  z FlowchartWidget.selectionChangeda  s+   ))+u:?D8DtV$DIIt)DII		'II$$Q'II,,.#$>>#3q}}O!!))!&&(31j)%%--Q[[M`M`.ab%%--b1;;*()D%!!$!6rH   c                    d }|D ]N  }|| j                   u r y || _         t        |d      s't        |j                  t              sB|j                  } n || j
                  j                  d       y |j                         }t        |t              rDt        |      j                  dt        |j                        dt        |j                        }n!t        |      }t        |      dkD  r|d d dz   }| j
                  j                  |j                         j!                         d|j!                         d|       y )Nrc   rv   i  z...r   z = )r  r   r  rc   r   r  setPlainTextvaluer   r   r  r   shapedtyper   rg   rF   )rD   r   rc   r   vals        r    r  zFlowchartWidget.hoverOver{  s     	Dt~~%!DNtV$DIIx)Hyy	 <NN''+**,C#w'$(I$6$6CIICIIW#hs8c>ds)e+CNN''		8H8H8JDIIKY\(]^rH   c                     | j                   j                  d        | j                  j                  d       | j                  j                  d       | j                  j                  d       y )Nrv  )r  r  r  r  r  rl  r  rX   s    r    r   zFlowchartWidget.clear  sP    !!$'##B'!!"%!!"%rH   r   )r  r  r  r  r-   ra  rK   r  r  r   rA   r  r  r  r   rO   rH   r    rD  rD    s>    I0:l$	,174_2&rH   rD  c                       e Zd Zy)r   N)r  r  r  rO   rH   r    r   r     s    rH   r   )$r-   	importlibrm  collectionsr   numpyr   rv  r	   r
   r   r   r   r   debugr   graphicsItems.GraphicsObjectr   rA  r   r   r   r6  r   r+   r   r   r   r!   r   r   r5  r   r  rD  r   rO   rH   r    <module>r     s   B  	 #  ) ' #   9 " D #   5K) K)\#N #N];)++ ];@i&h'' i&X	D 	rH   