Salome HOME
copy tag mergefrom_BR_V0_1_CC_Salome_04oct07
[modules/yacs.git] / src / pyqt / gui / CItems.py
1
2 import sys,traceback
3 from qt import *
4 from qtcanvas import *
5 import pilot
6 dispatcher=pilot.Dispatcher.getDispatcher()
7
8 class PointItem(QCanvasEllipse):
9   def __init__(self,obj,x,y,canvas):
10     """Create a point contained in a composite line (obj)"""
11     QCanvasEllipse.__init__(self,6,6,canvas)
12     self.obj=obj
13     self.inline=None
14     self.outline=None
15     self.setPen(QPen(Qt.black))
16     self.setBrush(QBrush(Qt.red))
17     self.setX(x)
18     self.setY(y)
19     self.setVisible(True)
20
21   def setInline(self,inline):
22     self.inline=inline
23     if inline.z() >= self.z():
24       self.setZ(inline.z()+1)
25   def setOutline(self,outline):
26     self.outline=outline
27     if outline.z() >= self.z():
28       self.setZ(outline.z()+1)
29
30   def moveBy(self,dx,dy):
31     """Request the point move by x,y"""
32     self.myMove(dx,dy)
33
34   def myMove(self,dx,dy):
35     """The real move"""
36     QCanvasEllipse.moveBy(self,dx,dy)
37     if self.outline:
38       self.outline.setFromPoint( int(self.x()), int(self.y()) )
39     if self.inline:
40       self.inline.setToPoint( int(self.x()), int(self.y()) )
41
42   def getObj(self):
43     """The object which contains the point"""
44     return self.obj
45
46   def handleDoubleClick(self,pos):
47     self.obj.deletePoint(self,pos)
48   #def __del__(self):
49   #  print "PointItem.__del__"
50   def clear(self):
51     """To remove from canvas"""
52     self.setCanvas(None)
53     self.obj=None
54     self.inline=None
55     self.outline=None
56
57 class LineItem(QCanvasLine):
58   """A line between 2 points"""
59   def __init__(self,obj,fromPoint, toPoint,canvas):
60     QCanvasLine.__init__(self,canvas)
61     self.obj=obj
62     self.fromPoint=fromPoint
63     self.toPoint=toPoint
64     self.setPen(QPen(Qt.black))
65     self.setBrush(QBrush(Qt.red))
66     self.setPoints(int(fromPoint.x()),int(fromPoint.y()), int(toPoint.x()), int(toPoint.y()))
67     self.setZ(min(fromPoint.z(),toPoint.z())-1)
68     self.setVisible(True)
69
70   def setFromPoint(self,x,y):
71     self.setPoints(x,y,self.endPoint().x(),self.endPoint().y())
72   def setToPoint(self,x,y):
73     self.setPoints(self.startPoint().x(), self.startPoint().y(),x,y)
74   def moveBy(self,dx,dy):
75     """Disable line move"""
76     pass
77
78   def getObj(self):
79     """The object which contains the line"""
80     return self.obj
81   def handleDoubleClick(self,pos):
82     #split the line
83     self.obj.splitline(self,pos)
84   #def __del__(self):
85   #  print "LineItem.__del__"
86   def clear(self):
87     """To remove from canvas"""
88     self.setCanvas(None)
89     self.fromPoint=None
90     self.toPoint=None
91     self.obj=None
92
93 class LinkItem:
94   def __init__(self,fromPort, toPort,canvas):
95     self.fromPort=fromPort
96     self.toPort=toPort
97     self.canvas=canvas
98     fromPort.addOutLink(self)
99     toPort.addInLink(self)
100     self.lines=[]
101     self.points=[]
102     self.lines.append(LineItem(self,fromPort, toPort,canvas))
103
104   def deletePoint(self,point,pos):
105     """Delete intermediate point"""
106     if point not in self.points:
107       return
108     self.points.remove(point)
109     inline=point.inline
110     outline=point.outline
111     inline.toPoint=outline.toPoint
112     inline.setToPoint(outline.toPoint.x(),outline.toPoint.y())
113     self.lines.remove(outline)
114     if inline.toPoint in self.points:
115       inline.toPoint.setInline(inline)
116     #remove from canvas
117     point.clear()
118     outline.clear()
119
120   def splitline(self,line,pos):
121     """Split line at position pos"""
122     #The new point
123     point=PointItem(self,pos.x(),pos.y(),self.canvas)
124     self.points.append(point)
125     i=self.lines.index(line)
126
127     newline=LineItem(self,point,line.toPoint,self.canvas)
128     if line.toPoint in self.points:
129       #line not connected to port : reconnect newline
130       line.toPoint.setInline(newline)
131     self.lines.insert(i+1,newline)
132
133     line.setToPoint(pos.x(),pos.y())
134     line.toPoint=point
135     point.setInline(line)
136     point.setOutline(newline)
137
138   def setFromPoint(self,x,y):
139     first=self.lines[0]
140     first.setFromPoint(x,y)
141
142   def setToPoint(self,x,y):
143     last=self.lines[-1]
144     last.setToPoint(x,y)
145
146   def moveBy(self,dx,dy):
147     pass
148
149   def popup(self,canvasView):
150     menu=QPopupMenu()
151     caption = QLabel( "<font color=darkblue><u><b>Link Menu</b></u></font>",menu )
152     caption.setAlignment( Qt.AlignCenter )
153     menu.insertItem( caption )
154     menu.insertItem("Delete", self.delete)
155     return menu
156
157   def delete(self):
158     print "delete link"
159
160   def tooltip(self,view,pos):
161     r = QRect(pos.x(), pos.y(), pos.x()+10, pos.y()+10)
162     s = QString( "link: "+self.fromPort.port.getNode().getName() +":"+self.fromPort.port.getName()+"->"+self.toPort.port.getNode().getName()+":"+self.toPort.port.getName()  )
163     view.tip( r, s )
164     #QToolTip(view).tip( r, s )
165
166 class ControlLinkItem(LinkItem):
167   def tooltip(self,view,pos):
168     r = QRect(pos.x(), pos.y(), pos.x()+10, pos.y()+10)
169     s = QString( "link: "+self.fromPort.port.getNode().getName()+"->"+self.toPort.port.getNode().getName())
170     view.tip( r, s )
171     #QToolTip(view).tip( r, s )
172
173 class ControlItem(QCanvasRectangle):
174   def __init__(self,node,port,canvas):
175     QCanvasRectangle.__init__(self,canvas)
176     self.setSize(6,6)
177     self.port=port
178     self.setPen(QPen(Qt.black))
179     self.setBrush(QBrush(Qt.red))
180     self.setZ(node.z()+1)
181     self.node=node
182   def moveBy(self,dx,dy):
183     self.node.moveBy(dx,dy)
184   def myMove(self,dx,dy):
185     QCanvasRectangle.moveBy(self,dx,dy)
186   def getObj(self):
187     return self
188   def popup(self,canvasView):
189     self.context=canvasView
190     menu=QPopupMenu()
191     caption = QLabel( "<font color=darkblue><u><b>Port Menu</b></u></font>",menu )
192     caption.setAlignment( Qt.AlignCenter )
193     menu.insertItem( caption )
194     menu.insertItem("Connect", self.connect)
195     return menu
196   def connect(self):
197     print "connect",self.context
198     self.context.connecting(self)
199   def link(self,obj):
200     print "link:",obj
201   def tooltip(self,view,pos):
202     r = QRect(pos.x(), pos.y(), self.width(), self.height())
203     s = QString( "gate:")
204     view.tip( r, s )
205     #QToolTip(view).tip( r, s )
206
207 class InControlItem(ControlItem):
208   def __init__(self,node,port,canvas):
209     ControlItem.__init__(self,node,port,canvas)
210     self.__inList=[]
211
212   def myMove(self,dx,dy):
213     ControlItem.myMove(self,dx,dy)
214     for link in self.__inList:
215       link.setToPoint( int(self.x()), int(self.y()) )
216
217   def link(self,obj):
218     print "link:",obj
219     if isinstance(obj,OutControlItem):
220       #Connection possible
221       l=LinkItem(obj,self,self.canvas())
222
223   def addInLink(self,link):
224     self.__inList.append(link)
225
226   def tooltip(self,view,pos):
227     r = QRect(pos.x(), pos.y(), self.width(), self.height())
228     s = QString( "ingate:")
229     view.tip( r, s )
230     #QToolTip(view).tip( r, s )
231
232 class OutControlItem(ControlItem):
233   def __init__(self,node,port,canvas):
234     ControlItem.__init__(self,node,port,canvas)
235     self.__outList=[]
236
237   def myMove(self,dx,dy):
238     ControlItem.myMove(self,dx,dy)
239     for link in self.__outList:
240       link.setFromPoint( int(self.x()), int(self.y()) )
241
242   def link(self,obj):
243     print "link:",obj
244     if isinstance(obj,InControlItem):
245       #Connection possible
246       l=LinkItem(self,obj,self.canvas())
247
248   def addOutLink(self,link):
249     self.__outList.append(link)
250
251   def tooltip(self,view,pos):
252     r = QRect(pos.x(), pos.y(), self.width(), self.height())
253     s = QString( "outgate:")
254     view.tip( r, s )
255     #QToolTip(view).tip( r, s )
256
257 class PortItem(QCanvasEllipse):
258   def __init__(self,node,port,canvas):
259     QCanvasEllipse.__init__(self,6,6,canvas)
260     self.port=port
261     self.setPen(QPen(Qt.black))
262     self.setBrush(QBrush(Qt.red))
263     self.setZ(node.z()+1)
264     self.node=node
265
266   def moveBy(self,dx,dy):
267     self.node.moveBy(dx,dy)
268
269   def myMove(self,dx,dy):
270     QCanvasEllipse.moveBy(self,dx,dy)
271
272   def getObj(self):
273     return self
274
275   def popup(self,canvasView):
276     self.context=canvasView
277     menu=QPopupMenu()
278     caption = QLabel( "<font color=darkblue><u><b>Port Menu</b></u></font>",menu )
279     caption.setAlignment( Qt.AlignCenter )
280     menu.insertItem( caption )
281     menu.insertItem("Connect", self.connect)
282     return menu
283
284   def connect(self):
285     print "connect",self.context
286     self.context.connecting(self)
287
288   def link(self,obj):
289     print "link:",obj
290
291   def tooltip(self,view,pos):
292     r = QRect(pos.x(),pos.y(),self.width(), self.height())
293     t=self.port.edGetType()
294     s = QString( "port: " + self.port.getName() + ":" + t.name())
295     view.tip( r, s )
296     #QToolTip(view).tip( r, s )
297
298 class InPortItem(PortItem):
299   def __init__(self,node,port,canvas):
300     PortItem.__init__(self,node,port,canvas)
301     self.__inList=[]
302
303   def myMove(self,dx,dy):
304     PortItem.myMove(self,dx,dy)
305     for link in self.__inList:
306       link.setToPoint( int(self.x()), int(self.y()) )
307
308   def link(self,obj):
309     print "link:",obj
310     if isinstance(obj,OutPortItem):
311       #Connection possible
312       l=LinkItem(obj,self,self.canvas())
313
314   def addInLink(self,link):
315     self.__inList.append(link)
316
317
318
319 class OutPortItem(PortItem):
320   def __init__(self,node,port,canvas):
321     PortItem.__init__(self,node,port,canvas)
322     self.__outList=[]
323
324   def myMove(self,dx,dy):
325     PortItem.myMove(self,dx,dy)
326     for link in self.__outList:
327       link.setFromPoint( int(self.x()), int(self.y()) )
328
329   def link(self,obj):
330     print "link:",obj
331     if isinstance(obj,InPortItem):
332       #Connection possible
333       l=LinkItem(self,obj,self.canvas())
334
335   def addOutLink(self,link):
336     self.__outList.append(link)
337
338 class InStreamItem(InPortItem):
339   def __init__(self,node,port,canvas):
340     InPortItem.__init__(self,node,port,canvas)
341     self.setBrush(QBrush(Qt.green))
342
343 class OutStreamItem(OutPortItem):
344   def __init__(self,node,port,canvas):
345     OutPortItem.__init__(self,node,port,canvas)
346     self.setBrush(QBrush(Qt.green))
347
348 class Cell(QCanvasRectangle,pilot.PyObserver):
349   colors={
350       "pink":Qt.cyan,
351       "green":Qt.green,
352       "magenta":Qt.magenta,
353       "purple":Qt.darkMagenta,
354       "blue":Qt.blue,
355       "red":Qt.red,
356       "orange":Qt.yellow,
357       "grey":Qt.gray,
358       "white":Qt.white,
359     }
360
361   def __init__(self,node,canvas):
362     QCanvasRectangle.__init__(self,canvas)
363     pilot.PyObserver.__init__(self)
364     self.setSize(50,50)
365     #node is an instance of YACS::ENGINE::Node
366     self.node=node
367     dispatcher.addObserver(self,node,"status")
368     self.label=QCanvasText(canvas)
369     self.label.setText(self.node.getName())
370     self.label.setFont(QFont("Helvetica",8))
371     rect=self.label.boundingRect()
372     self.label.setX(self.x()+self.width()/2-rect.width()/2)
373     self.label.setY(self.y()+self.height()/2-rect.height()/2)
374     self.label.setZ(self.z()+1)
375     color= self.colors.get(node.getColorState(node.getEffectiveState()),Qt.white)
376     self.setBrush(QBrush(color))
377
378     self.inports=[]
379     self.outports=[]
380
381     liste= self.node.getSetOfInputPort()
382     dy=6
383     y=0
384     for inport in self.node.getSetOfInputPort():
385       p=InPortItem(self,inport,canvas)
386       y=y+dy
387       p.myMove(0,y)
388       self.inports.append(p)
389
390     for instream in self.node.getSetOfInputDataStreamPort():
391       p=InStreamItem(self,instream,canvas)
392       y=y+dy
393       p.myMove(0,y)
394       self.inports.append(p)
395
396     ymax=y
397
398     liste= self.node.getSetOfOutputPort()
399     dy=6
400     y=0
401     for outport in self.node.getSetOfOutputPort():
402       p=OutPortItem(self,outport,canvas)
403       y=y+dy
404       p.myMove(50,y)
405       self.outports.append(p)
406
407     for outstream in self.node.getSetOfOutputDataStreamPort():
408       p=OutStreamItem(self,outstream,canvas)
409       y=y+dy
410       p.myMove(50,y)
411       self.outports.append(p)
412
413     ymax=max(y,ymax)
414
415     #Control ports
416     y=ymax+dy
417     if y < 44:y=44
418     p=InControlItem(self,self.node.getInGate(),canvas)
419     p.myMove(0,y)
420     self.inports.append(p)
421     self.ingate=p
422     p=OutControlItem(self,self.node.getOutGate(),canvas)
423     p.myMove(44,y)
424     self.outports.append(p)
425     self.outgate=p
426     y=y+dy
427     self.setSize(50,y)
428
429
430   events={
431       "status":QEvent.User+1,
432       }
433
434   def pynotify(self,object,event):
435     #print "pynotify",event,object
436     try:
437       evType=self.events[event]
438       ev=QCustomEvent(evType)
439       ev.setData(self)
440       ev.yacsEvent=event
441       QApplication.postEvent(self.canvas(), ev)
442       #request immediate processing (deadlock risk ???)
443       #QApplication.sendPostedEvents(self.canvas(), evType)
444       #print "pynotify end"
445     except:
446       #traceback.print_exc()
447       raise
448
449   def customEvent(self,event):
450     if event.yacsEvent=="status":
451       object=self.node
452       state=object.getEffectiveState()
453       color=object.getColorState(state)
454       color= self.colors.get(color,Qt.white)
455       self.setBrush(QBrush(color))
456     else:
457       print "Unknown custom event type:", event.type()
458
459   def moveBy(self,dx,dy):
460     QCanvasRectangle.moveBy(self,dx,dy)
461     self.label.moveBy(dx,dy)
462     for p in self.inports:
463       p.myMove(dx,dy)
464     for p in self.outports:
465       p.myMove(dx,dy)
466
467   def show(self):
468     QCanvasRectangle.show(self)
469     self.label.show()
470     for p in self.inports:
471       p.show()
472     for p in self.outports:
473       p.show()
474
475   def getObj(self):
476     return self
477
478   def popup(self,canvasView):
479     menu=QPopupMenu()
480     caption = QLabel( "<font color=darkblue><u><b>Node Menu</b></u></font>",menu )
481     caption.setAlignment( Qt.AlignCenter )
482     menu.insertItem( caption )
483     menu.insertItem("Browse", self.browse)
484     return menu
485
486   def tooltip(self,view,pos):
487     r = QRect(pos.x(), pos.y(), self.width(), self.height())
488     s = QString( "node: " + self.node.getName())
489     view.tip( r, s )
490     #QToolTip(view).tip( r, s )
491
492   def browse(self):
493     print "browse"