"""
This file defines some primitives to draw a circuit schematic on Widgets.
For now it is only used in IqManagerWidget.
"""
import os.path as osp
from qtpy import QtCore, QtWidgets, QtGui
IMAGE_PATH = osp.join(osp.split(osp.dirname(__file__))[0], "images")
[docs]class MyLabelSignal(QtWidgets.QLabel):
pass
[docs]class MyItem(QtWidgets.QWidget):
def __init__(self, widget_name, y, label, parent, x_offset=0):
super(MyItem, self).__init__()
self.lay = QtWidgets.QVBoxLayout()
self.setLayout(self.lay)
self.item = QtWidgets.QLabel(label)
self.setStyleSheet('background-color:transparent')
self.lay.addWidget(self.item)
self.widget_name = widget_name
self.y = y
self.x_offset = x_offset
self.parent = parent
parent.graphic_items.append(self)
self.item.setStyleSheet(
"QLabel{border: 1px solid black; border-radius: 5px; "
"font-size: 15px; background-color:white}")
self.proxy = parent.scene.addWidget(self)
self.proxy.setZValue(2)
[docs] def item_x(self):
return self.pos().x() + self.item.pos().x()
[docs] def item_y(self):
return self.pos().y() + self.item.pos().y()
[docs] def move_to_right_position(self):
widget = self.parent.module_widgets[0].attribute_widgets[
self.widget_name]
x = widget.pos().x() + widget.width()/2 + self.x_offset - \
self.item.width()/2 + self.item.x()
y = self.y*self.parent.view.height() - self.item.height()/2 + \
self.item.y()
self.move(x, y)
[docs]class MyLabel(MyItem):
pass
[docs]class MyImage(MyItem):
def __init__(self, widget_name, y, filename, label, parent, x_offset=0):
super(MyImage, self).__init__(widget_name, y, label, parent, x_offset)
self.pixmap = QtGui.QPixmap(osp.join(IMAGE_PATH, filename))
self.item.setPixmap(self.pixmap)
self.item.setFixedSize(self.pixmap.size())
self.label = QtWidgets.QLabel(label)
self.lay.addWidget(self.label)
#self.setText(self.widget_name)
[docs]class Connection(object):
arrow_height = 10
arrow_width = 15
margin = 15
def __init__(self, widget1, widget2, h_first, parent, show_arrow=True):
self.parent = parent
self.widget_start = widget1
self.widget_stop = widget2
self.h_first = h_first
self.show_arrow = show_arrow
self.brush = QtGui.QBrush(QtCore.Qt.black)
self.arrow = QtWidgets.QGraphicsPolygonItem()
self.arrow.setBrush(self.brush)
self.pen = QtGui.QPen(QtCore.Qt.black,
3,
QtCore.Qt.SolidLine,
QtCore.Qt.RoundCap,
QtCore.Qt.RoundJoin)
self.line1 = QtWidgets.QGraphicsLineItem()
self.line1.setPen(self.pen)
self.line2 = QtWidgets.QGraphicsLineItem()
self.line2.setPen(self.pen)
self.line1.setZValue(1)
self.line2.setZValue(1)
self.parent.scene.addItem(self.line1)
self.parent.scene.addItem(self.line2)
self.parent.scene.addItem(self.arrow)
self.adjust()
[docs] def adjust(self):
x1 = self.widget_start.item_x() + self.widget_start.item.width() / 2
x2 = self.widget_stop.item_x() + self.widget_stop.item.width() / 2
y1 = self.widget_start.item_y() + self.widget_start.item.height() / 2
y2 = self.widget_stop.item_y() + self.widget_stop.item.height() / 2
if self.h_first:
self.line1.setLine(x1, y1, x1, y2)
self.line2.setLine(x1, y2, x2, y2)
else:
self.line1.setLine(x1, y1, x2, y1)
self.line2.setLine(x2, y1, x2, y2)
if self.show_arrow:
if self.h_first:
x = x2 - self.widget_stop.width() / 2
y = y2
arrow = QtGui.QPolygonF(
[QtCore.QPoint(x - self.margin, y - self.arrow_height / 2),
QtCore.QPoint(x - self.margin, y + self.arrow_height / 2),
QtCore.QPoint(x - self.margin + self.arrow_width, y)])
else:
x = x2
y = y2 - self.widget_stop.height() / 2
if y2 < y1:
margin = - self.margin
arrow_width = - self.arrow_width
y = y2 + self.widget_stop.height() / 2
else:
margin = self.margin
arrow_width = self.arrow_width
arrow = QtGui.QPolygonF(
[QtCore.QPoint(x - self.arrow_height / 2, y - margin),
QtCore.QPoint(x + self.arrow_height / 2, y - margin),
QtCore.QPoint(x, y - margin + arrow_width)])
if self.show_arrow:
self.arrow.setPolygon(arrow)
class MyFrame(QtWidgets.QFrame):
def __init__(self, parent):
super(MyFrame, self).__init__(parent)
self.setStyleSheet("background-color: white;")
self.parent = parent
self.lower()
class MyFrameDrawing(QtWidgets.QFrame):
def __init__(self, parent):
super(MyFrameDrawing, self).__init__()
self.setStyleSheet("background-color: white;")
self.parent = parent
self.lower()
self.proxy = self.parent.scene.addWidget(self)
self.proxy.setZValue(-1)