1 # Copyright (C) 2006-2024 CEA, EDF
3 # This library is free software; you can redistribute it and/or
4 # modify it under the terms of the GNU Lesser General Public
5 # License as published by the Free Software Foundation; either
6 # version 2.1 of the License, or (at your option) any later version.
8 # This library is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 # Lesser General Public License for more details.
13 # You should have received a copy of the GNU Lesser General Public
14 # License along with this library; if not, write to the Free Software
15 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 from qtcanvas import *
28 dispatcher=pilot.Dispatcher.getDispatcher()
30 class TextItem(QCanvasText):
31 """A text in a composite object"""
32 def __init__(self,obj,canvas):
33 QCanvasText.__init__(self,canvas)
37 """The composite object which contains the text"""
39 def moveBy(self,dx,dy):
40 """Request the text move by x,y"""
42 #the text is a part of a composite object
43 self.obj.moveBy(dx,dy)
45 #the text is independant
47 def myMove(self,dx,dy):
49 QCanvasText.moveBy(self,dx,dy)
51 """The canvas item has been selected"""
55 class PointItem(QCanvasEllipse):
56 def __init__(self,obj,x,y,canvas):
57 """Create a point contained in a composite line (obj)"""
58 QCanvasEllipse.__init__(self,6,6,canvas)
63 self.setPen(QPen(Qt.black))
64 self.setBrush(QBrush(Qt.red))
69 def setInline(self,inline):
71 if inline.z() >= self.z():
72 self.setZ(inline.z()+1)
73 def setOutline(self,outline):
75 if outline.z() >= self.z():
76 self.setZ(outline.z()+1)
78 def moveBy(self,dx,dy):
79 """Request the point move by x,y"""
82 def myMove(self,dx,dy):
84 QCanvasEllipse.moveBy(self,dx,dy)
86 self.outline.setFromPoint( int(self.x()), int(self.y()) )
88 self.inline.setToPoint( int(self.x()), int(self.y()) )
91 """The object which contains the point"""
94 def handleDoubleClick(self,pos):
95 self.obj.deletePoint(self,pos)
98 # print "PointItem.__del__"
101 """To remove from canvas"""
108 """The canvas item has been selected"""
110 class LineItem(QCanvasLine):
111 """A line between 2 points"""
112 def __init__(self,obj,fromPoint, toPoint,canvas):
113 QCanvasLine.__init__(self,canvas)
116 self.fromPoint=fromPoint
118 self.setPen(QPen(Qt.black))
119 self.setBrush(QBrush(Qt.red))
120 self.setPoints(int(fromPoint.x()),int(fromPoint.y()), int(toPoint.x()), int(toPoint.y()))
121 self.setZ(min(fromPoint.z(),toPoint.z())-1)
122 self.setVisible(True)
123 self.arrow = QCanvasPolygon(self.canvas())
124 self.arrow.setBrush(QBrush(Qt.black))
128 def setFromPoint(self,x,y):
129 self.setPoints(x,y,self.endPoint().x(),self.endPoint().y())
131 def setToPoint(self,x,y):
132 self.setPoints(self.startPoint().x(), self.startPoint().y(),x,y)
134 def moveBy(self,dx,dy):
135 """Disable line move"""
139 x1,y1=self.startPoint().x(),self.startPoint().y()
140 x2,y2=self.endPoint().x(),self.endPoint().y()
141 d=math.hypot(x2-x1,y2-y1)
148 pa.setPoint(0, QPoint(x+l*cosa,y+l*sina))
149 pa.setPoint(1, QPoint(x-e*sina,y+e*cosa))
150 pa.setPoint(2, QPoint(x+e*sina,y-e*cosa))
151 self.arrow.setPoints(pa)
154 """The object which contains the line"""
156 def handleDoubleClick(self,pos):
158 self.obj.splitline(self,pos)
161 # print "LineItem.__del__"
164 """To remove from canvas"""
169 self.arrow.setCanvas(None)
173 """The canvas item has been selected"""
176 def __init__(self,fromPort, toPort,canvas):
177 self.fromPort=fromPort
181 fromPort.addOutLink(self)
182 toPort.addInLink(self)
185 self.lines.append(LineItem(self,fromPort, toPort,canvas))
187 def deletePoint(self,point,pos):
188 """Delete intermediate point"""
189 if point not in self.points:
191 self.points.remove(point)
193 outline=point.outline
194 inline.toPoint=outline.toPoint
195 inline.setToPoint(outline.toPoint.x(),outline.toPoint.y())
196 self.lines.remove(outline)
197 if inline.toPoint in self.points:
198 inline.toPoint.setInline(inline)
203 def clearPoints(self):
204 #make a copy as deletePoint modify self.points
205 for point in self.points[:]:
206 self.deletePoint(point,0)
208 def splitline(self,line,pos):
209 self.splitLine(line,pos.x(),pos.y())
211 def splitLine(self,line,x,y):
212 """Split line at position x,y"""
214 point=PointItem(self,x,y,self.canvas)
215 self.points.append(point)
216 i=self.lines.index(line)
218 newline=LineItem(self,point,line.toPoint,self.canvas)
219 if line.toPoint in self.points:
220 #line not connected to port : reconnect newline
221 line.toPoint.setInline(newline)
222 self.lines.insert(i+1,newline)
226 point.setInline(line)
227 point.setOutline(newline)
229 def setFromPoint(self,x,y):
231 first.setFromPoint(x,y)
233 def setToPoint(self,x,y):
237 def moveBy(self,dx,dy):
240 def popup(self,canvasView):
242 caption = QLabel( "<font color=darkblue><u><b>Link Menu</b></u></font>",menu )
243 caption.setAlignment( Qt.AlignCenter )
244 menu.insertItem( caption )
245 menu.insertItem("Delete", self.delete)
251 def tooltip(self,view,pos):
252 r = QRect(pos.x(), pos.y(), pos.x()+10, pos.y()+10)
253 s = QString( "link: "+self.fromPort.port.getNode().getName() +":"+self.fromPort.port.getName()+"->"+self.toPort.port.getNode().getName()+":"+self.toPort.port.getName() )
257 """The canvas item has been selected"""
259 class ControlLinkItem(LinkItem):
260 def tooltip(self,view,pos):
261 r = QRect(pos.x(), pos.y(), pos.x()+10, pos.y()+10)
262 s = QString( "link: "+self.fromPort.port.getNode().getName()+"->"+self.toPort.port.getNode().getName())
264 #QToolTip(view).tip( r, s )
266 class ControlItem(QCanvasRectangle):
267 def __init__(self,node,port,canvas):
268 QCanvasRectangle.__init__(self,canvas)
271 self.setPen(QPen(Qt.black))
272 self.setBrush(QBrush(Qt.red))
273 self.setZ(node.z()+1)
275 self.item=Item.adapt(self.port)
277 def moveBy(self,dx,dy):
278 self.node.moveBy(dx,dy)
280 def myMove(self,dx,dy):
281 QCanvasRectangle.moveBy(self,dx,dy)
286 def popup(self,canvasView):
287 self.context=canvasView
289 caption = QLabel( "<font color=darkblue><u><b>Port Menu</b></u></font>",menu )
290 caption.setAlignment( Qt.AlignCenter )
291 menu.insertItem( caption )
292 menu.insertItem("Connect", self.connect)
296 print("ControlItem.connect",self.context)
298 item=Item.adapt(self.port)
301 self.context.connecting(item)
302 #self.context.connecting(self)
305 #Protocol to link 2 objects (ports, at first)
306 #First, notify the canvas View (or any view that can select) we are connecting (see method connect above)
307 #Second (and last) make the link in the link method of object that was declared connecting
310 def tooltip(self,view,pos):
311 r = QRect(pos.x(), pos.y(), self.width(), self.height())
312 s = QString( "gate:")
316 """The canvas item has been selected"""
317 #print "control port selected"
318 item=Item.adapt(self.port)
321 class InControlItem(ControlItem):
322 def __init__(self,node,port,canvas):
323 ControlItem.__init__(self,node,port,canvas)
326 def myMove(self,dx,dy):
327 ControlItem.myMove(self,dx,dy)
328 for link in self.__inList:
329 link.setToPoint( int(self.x()), int(self.y()) )
332 #Here we create the link between self and obj.
333 #self has been declared connecting in connect method
335 if isinstance(obj,OutControlItem):
337 l=LinkItem(obj,self,self.canvas())
339 def addInLink(self,link):
340 self.__inList.append(link)
342 def tooltip(self,view,pos):
343 r = QRect(pos.x(), pos.y(), self.width(), self.height())
344 s = QString( "ingate:")
346 #QToolTip(view).tip( r, s )
348 class OutControlItem(ControlItem):
349 def __init__(self,node,port,canvas):
350 ControlItem.__init__(self,node,port,canvas)
353 def myMove(self,dx,dy):
354 ControlItem.myMove(self,dx,dy)
355 for link in self.__outList:
356 link.setFromPoint( int(self.x()), int(self.y()) )
359 #Here we create the link between self and obj.
360 #self has been declared connecting in connect method
362 if isinstance(obj,InControlItem):
364 l=LinkItem(self,obj,self.canvas())
366 def addOutLink(self,link):
367 self.__outList.append(link)
369 def tooltip(self,view,pos):
370 r = QRect(pos.x(), pos.y(), self.width(), self.height())
371 s = QString( "outgate:")
373 #QToolTip(view).tip( r, s )
376 return self.__outList
378 class PortItem(QCanvasEllipse):
379 def __init__(self,node,port,canvas):
380 QCanvasEllipse.__init__(self,6,6,canvas)
383 self.item=Item.adapt(self.port)
384 self.setPen(QPen(Qt.black))
385 self.setBrush(QBrush(Qt.red))
386 self.setZ(node.z()+1)
389 def moveBy(self,dx,dy):
390 self.node.moveBy(dx,dy)
392 def myMove(self,dx,dy):
393 QCanvasEllipse.moveBy(self,dx,dy)
398 def popup(self,canvasView):
399 self.context=canvasView
401 caption = QLabel( "<font color=darkblue><u><b>Port Menu</b></u></font>",menu )
402 caption.setAlignment( Qt.AlignCenter )
403 menu.insertItem( caption )
404 menu.insertItem("Connect", self.connect)
408 print("PortItem.connect",self.context)
410 item=Item.adapt(self.port)
412 self.context.connecting(item)
413 #self.context.connecting(self)
416 print("PortItem.link:",obj)
418 def tooltip(self,view,pos):
419 r = QRect(pos.x(),pos.y(),self.width(), self.height())
420 t=self.port.edGetType()
421 s = QString( "port: " + self.port.getName() + ":" + t.name())
425 """The canvas item has been selected"""
426 #print "port selected"
427 item=Item.adapt(self.port)
430 class InPortItem(PortItem):
431 def __init__(self,node,port,canvas):
432 PortItem.__init__(self,node,port,canvas)
435 def myMove(self,dx,dy):
436 PortItem.myMove(self,dx,dy)
437 for link in self.__inList:
438 link.setToPoint( int(self.x()), int(self.y()) )
441 #Here we create the link between self and obj.
442 #self has been declared connecting in connect method
444 if isinstance(obj,OutPortItem):
446 l=LinkItem(obj,self,self.canvas())
448 def addInLink(self,link):
449 self.__inList.append(link)
451 class OutPortItem(PortItem):
452 def __init__(self,node,port,canvas):
453 PortItem.__init__(self,node,port,canvas)
456 def myMove(self,dx,dy):
457 PortItem.myMove(self,dx,dy)
458 for link in self.__outList:
459 link.setFromPoint( int(self.x()), int(self.y()) )
462 #Here we create the link between self and obj.
463 #self has been declared connecting in connect method
465 if isinstance(obj,InPortItem):
467 l=LinkItem(self,obj,self.canvas())
469 def addOutLink(self,link):
470 self.__outList.append(link)
473 return self.__outList
475 class InStreamItem(InPortItem):
476 def __init__(self,node,port,canvas):
477 InPortItem.__init__(self,node,port,canvas)
478 self.setBrush(QBrush(Qt.green))
480 class OutStreamItem(OutPortItem):
481 def __init__(self,node,port,canvas):
482 OutPortItem.__init__(self,node,port,canvas)
483 self.setBrush(QBrush(Qt.green))
485 class Cell(QCanvasRectangle,pypilot.PyObserver):
489 "magenta":Qt.magenta,
490 "purple":Qt.darkMagenta,
498 def __init__(self,node,canvas):
499 QCanvasRectangle.__init__(self,canvas)
500 pypilot.PyObserver.__init__(self)
504 #node is an instance of YACS::ENGINE::Node
506 self.item=Item.adapt(self.node)
507 dispatcher.addObserver(self,node,"status")
508 self.label=TextItem(self,canvas)
509 self.label.setText(self.node.getName())
510 self.label.setFont(QFont("Helvetica",8))
511 rect=self.label.boundingRect()
512 self.label.setZ(self.z()+1)
513 self.label.myMove(self.x()+self.width()/2-rect.width()/2,self.y()+self.height()/2-rect.height()/2)
514 color= self.colors.get(node.getColorState(node.getEffectiveState()),Qt.white)
515 self.setBrush(QBrush(color))
519 for inport in self.node.getSetOfInputPort():
520 p=InPortItem(self,inport,canvas)
523 self.inports.append(p)
525 for instream in self.node.getSetOfInputDataStreamPort():
526 p=InStreamItem(self,instream,canvas)
529 self.inports.append(p)
535 for outport in self.node.getSetOfOutputPort():
536 p=OutPortItem(self,outport,canvas)
539 self.outports.append(p)
541 for outstream in self.node.getSetOfOutputDataStreamPort():
542 p=OutStreamItem(self,outstream,canvas)
545 self.outports.append(p)
552 p=InControlItem(self,self.node.getInGate(),canvas)
554 self.inports.append(p)
556 p=OutControlItem(self,self.node.getOutGate(),canvas)
558 self.outports.append(p)
565 "status":QEvent.User+1,
568 def pynotify(self,object,event):
569 #print "pynotify",event,object
571 evType=self.events[event]
572 ev=QCustomEvent(evType)
575 QApplication.postEvent(self.canvas(), ev)
576 #request immediate processing (deadlock risk ???)
577 #QApplication.sendPostedEvents(self.canvas(), evType)
578 #print "pynotify end"
580 #traceback.print_exc()
583 def customEvent(self,event):
584 if event.yacsEvent=="status":
586 state=object.getEffectiveState()
587 color=object.getColorState(state)
588 color= self.colors.get(color,Qt.white)
589 self.setBrush(QBrush(color))
591 print("Unknown custom event type:", event.type())
593 def moveBy(self,dx,dy):
594 QCanvasRectangle.moveBy(self,dx,dy)
595 self.label.myMove(dx,dy)
596 for p in self.inports:
598 for p in self.outports:
602 QCanvasRectangle.show(self)
604 for p in self.inports:
606 for p in self.outports:
612 def popup(self,canvasView):
614 caption = QLabel( "<font color=darkblue><u><b>Node Menu</b></u></font>",menu )
615 caption.setAlignment( Qt.AlignCenter )
616 menu.insertItem( caption )
617 menu.insertItem("Browse", self.browse)
620 def tooltip(self,view,pos):
621 r = QRect(pos.x(), pos.y(), self.width(), self.height())
622 s = QString( "node: " + self.node.getName())
624 #QToolTip(view).tip( r, s )
630 """The canvas item has been selected"""
631 #print "node selected"
632 item=Item.adapt(self.node)