]> SALOME platform Git repositories - modules/yacs.git/blob - src/pyqt/gui/Items.py
Salome HOME
copy tag mergefrom_BR_V0_1_CC_Salome_04oct07
[modules/yacs.git] / src / pyqt / gui / Items.py
1 import sys
2 import pilot
3 import Item
4 import adapt
5 from qt import *
6 from qtcanvas import *
7 from GraphViewer import GraphViewer
8 import Editor
9 import CItems
10 import pygraphviz
11 import traceback
12
13
14 class DataLinkItem(Item.Item):
15   def __init__(self,pin,pout):
16     self.pin=pin
17     self.pout=pout
18     self.label= pout.getNode().getName()+":"+pout.getName()+"->"+pin.getNode().getName()+":"+pin.getName()
19
20   def getIconName(self):
21     return "datalink.png"
22
23 class StreamLinkItem(Item.Item):
24   def __init__(self,pin,pout):
25     self.pin=pin
26     self.pout=pout
27     self.label= pout.getNode().getName()+":"+pout.getName()+"->"+pin.getNode().getName()+":"+pin.getName()
28
29   def getIconName(self):
30     return "streamlink.png"
31
32 class ControlLinkItem(Item.Item):
33   def __init__(self,nodeup,nodedown):
34     self.nodedown=nodedown
35     self.nodeup=nodeup
36     self.label= nodeup.getName()+"->"+nodedown.getName()
37
38   def getIconName(self):
39     return "controllink.png"
40
41 class ControlLinksItem(Item.Item):
42   """Item pour les liens controle d'un noeud compose"""
43   def __init__(self,item):
44     self.item=item
45     self.label="Control Links"
46   def getIconName(self):
47     return "folder"
48   def isExpandable(self):
49     return True
50   def getChildren(self):
51     sublist=[]
52     for n in self.item.node.edGetDirectDescendants():
53       for p in n.getOutNodes():
54         sublist.append(ControlLinkItem(n,p))
55     return sublist
56
57 class DataLinksItem(Item.Item):
58   """Item pour les liens data d'un noeud compose"""
59   def __init__(self,item):
60     self.item=item
61     self.label="Data Links"
62
63   def getIconName(self):
64     return "folder"
65
66   def isExpandable(self):
67     return True
68
69   def getChildren(self):
70     sublist=[]
71     for pout,pin in self.item.node.getSetOfInternalLinks():
72       if pout.getNode().getFather() != self.item.node and pin.getNode().getFather() != self.item.node:
73         continue
74       if isinstance(pin,pilot_InputDataStreamPort):
75         sublist.append(StreamLinkItem(pin,pout))
76       else:
77         sublist.append(DataLinkItem(pin,pout))
78     #for pout,pin in self.item.node.getSetOfLinksLeavingCurrentScope():
79     #  sublist.append(DataLinkItem(pin,pout))
80     #for pin,pout in self.item.node.getSetOfLinksComingInCurrentScope():
81     #  sublist.append(DataLinkItem(pin,pout))
82     return sublist
83
84 class MyCanvas(QCanvas):
85   def customEvent(self,event):
86     object=event.data()
87     object.customEvent(event)
88     self.update()
89
90 class ItemComposedNode(Item.Item):
91   """Item pour les noeuds composes"""
92   n=0
93   def __init__(self,node):
94     #node is an instance of YACS::ENGINE::ComposedNode
95     self.node=node
96     self.label=node.getName()
97
98   def isExpandable(self):
99     return True
100
101   def getChildren(self):
102     #liste des noeuds fils
103     liste=self.node.edGetDirectDescendants()
104     #On les adapte en item avant de les retourner
105     sublist=[]
106     for n in liste:
107       try:
108         sublist.append(adapt.adapt(n,Item.Item))
109       except:
110         print n
111         #traceback.print_exc()
112         raise
113     sublist.append(DataLinksItem(self))
114     sublist.append(ControlLinksItem(self))
115     return sublist
116
117   def getIconName(self):
118     return "green-los"
119
120   def panel(self,parent):
121     """Retourne un tab widget pour browser/editer la proc"""
122     tabWidget = QTabWidget( parent )
123     for name,method in self.panels:
124       tabWidget.addTab( method(self,tabWidget), name )
125     return tabWidget
126
127   def addNode(self):
128     r=pilot.getRuntime()
129     ItemComposedNode.n=ItemComposedNode.n+1
130     n1=r.createScriptNode("","unknown_%d" % ItemComposedNode.n)
131     node=CItems.Cell(n1,self.canvas)
132     node.show()
133     self.citems[n1.ptr()]=node
134     self.canvas.update()
135
136   def panel1(self,parent):
137     qvbox=QVBox(parent)
138     #Canvas size : 10000x10000
139     self.canvas=MyCanvas(10000,10000)
140     self.editor=GraphViewer(self,self.canvas,qvbox,"example",0)
141
142     #permet de retrouver un item node dans le canvas a partir 
143     #d'un proxy swig quelconque (astuce)
144     #Pour retrouver un item node faire : citems[node.ptr()]
145     citems={}
146     self.citems=citems
147     #permet de retrouver un item port dans le canvas a partir 
148     #d'un proxy swig quelconque (astuce)
149     #Pour retrouver un item port faire : pitems[port.ptr()]
150     pitems={}
151     #self.pitems=pitems
152
153     y=0
154     lnode=self.node.edGetDirectDescendants()
155     for n in lnode:
156       c=CItems.Cell(n,self.canvas)
157       citems[n.ptr()]=c
158       c.show()
159
160     for k,n in citems.items():
161       for p in n.inports:
162         pitems[p.port.ptr()]=p
163       for p in n.outports:
164         pitems[p.port.ptr()]=p
165
166     for pout,pin in self.node.getSetOfInternalLinks():
167       if pout.getNode().getFather() != self.node and pin.getNode().getFather() != self.node:
168         continue
169       po=pitems.get(pout.ptr())
170       pi=pitems.get(pin.ptr())
171       if pi and po:
172         CItems.LinkItem(po,pi,self.canvas)
173
174     for n in lnode:
175       itemup=citems[n.ptr()]
176       for ndown in n.getOutNodes():
177         itemdown=citems[ndown.ptr()]
178         CItems.ControlLinkItem(itemup.outgate,itemdown.ingate,self.canvas)
179
180     self.layout("LR")
181
182     return qvbox
183
184   panels=[("Panel1",panel1)]
185
186   def layout(self,rankdir):
187     """Compute graph layout with graphviz package"""
188     G=pygraphviz.AGraph(strict=False,directed=True)
189     G.graph_attr["rankdir"]=rankdir
190     for k,n in self.citems.items():
191       #k est l'adresse du node (YACS)
192       #n est l'item dans le canvas
193       G.add_node(k)
194
195     for pout,pin in self.node.getSetOfInternalLinks():
196       if pout.getNode().ptr() not in self.citems :
197         continue
198       if pin.getNode().ptr() not in self.citems:
199         continue
200       G.add_edge(pout.getNode().ptr(),pin.getNode().ptr())
201
202     for k,n in self.citems.items():
203       for ndown in n.node.getOutNodes():
204         G.add_edge(n.node.ptr(),ndown.ptr())
205
206     #By default graphviz uses 96.0 pixel per inch (dpi=96.0)
207     for n in G.nodes():
208       item=self.citems[int(n)]
209       h=item.height()/96. #height in inch
210       w=item.width()/96.  #width in inch
211       n.attr['height']=str(h)
212       n.attr['width']=str(w)
213       n.attr['fixedsize']="true"
214       n.attr['shape']="box"
215       #n.attr['label']=item.node.getName()
216
217     G.layout(prog='dot') # use dot
218     #G.write("layout.dot")
219     #G.draw("layout.png")
220
221     #from pygraphviz import graphviz as gv
222     #bbox= gv.agget(G.handle,"bb")#bounding box to resize
223     #x1,y1,x2,y2=eval(bbox)
224     #self.canvas.resize(w,h)
225
226     for n in G:
227       pos=n.attr['pos'] #position is given in points (72 points par inch, so 1 point = 96./72=1.34)
228       x,y=eval(pos)
229       x=96./72*x+10
230       y=96./72*y+10
231       item=self.citems[int(n)]
232   #    x0=item.x()+item.width()/2.
233   #    y0=item.y()+item.height()/2.
234       x0=item.x()
235       y0=item.y()
236       x=x-x0
237       y=y-y0
238       item.moveBy(x,y)
239
240     self.canvas.update()
241
242 class ItemProc(ItemComposedNode):
243   """Item pour la procedure"""
244
245 class ItemPort(Item.Item):
246   """Item pour les ports """
247   panels=[]
248   def __init__(self,port):
249     self.port=port
250     self.label=port.getName()
251
252   def getIconName(self):
253     return "port.png"
254
255   def panel(self,parent):
256     """Retourne un tab widget pour browser/editer l'item"""
257     tabWidget = QTabWidget( parent )
258     for name,method in self.panels:
259       tabWidget.addTab( method(self,tabWidget), name )
260     return tabWidget
261
262 class ItemInPort(ItemPort):
263   def getIconName(self):
264     return "inport.png"
265
266   def panel1(self,parent):
267     qvbox=QVBox(parent)
268     qvbox.layout().setAlignment(Qt.AlignTop|Qt.AlignLeft)
269     qvbox.setSpacing( 5 )
270     row0=QHBox(qvbox)
271     label=QLabel("Name: ",row0)
272     lined0 = QLineEdit(self.port.getName(),row0)
273     label=QLabel("Type: ",row0)
274     QLineEdit(self.port.edGetType().name(),row0)
275
276     label=QLabel("Value: ",qvbox)
277     #self.value=QLabel("Empty",qvbox)
278     self.value=QTextEdit(qvbox)
279     self.value.setText("Empty")
280     if not self.port.isEmpty():
281       self.value.setText(self.port.dump())
282
283     row3=QHBox(qvbox)
284     but2=QPushButton( "Refresh", row3 )
285     qvbox.connect( but2, SIGNAL("clicked()"), self.handleRefresh )
286
287     return qvbox
288
289   def handleRefresh(self):
290     if not self.port.isEmpty():
291       self.value.setText(self.port.dump())
292
293   panels=[("Panel1",panel1)]
294
295 class ItemOutPort(ItemPort):
296   def getIconName(self):
297     return "outport.png"
298
299   def panel1(self,parent):
300     qvbox=QVBox(parent)
301     qvbox.layout().setAlignment(Qt.AlignTop|Qt.AlignLeft)
302     qvbox.setSpacing( 5 )
303
304     row0=QHBox(qvbox)
305     QLabel("Name: ",row0)
306     QLineEdit(self.port.getName(),row0)
307     QLabel("Type: ",row0)
308     QLineEdit(self.port.edGetType().name(),row0)
309
310     QLabel("Value: ",qvbox)
311     self.value=QTextEdit(qvbox)
312     self.value.setText("Empty")
313     try:
314       self.value.setText(self.port.dump())
315     except:
316       traceback.print_exc()
317
318     row3=QHBox(qvbox)
319     but2=QPushButton( "Refresh", row3 )
320     qvbox.connect( but2, SIGNAL("clicked()"), self.handleRefresh )
321
322     return qvbox
323
324   def handleRefresh(self):
325     try:
326       self.value.setText(self.port.dump())
327     except:
328       traceback.print_exc()
329
330   panels=[("Panel1",panel1)]
331
332
333 class ItemInStream(ItemPort):
334   def getIconName(self):
335     return "instream.png"
336 class ItemOutStream(ItemPort):
337   def getIconName(self):
338     return "outstream.png"
339
340 class ItemNode(Item.Item):
341   """Item pour les noeuds elementaires
342      Il n a pas de fils
343   """
344   #attr donnant la liste des panels du noeud (nom,method)
345   panels=[]
346   def __init__(self,node):
347     self.node=node
348     self.label=node.getName()
349
350   def isExpandable(self):
351     return True
352
353   def getChildren(self):
354     sublist=[]
355     for n in self.node.getSetOfInputPort():
356       sublist.append(adapt.adapt(n,Item.Item))
357     for n in self.node.getSetOfOutputPort():
358       sublist.append(adapt.adapt(n,Item.Item))
359     for n in self.node.getSetOfInputDataStreamPort():
360       sublist.append(adapt.adapt(n,Item.Item))
361     for n in self.node.getSetOfOutputDataStreamPort():
362       sublist.append(adapt.adapt(n,Item.Item))
363     return sublist
364
365   def panel(self,parent):
366     """Retourne un tab widget pour browser/editer l'item"""
367     tabWidget = QTabWidget( parent )
368     for name,method in self.panels:
369       tabWidget.addTab( method(self,tabWidget), name )
370     return tabWidget
371
372 class ItemScriptNode(ItemNode):
373
374   def panel1(self,parent):
375     qvbox=QVBox(parent)
376     qvbox.setSpacing( 5 )
377
378     row0=QHBox(qvbox)
379     label=QLabel("Name: ",row0)
380     lined0 = QLineEdit(self.node.getName(),row0)
381
382     label=QLabel("Script: ",qvbox)
383     mle=Editor.Editor(qvbox,"multiLineEdit" )
384     mle.setText(self.node.getScript())
385
386     row2=QHBox(qvbox)
387     but1=QPushButton( "Save", row2 )
388     but2=QPushButton( "Cancel", row2 )
389     qvbox.connect( but1, SIGNAL("clicked()"), self.handleSave )
390     qvbox.connect( but2, SIGNAL("clicked()"), self.handleCancel )
391
392     return qvbox
393
394   panels=[("Panel1",panel1)]
395
396   def getIconName(self):
397     return "green-ball"
398
399   def handleSave(self):
400     self.node.setScript(str(self.mle.text()))
401   def handleCancel(self):
402     self.lined0.setText(self.node.getName())
403     self.mle.setText(self.node.getScript())
404
405 class ItemFuncNode(ItemNode):
406   def panel1(self,parent):
407     """Retourne un widget pour browser/editer l'item"""
408     qvbox=QVBox(parent)
409     qvbox.setSpacing( 5 )
410
411     row0=QHBox(qvbox)
412     label=QLabel("Name: ",row0)
413     self.lined0 = QLineEdit(self.node.getName(),row0)
414
415     row1=QHBox(qvbox)
416     label=QLabel("Fname: ",row1)
417     self.lined1 = QLineEdit(self.node.getFname(),row1)
418
419     label=QLabel("Function: ",qvbox)
420     self.mle=Editor.Editor(qvbox,"multiLineEdit" )
421     self.mle.setText(self.node.getScript())
422
423     row2=QHBox(qvbox)
424     but1=QPushButton( "Save", row2 )
425     but2=QPushButton( "Cancel", row2 )
426     qvbox.connect( but1, SIGNAL("clicked()"), self.handleSave )
427     qvbox.connect( but2, SIGNAL("clicked()"), self.handleCancel )
428
429     return qvbox
430
431   panels=[("Panel1",panel1)]
432
433   def getIconName(self):
434     return "green-ball"
435   def FuncChanged(self, newText ):
436     self.myFunc=str(newText)
437
438   def handleSave(self):
439     self.node.setFname(str(self.lined1.text()))
440     self.node.setScript(str(self.mle.text()))
441   def handleCancel(self):
442     self.lined0.setText(self.node.getName())
443     self.lined1.setText(self.node.getFname())
444     self.mle.setText(self.node.getScript())
445
446 class ItemService(ItemNode):
447   def panel1(self,parent):
448     """Retourne un widget pour browser/editer l'item"""
449     self.myName=self.node.getName()
450
451     qvbox=QVBox(parent)
452     qvbox.layout().setAlignment(Qt.AlignTop|Qt.AlignLeft)
453     qvbox.setSpacing( 5 )
454
455     row0=QHBox(qvbox)
456     label=QLabel("Name: ",row0)
457     self.lined0 = QLineEdit(self.node.getName(),row0)
458     qvbox.connect( self.lined0, SIGNAL("textChanged(const QString &)"), self.NameChanged )
459     qvbox.connect( self.lined0, SIGNAL("returnPressed()"), self.NameReturn )
460     QToolTip.add( self.lined0, "Node name" )
461
462     row1=QHBox(qvbox)
463     label1=QLabel("Ref: ",row1)
464     self.lined1 = QLineEdit(row1)
465     if self.node.getComponent():
466       self.lined1.setText(self.node.getComponent().getName())
467     else:
468       self.lined1.setText("NO_COMPONENT_NAME")
469
470     row2=QHBox(qvbox)
471     label2=QLabel("Method: ",row2)
472     self.lined2 = QLineEdit(row2)
473     self.lined2.setText(self.node.getMethod())
474
475     row3=QHBox(qvbox)
476     but1=QPushButton( "Save", row3 )
477     but2=QPushButton( "Cancel", row3 )
478     qvbox.connect( but1, SIGNAL("clicked()"), self.handleSave )
479     qvbox.connect( but2, SIGNAL("clicked()"), self.handleCancel )
480
481     return qvbox
482
483   panels=[("Panel1",panel1)]
484
485   def NameChanged(self, newText ):
486     self.myName=str(newText)
487
488   def NameReturn(self):
489     pass
490
491   def getIconName(self):
492     return "green-square"
493
494   def handleSave(self):
495     self.node.setRef(str(self.lined1.text()))
496     self.node.setMethod(str(self.lined2.text()))
497   def handleCancel(self):
498     self.lined0.setText(self.node.getName())
499     self.lined1.setText(self.node.getComponent().getName())
500     self.lined2.setText(self.node.getMethod())
501
502 def adapt_Proc_to_Item(obj, protocol, alternate):
503   return ItemProc(obj)
504
505 def adapt_Node_to_Item(obj, protocol, alternate):
506   return ItemNode(obj)
507
508 def adapt_ComposedNode_to_Item(obj, protocol, alternate):
509   return ItemComposedNode(obj)
510
511 def adapt_InlineFuncNode_to_Item(obj, protocol, alternate):
512   return ItemFuncNode(obj)
513
514 def adapt_InlineScriptNode_to_Item(obj, protocol, alternate):
515   return ItemScriptNode(obj)
516
517 def adapt_ServiceNode_to_Item(obj, protocol, alternate):
518   return ItemService(obj)
519
520 def adapt_Port_to_Item(obj, protocol, alternate):
521   return ItemPort(obj)
522
523 def adapt_InPort_to_Item(obj, protocol, alternate):
524   return ItemInPort(obj)
525
526 def adapt_OutPort_to_Item(obj, protocol, alternate):
527   return ItemOutPort(obj)
528
529 def adapt_InStream_to_Item(obj, protocol, alternate):
530   return ItemInStream(obj)
531
532 def adapt_OutStream_to_Item(obj, protocol, alternate):
533   return ItemOutStream(obj)
534
535 if hasattr(pilot,"ProcPtr"):
536   adapt.registerAdapterFactory(pilot.ProcPtr, Item.Item, adapt_Proc_to_Item)
537   adapt.registerAdapterFactory(pilot.BlocPtr, Item.Item, adapt_ComposedNode_to_Item)
538   adapt.registerAdapterFactory(pilot.ForLoopPtr, Item.Item, adapt_ComposedNode_to_Item)
539   adapt.registerAdapterFactory(pilot.WhileLoopPtr, Item.Item, adapt_ComposedNode_to_Item)
540   adapt.registerAdapterFactory(pilot.ForEachLoopPtr, Item.Item, adapt_ComposedNode_to_Item)
541   adapt.registerAdapterFactory(pilot.SwitchPtr, Item.Item, adapt_ComposedNode_to_Item)
542   adapt.registerAdapterFactory(pilot.ComposedNodePtr, Item.Item, adapt_ComposedNode_to_Item)
543
544   adapt.registerAdapterFactory(pilot.ServiceNodePtr, Item.Item, adapt_ServiceNode_to_Item)
545   #adapt.registerAdapterFactory(pilot.ServiceNodeNodePtr, Item.Item, adapt_Node_to_Item)
546   adapt.registerAdapterFactory(pilot.InlineNodePtr, Item.Item, adapt_InlineScriptNode_to_Item)
547   adapt.registerAdapterFactory(pilot.InlineFuncNodePtr, Item.Item, adapt_InlineFuncNode_to_Item)
548   adapt.registerAdapterFactory(pilot.NodePtr, Item.Item, adapt_Node_to_Item)
549
550   adapt.registerAdapterFactory(pilot.OutputPortPtr, Item.Item, adapt_OutPort_to_Item)
551   adapt.registerAdapterFactory(pilot.InputPortPtr, Item.Item, adapt_InPort_to_Item)
552   adapt.registerAdapterFactory(pilot.OutputDataStreamPortPtr, Item.Item, adapt_OutStream_to_Item)
553   adapt.registerAdapterFactory(pilot.InputDataStreamPortPtr, Item.Item, adapt_InStream_to_Item)
554
555   pilot_InputDataStreamPort=pilot.InputDataStreamPortPtr
556
557 else:
558   adapt.registerAdapterFactory(pilot.Proc, Item.Item, adapt_Proc_to_Item)
559   adapt.registerAdapterFactory(pilot.Bloc, Item.Item, adapt_ComposedNode_to_Item)
560   adapt.registerAdapterFactory(pilot.ForLoop, Item.Item, adapt_ComposedNode_to_Item)
561   adapt.registerAdapterFactory(pilot.WhileLoop, Item.Item, adapt_ComposedNode_to_Item)
562   adapt.registerAdapterFactory(pilot.ForEachLoop, Item.Item, adapt_ComposedNode_to_Item)
563   adapt.registerAdapterFactory(pilot.Switch, Item.Item, adapt_ComposedNode_to_Item)
564   adapt.registerAdapterFactory(pilot.ComposedNode, Item.Item, adapt_ComposedNode_to_Item)
565
566   adapt.registerAdapterFactory(pilot.ServiceNode, Item.Item, adapt_ServiceNode_to_Item)
567   #adapt.registerAdapterFactory(pilot.ServiceNodeNode, Item.Item, adapt_Node_to_Item)
568   adapt.registerAdapterFactory(pilot.InlineNode, Item.Item, adapt_InlineScriptNode_to_Item)
569   adapt.registerAdapterFactory(pilot.InlineFuncNode, Item.Item, adapt_InlineFuncNode_to_Item)
570   adapt.registerAdapterFactory(pilot.Node, Item.Item, adapt_Node_to_Item)
571
572   adapt.registerAdapterFactory(pilot.OutputPort, Item.Item, adapt_OutPort_to_Item)
573   adapt.registerAdapterFactory(pilot.InputPort, Item.Item, adapt_InPort_to_Item)
574   adapt.registerAdapterFactory(pilot.OutputDataStreamPort, Item.Item, adapt_OutStream_to_Item)
575   adapt.registerAdapterFactory(pilot.InputDataStreamPort, Item.Item, adapt_InStream_to_Item)
576
577   pilot_InputDataStreamPort=pilot.InputDataStreamPort