10 dispatcher=pilot.Dispatcher.getDispatcher()
12 class TextItem(QCanvasText):
13 """A text in a composite object"""
14 def __init__(self,obj,canvas):
15 QCanvasText.__init__(self,canvas)
19 """The composite object which contains the text"""
21 def moveBy(self,dx,dy):
22 """Request the text move by x,y"""
24 #the text is a part of a composite object
25 self.obj.moveBy(dx,dy)
27 #the text is independant
29 def myMove(self,dx,dy):
31 QCanvasText.moveBy(self,dx,dy)
33 """The canvas item has been selected"""
37 class PointItem(QCanvasEllipse):
38 def __init__(self,obj,x,y,canvas):
39 """Create a point contained in a composite line (obj)"""
40 QCanvasEllipse.__init__(self,6,6,canvas)
45 self.setPen(QPen(Qt.black))
46 self.setBrush(QBrush(Qt.red))
51 def setInline(self,inline):
53 if inline.z() >= self.z():
54 self.setZ(inline.z()+1)
55 def setOutline(self,outline):
57 if outline.z() >= self.z():
58 self.setZ(outline.z()+1)
60 def moveBy(self,dx,dy):
61 """Request the point move by x,y"""
64 def myMove(self,dx,dy):
66 QCanvasEllipse.moveBy(self,dx,dy)
68 self.outline.setFromPoint( int(self.x()), int(self.y()) )
70 self.inline.setToPoint( int(self.x()), int(self.y()) )
73 """The object which contains the point"""
76 def handleDoubleClick(self,pos):
77 self.obj.deletePoint(self,pos)
80 # print "PointItem.__del__"
83 """To remove from canvas"""
90 """The canvas item has been selected"""
92 class LineItem(QCanvasLine):
93 """A line between 2 points"""
94 def __init__(self,obj,fromPoint, toPoint,canvas):
95 QCanvasLine.__init__(self,canvas)
98 self.fromPoint=fromPoint
100 self.setPen(QPen(Qt.black))
101 self.setBrush(QBrush(Qt.red))
102 self.setPoints(int(fromPoint.x()),int(fromPoint.y()), int(toPoint.x()), int(toPoint.y()))
103 self.setZ(min(fromPoint.z(),toPoint.z())-1)
104 self.setVisible(True)
105 self.arrow = QCanvasPolygon(self.canvas())
106 self.arrow.setBrush(QBrush(Qt.black))
110 def setFromPoint(self,x,y):
111 self.setPoints(x,y,self.endPoint().x(),self.endPoint().y())
113 def setToPoint(self,x,y):
114 self.setPoints(self.startPoint().x(), self.startPoint().y(),x,y)
116 def moveBy(self,dx,dy):
117 """Disable line move"""
121 x1,y1=self.startPoint().x(),self.startPoint().y()
122 x2,y2=self.endPoint().x(),self.endPoint().y()
123 d=math.hypot(x2-x1,y2-y1)
130 pa.setPoint(0, QPoint(x+l*cosa,y+l*sina))
131 pa.setPoint(1, QPoint(x-e*sina,y+e*cosa))
132 pa.setPoint(2, QPoint(x+e*sina,y-e*cosa))
133 self.arrow.setPoints(pa)
136 """The object which contains the line"""
138 def handleDoubleClick(self,pos):
140 self.obj.splitline(self,pos)
143 # print "LineItem.__del__"
146 """To remove from canvas"""
151 self.arrow.setCanvas(None)
155 """The canvas item has been selected"""
158 def __init__(self,fromPort, toPort,canvas):
159 self.fromPort=fromPort
163 fromPort.addOutLink(self)
164 toPort.addInLink(self)
167 self.lines.append(LineItem(self,fromPort, toPort,canvas))
169 def deletePoint(self,point,pos):
170 """Delete intermediate point"""
171 if point not in self.points:
173 self.points.remove(point)
175 outline=point.outline
176 inline.toPoint=outline.toPoint
177 inline.setToPoint(outline.toPoint.x(),outline.toPoint.y())
178 self.lines.remove(outline)
179 if inline.toPoint in self.points:
180 inline.toPoint.setInline(inline)
185 def clearPoints(self):
186 #make a copy as deletePoint modify self.points
187 for point in self.points[:]:
188 self.deletePoint(point,0)
190 def splitline(self,line,pos):
191 self.splitLine(line,pos.x(),pos.y())
193 def splitLine(self,line,x,y):
194 """Split line at position x,y"""
196 point=PointItem(self,x,y,self.canvas)
197 self.points.append(point)
198 i=self.lines.index(line)
200 newline=LineItem(self,point,line.toPoint,self.canvas)
201 if line.toPoint in self.points:
202 #line not connected to port : reconnect newline
203 line.toPoint.setInline(newline)
204 self.lines.insert(i+1,newline)
208 point.setInline(line)
209 point.setOutline(newline)
211 def setFromPoint(self,x,y):
213 first.setFromPoint(x,y)
215 def setToPoint(self,x,y):
219 def moveBy(self,dx,dy):
222 def popup(self,canvasView):
224 caption = QLabel( "<font color=darkblue><u><b>Link Menu</b></u></font>",menu )
225 caption.setAlignment( Qt.AlignCenter )
226 menu.insertItem( caption )
227 menu.insertItem("Delete", self.delete)
233 def tooltip(self,view,pos):
234 r = QRect(pos.x(), pos.y(), pos.x()+10, pos.y()+10)
235 s = QString( "link: "+self.fromPort.port.getNode().getName() +":"+self.fromPort.port.getName()+"->"+self.toPort.port.getNode().getName()+":"+self.toPort.port.getName() )
239 """The canvas item has been selected"""
241 class ControlLinkItem(LinkItem):
242 def tooltip(self,view,pos):
243 r = QRect(pos.x(), pos.y(), pos.x()+10, pos.y()+10)
244 s = QString( "link: "+self.fromPort.port.getNode().getName()+"->"+self.toPort.port.getNode().getName())
246 #QToolTip(view).tip( r, s )
248 class ControlItem(QCanvasRectangle):
249 def __init__(self,node,port,canvas):
250 QCanvasRectangle.__init__(self,canvas)
253 self.setPen(QPen(Qt.black))
254 self.setBrush(QBrush(Qt.red))
255 self.setZ(node.z()+1)
257 self.item=Item.adapt(self.port)
259 def moveBy(self,dx,dy):
260 self.node.moveBy(dx,dy)
262 def myMove(self,dx,dy):
263 QCanvasRectangle.moveBy(self,dx,dy)
268 def popup(self,canvasView):
269 self.context=canvasView
271 caption = QLabel( "<font color=darkblue><u><b>Port Menu</b></u></font>",menu )
272 caption.setAlignment( Qt.AlignCenter )
273 menu.insertItem( caption )
274 menu.insertItem("Connect", self.connect)
278 print "ControlItem.connect",self.context
280 item=Item.adapt(self.port)
283 self.context.connecting(item)
284 #self.context.connecting(self)
287 #Protocol to link 2 objects (ports, at first)
288 #First, notify the canvas View (or any view that can select) we are connecting (see method connect above)
289 #Second (and last) make the link in the link method of object that was declared connecting
292 def tooltip(self,view,pos):
293 r = QRect(pos.x(), pos.y(), self.width(), self.height())
294 s = QString( "gate:")
298 """The canvas item has been selected"""
299 #print "control port selected"
300 item=Item.adapt(self.port)
303 class InControlItem(ControlItem):
304 def __init__(self,node,port,canvas):
305 ControlItem.__init__(self,node,port,canvas)
308 def myMove(self,dx,dy):
309 ControlItem.myMove(self,dx,dy)
310 for link in self.__inList:
311 link.setToPoint( int(self.x()), int(self.y()) )
314 #Here we create the link between self and obj.
315 #self has been declared connecting in connect method
317 if isinstance(obj,OutControlItem):
319 l=LinkItem(obj,self,self.canvas())
321 def addInLink(self,link):
322 self.__inList.append(link)
324 def tooltip(self,view,pos):
325 r = QRect(pos.x(), pos.y(), self.width(), self.height())
326 s = QString( "ingate:")
328 #QToolTip(view).tip( r, s )
330 class OutControlItem(ControlItem):
331 def __init__(self,node,port,canvas):
332 ControlItem.__init__(self,node,port,canvas)
335 def myMove(self,dx,dy):
336 ControlItem.myMove(self,dx,dy)
337 for link in self.__outList:
338 link.setFromPoint( int(self.x()), int(self.y()) )
341 #Here we create the link between self and obj.
342 #self has been declared connecting in connect method
344 if isinstance(obj,InControlItem):
346 l=LinkItem(self,obj,self.canvas())
348 def addOutLink(self,link):
349 self.__outList.append(link)
351 def tooltip(self,view,pos):
352 r = QRect(pos.x(), pos.y(), self.width(), self.height())
353 s = QString( "outgate:")
355 #QToolTip(view).tip( r, s )
358 return self.__outList
360 class PortItem(QCanvasEllipse):
361 def __init__(self,node,port,canvas):
362 QCanvasEllipse.__init__(self,6,6,canvas)
365 self.item=Item.adapt(self.port)
366 self.setPen(QPen(Qt.black))
367 self.setBrush(QBrush(Qt.red))
368 self.setZ(node.z()+1)
371 def moveBy(self,dx,dy):
372 self.node.moveBy(dx,dy)
374 def myMove(self,dx,dy):
375 QCanvasEllipse.moveBy(self,dx,dy)
380 def popup(self,canvasView):
381 self.context=canvasView
383 caption = QLabel( "<font color=darkblue><u><b>Port Menu</b></u></font>",menu )
384 caption.setAlignment( Qt.AlignCenter )
385 menu.insertItem( caption )
386 menu.insertItem("Connect", self.connect)
390 print "PortItem.connect",self.context
392 item=Item.adapt(self.port)
394 self.context.connecting(item)
395 #self.context.connecting(self)
398 print "PortItem.link:",obj
400 def tooltip(self,view,pos):
401 r = QRect(pos.x(),pos.y(),self.width(), self.height())
402 t=self.port.edGetType()
403 s = QString( "port: " + self.port.getName() + ":" + t.name())
407 """The canvas item has been selected"""
408 #print "port selected"
409 item=Item.adapt(self.port)
412 class InPortItem(PortItem):
413 def __init__(self,node,port,canvas):
414 PortItem.__init__(self,node,port,canvas)
417 def myMove(self,dx,dy):
418 PortItem.myMove(self,dx,dy)
419 for link in self.__inList:
420 link.setToPoint( int(self.x()), int(self.y()) )
423 #Here we create the link between self and obj.
424 #self has been declared connecting in connect method
426 if isinstance(obj,OutPortItem):
428 l=LinkItem(obj,self,self.canvas())
430 def addInLink(self,link):
431 self.__inList.append(link)
433 class OutPortItem(PortItem):
434 def __init__(self,node,port,canvas):
435 PortItem.__init__(self,node,port,canvas)
438 def myMove(self,dx,dy):
439 PortItem.myMove(self,dx,dy)
440 for link in self.__outList:
441 link.setFromPoint( int(self.x()), int(self.y()) )
444 #Here we create the link between self and obj.
445 #self has been declared connecting in connect method
447 if isinstance(obj,InPortItem):
449 l=LinkItem(self,obj,self.canvas())
451 def addOutLink(self,link):
452 self.__outList.append(link)
455 return self.__outList
457 class InStreamItem(InPortItem):
458 def __init__(self,node,port,canvas):
459 InPortItem.__init__(self,node,port,canvas)
460 self.setBrush(QBrush(Qt.green))
462 class OutStreamItem(OutPortItem):
463 def __init__(self,node,port,canvas):
464 OutPortItem.__init__(self,node,port,canvas)
465 self.setBrush(QBrush(Qt.green))
467 class Cell(QCanvasRectangle,pypilot.PyObserver):
471 "magenta":Qt.magenta,
472 "purple":Qt.darkMagenta,
480 def __init__(self,node,canvas):
481 QCanvasRectangle.__init__(self,canvas)
482 pypilot.PyObserver.__init__(self)
486 #node is an instance of YACS::ENGINE::Node
488 self.item=Item.adapt(self.node)
489 dispatcher.addObserver(self,node,"status")
490 self.label=TextItem(self,canvas)
491 self.label.setText(self.node.getName())
492 self.label.setFont(QFont("Helvetica",8))
493 rect=self.label.boundingRect()
494 self.label.setZ(self.z()+1)
495 self.label.myMove(self.x()+self.width()/2-rect.width()/2,self.y()+self.height()/2-rect.height()/2)
496 color= self.colors.get(node.getColorState(node.getEffectiveState()),Qt.white)
497 self.setBrush(QBrush(color))
501 for inport in self.node.getSetOfInputPort():
502 p=InPortItem(self,inport,canvas)
505 self.inports.append(p)
507 for instream in self.node.getSetOfInputDataStreamPort():
508 p=InStreamItem(self,instream,canvas)
511 self.inports.append(p)
517 for outport in self.node.getSetOfOutputPort():
518 p=OutPortItem(self,outport,canvas)
521 self.outports.append(p)
523 for outstream in self.node.getSetOfOutputDataStreamPort():
524 p=OutStreamItem(self,outstream,canvas)
527 self.outports.append(p)
534 p=InControlItem(self,self.node.getInGate(),canvas)
536 self.inports.append(p)
538 p=OutControlItem(self,self.node.getOutGate(),canvas)
540 self.outports.append(p)
547 "status":QEvent.User+1,
550 def pynotify(self,object,event):
551 #print "pynotify",event,object
553 evType=self.events[event]
554 ev=QCustomEvent(evType)
557 QApplication.postEvent(self.canvas(), ev)
558 #request immediate processing (deadlock risk ???)
559 #QApplication.sendPostedEvents(self.canvas(), evType)
560 #print "pynotify end"
562 #traceback.print_exc()
565 def customEvent(self,event):
566 if event.yacsEvent=="status":
568 state=object.getEffectiveState()
569 color=object.getColorState(state)
570 color= self.colors.get(color,Qt.white)
571 self.setBrush(QBrush(color))
573 print "Unknown custom event type:", event.type()
575 def moveBy(self,dx,dy):
576 QCanvasRectangle.moveBy(self,dx,dy)
577 self.label.myMove(dx,dy)
578 for p in self.inports:
580 for p in self.outports:
584 QCanvasRectangle.show(self)
586 for p in self.inports:
588 for p in self.outports:
594 def popup(self,canvasView):
596 caption = QLabel( "<font color=darkblue><u><b>Node Menu</b></u></font>",menu )
597 caption.setAlignment( Qt.AlignCenter )
598 menu.insertItem( caption )
599 menu.insertItem("Browse", self.browse)
602 def tooltip(self,view,pos):
603 r = QRect(pos.x(), pos.y(), self.width(), self.height())
604 s = QString( "node: " + self.node.getName())
606 #QToolTip(view).tip( r, s )
612 """The canvas item has been selected"""
613 #print "node selected"
614 item=Item.adapt(self.node)