def paint(self, painter, option, widget): """ Draws the circular port. Args: painter (QtGui.QPainter): painter used for drawing the item. option (QtGui.QStyleOptionGraphicsItem): used to describe the parameters needed to draw. widget (QtWidgets.QWidget): not used. """ painter.save() rect = QtCore.QRectF(0.0, 0.8, self._width, self._height) painter.setBrush(QtGui.QColor(0, 0, 0, 200)) painter.setPen(QtGui.QPen(QtGui.QColor(0, 0, 0, 255), 1.8)) path = QtGui.QPainterPath() path.addEllipse(rect) painter.drawPath(path) if self._hovered: color = QtGui.QColor(*PORT_HOVER_COLOR) border_color = QtGui.QColor(*PORT_HOVER_BORDER_COLOR) elif self.connected_pipes: color = QtGui.QColor(*PORT_ACTIVE_COLOR) border_color = QtGui.QColor(*PORT_ACTIVE_BORDER_COLOR) else: color = QtGui.QColor(*self.color) border_color = QtGui.QColor(*self.border_color) painter.setBrush(color) pen = QtGui.QPen(border_color, 1.5) painter.setPen(pen) painter.drawEllipse(self.boundingRect()) painter.restore()
def paint(self, painter, option, widget): """ Draws the circular port. Args: painter (QtGui.QPainter): painter used for drawing the item. option (QtGui.QStyleOptionGraphicsItem): used to describe the parameters needed to draw. widget (QtWidgets.QWidget): not used. """ painter.save() ### display the falloff colision ### # pen = QtGui.QPen(QtGui.QColor(255, 255, 255, 80), 0.8) # pen.setStyle(QtCore.Qt.DotLine) # painter.setPen(pen) # painter.drawRect(self.boundingRect()) rect_w = self._width / 1.8 rect_h = self._height / 1.8 rect_x = self.boundingRect().center().x() - (rect_w / 2) rect_y = self.boundingRect().center().y() - (rect_h / 2) port_rect = QtCore.QRectF(rect_x, rect_y, rect_w, rect_h) if self._hovered: color = QtGui.QColor(*PORT_HOVER_COLOR) border_color = QtGui.QColor(*PORT_HOVER_BORDER_COLOR) elif self.connected_pipes: color = QtGui.QColor(*PORT_ACTIVE_COLOR) border_color = QtGui.QColor(*PORT_ACTIVE_BORDER_COLOR) else: color = QtGui.QColor(*self.color) border_color = QtGui.QColor(*self.border_color) pen = QtGui.QPen(border_color, 1.8) painter.setPen(pen) painter.setBrush(color) painter.drawEllipse(port_rect) if self.connected_pipes and not self._hovered: painter.setBrush(border_color) w = port_rect.width() / 2.5 h = port_rect.height() / 2.5 rect = QtCore.QRectF(port_rect.center().x() - w / 2, port_rect.center().y() - h / 2, w, h) border_color = QtGui.QColor(*self.border_color) pen = QtGui.QPen(border_color, 1.6) painter.setPen(pen) painter.setBrush(border_color) painter.drawEllipse(rect) elif self._hovered: if self.multi_connection: pen = QtGui.QPen(border_color, 1.4) painter.setPen(pen) painter.setBrush(color) w = port_rect.width() / 1.8 h = port_rect.height() / 1.8 else: painter.setBrush(border_color) w = port_rect.width() / 3.5 h = port_rect.height() / 3.5 rect = QtCore.QRectF(port_rect.center().x() - w / 2, port_rect.center().y() - h / 2, w, h) painter.drawEllipse(rect) painter.restore()
def draw_path(self, p1, p2): path = QtGui.QPainterPath() path.moveTo(p1) path.lineTo(p2) self.setPath(path)
def paint(self, painter, option, widget): """ Draws the node base not the ports. Args: painter (QtGui.QPainter): painter used for drawing the item. option (QtGui.QStyleOptionGraphicsItem): used to describe the parameters needed to draw. widget (QtWidgets.QWidget): not used. """ painter.save() bg_border = 1.0 rect = QtCore.QRectF(0.5 - (bg_border / 2), 0.5 - (bg_border / 2), self._width + bg_border, self._height + bg_border) radius = 2 border_color = QtGui.QColor(*self.border_color) path = QtGui.QPainterPath() path.addRoundedRect(rect, radius, radius) painter.setPen(QtGui.QPen(border_color.darker(200), 1.5)) painter.drawPath(path) rect = self.boundingRect() bg_color = QtGui.QColor(*self.color) painter.setBrush(bg_color) painter.setPen(QtCore.Qt.NoPen) painter.drawRoundedRect(rect, radius, radius) if self.selected and NODE_SEL_COLOR: painter.setBrush(QtGui.QColor(*NODE_SEL_COLOR)) painter.drawRoundedRect(rect, radius, radius) label_rect = QtCore.QRectF(rect.left() + (radius / 2), rect.top() + (radius / 2), self._width - (radius / 1.25), 28) path = QtGui.QPainterPath() path.addRoundedRect(label_rect, radius / 1.5, radius / 1.5) painter.setBrush(QtGui.QColor(0, 0, 0, 50)) painter.fillPath(path, painter.brush()) border_width = 0.8 if self.selected and NODE_SEL_BORDER_COLOR: border_width = 1.2 border_color = QtGui.QColor(*NODE_SEL_BORDER_COLOR) border_rect = QtCore.QRectF(rect.left() - (border_width / 2), rect.top() - (border_width / 2), rect.width() + border_width, rect.height() + border_width) pen = QtGui.QPen(border_color, border_width) pen.setCosmetic(self.viewer().get_zoom() < 0.0) path = QtGui.QPainterPath() path.addRoundedRect(border_rect, radius, radius) painter.setBrush(QtCore.Qt.NoBrush) painter.setPen(pen) painter.drawPath(path) painter.restore()
def set_size(self, size=5.0): triangle = QtGui.QPolygonF() triangle.append(QtCore.QPointF(-size, size)) triangle.append(QtCore.QPointF(0.0, -size * 2)) triangle.append(QtCore.QPointF(size, size)) self.setPolygon(triangle)
def paint(self, painter, option, widget): """ Draws the connection line between nodes. Args: painter (QtGui.QPainter): painter used for drawing the item. option (QtGui.QStyleOptionGraphicsItem): used to describe the parameters needed to draw. widget (QtWidgets.QWidget): not used. """ color = QtGui.QColor(*self._color) pen_style = PIPE_STYLES.get(self.style) pen_width = PIPE_WIDTH if self._active: color = QtGui.QColor(*PIPE_ACTIVE_COLOR) if pen_style == QtCore.Qt.DashDotDotLine: pen_width += 1 else: pen_width += 0.35 elif self._highlight: color = QtGui.QColor(*PIPE_HIGHLIGHT_COLOR) pen_style = PIPE_STYLES.get(PIPE_STYLE_DEFAULT) if self.disabled(): if not self._active: color = QtGui.QColor(*PIPE_DISABLED_COLOR) pen_width += 0.2 pen_style = PIPE_STYLES.get(PIPE_STYLE_DOTTED) pen = QtGui.QPen(color, pen_width) pen.setStyle(pen_style) pen.setCapStyle(QtCore.Qt.RoundCap) painter.save() painter.setPen(pen) painter.setRenderHint(painter.Antialiasing, True) painter.drawPath(self.path()) # draw arrow if self.input_port and self.output_port: cen_x = self.path().pointAtPercent(0.5).x() cen_y = self.path().pointAtPercent(0.5).y() loc_pt = self.path().pointAtPercent(0.49) tgt_pt = self.path().pointAtPercent(0.51) dist = math.hypot(tgt_pt.x() - cen_x, tgt_pt.y() - cen_y) if dist < 0.5: painter.restore() return color.setAlpha(255) if self._highlight: painter.setBrush(QtGui.QBrush(color.lighter(150))) elif self._active or self.disabled(): painter.setBrush(QtGui.QBrush(color.darker(200))) else: painter.setBrush(QtGui.QBrush(color.darker(130))) pen_width = 0.6 if dist < 1.0: pen_width *= (1.0 + dist) painter.setPen(QtGui.QPen(color, pen_width)) transform = QtGui.QTransform() transform.translate(cen_x, cen_y) radians = math.atan2(tgt_pt.y() - loc_pt.y(), tgt_pt.x() - loc_pt.x()) degrees = math.degrees(radians) - 90 transform.rotate(degrees) if dist < 1.0: transform.scale(dist, dist) painter.drawPolygon(transform.map(self._arrow)) painter.restore( ) # QPaintDevice: Cannot destroy paint device that is being painted
def activate(self): self._active = True color = QtGui.QColor(*PIPE_ACTIVE_COLOR) pen = QtGui.QPen(color, 2.5, PIPE_STYLES.get(PIPE_STYLE_DEFAULT)) self.setPen(pen)
def draw_path(self, start_port, end_port=None, cursor_pos=None): """ Draws the path between ports. Args: start_port (PortItem): port used to draw the starting point. end_port (PortItem): port used to draw the end point. cursor_pos (QtCore.QPointF): cursor position if specified this will be the draw end point. """ if not start_port: return pos1 = start_port.scenePos() pos1.setX(pos1.x() + (start_port.boundingRect().width() / 2)) pos1.setY(pos1.y() + (start_port.boundingRect().height() / 2)) if cursor_pos: pos2 = cursor_pos elif end_port: pos2 = end_port.scenePos() pos2.setX(pos2.x() + (start_port.boundingRect().width() / 2)) pos2.setY(pos2.y() + (start_port.boundingRect().height() / 2)) else: return line = QtCore.QLineF(pos1, pos2) path = QtGui.QPainterPath() path.moveTo(line.x1(), line.y1()) if self.viewer_pipe_layout() == PIPE_LAYOUT_STRAIGHT: path.lineTo(pos2) self.setPath(path) return elif self.viewer_pipe_layout() == PIPE_LAYOUT_CURVED: ctr_offset_x1, ctr_offset_x2 = pos1.x(), pos2.x() tangent = ctr_offset_x1 - ctr_offset_x2 tangent = (tangent * -1) if tangent < 0 else tangent max_width = start_port.node.boundingRect().width() / 2 tangent = max_width if tangent > max_width else tangent if start_port.port_type == IN_PORT: ctr_offset_x1 -= tangent ctr_offset_x2 += tangent else: ctr_offset_x1 += tangent ctr_offset_x2 -= tangent ctr_point1 = QtCore.QPointF(ctr_offset_x1, pos1.y()) ctr_point2 = QtCore.QPointF(ctr_offset_x2, pos2.y()) path.cubicTo(ctr_point1, ctr_point2, pos2) self.setPath(path) elif self.viewer_pipe_layout() == PIPE_LAYOUT_ANGLE: ctr_offset_x1, ctr_offset_x2 = pos1.x(), pos2.x() distance = ctr_offset_x1 - ctr_offset_x2 distance = (distance * -1) if distance < 0 else distance distance /= 2 if start_port.port_type == IN_PORT: ctr_offset_x1 -= distance ctr_offset_x2 += distance else: ctr_offset_x1 += distance ctr_offset_x2 -= distance ctr_point1 = QtCore.QPointF(ctr_offset_x1, pos1.y()) ctr_point2 = QtCore.QPointF(ctr_offset_x2, pos2.y()) path.lineTo(ctr_point1) path.lineTo(ctr_point2) path.lineTo(pos2) self.setPath(path)
def highlight(self): self._highlight = True pen = QtGui.QPen(QtGui.QColor(*PIPE_HIGHLIGHT_COLOR), 2) pen.setStyle(PIPE_STYLES.get(PIPE_STYLE_DEFAULT)) self.setPen(pen)
def reset(self): self._active = False self._highlight = False pen = QtGui.QPen(QtGui.QColor(*self.color), 2) pen.setStyle(PIPE_STYLES.get(self.style)) self.setPen(pen)
def activate(self): self._active = True pen = QtGui.QPen(QtGui.QColor(*PIPE_ACTIVE_COLOR), 2) pen.setStyle(PIPE_STYLES.get(PIPE_STYLE_DEFAULT)) self.setPen(pen)
def paint(self, painter, option, widget): """ Draws the connection line. Args: painter (QtGui.QPainter): painter used for drawing the item. option (QtGui.QStyleOptionGraphicsItem): used to describe the parameters needed to draw. widget (QtWidgets.QWidget): not used. """ color = QtGui.QColor(*PIPE_ACTIVE_COLOR) pen_style = PIPE_STYLES.get(PIPE_STYLE_DASHED) pen_width = PIPE_WIDTH + 0.35 pen = QtGui.QPen(color, pen_width) pen.setStyle(pen_style) pen.setCapStyle(QtCore.Qt.RoundCap) painter.save() painter.setPen(pen) painter.setRenderHint(painter.Antialiasing, True) painter.drawPath(self.path()) cen_x = self.path().pointAtPercent(0.5).x() cen_y = self.path().pointAtPercent(0.5).y() loc_pt = self.path().pointAtPercent(0.9) tgt_pt = self.path().pointAtPercent(1.0) dist = math.hypot(tgt_pt.x() - cen_x, tgt_pt.y() - cen_y) if dist < 0.05: painter.restore() return # draw circle size = 10.0 if dist < 50.0: size *= (dist / 50.0) rect = QtCore.QRectF(cen_x - (size / 2), cen_y - (size / 2), size, size) painter.setBrush(color) painter.setPen(QtGui.QPen(color.darker(130), pen_width)) painter.drawEllipse(rect) # draw arrow color.setAlpha(255) painter.setBrush(color.darker(200)) pen_width = 0.6 if dist < 1.0: pen_width *= 1.0 + dist painter.setPen(QtGui.QPen(color, pen_width)) transform = QtGui.QTransform() transform.translate(tgt_pt.x(), tgt_pt.y()) radians = math.atan2(tgt_pt.y() - loc_pt.y(), tgt_pt.x() - loc_pt.x()) degrees = math.degrees(radians) + 90 transform.rotate(degrees) scale = 1.0 if dist < 20.0: scale = dist / 20.0 transform.scale(scale, scale) painter.drawPolygon(transform.map(self._arrow)) painter.restore()
#!/usr/bin/python from NodeGraphQt import QtWidgets, QtCore, QtGui, QtCompat from NodeGraphQt.widgets.properties import NodePropWidget PROPERTY_BG_COLOR = QtGui.QColor(53, 53, 53) class PropertiesDelegate(QtWidgets.QStyledItemDelegate): def paint(self, painter, option, index): """ Args: painter (QtGui.QPainter): option (QtGui.QStyleOptionViewItem): index (QtCore.QModelIndex): """ painter.save() painter.setRenderHint(QtGui.QPainter.Antialiasing, False) painter.setPen(QtCore.Qt.NoPen) painter.setBrush(PROPERTY_BG_COLOR) painter.drawRect(option.rect) if option.state & QtWidgets.QStyle.State_Selected: bdr_clr = option.palette.highlight().color() painter.setPen(QtGui.QPen(bdr_clr, 1.5)) else: bdr_clr = option.palette.alternateBase().color() painter.setPen(QtGui.QPen(bdr_clr, 1)) painter.setBrush(QtCore.Qt.NoBrush) painter.drawRect(
def _on_select_color(self): color = QtWidgets.QColorDialog.getColor(QtGui.QColor(*self.get_value())) if color.isValid(): self.set_value(color.getRgb())
def highlight(self): self._highlight = True color = QtGui.QColor(*PIPE_HIGHLIGHT_COLOR) pen = QtGui.QPen(color, 2, PIPE_STYLES.get(PIPE_STYLE_DEFAULT)) self.setPen(pen)
def paint(self, painter, option, widget): """ Draws the overlay disabled X item on top of a node item. Args: painter (QtGui.QPainter): painter used for drawing the item. option (QtGui.QStyleOptionGraphicsItem): used to describe the parameters needed to draw. widget (QtWidgets.QWidget): not used. """ painter.save() margin = 20 rect = self.boundingRect() dis_rect = QtCore.QRectF(rect.left() - (margin / 2), rect.top() - (margin / 2), rect.width() + margin, rect.height() + margin) pen = QtGui.QPen(QtGui.QColor(*self.color), 8) pen.setCapStyle(QtCore.Qt.RoundCap) painter.setPen(pen) painter.drawLine(dis_rect.topLeft(), dis_rect.bottomRight()) painter.drawLine(dis_rect.topRight(), dis_rect.bottomLeft()) bg_color = QtGui.QColor(*self.color) bg_color.setAlpha(100) bg_margin = -0.5 bg_rect = QtCore.QRectF(dis_rect.left() - (bg_margin / 2), dis_rect.top() - (bg_margin / 2), dis_rect.width() + bg_margin, dis_rect.height() + bg_margin) painter.setPen(QtGui.QPen(QtGui.QColor(0, 0, 0, 0))) painter.setBrush(bg_color) painter.drawRoundedRect(bg_rect, 5, 5) pen = QtGui.QPen(QtGui.QColor(155, 0, 0, 255), 0.7) painter.setPen(pen) painter.drawLine(dis_rect.topLeft(), dis_rect.bottomRight()) painter.drawLine(dis_rect.topRight(), dis_rect.bottomLeft()) point_size = 4.0 point_pos = (dis_rect.topLeft(), dis_rect.topRight(), dis_rect.bottomLeft(), dis_rect.bottomRight()) painter.setBrush(QtGui.QColor(255, 0, 0, 255)) for p in point_pos: p.setX(p.x() - (point_size / 2)) p.setY(p.y() - (point_size / 2)) point_rect = QtCore.QRectF(p, QtCore.QSizeF(point_size, point_size)) painter.drawEllipse(point_rect) if self.text: font = painter.font() font.setPointSize(10) painter.setFont(font) font_metrics = QtGui.QFontMetrics(font) font_width = font_metrics.width(self.text) font_height = font_metrics.height() txt_w = font_width * 1.25 txt_h = font_height * 2.25 text_bg_rect = QtCore.QRectF((rect.width() / 2) - (txt_w / 2), (rect.height() / 2) - (txt_h / 2), txt_w, txt_h) painter.setPen(QtGui.QPen(QtGui.QColor(255, 0, 0), 0.5)) painter.setBrush(QtGui.QColor(*self.color)) painter.drawRoundedRect(text_bg_rect, 2, 2) text_rect = QtCore.QRectF((rect.width() / 2) - (font_width / 2), (rect.height() / 2) - (font_height / 2), txt_w * 2, font_height * 2) painter.setPen(QtGui.QPen(QtGui.QColor(255, 0, 0), 1)) painter.drawText(text_rect, self.text) painter.restore()
def reset(self): self._active = False self._highlight = False color = QtGui.QColor(*self.color) pen = QtGui.QPen(color, 2, PIPE_STYLES.get(self.style)) self.setPen(pen)
def reset_path(self): path = QtGui.QPainterPath(QtCore.QPointF(0.0, 0.0)) self.setPath(path)
def draw_path(self, start_port, end_port, cursor_pos=None): """ Draws the path between ports. Args: start_port (PortItem): port used to draw the starting point. end_port (PortItem): port used to draw the end point. cursor_pos (QtCore.QPointF): cursor position if specified this will be the draw end point. """ if not start_port: return offset = (start_port.boundingRect().width() / 2) pos1 = start_port.scenePos() pos1.setX(pos1.x() + offset) pos1.setY(pos1.y() + offset) if cursor_pos: pos2 = cursor_pos elif end_port: offset = start_port.boundingRect().width() / 2 pos2 = end_port.scenePos() pos2.setX(pos2.x() + offset) pos2.setY(pos2.y() + offset) else: return line = QtCore.QLineF(pos1, pos2) path = QtGui.QPainterPath() path.moveTo(line.x1(), line.y1()) if self.viewer_pipe_layout() == PIPE_LAYOUT_STRAIGHT: path.lineTo(pos2) self.setPath(path) return ctr_offset_x1, ctr_offset_x2 = pos1.x(), pos2.x() tangent = ctr_offset_x1 - ctr_offset_x2 tangent = (tangent * -1) if tangent < 0 else tangent max_width = start_port.node.boundingRect().width() / 2 tangent = max_width if tangent > max_width else tangent if start_port.port_type == IN_PORT: ctr_offset_x1 -= tangent ctr_offset_x2 += tangent else: ctr_offset_x1 += tangent ctr_offset_x2 -= tangent ctr_point1 = QtCore.QPointF(ctr_offset_x1, pos1.y()) ctr_point2 = QtCore.QPointF(ctr_offset_x2, pos2.y()) path.cubicTo(ctr_point1, ctr_point2, pos2) self.setPath(path) # draw arrow if start_port.port_type == IN_PORT: loc_pt = self.path().pointAtPercent(0.49) tgt_pt = self.path().pointAtPercent(0.51) else: loc_pt = self.path().pointAtPercent(0.51) tgt_pt = self.path().pointAtPercent(0.49) radians = math.atan2(tgt_pt.y() - loc_pt.y(), tgt_pt.x() - loc_pt.x()) degrees = math.degrees(radians) - 90 self.__arrow.setPos(self.path().pointAtPercent(0.5)) self.__arrow.setRotation(degrees)