class EFrameLayout(QGraphicsPolygonItem): def __init__(self, parent=None, scene=None): super(EFrameLayout, self).__init__(parent, scene) self.setFlag(QGraphicsItem.ItemIsMovable, True) self.setAcceptsHoverEvents(True) self.__name = QGraphicsTextItem() self.__name.setPlainText('Frame Layout') self.__handleWidth = 500 self.__handleHeight = 20 self.__separator = 5 self.__boundExtra = 3 + self.pen().width() self.__handleRect = QRectF( 0.0 , 0.0 , self.__handleWidth, self.__handleHeight ) self.__controlsBound = 0.0 self.__controls = [] self.__isDefaultPen = False self.__isCollapsed = True self.__pens = { 0: EDraw.EColor.DefaultLeaveHoverPen, 1: EDraw.EColor.DefaultEnterHoverPen } self.setPen(self.__pens[self.__isDefaultPen]) @property def Label(self): return self.__name.toPlainText() @Label.setter def Label(self, label): self.__name.setPlainText( str( label ) ) @property def Width(self): return self.__handleWidth @Width.setter def Width(self, width): self.__handleWidth = width self.updateGeometry() def toggleContentVisibility(self): if not len(self.__controls): return if self.__controls[0].isVisible(): [ control.hide() for control in self.__controls ] self.__isCollapsed = True return [ control.show() for control in self.__controls ] self.__isCollapsed = False def updateGeometry(self): self.__handleRect = QRectF( 0.0 , 0.0 , self.__handleWidth, self.__handleHeight ) if not len(self.__controls) or self.__isCollapsed: self.__controlsBound = 0.0 return self.__controlsBound = 0.0 self.__controlsBound = self.__separator self.__controlsBound += sum( [ control.boundingRect().height() + self.__separator for control in self.__controls ] ) step = self.__handleHeight + self.__separator * 2 for control in self.__controls: control.Name.setTextWidth( self.__controlNameWidth ) control.Width = self.__handleRect.normalized().adjusted( 5.0, 0.0, -5.0, 0.0 ).width() control.setPos( 5.0 , step ) step += control.boundingRect().height() + self.__separator def addControl(self, control): if not isinstance(control, EControlsGroup): raise AttributeError self.__controls.append(control) control.setParentItem(self) control.setFlag(QGraphicsItem.ItemIsMovable, False) self.__controlNameWidth = max([ control.Name.boundingRect().width() for control in self.__controls ]) + 5 self.__isCollapsed = False self.updateGeometry() def clear(self): [ control.setParentItem(None) for control in self.__controls ] self.__controls = [] self.updateGeometry() def mouseDoubleClickEvent(self, mouseEvent): QGraphicsPolygonItem.mouseDoubleClickEvent(self, mouseEvent) self.toggleContentVisibility() self.updateGeometry() def shape(self): return QGraphicsItem.shape(self) def boundingRect(self): return self.__handleRect.normalized().adjusted( 0.0, 0.0, 0.0, self.__controlsBound ) def paint(self, painter, option, widget=None): if not self.__isCollapsed: painter.setPen( QPen( QColor( 0, 0, 0, 50 ), 2 , Qt.SolidLine ) ) painter.setBrush( QColor( 0, 0, 0, 50 ) ) painter.drawRect( self.boundingRect().adjusted( self.pen().width(), self.__handleHeight , -self.pen().width(), 0.0 ) ) painter.setPen(self.pen()) painter.setBrush( EDraw.EColor.LinearGradient( self.__handleRect, Qt.darkGray ) ) #painter.drawPolygon( QPolygonF( self.__handleRect.normalized().adjusted(-self.__boundExtra, 0.0, self.__boundExtra, 0.0 ) ) ) painter.drawPolygon( QPolygonF( self.__handleRect ) ) painter.setPen(Qt.lightGray) r = QRectF( 0.0, 0.0, self.__name.boundingRect().width(), self.__handleRect.height() ) painter.drawText( r, Qt.AlignCenter, self.__name.toPlainText() )
class EFrameLayout(QGraphicsPolygonItem): def __init__(self, parent=None, scene=None): super(EFrameLayout, self).__init__(parent, scene) self.setFlag(QGraphicsItem.ItemIsMovable, True) self.setAcceptsHoverEvents(True) self.__name = QGraphicsTextItem() self.__name.setPlainText('Frame Layout') self.__handleWidth = 500 self.__handleHeight = 20 self.__separator = 5 self.__boundExtra = 3 + self.pen().width() self.__handleRect = QRectF(0.0, 0.0, self.__handleWidth, self.__handleHeight) self.__controlsBound = 0.0 self.__controls = [] self.__isDefaultPen = False self.__isCollapsed = True self.__pens = { 0: EDraw.EColor.DefaultLeaveHoverPen, 1: EDraw.EColor.DefaultEnterHoverPen } self.setPen(self.__pens[self.__isDefaultPen]) @property def Label(self): return self.__name.toPlainText() @Label.setter def Label(self, label): self.__name.setPlainText(str(label)) @property def Width(self): return self.__handleWidth @Width.setter def Width(self, width): self.__handleWidth = width self.updateGeometry() def toggleContentVisibility(self): if not len(self.__controls): return if self.__controls[0].isVisible(): [control.hide() for control in self.__controls] self.__isCollapsed = True return [control.show() for control in self.__controls] self.__isCollapsed = False def updateGeometry(self): self.__handleRect = QRectF(0.0, 0.0, self.__handleWidth, self.__handleHeight) if not len(self.__controls) or self.__isCollapsed: self.__controlsBound = 0.0 return self.__controlsBound = 0.0 self.__controlsBound = self.__separator self.__controlsBound += sum([ control.boundingRect().height() + self.__separator for control in self.__controls ]) step = self.__handleHeight + self.__separator * 2 for control in self.__controls: control.Name.setTextWidth(self.__controlNameWidth) control.Width = self.__handleRect.normalized().adjusted( 5.0, 0.0, -5.0, 0.0).width() control.setPos(5.0, step) step += control.boundingRect().height() + self.__separator def addControl(self, control): if not isinstance(control, EControlsGroup): raise AttributeError self.__controls.append(control) control.setParentItem(self) control.setFlag(QGraphicsItem.ItemIsMovable, False) self.__controlNameWidth = max([ control.Name.boundingRect().width() for control in self.__controls ]) + 5 self.__isCollapsed = False self.updateGeometry() def clear(self): [control.setParentItem(None) for control in self.__controls] self.__controls = [] self.updateGeometry() def mouseDoubleClickEvent(self, mouseEvent): QGraphicsPolygonItem.mouseDoubleClickEvent(self, mouseEvent) self.toggleContentVisibility() self.updateGeometry() def shape(self): return QGraphicsItem.shape(self) def boundingRect(self): return self.__handleRect.normalized().adjusted(0.0, 0.0, 0.0, self.__controlsBound) def paint(self, painter, option, widget=None): if not self.__isCollapsed: painter.setPen(QPen(QColor(0, 0, 0, 50), 2, Qt.SolidLine)) painter.setBrush(QColor(0, 0, 0, 50)) painter.drawRect(self.boundingRect().adjusted( self.pen().width(), self.__handleHeight, -self.pen().width(), 0.0)) painter.setPen(self.pen()) painter.setBrush( EDraw.EColor.LinearGradient(self.__handleRect, Qt.darkGray)) #painter.drawPolygon( QPolygonF( self.__handleRect.normalized().adjusted(-self.__boundExtra, 0.0, self.__boundExtra, 0.0 ) ) ) painter.drawPolygon(QPolygonF(self.__handleRect)) painter.setPen(Qt.lightGray) r = QRectF(0.0, 0.0, self.__name.boundingRect().width(), self.__handleRect.height()) painter.drawText(r, Qt.AlignCenter, self.__name.toPlainText())
class CanvasProps (QGraphicsItem): def __init__(self, parent=None, scene=None): QGraphicsItem.__init__ (self) self.parent = parent self.helper = self.parent.getHelper() #self.setFlags (QGraphicsItem.ItemIsSelectable) self.setAcceptsHoverEvents (True) self.pen_color = QPen (Qt.black, 2) self.color = QColor (Qt.white).dark (150) # init Canvas Animation Tweening self.timeline = QTimeLine (200) self.timeline.setFrameRange (0, 100) self.anim = QGraphicsItemAnimation () self.anim.setItem (self) self.anim.setTimeLine (self.timeline) self.helper.connect (self.timeline, SIGNAL("finished()"), self.moveFurtherUp) self.anim_active = False #self._nodename = QGraphicsTextItem ('text '+str(self.node_id), self) self._nodename = QGraphicsTextItem ('', self) self._nodename.setPos (QPointF (18, 20)) self._nodename.setDefaultTextColor (QColor (Qt.white).light (255)) self._nodename.setFont (QFont ("Helvetica", 11, QFont.Bold, False)) self._nodename.setTextWidth(120) self._nodename.setToolTip (self._nodename.toPlainText ()) #self._nodename.setHtml("<h2 align=\"center\">hello</h2><h2 align=\"center\">world 1234345345</h2>123"); self.props_list = [] self.props_textItem_value_list = [] self.FACTOR = 4.0 self._canvas_height = 0 def boundingRect (self): return QRectF (0, 0, 122, 150) def shape (self): path = QPainterPath () path.addRect (0, 0, 122, 20) return path def paint (self, painter, option, unused_widget): if option.state & QStyle.State_Selected: fillColor = self.color.dark (100) else: fillColor = self.color if option.state & QStyle.State_MouseOver: fillColor = fillColor.light (120) if option.levelOfDetail < 0.2: if option.levelOfDetail < 0.125: painter.fillRect (QRectF (0, 0, 110, 70), fillColor) return painter.setPen (QPen (Qt.black, 0)) painter.setBrush (fillColor) painter.drawRect (0, 0, 120, 20) return oldPen = painter.pen () pen = oldPen width = 0 if option.state & QStyle.State_Selected: width += 2 pen.setWidth (width) if option.state & QStyle.State_Sunken: level = 120 else: level = 100 painter.setBrush (QBrush (fillColor.dark (level))) #painter.drawRoundRect (QRect (0, 0, 80, 34+self.height), 20) painter.drawRect (QRect (0, 20, 120, 30+9*self._canvas_height)) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - def addProp (self, prop_name, prop_value): i = len (self.props_list) self.props_list.append (QGraphicsTextItem (prop_name + ' : ', self)) self.props_textItem_value_list.append (CustomFloatingText (prop_value, self)) # (1) adding the prop's name. self.props_list[i].setPos (QPointF (7, 35+i*10)) self.props_list[i].setDefaultTextColor (QColor (Qt.white).light (255)) self.props_list[i].setFont (QFont ("Helvetica", 9, QFont.StyleItalic, False)) self.props_list[i].setTextWidth (55) self.props_list[i].setToolTip (self.props_list[i].toPlainText ()) # (2) adding the prop's value. self.props_textItem_value_list[i].setTextInteractionFlags (Qt.TextEditable) self.props_textItem_value_list[i].setPos (QPointF (55, 35+i*10)) self.props_textItem_value_list[i].setDefaultTextColor (QColor (Qt.white).light (255)) self.props_textItem_value_list[i].setFont (QFont ("Helvetica", 9, QFont.StyleNormal, False)) self.props_textItem_value_list[i].setTextWidth (55) receiver = lambda value: self.parent.listenToChangedPropsValues (prop_name, value) self.helper.connect (self.props_textItem_value_list[i], SIGNAL ("textChanged(QString)"), receiver) def getProps (self): tmp_list = [] l = len (self.props_list) for i in range (0, l): tmp_list[i] = [self.props_list[i].toPlainText(), self.props_textItem_value_list[i].toPlainText()] return tmp_list def setTitle (self, title): self._nodename.setPlainText (title) def setCanvasHeightInUnits (self, ch): self._canvas_height = ch # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - def moveDown (self, canvas_height_in_units): self.anim_active = True self.upwards_flag = False self.canvas_height = canvas_height_in_units self.timeline.stop () self.anim.setPosAt (0, QPointF(0, 1+(self.canvas_height+1)*self.FACTOR)) self.anim.setPosAt (1, QPointF(0, 1+(self.canvas_height+2)*self.FACTOR)) self.timeline.start () self.update () def moveUp (self, canvas_height_in_units): if self.anim_active == False: self.anim_active = True self.upwards_flag = True self.canvas_height = canvas_height_in_units self.timeline.stop () self.anim.setPosAt (0, QPointF(0, 1+(self.canvas_height+1)*self.FACTOR)) self.anim.setPosAt (1, QPointF(0, 1+(self.canvas_height) *self.FACTOR)) self.timeline.start () self.update () # this method double-checks whether the canvas needs to be further up as a # result of receiving other asynchronous "delete link" SIGNALs while moving up. def moveFurtherUp (self): self.anim_active = False if self.upwards_flag==True: if self.parent.getMaxLen() < self.canvas_height: self.moveUp (self.canvas_height-1) # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - def hoverEnterEvent (self, e): self._nodename.setToolTip (self._nodename.toPlainText ()) QGraphicsItem.hoverEnterEvent (self, e) '''
class EControlsGroup(QGraphicsPolygonItem): def __init__(self, parent=None, scene=None): super(EControlsGroup, self).__init__(parent, scene) self.setFlag(QGraphicsItem.ItemIsMovable, True) self.setAcceptsHoverEvents(True) self.__kId = str(uuid.uuid1()) self.__name = QGraphicsTextItem() self.__name.setPlainText('EddGroup') self.__sWidth = 500 self.__sHeight = 20 self.__sExtra = 8 self.__controlsOffset = 5 self.__isDefaultPen = False self.__pens = { 0: EDraw.EColor.DefaultLeaveHoverPen, 1: EDraw.EColor.DefaultEnterHoverPen } self.setPen(self.__pens[self.__isDefaultPen]) self.__shapeRect = QRectF(0, 0, self.__sWidth, self.__sHeight) self.__controls = [] def updateGeometry(self): adjustableControls = [ control for control in self.__controls if control.Adjustable ] if len(adjustableControls): fixedControlsBounds = self.__name.boundingRect().width() fixedControlsBounds += sum( map(int, [ control.boundingRect().width() for control in self.__controls if not control.Adjustable ])) adjustableControlsWidth = int( (self.__sWidth - fixedControlsBounds)) / len(adjustableControls) step = self.__name.boundingRect().width() for control in self.__controls: if control.Adjustable: control.Width = adjustableControlsWidth - self.__controlsOffset control.setPos(step, 0.0) step += control.boundingRect().width() + self.__controlsOffset self.__shapeRect = QRectF( 0, -(self.__sExtra / 2), self.__sWidth, max([control.Height for control in self.__controls]) + self.__sExtra) @property def kId(self): return self.__kId @property def Name(self): return self.__name @Name.setter def Name(self, name): " %s" % self.__name.setPlainText(name) self.updateGeometry() @property def Width(self): return self.__sWidth @Width.setter def Width(self, width): self.__sWidth = width #- self.__controlsOffset * len( self.__controls ) self.updateGeometry() @property def Height(self): return self.__sHeight @property def Controls(self): return self.__controls @Controls.setter def Controls(self, control): control.setParentItem(self) self.__controls.append(control) self.updateGeometry() def toggleHighlight(self): if self.__isDefaultPen: self.__isDefaultPen = False self.setPen(self.__pens[self.__isDefaultPen]) return self.__isDefaultPen = True self.setPen(self.__pens[self.__isDefaultPen]) def hoverEnterEvent(self, mouseEvent): QGraphicsPolygonItem.hoverEnterEvent(self, mouseEvent) self.toggleHighlight() def hoverLeaveEvent(self, mouseEvent): QGraphicsPolygonItem.hoverLeaveEvent(self, mouseEvent) self.toggleHighlight() def shape(self): return QGraphicsItem.shape(self) def boundingRect(self): return self.__shapeRect def paint(self, painter, option, widget=None): painter.setPen(self.pen()) painter.setBrush( EDraw.EColor.LinearGradient(self.boundingRect(), Qt.darkGray)) painter.drawPolygon(QPolygonF(self.boundingRect())) painter.setPen(Qt.lightGray) r = QRectF(0.0, -(self.__sExtra / 2), self.__name.boundingRect().width(), self.boundingRect().height()) painter.drawText(r, Qt.AlignRight | Qt.AlignCenter, "%s: " % self.__name.toPlainText())
class EControlsGroup(QGraphicsPolygonItem): def __init__(self, parent=None, scene=None): super(EControlsGroup, self).__init__(parent, scene) self.setFlag(QGraphicsItem.ItemIsMovable, True) self.setAcceptsHoverEvents(True) self.__kId = str( uuid.uuid1() ) self.__name = QGraphicsTextItem() self.__name.setPlainText('EddGroup') self.__sWidth = 500 self.__sHeight = 20 self.__sExtra = 8 self.__controlsOffset = 5 self.__isDefaultPen = False self.__pens = { 0: EDraw.EColor.DefaultLeaveHoverPen, 1: EDraw.EColor.DefaultEnterHoverPen } self.setPen(self.__pens[self.__isDefaultPen]) self.__shapeRect = QRectF( 0 , 0, self.__sWidth, self.__sHeight ) self.__controls = [] def updateGeometry(self): adjustableControls = [ control for control in self.__controls if control.Adjustable ] if len(adjustableControls): fixedControlsBounds = self.__name.boundingRect().width() fixedControlsBounds += sum( map( int, [ control.boundingRect().width() for control in self.__controls if not control.Adjustable ] )) adjustableControlsWidth = int(( self.__sWidth - fixedControlsBounds )) / len(adjustableControls) step = self.__name.boundingRect().width() for control in self.__controls: if control.Adjustable: control.Width = adjustableControlsWidth - self.__controlsOffset control.setPos( step, 0.0 ) step += control.boundingRect().width() + self.__controlsOffset self.__shapeRect = QRectF( 0 , -(self.__sExtra / 2), self.__sWidth, max([ control.Height for control in self.__controls ]) + self.__sExtra ) @property def kId(self): return self.__kId @property def Name(self): return self.__name @Name.setter def Name(self, name ): " %s" % self.__name.setPlainText(name) self.updateGeometry() @property def Width(self): return self.__sWidth @Width.setter def Width(self, width): self.__sWidth = width #- self.__controlsOffset * len( self.__controls ) self.updateGeometry() @property def Height(self): return self.__sHeight @property def Controls(self): return self.__controls @Controls.setter def Controls(self, control): control.setParentItem(self) self.__controls.append(control) self.updateGeometry() def toggleHighlight(self): if self.__isDefaultPen: self.__isDefaultPen = False self.setPen(self.__pens[self.__isDefaultPen]) return self.__isDefaultPen = True self.setPen(self.__pens[self.__isDefaultPen]) def hoverEnterEvent(self, mouseEvent): QGraphicsPolygonItem.hoverEnterEvent(self, mouseEvent) self.toggleHighlight() def hoverLeaveEvent(self, mouseEvent): QGraphicsPolygonItem.hoverLeaveEvent(self, mouseEvent) self.toggleHighlight() def shape(self): return QGraphicsItem.shape(self) def boundingRect(self): return self.__shapeRect def paint(self, painter, option, widget=None): painter.setPen(self.pen()) painter.setBrush( EDraw.EColor.LinearGradient( self.boundingRect(), Qt.darkGray ) ) painter.drawPolygon( QPolygonF( self.boundingRect() ) ) painter.setPen(Qt.lightGray) r = QRectF( 0.0, -(self.__sExtra / 2), self.__name.boundingRect().width(), self.boundingRect().height() ) painter.drawText( r , Qt.AlignRight | Qt.AlignCenter , "%s: " % self.__name.toPlainText() )