6 dispatcher=pilot.Dispatcher.getDispatcher()
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)
15 self.setPen(QPen(Qt.black))
16 self.setBrush(QBrush(Qt.red))
21 def setInline(self,inline):
23 if inline.z() >= self.z():
24 self.setZ(inline.z()+1)
25 def setOutline(self,outline):
27 if outline.z() >= self.z():
28 self.setZ(outline.z()+1)
30 def moveBy(self,dx,dy):
31 """Request the point move by x,y"""
34 def myMove(self,dx,dy):
36 QCanvasEllipse.moveBy(self,dx,dy)
38 self.outline.setFromPoint( int(self.x()), int(self.y()) )
40 self.inline.setToPoint( int(self.x()), int(self.y()) )
43 """The object which contains the point"""
46 def handleDoubleClick(self,pos):
47 self.obj.deletePoint(self,pos)
49 # print "PointItem.__del__"
51 """To remove from canvas"""
57 class LineItem(QCanvasLine):
58 """A line between 2 points"""
59 def __init__(self,obj,fromPoint, toPoint,canvas):
60 QCanvasLine.__init__(self,canvas)
62 self.fromPoint=fromPoint
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)
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"""
79 """The object which contains the line"""
81 def handleDoubleClick(self,pos):
83 self.obj.splitline(self,pos)
85 # print "LineItem.__del__"
87 """To remove from canvas"""
94 def __init__(self,fromPort, toPort,canvas):
95 self.fromPort=fromPort
98 fromPort.addOutLink(self)
99 toPort.addInLink(self)
102 self.lines.append(LineItem(self,fromPort, toPort,canvas))
104 def deletePoint(self,point,pos):
105 """Delete intermediate point"""
106 if point not in self.points:
108 self.points.remove(point)
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)
120 def splitline(self,line,pos):
121 """Split line at position pos"""
123 point=PointItem(self,pos.x(),pos.y(),self.canvas)
124 self.points.append(point)
125 i=self.lines.index(line)
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)
133 line.setToPoint(pos.x(),pos.y())
135 point.setInline(line)
136 point.setOutline(newline)
138 def setFromPoint(self,x,y):
140 first.setFromPoint(x,y)
142 def setToPoint(self,x,y):
146 def moveBy(self,dx,dy):
149 def popup(self,canvasView):
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)
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() )
164 #QToolTip(view).tip( r, s )
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())
171 #QToolTip(view).tip( r, s )
173 class ControlItem(QCanvasRectangle):
174 def __init__(self,node,port,canvas):
175 QCanvasRectangle.__init__(self,canvas)
178 self.setPen(QPen(Qt.black))
179 self.setBrush(QBrush(Qt.red))
180 self.setZ(node.z()+1)
182 def moveBy(self,dx,dy):
183 self.node.moveBy(dx,dy)
184 def myMove(self,dx,dy):
185 QCanvasRectangle.moveBy(self,dx,dy)
188 def popup(self,canvasView):
189 self.context=canvasView
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)
197 print "connect",self.context
198 self.context.connecting(self)
201 def tooltip(self,view,pos):
202 r = QRect(pos.x(), pos.y(), self.width(), self.height())
203 s = QString( "gate:")
205 #QToolTip(view).tip( r, s )
207 class InControlItem(ControlItem):
208 def __init__(self,node,port,canvas):
209 ControlItem.__init__(self,node,port,canvas)
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()) )
219 if isinstance(obj,OutControlItem):
221 l=LinkItem(obj,self,self.canvas())
223 def addInLink(self,link):
224 self.__inList.append(link)
226 def tooltip(self,view,pos):
227 r = QRect(pos.x(), pos.y(), self.width(), self.height())
228 s = QString( "ingate:")
230 #QToolTip(view).tip( r, s )
232 class OutControlItem(ControlItem):
233 def __init__(self,node,port,canvas):
234 ControlItem.__init__(self,node,port,canvas)
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()) )
244 if isinstance(obj,InControlItem):
246 l=LinkItem(self,obj,self.canvas())
248 def addOutLink(self,link):
249 self.__outList.append(link)
251 def tooltip(self,view,pos):
252 r = QRect(pos.x(), pos.y(), self.width(), self.height())
253 s = QString( "outgate:")
255 #QToolTip(view).tip( r, s )
257 class PortItem(QCanvasEllipse):
258 def __init__(self,node,port,canvas):
259 QCanvasEllipse.__init__(self,6,6,canvas)
261 self.setPen(QPen(Qt.black))
262 self.setBrush(QBrush(Qt.red))
263 self.setZ(node.z()+1)
266 def moveBy(self,dx,dy):
267 self.node.moveBy(dx,dy)
269 def myMove(self,dx,dy):
270 QCanvasEllipse.moveBy(self,dx,dy)
275 def popup(self,canvasView):
276 self.context=canvasView
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)
285 print "connect",self.context
286 self.context.connecting(self)
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())
296 #QToolTip(view).tip( r, s )
298 class InPortItem(PortItem):
299 def __init__(self,node,port,canvas):
300 PortItem.__init__(self,node,port,canvas)
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()) )
310 if isinstance(obj,OutPortItem):
312 l=LinkItem(obj,self,self.canvas())
314 def addInLink(self,link):
315 self.__inList.append(link)
319 class OutPortItem(PortItem):
320 def __init__(self,node,port,canvas):
321 PortItem.__init__(self,node,port,canvas)
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()) )
331 if isinstance(obj,InPortItem):
333 l=LinkItem(self,obj,self.canvas())
335 def addOutLink(self,link):
336 self.__outList.append(link)
338 class InStreamItem(InPortItem):
339 def __init__(self,node,port,canvas):
340 InPortItem.__init__(self,node,port,canvas)
341 self.setBrush(QBrush(Qt.green))
343 class OutStreamItem(OutPortItem):
344 def __init__(self,node,port,canvas):
345 OutPortItem.__init__(self,node,port,canvas)
346 self.setBrush(QBrush(Qt.green))
348 class Cell(QCanvasRectangle,pilot.PyObserver):
352 "magenta":Qt.magenta,
353 "purple":Qt.darkMagenta,
361 def __init__(self,node,canvas):
362 QCanvasRectangle.__init__(self,canvas)
363 pilot.PyObserver.__init__(self)
365 #node is an instance of YACS::ENGINE::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))
381 liste= self.node.getSetOfInputPort()
384 for inport in self.node.getSetOfInputPort():
385 p=InPortItem(self,inport,canvas)
388 self.inports.append(p)
390 for instream in self.node.getSetOfInputDataStreamPort():
391 p=InStreamItem(self,instream,canvas)
394 self.inports.append(p)
398 liste= self.node.getSetOfOutputPort()
401 for outport in self.node.getSetOfOutputPort():
402 p=OutPortItem(self,outport,canvas)
405 self.outports.append(p)
407 for outstream in self.node.getSetOfOutputDataStreamPort():
408 p=OutStreamItem(self,outstream,canvas)
411 self.outports.append(p)
418 p=InControlItem(self,self.node.getInGate(),canvas)
420 self.inports.append(p)
422 p=OutControlItem(self,self.node.getOutGate(),canvas)
424 self.outports.append(p)
431 "status":QEvent.User+1,
434 def pynotify(self,object,event):
435 #print "pynotify",event,object
437 evType=self.events[event]
438 ev=QCustomEvent(evType)
441 QApplication.postEvent(self.canvas(), ev)
442 #request immediate processing (deadlock risk ???)
443 #QApplication.sendPostedEvents(self.canvas(), evType)
444 #print "pynotify end"
446 #traceback.print_exc()
449 def customEvent(self,event):
450 if event.yacsEvent=="status":
452 state=object.getEffectiveState()
453 color=object.getColorState(state)
454 color= self.colors.get(color,Qt.white)
455 self.setBrush(QBrush(color))
457 print "Unknown custom event type:", event.type()
459 def moveBy(self,dx,dy):
460 QCanvasRectangle.moveBy(self,dx,dy)
461 self.label.moveBy(dx,dy)
462 for p in self.inports:
464 for p in self.outports:
468 QCanvasRectangle.show(self)
470 for p in self.inports:
472 for p in self.outports:
478 def popup(self,canvasView):
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)
486 def tooltip(self,view,pos):
487 r = QRect(pos.x(), pos.y(), self.width(), self.height())
488 s = QString( "node: " + self.node.getName())
490 #QToolTip(view).tip( r, s )