;iytgdZddlZddlZddlmZddlmZddlmZm Z ddlm Z ddlm Z dd lm Z dd lmZdd lmZdd lmZmZd dlmZd dlmZd dlmZd dlmZd dlmZdZGddeZGddeZGddejZ Gdde j!Z"GddeZ#dS)) FlowchartFlowchartGraphicsItem FlowchartNodeN) OrderedDict)ndarray)DataTreeWidget FileDialog) configfile)dockarea) functions)printExc)GraphicsObject)QtCore QtWidgets)FlowchartCtrlTemplate_generic)FlowchartGraphicsView)LIBRARY)Node)TerminalcXtd|DS)Nc6g|]\}}t||fS)str).0kvs QC:\PYTHON\MyICR_Workspace\venv\Lib\site-packages\pyqtgraph/flowchart/Flowchart.py zstrDict..s&333A#a&&!333)dictitems)ds rstrDictr%s' 33333 4 44r!czeZdZejeZejeZejZejZ ejeeeZ d$dZ dZ dZ dZdZdZdZd Zd Zd Zd Zd Zd%dZd&dZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%d'dZ&d%dZ'd(d!Z(d"Z)d#Z*dS))rNc>|pt|_|d}|i}||_tj||ddd|_i|_d|_d|_d|_ d|_ | tddd|_ tddd |_ ||j dd d g||j dd d g|j j|j|j j|j|j j|j|j j|j|j j|j|j j|j|j j|j|jd |D]\}}|j|fi|dS)NrT) allowAddInputallowAddOutputF Input) allowRemover)Output)r,r(ijri,g{Gz?)padding)rlibraryfilePathr__init__ inputWasSet_nodesnextZVal_widget_scene processingwidget inputNode outputNodeaddNodesigOutputChangedconnect outputChangedsigTerminalRenamedinternalTerminalRenamedsigTerminalRemovedinternalTerminalRemovedsigTerminalAddedinternalTerminalAddedviewBox autoRanger# addTerminal)self terminalsnamer0r/optss rr1zFlowchart.__init__&s)' <D  I   dDTJJJJ!     g5NNNxU$OOO T^WtQi888 T_ha999 (001CDDD *2243OPPP )11$2NOOO *2243OPPP )11$2NOOO (001KLLL '//0JKKK ...#//++ + +JD$ D T * *T * * * * + +r!cj||_|jdSN)r/r8 chartWidget buildMenu)rHlibs r setLibraryzFlowchart.setLibraryMs,  !++-----r!c 8d|_|jjdi|dS)zSet the input values of the flowchart. This will automatically propagate the new values throughout the flowchart, (possibly) causing the output to change. TNr)r2r9 setOutputrHargss rsetInputzFlowchart.setInputQs-   ((4(((((r!c|j}|||jdi|dS)Nr)r: inputValuesr8r>rS)rHvalss rr>zFlowchart.outputChanged[sO**,, ##D)))r!c4|jS)zIReturn a dict of the values on the Flowchart's output terminals. )r:rXrHs routputzFlowchart.outputbs**,,,r!c|jSrM)r3r[s rnodeszFlowchart.nodesg {r!c tj||fi|}|}|ddkrd|d<d|d<|jj|j |jj|fi||jj|jn#|jj|jwxYwd|d<|jj|j |jj|fi||jj|jn)#|jj|jwxYw|S)NioinoutFmulti) rrGrJr9rC disconnectrDr=r:)rHrJrKterms rrGzFlowchart.addTerminaljsZd33d33yy{{ :  DJ!DM N + 6 6t7Q R R R T**4884888/778RSSSS/778RSSSSDJ O , 7 78R S S S U++D99D9990889STTTT0889STTTT s#B&C.D&&&E c||}||}tj||||dSrM)internalTerminalrremoveTerminalnoderJ)rHrJrfinTerms rrizFlowchart.removeTerminals[Dz&&t,, D$''' $$V[[]]33333r!c`|||dSrM)renamerJ)rHrfoldNames rr@z!Flowchart.internalTerminalRenameds( W TYY[[)))))r!c |jdkrd}nd}tj||||||dS)Nrbrc)ra renamable removable multiable)_iorrGrJ isRenamable isRemovable isMultiable)rHrjrfras rrDzFlowchart.internalTerminalAddeds 8t  BBB tyy{{rT=M=M=O=O[_[k[k[m[my}zJzJzLzL M M M M M Mr!cx tj||dS#t$rYdSwxYwrM)rrirJKeyError)rHrjrfs rrBz!Flowchart.internalTerminalRemovedsJ   diikk 2 2 2 2 2    DD s '+ 99c|}tj|||||j|jfD]&}||jvr|||'dSrM)rJrterminalRenamedr9r:rIrm)rHrfrnnewNamens rrzzFlowchart.terminalRenamedsr))++ T4=':::.$/2 + +A!+%%' !!'*** + +r!c|d} d||fz}||jvrn|dz }|j||}|||||S)z8Create a new Node and add it to this flowchart. NrTz%s.%dr)r3r/ getNodeTyper;)rHnodeTyperJposr|rjs r createNodezFlowchart.createNodes{ <A (A.t{**Q   2t|''11$77 T4%%% r!c|ddg}t|tjtjfvr(||g}|}||jdz|xjdz c_|j ||j |||j |<||j ur0||jur'|||j|j|j|j|j|j|j|d|dS)zXAdd an existing Node to this flowchart. See also: createNode() Nrrradd)typerQPointQPointFxy graphicsItem setZValuer4rEaddItemmoveByr3r9r:r8r; sigClosedr= nodeClosed sigRenamed nodeRenamedr<nodeOutputChangedsigChartChangedemit)rHrjrJritems rr;zFlowchart.addNodesQ ;a&C 997 7 75577CEEGG$C  "" t}Q'''   T""" S  D t~ % %$do*E*E KKMM ! !$ ' ' ' t///  0111 %%d&<=== !!$t44444r!c.|dS)z+Remove a Node from this flowchart. N)close)rHrjs r removeNodezFlowchart.removeNodes r!cv|j|=||d|jfd|jfd|jffD]@\}} t|||*#ttf$rY=wxYw|j |d|dS)Nrrr<remove) r3rJr8rrrrgetattrre TypeError RuntimeErrorrr)rHrjsignalslots rrzFlowchart.nodeCloseds K $   &&&)4?;*D,<=0$2HIK  LFD f%%006666|,     !!$$77777s"#BBBc|j|=||j|<||jur1||jur(||||j|d|dS)Nrm)r3rJr9r:r8rrrrHrjrns rrzFlowchart.nodeRenamedsx K #' DIIKK t~ % %$do*E*E KKMM % %dG 4 4 4 !!$$77777r!cdSrMrr[s r arrangeNodeszFlowchart.arrangeNodes r!c||urR|r|j|S|j|S|S)zXIf the terminal belongs to the external Node, return the corresponding internal terminal)rjisInputr9rJr:)rHrfs rrhzFlowchart.internalTerminalsT 99;;$  ||~~ 4~diikk22tyy{{33Kr!c||}||}||dS)z5Connect two terminals together within this flowchart.N)rh connectTo)rHterm1term2s rconnectTerminalszFlowchart.connectTerminalss@%%e,,%%e,, r!c ji|}|jD]\}}||vr |||<i}|D]\}}|dkr|}||jurt |} t |} i}| D]} | } t| dkr*| r1tfd| D|| <o| d|| <||j ur|}# | r||} n|jd ddi|} n5#t!dt#|dt#|xYw| D]0} | | |<!#t$$rY-wxYw|dkr|vr|=|S) 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. prc,g|]}|v||fSrr)ridatas rr z%Flowchart.process..s-0[0[0[!QRVZQZQZ!T!WQZQZQZr!displayFzError processing node z . Args are: r$r) processOrderr9outputsr#listvaluesinputsinputTerminalslen isMultiValuer"rJr: isBypassedprocessBypassedprocessprintrrx)rHrUorderr|tretcargrjoutsinsinprresultrcrs @rrzFlowchart.processs !!##N**,,2244 " "DAqDyyq'Q- "- "FAsCxx4>))DLLNN1133444;;==//1122;;C //11F6{{a'' ''));+/0[0[0[0[v0[0[0[+\+\SXXZZ((+/q ?SXXZZ((4?**CC??,,I%)%9%9$%?%?FF%1T\%H%H%%H4%H%HF#d))))UXY]U^U^U^_```#!!!(.sxxzz(:DII'!!! D! !c$;;S  s9F::2G,4H HHci}i}|jD]\\}}|||<|D]}|||<]t j|}d|D}g}|D]e\}} d} d} | D]=} | |urd} n4 || } n#t$rY-wxYw| | | kr| } | } >| | | dz|ff| dd|D]\}}| |d|f|S) aReturn 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 cg|]}d|fS)rr)rr|s rr z*Flowchart.processOrder..Ps'''AQx'''r!rNrc|dSNrras rz(Flowchart.processOrder..es !r!T)keyreverser$) r3r#dependentNodesrrfntoposortindex ValueErrorappendsortinsert)rHdepstdepsrJrjrropsdelsr^lastIndlastNoder|indrs rrzFlowchart.processOrder<s+++-- . .JD$,,..DJ\\^^**,, . .++--a .  D!!(''''  , ,HAuGH " "99"GE!#kk!nn%!!! !#sW}} H!G" WQYN+++ nnd 333 $ $DAq JJq3( # # # # sC C*)C*cx|jrdSd|_ i}|jD]`\}}g||<|D]/}|||0atj||g}| t|}|ddD]}d}t| D]Z} t| }|D]"} | |vr|dz}| | d#[|rJ||t|z} d|_|jr d|_dS|jdS#d|_|jrd|_w|jwxYw)zTriggered when a node's output values have changed. (NOT called during process()) Propagates new data forward through network.NT)r^rF)r)r7r3r#rrextendrrrrsetrr connectionskeys inputChangedupdater2sigStateChangedr) rH startNoderrJrjrrtermsrrfr$s rrzFlowchart.nodeOutputChangedksW ?  F% ,D"k//11 : : dT ..00::AJ%%a&6&6&8&89999:KYK888E MMOOO ))++224455Eabb  : : !5!5!7!788@@D 0 0 2 2 7 7 9 9::D!@@::"dNF --a-??? @ :KKMMMS!6!6!8!8999E :"$DO ,#(   $))+++++ $DO ,#(  $))++++s GH1H9c|jS)aReturn 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.)rEr[s rchartGraphicsItemzFlowchart.chartGraphicsItems |r!c|jPt||_|j|_|j|_|jS)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. )r5FlowchartCtrlWidgetscenerEr[s rr8zFlowchart.widgetsM < .t44DL++--DJ<//11DL|r!c t}|jD][}|}|D]0}|D]}|||f1\|SrM)rr3rrrr)rHconnr|rrrs rlistConnectionszFlowchart.listConnectionssuu##%% % %AIIKKE\\^^ % %%%AHHaV$$$$% % r!ctj|}g|d<g|d<|jD]\}}t |}t |dr|j}|}||| | f|d}|d || }|D]\} } |d | | | | f|j|d<|j|d<|S)z`Return a serializable data structure representing the current state of this flowchart. r^connectsnodeName)classrJrstater9r:)r saveStater3r#rhasattrrrrrrrrrjrJr9r:) rHrrJrjclsclsNamernsrrbs rrzFlowchart.saveStatest$$gj+++-- * *JD$t**CsJ'' *,''))--//&ceeggsuuww=OZ^ZhZhZjZjkkg%%b)))##%% ] ]DAq *  $ $affhhmmooqvvxxRSRXRXRZRZ%[ \ \ \ \!^5577k"o7799l r!Fc |d |r|tj|||d}|d|D]}|d|jvr-|j|d|d> ||d|d}||d~#td |dzYxYw|j| d i|j | d i|d D]\}}}} | |j|||j|| A#t|j|j t|j|j td |d|d|d| d YxYw |dn#|dwxYw||j|jdS)zSRestore the state of this flowchart from a previous call to `saveState()`. Tr^c|ddS)Nrrrrs rrz(Flowchart.restoreState..sQuXa[r!)rrJrr)rJz+Error creating node %s: (continuing anyway)r9r:rzError connecting terminals .z - :FN) blockSignalsclearr restoreStaterr3rrr9getr:rrrIr>sigChartLoadedrr) rHrrr^r|rjn1t1n2t2s rrzFlowchart.restoreStates $ %   dE * * *'NE JJ00J 1 1 1 X XV9 ++K& *77' CCCX??1W:AfI?FFD%%aj1111XJQvYVWWWWW N ' ' +r(B(B C C C O ( (<)D)D E E E#( "3 ] ]BB]))$+b/"*=t{2r?RSSSS]$+b/3444$+b/3444HBBBPRPRPRTVTVTVXZXZXZ[\\\\\  ]   e $ $ $ $D  e $ $ $ $    """ !!#####s>B H">C! H!C=;A0H,8F%$H%AHHH4c|c||j}|d}tdd|d|_|j|jj|jdStj|}| |d|j |j |dS)z*Load a flowchart (``*.fc``) file. NrzLoad Flowchart..Flowchart (*.fc)T)r)r0r fileDialogshow fileSelectedr=loadFiler readConfigFilerrErF sigFileLoadedr)rHfileNamestartDirrs rr zFlowchart.loadFiles  =(/A8M_``DO O " " " O ( 0 0 ? ? ? F)(33 %t,,,     )))))r! flowchart.fcc|||j}|d}tdd|d|_|jd|jt jjj|j |jj |j dStj|||j|dS)z*Save this flowchart to a .fc file NrzSave Flowchart..r fc)r0r r setDefaultSuffix setAcceptModer QFileDialog AcceptMode AcceptSaver r r=saveFiler writeConfigFiler sigFileSavedr)rHrrsuggestedFileNames rrzFlowchart.saveFiles  =(/A8M_``DO O , ,T 2 2 2 O ) ))*?*J*U V V V O " " " O ( 0 0 ? ? ? F"4>>#3#3X>>> x(((((r!ct|jD])}||jus ||jur|*|dS)zURemove all nodes from this flowchart except the original input/output nodes. N)rr3rr9r:rr8r)rHr|s rrzFlowchart.clearstdk((**++  ADN""a4?&:&: GGIIII r!ctj||j|jdSrM)rclearTerminalsr9r:r[s rr zFlowchart.clearTerminals#sA D!!! %%''' &&(((((r!)NNNN)NNrM)F)NNr)+__name__ __module__ __qualname__rSignalobjectrrrrrr1rQrVr>r\r^rGrir@rDrBrzrr;rrrrrhrrrrrr8rrrr rrr rr!rrrsp!FM&))M 6=((L#V]__N#fmooO#fmFFF;;O%+%+%+%+N...)))--- ,444***MMM +++    5555, 8 8 8888    IIIV,,,^-,-,-,^   0%$%$%$%$N****$))))")))))r!rc&eZdZdZdZdZdZdS)rcdtj|||_|dSrM)rr1chartupdateTerminals)rHr(s rr1zFlowchartGraphicsItem.__init__+s2%%%  r!ci|_|}|j}|t |dzz }|}|D]e\}}|}||j|<||| | |||z }f|j }|t |dzz }|}|D]S\}}|}||j|<||| d|||z }TdS)Nrr) rI boundingRectr(rheightrr#r setParentItem setAnchorwidthr) rHboundsrdyrr|rrrcs rr)z%FlowchartGraphicsItem.updateTerminals0sf""$$j!! ]]__C + IIKK  DAq>>##D $DN1    t $ $ $ NN6<<>>1 - - - GAAj  "" ]]__C + IIKK  DAq>>##D $DN1    t $ $ $ NN1a GAA   r!c(tjSrM)rQRectFr[s rr+z"FlowchartGraphicsItem.boundingRectFs}r!cdSrMr)rHrrUs rpaintzFlowchartGraphicsItem.paintJs r!N)r!r"r#r1r)r+r5rr!rrr)sP ,     r!rceZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdZdZdZdZdZdS)rzThe widget that contains the list of all the nodes in a flowchart and their controls, as well as buttons for loading/saving flowcharts.ci|_d|_tj|||_t j|_|j ||jj d|jj dd|jj |jj jj|jj t"jjjt+|||_tj|_|jd|j|j|jdd|jj }|d|jj|jj j !|j |jj"j#!|j$|jj%j#!|j&|jj'j#!|j(|jj)j*!|j+|jj,!|j-|jj.j#!|j/|jj0!|j1dS)Nrrri r)2r#currentFileNamerQWidgetr1r(FlowchartCtrlTemplateUi_FormuisetupUictrlListsetColumnCountsetColumnWidthsetVerticalScrollMode ScrollModeScrollPerPixelsetHorizontalScrollBarPolicyrQtScrollBarPolicyScrollBarAlwaysOffFlowchartWidgetrN QMainWindowcwWinsetWindowTitlesetCentralWidgetresizeheadersetSectionResizeMode ResizeModeStretch itemChangedr=loadBtnclicked loadClickedsaveBtn saveClicked saveAsBtn saveAsClicked showChartBtntoggled chartToggledrsetCurrentFile reloadBtn reloadClickedr fileSaved)rHr(hs rr1zFlowchartCtrlWidget.__init__Ss[ #""4((( '/11  ''*** ''2... ..tw/?/J/YZZZ 55fi6O6bccc*5$77*,,  !!+... ##D$4555 $s### G  # # % % q!,"6777 $,,T-=>>> ''(8999 ''(8999 !))$*<=== $,,T->???  (()<=== !))$*<=== ''77777r!cr|r|jdS|jdSrM)rLr hide)rHrs rr^z FlowchartCtrlWidget.chartToggledzs:   JOO      JOO     r!c |j|jjddS#|jjdxYw)Nz Reloaded.zError.)rN reloadLibraryr>r`successr[s rraz!FlowchartCtrlWidget.reloadClickeds`    * * , , , G  % %k 2 2 2 2 2  G  % %h / / / s 8<"Ac8|jdSrM)r(r r[s rrWzFlowchartCtrlWidget.loadClickeds r!cn|||jjddS)NzSaved.)r_r>rXrhrHrs rrbzFlowchartCtrlWidget.fileSaveds4 H%%% )))))r!c|j|dS |j|jdS#|jjdxYw)NError)r:r[r(rr>rXfailurer[s rrYzFlowchartCtrlWidget.saveClickedsk   '      ##D$899999 ''000s A"A"c |j|jdS|j|jdS#|jjdxYw)N)rrm)r:r(rr>rXrnr[s rr[z!FlowchartCtrlWidget.saveAsClickedsp #+ ##%%%%% ##d6J#KKKKK  GO # #G , , , s A A"A(c||_| |jjdnJ|jjdtj|jdz|ddS)Nz[ new ]z %sr)r:r> fileNameLabelsetTextospathsplit resizeEventrks rr_z"FlowchartCtrlWidget.setCurrentFiles|'   G ! ) )*: ; ; ; ; G ! ) )+ dFZ8[8[\]8^*^ _ _ _ r!cdSrMrrTs rrTzFlowchartCtrlWidget.itemChangedrr!c4|jSrM)rNrr[s rrzFlowchartCtrlWidget.scenes%%'''r!c4|jSrM)rNrEr[s rrEzFlowchartCtrlWidget.viewBoxs'')))r!cl|j|d|dSr)r#rrrJrs rrzFlowchartCtrlWidget.nodeRenameds- 4  DIIKK00000r!c|}tj|ddg}|jj|tjd}|d| d||_ |jj |d|||_ ||_ |||j|j|Itj}|||jj |d|||j|<dS)NXTr8rr) ctrlWidgetrQTreeWidgetItemrJr>r@addTopLevelItem QPushButton setCheckable setFixedWidth bypassBtn setItemWidgetrj bypassButton setCheckedrrVr= bypassClickedaddChildr#)rHrjctrlrbypitem2s rr;zFlowchartCtrlWidget.addNodes@  ($))++r2)>?? ((...#C((  " &&tQ444 t(())) D.///  -//E MM% G  * *5!T : : : 4r!c||jvrk|j|} |jj|jn#t t f$rYnwxYw|jj |dSdSrM) r#rrVrerrrr>r@removeTopLevelItemrHrjrs rrzFlowchartCtrlWidget.removeNodes 4:  :d#D &11$2DEEEE|,     G  / / 5 5 5 5 5  s$=AActj|}|j|dSrM)rQObjectsenderrjbypass isChecked)rHbtns rrz!FlowchartCtrlWidget.bypassClickeds9n##D))  (((((r!c|jSrM)rNr[s rrNzFlowchartCtrlWidget.chartWidgets r!cdSrMr)rHrs rr>z!FlowchartCtrlWidget.outputChangedrr!c8|jdSrM)rNrr[s rrzFlowchartCtrlWidget.clears      r!c^|j|}|jj|dSrM)r#r>r@setCurrentItemrs rselectzFlowchartCtrlWidget.selects-z$ ''-----r!cf|jjdSrM)r>r@selectionModelclearSelectionr[s rrz"FlowchartCtrlWidget.clearSelections+ ''))88:::::r!N)r!r"r#__doc__r1r^rarWrbrYr[r_rTrrErr;rrrNr>rrrrr!rrrPsMRR888N ***      (((***111   .666)))      !!!...;;;;;r!rcVeZdZdZdZdZddZdZdZdZ d Z d Z d Z d Z d ZdS)rJz?Includes the actual graphical flowchart and debugging interfacec6tj|||_||_d|_t j||_tjdd|_ |j |j|j | |j tj|_|jdtjdd|_|j |j| |jdtj|_tj|_|j|jtj|_tj|_|jdt7|_|j |j|j |jtjdd |_|j |j| |jd|j|_|j |_!|"|jj#$|j#|jj%$|j&dS) Nview)r9iX)sizeTz Hover Info)r9r8bottomz Selected Node)r9)'r DockArear1r(r hoverItemrrDockviewDock addWidget hideTitleBaraddDockr QTextEdit hoverText setReadOnly hoverDockr;selInfo QGridLayout selInfoLayout setLayoutQLabel selDescLabel selNameLabel setWordWrapr selectedTreeselDockrr6rE_viewBoxrOselectionChangedr= sigMouseHover hoverOver)rHr(rs rr1zFlowchartWidget.__init__sx""4(((   *?EE  f:>>>   *** ""$$$ T]####,.. ""4(((!|)DDD   000 T^X... (** &244 t1222%,..%,.. %%d+++*,, $$T%6777 $$T%6777}_:FFF  t|,,, T\8,,,ioo''  ))++  $,,T-BCCC !))$.99999r!c|jj|jd|_g|_|jj|dSrM) nodeMenu triggeredrenodeMenuTriggeredsubMenusr(r/reloadrOr[s rrgzFlowchartWidget.reloadLibrary(sY **4+ABBB   !!### r!Ncdfd tj|_g|_|jj|j|j||jj|j |jS)NcH|D]\}}t|trNtj|}||||||||h||}||_||_ dSNr) r# isinstancerrQMenuaddMenur addActionrr)rjrootMenurrsectionmenuact buildSubMenus rrz/FlowchartWidget.buildMenu..buildSubMenu1s!% " " dK00"$?733D$$T*** LtX3????OOD))))",,W55C#*CL!CGG " "r!rrM) rrrrr(r/ getNodeTreerr=r)rHrrs @rrOzFlowchartWidget.buildMenu0s " " " " " ""))   TZ'3355t}dmY\]]]] ''(>???}r!c||_dSrM)menuPos)rHrs rmenuPosChangedzFlowchartWidget.menuPosChangedBs  r!c|||j|dSrM)rOscenePosrpopup screenPos)rHevs r showViewMenuzFlowchartWidget.showViewMenuEsB r{{}}%%% BLLNN+++++r!c|jSrM)r6r[s rrzFlowchartWidget.scenePr_r!c|jSrM)rr[s rrEzFlowchartWidget.viewBoxSs }r!c|j}|j|j}n|j}||}|j||dSr)rrrrEmapSceneToViewr(r)rHactionrrs rrz!FlowchartWidget.nodeMenuTriggeredVs]? : !*CC,Cllnn++C00 hC00000r!c|j}t|dkrd}n@|d}t|dr%t |jt r |j}||jjvr|j |n|j | | d}|j |t|dr0|jd|jd|jjn|jd|j |j|d<nd}|j|d dS) Nrrj)rrrzz: r| exceptionT)hideRoot)r6 selectedItemsrrrrjrrr#rr outputValuesrXrrrrJrr __class__rrrsetData)rHr#rrr|s rrz FlowchartWidget.selectionChangedaso ))++ u::??DD8DtV$$ DIt)D)D I ''I$$Q''''I,,...#$>>#3#3q}}OO!))!&&((3331j))2%---Q[M`M`.abbbb%--b111;*() D% !!$!66666r!cd}|D]H}||jurdS||_t|dr#t|jtr |j}nI||jddS|}t|trAt|j dt|j dt|j }n/t|}t|dkr |dddz}|j|d|d|dS)Nrfr| iz...rz = )rrrrfrr setPlainTextvaluerrr!rshapedtyperrjrJ)rHr#rfrvals rrzFlowchartWidget.hoverOver{sO  Dt~%%!DNtV$$ DIx)H)H y < N ' ' + + + + +**,,C#w'' ,$(II$6$6$6CICIW#hhs88c>>dsd)e+C N ' ' 8H8H8J8J8J8JDIIKKKKY\Y\(] ^ ^ ^ ^ ^r!c|jd|jd|jd|jddS)Nr|)rrrrrrrrr[s rrzFlowchartWidget.clearsc !!$''' ##B''' !!"%%% !!"%%%%%r!rM)r!r"r#rr1rgrOrrrrErrrrrr!rrJrJsII0:0:0:l$ , , ,1117774___2&&&&&r!rJceZdZdS)rN)r!r"r#rr!rrrsDr!r)$r1 importlibrs collectionsrnumpyrr|r r r r r rdebugrgraphicsItems.GraphicsObjectrrGrrrr<rr/rrrr%rrr;rrrJrrr!rrs: B B B ######))))))))''''''######999999""""""""DDDDDD######555K)K)K)K)K)K)K)K)\# # # # # N# # # N];];];];];)+];];];@i&i&i&i&i&h'i&i&i&X     D     r!