def draw_y_axis(self): lineItem = QGraphicsLineItem(0, self.coordY(self.ylim[0]), 0, self.coordY(self.ylim[1]), parent=self.item) lineItem.setPen(QPen(QColor('black'))) lineItem.setZValue(10) max_w = 0 for y in set(self.hlines + list(self.ylim)): lineItem = QGraphicsLineItem(0, self.coordY(y), -5, self.coordY(y), parent=self.item) lineItem.setPen(QPen(QColor('black'))) lineItem.setZValue(10) text = QGraphicsSimpleTextItem(str(y)) text.setFont(QFont("Arial", self.fsize - 2)) text.setParentItem(self.item) tw = text.boundingRect().width() max_w = tw if tw > max_w else max_w th = text.boundingRect().height() # Center text according to masterItem size text.setPos(-tw - 5, self.coordY(y) - th / 2) if self.ylabel: text = QGraphicsSimpleTextItem(self.ylabel) text.setFont(QFont("Arial", self.fsize - 1)) text.setParentItem(self.item) text.rotate(-90) tw = text.boundingRect().width() th = text.boundingRect().height() # Center text according to masterItem size text.setPos(-th - 5 - max_w, tw / 2 + self.coordY(sum(self.ylim) / 2))
def iLabel(node, *args, **kargs): #code for making specialized faces for intermediates mostly cribbed from the ete2 website example (though not interactive): # http://pythonhosted.org/ete2/tutorial/tutorial_drawing.html#creating-your-custom-interactive-item-faces my_label = node.name ellipse = QGraphicsEllipseItem( 0, 0, fontSize * 2, fontSize * 2 ) #I think the first two are coords of center; second pair is major/minor axis ellipse.setPen(QPen(QColor('black'))) ellipse.setBrush(QBrush(QColor('white'))) text = QGraphicsSimpleTextItem(my_label) text.setParentItem(ellipse) text.setBrush(QBrush(QColor("black"))) font = QFont("Arial", fontSize * .9, weight=80) font.setLetterSpacing(1, 2) #add 2 pixels between letters for legibility text.setFont(font) #Center text according to masterItem size tw = text.boundingRect().width() th = text.boundingRect().height() center = ellipse.boundingRect().center() text.setPos( center.x() + 1 - tw / 2, center.y() - th / 2 ) #since the last letter has an extra 2 pixels after it from the spacing command, adjust center to compensate return ellipse
def showMoveHelper(self, visible=True): """show help text In empty HandBoards""" if visible: if not self.__moveHelper: splitter = QGraphicsRectItem(self) hbCenter = self.rect().center() splitter.setRect(hbCenter.x() * 0.5, hbCenter.y(), hbCenter.x() * 1, 1) helpItems = [splitter] for name, yFactor in [(m18n('Move Exposed Tiles Here'), 0.5), (m18n('Move Concealed Tiles Here'), 1.5)]: helper = QGraphicsSimpleTextItem(name, self) helper.setScale(3) nameRect = QRectF() nameRect.setSize(helper.mapToParent(helper.boundingRect()).boundingRect().size()) center = QPointF(hbCenter) center.setY(center.y() * yFactor) helper.setPos(center - nameRect.center()) if self.sceneRotation() == 180: rotateCenter(helper, 180) helpItems.append(helper) self.__moveHelper = self.scene().createItemGroup(helpItems) self.__moveHelper.setVisible(True) else: if self.__moveHelper: self.__moveHelper.setVisible(False)
def update_items(self): #self.item = QGraphicsRectItem(0,0,self._total_w, self.row_h) seq_width = 0 nopen = QPen(QtCore.Qt.NoPen) font = QFont("Courier", self.fsize) rect_cls = self.InteractiveLetterItem if self.interact else QGraphicsRectItem for i, letter in enumerate(self.seq): width = self.col_w for m in self.special_col: if m[0] < i <= m[1]: width = self.alt_col_w break #load interactive item if called correspondingly rectItem = rect_cls(0, 0, width, self.row_h, parent=self.item) rectItem.setX(seq_width) # to give correct X to children item rectItem.setBrush(self.bg_col[letter]) rectItem.setPen(nopen) if self.interact: if self.codon: rectItem.codon = '%s, %d: %s' % ( self.seq[i], i, self.codon[i * 3:i * 3 + 3]) else: rectItem.codon = '%s, %d' % (self.seq[i], i) # write letter if enough space if width >= self.fsize: text = QGraphicsSimpleTextItem(letter, parent=rectItem) text.setFont(font) text.setBrush(self.fg_col[letter]) # Center text according to rectItem size tw = text.boundingRect().width() th = text.boundingRect().height() text.setPos((width - tw) / 2, (self.row_h - th) / 2) seq_width += width self.width = seq_width
def draw_x_axis(self): #lineItem = QGraphicsLineItem(self.col_w/2, # self.coordY(self.ylim[0])+2, # self.width-self.col_w/2, # self.coordY(self.ylim[0])+2, # parent=self.item) #lineItem.setPen(QPen(QColor('black'))) #lineItem.setZValue(10) #all_vals = list(range(0, len(self.values), 5)) #if (len(self.values)-1)%5: # all_vals += [len(self.values)-1] for x, lab in enumerate(self.values): # lineItem = QGraphicsLineItem(0, self.coordY(self.ylim[0])+2, # 0, self.coordY(self.ylim[0])+6, # parent=self.item) # lineItem.setX(x*self.col_w + self.col_w/2) # lineItem.setPen(QPen(QColor('black'))) # lineItem.setZValue(10) text = QGraphicsSimpleTextItem(str(lab)) text.rotate(-90) text.setFont(QFont("Arial", self.fsize - 2)) text.setParentItem(self.item) tw = text.boundingRect().height() # Center text according to masterItem size text.setPos(x * self.col_w - tw / 2 + self.col_w / 2, self.coordY(self.ylim[0]))
def __init__(self, game): """init and position the wall""" # we use only white dragons for building the wall. We could actually # use any tile because the face is never shown anyway. game.wall = self Wall.__init__(self, game) self.__square = Board(1, 1, Internal.field.tileset) self.__square.setZValue(ZValues.marker) sideLength = len(self.tiles) // 8 self.__sides = [UIWallSide(Internal.field.tileset, boardRotation, sideLength) \ for boardRotation in (0, 270, 180, 90)] for side in self.__sides: side.setParentItem(self.__square) side.lightSource = self.lightSource side.windTile = PlayerWind('E', Internal.field.windTileset, parent=side) side.windTile.hide() side.nameLabel = QGraphicsSimpleTextItem('', side) font = side.nameLabel.font() font.setPointSize(48) side.nameLabel.setFont(font) side.message = YellowText(side) side.message.setZValue(ZValues.popup) side.message.setVisible(False) side.message.setPos(side.center()) self.__sides[0].setPos(yWidth=sideLength) self.__sides[3].setPos(xHeight=1) self.__sides[2].setPos(xHeight=1, xWidth=sideLength, yHeight=1) self.__sides[1].setPos(xWidth=sideLength, yWidth=sideLength, yHeight=1) self.showShadows = Preferences.showShadows Internal.field.centralScene.addItem(self.__square)
def draw_x_axis(self): lineItem = QGraphicsLineItem(self.col_w / 2, self.coordY(self.ylim[0]) + 2, self.width - self.col_w / 2, self.coordY(self.ylim[0]) + 2, parent=self.item) lineItem.setPen(QPen(QColor('black'))) lineItem.setZValue(10) all_vals = list(range(0, len(self.values), self.x_inter_values)) if (len(self.values) - 1) % self.x_inter_values: all_vals += [len(self.values) - 1] hp_x = [] if self.hp: for x in list(range(0, len(self.values))): if self.x_values[x] in self.hp: hp_x.append(x) if not x in all_vals: all_vals += [x] all_vals.sort() for x in all_vals: lineItem = QGraphicsLineItem(0, self.coordY(self.ylim[0]) + 2, 0, self.coordY(self.ylim[0]) + 6, parent=self.item) lineItem.setX(x * self.col_w + self.col_w / 2) lineItem.setPen(QPen(QColor('black'))) lineItem.setZValue(10) if x in hp_x: text = QGraphicsSimpleTextItem("*" + str(self.x_values[x])) qfont = QFont("Arial", self.fsize - 1) #qfont.setBold(True) text.setFont(qfont) else: text = QGraphicsSimpleTextItem(" " + str(self.x_values[x])) text.setFont(QFont("Arial", self.fsize - 1)) text.rotate(-90) text.setParentItem(self.item) text.setZValue(10) tw = text.boundingRect().width() th = text.boundingRect().height() # Center text according to masterItem size text.setPos(x * self.col_w - th / 2 + self.col_w / 2, tw + self.coordY(self.ylim[0]) + 7)
def setPageHead(self, len): count = 0 x = 95 while count < len: item = QGraphicsSimpleTextItem() item.setFont(self.font) item.setText("%.2x" % count) item.setPos(x, 3) self.scene.addItem(item) x += self.pagew + 2 count += 1
def hoverEnterEvent(self, e): """ when mouse is over""" if not self.label: self.label = QGraphicsRectItem(parent=self) #self.label.setY(-18) self.label.setX(11) self.label.setBrush(QBrush(QColor("white"))) self.label.text = QGraphicsSimpleTextItem(parent=self.label) self.setZValue(1) self.label.text.setText(self.codon) self.label.setRect(self.label.text.boundingRect()) self.label.setVisible(True)
def set_labels(self, labels): """Set the text labels.""" self.clear() orientation = Qt.Horizontal if self.orientation == Qt.Vertical else Qt.Vertical for text in labels: item = QGraphicsSimpleTextItem(text, self) item.setFont(self.font()) item.setToolTip(text) witem = WrapperLayoutItem(item, orientation, parent=self) self.layout().addItem(witem) self.layout().setAlignment(witem, self.alignment) self.label_items.append(item) self.layout().activate() self.updateGeometry()
def hoverEnterEvent(self, e): # There are many ways of adding interactive elements. With the # following code, I show/hide a text item over my custom # DynamicItemFace if not self.label: self.label = QGraphicsRectItem() self.label.setParentItem(self) # This is to ensure that the label is rendered over the # rest of item children (default ZValue for items is 0) self.label.setZValue(1) self.label.setBrush(QBrush(QColor("white"))) self.label.text = QGraphicsSimpleTextItem() self.label.text.setParentItem(self.label) self.label.text.setText(self.node.name) self.label.setRect(self.label.text.boundingRect()) self.label.setVisible(True)
def update_items(self): rect_h = self.height if self.x_axis: rect_h += 30 self.item = QGraphicsRectItem(0, 0, self.width + 40, rect_h) self.item.setPen(QPen(QColor('white'))) #X axis if self.x_axis: self.draw_x_axis() # Legend self.draw_legend() # Y axes and colo rect yi = -1 for model in ["PCOC", "PC", "OC", "Topological", "Identical"]: if self.dict_values_pcoc.has_key(model): yi += 1 y = yi * self.col_w # Y axes ## Stick yaxis = (yi + 0.5) * self.col_w lineItem = QGraphicsLineItem(self.width, yaxis, self.width + 5, yaxis, parent=self.item) lineItem.setPen(QPen(QColor('black'))) ## Text text = QGraphicsSimpleTextItem(model) text.setFont(QFont("Arial", self.fsize - 2)) text.setParentItem(self.item) tw = text.boundingRect().width() th = text.boundingRect().height() ## Center text according to masterItem size text.setPos(self.width + 5, yaxis - th / 2) # Color rect for each model values = self.dict_values_pcoc[model] for i, val in enumerate(values): self.draw_fun(i * self.col_w, y, val, col_width=self.col_w)
def ugly_name_face(node, *args, **kargs): """ This is my item generator. It must receive a node object, and returns a Qt4 graphics item that can be used as a node face. """ # receive an arbitrary number of arguments, in this case width and # height of the faces width = args[0][0] height = args[0][1] ## Creates a main master Item that will contain all other elements ## Items can be standard QGraphicsItem # masterItem = QGraphicsRectItem(0, 0, width, height) # Or your custom Items, in which you can re-implement interactive # functions, etc. Check QGraphicsItem doc for details. masterItem = InteractiveItem(0, 0, width, height) # Keep a link within the item to access node info masterItem.node = node # I dont want a border around the masterItem masterItem.setPen(QPen(QtCore.Qt.NoPen)) # Add ellipse around text ellipse = QGraphicsEllipseItem(masterItem.rect()) ellipse.setParentItem(masterItem) # Change ellipse color ellipse.setBrush(QBrush(QColor(random_color()))) # Add node name within the ellipse text = QGraphicsSimpleTextItem(node.name) text.setParentItem(ellipse) text.setPen(QPen(QPen(QColor("white")))) # Center text according to masterItem size tw = text.boundingRect().width() th = text.boundingRect().height() center = masterItem.boundingRect().center() text.setPos(center.x() - tw / 2, center.y() - th / 2) return masterItem
def draw_legend(self): legend_h = self.height * ((self.nb_models - 1) / float(self.nb_models)) if legend_h < 35: legend_h = 35 legend_rect = QGraphicsRectItem(-20, 0, 10, legend_h, parent=self.item) x0 = -20 n_cat = 6. for y, str_y in [(1, 1), (1 / n_cat * 5, 0.99), (1 / n_cat * 4, 0.9), (1 / n_cat * 3, 0.8), (1 / n_cat * 2, 0.7), (1 / n_cat * 1, 0.5), (1 / n_cat * 0, 0)]: y_stick = legend_h - y * legend_h lineItem = QGraphicsLineItem(x0 - 5, y_stick, x0, y_stick, parent=self.item) lineItem.setPen(QPen(QColor('black'))) text = QGraphicsSimpleTextItem(str(str_y)) text.setFont(QFont("Arial", self.fsize - 4)) text.setParentItem(self.item) tw = text.boundingRect().width() th = text.boundingRect().height() # Center text according to masterItem size text.setPos(x0 - tw - 7, y_stick - th / 2) for (y1, y2, c) in [(1, 1 / n_cat * 5, 0.99), (1 / n_cat * 5, 1 / n_cat * 4, 0.9), (1 / n_cat * 4, 1 / n_cat * 3, 0.8), (1 / n_cat * 3, 1 / n_cat * 2, 0.7), (1 / n_cat * 2, 1 / n_cat * 1, 0.5), (1 / n_cat * 1, 1 / n_cat * 0, 0)]: y1_stick = legend_h - y1 * legend_h y2_stick = legend_h - y2 * legend_h self.draw_fun(x0, y1_stick, c, col_width=10, col_height=y2_stick - y1_stick)
def iLabel(node, *args, **kargs): #code for making specialized faces for intermediates mostly cribbed from the ete2 website example (though not interactive): # http://pythonhosted.org/ete2/tutorial/tutorial_drawing.html#creating-your-custom-interactive-item-faces my_label = args[0][0] #or maybe just node.name? ellipse = QGraphicsEllipseItem( 0, 0, fontSize * 2, fontSize * 2 ) #I think the first two are coords of center; second pair is major/minor axis ellipse.setBrush(QBrush(QColor('black'))) text = QGraphicsSimpleTextItem(my_label) text.setParentItem(ellipse) text.setBrush(QBrush(QColor("white"))) text.setFont(QFont("Arial", fontSize * .75)) #Center text according to masterItem size tw = text.boundingRect().width() th = text.boundingRect().height() center = ellipse.boundingRect().center() text.setPos(center.x() - tw / 2, center.y() - th / 2) return ellipse
def __init__(self, dataDir="", parent=None): QWidget.__init__(self, parent) self.renderer = QSvgRenderer(dataDir + "poker.svg") self.scene = QGraphicsScene() self.chat = QGraphicsSimpleTextItem() self.table = QGraphicsSvgItem(dataDir + "poker.svg") self.table.setSharedRenderer(self.renderer) self.table.setElementId("table") self.table.setMatrix(self.renderer.matrixForElement("transform_table")) self.scene.addItem(self.chat) self.scene.addItem(self.table) self.board = [] for i in range(5): card = AnimatedGraphicsSvgItem(dataDir + "svg-cards.svg", self.table) card.setElementId("back") parent = self.renderer.matrixForElement("transform_table") child = self.renderer.matrixForElement("transform_card%i" % i) cardMatrix = child.translate(-parent.dx(), -parent.dy()) card.setMatrix(cardMatrix) #card.setFlag(QGraphicsSvgItem.ItemIsMovable, True) card.scale(0.5, 0.5) card.hide() self.scene.addItem(card) self.board.append(card) self.seats = [] self.names = [] self.moneys = [] self.bets = [] for i in range(10): seat = SeatItem() def seatClickedEvent(seat=i): seatClickedCallback = self.seatClicked seatClickedCallback(seat) seat.event = seatClickedEvent seat.setSharedRenderer(self.renderer) seat.setElementId("seat") seat.setMatrix( self.renderer.matrixForElement("transform_seat%i" % i)) self.scene.addItem(seat) self.seats.append(seat) name = QGraphicsSimpleTextItem(seat) name.setMatrix(self.renderer.matrixForElement("seat_name")) self.scene.addItem(name) self.names.append(name) money = QGraphicsSimpleTextItem(seat) money.setMatrix(self.renderer.matrixForElement("seat_money")) self.scene.addItem(money) self.moneys.append(money) bet = QGraphicsSimpleTextItem() bet.setMatrix(self.renderer.matrixForElement("transform_bet%i" % i)) self.scene.addItem(bet) self.bets.append(bet) self.pots = [] for i in range(9): pot = QGraphicsSimpleTextItem() pot.setMatrix(self.renderer.matrixForElement("transform_pot%i" % i)) self.scene.addItem(pot) self.pots.append(pot) self.view = QGraphicsView(self) self.view.setScene(self.scene) self.view.resize(800, 600) self.fold = ActionItem() self.fold.setText("fold") self.fold.setPos(0, 550) self.scene.addItem(self.fold) self.fold.event = lambda: self.foldClicked() self.check = ActionItem() self.check.setText("check") self.check.setPos(50, 550) self.scene.addItem(self.check) self.check.event = lambda: self.checkClicked() self.call = ActionItem() self.call.setText("call") self.call.setPos(100, 550) self.scene.addItem(self.call) self.call.event = lambda: self.callClicked() self.bet = ActionItem() self.bet.setText("bet") self.bet.setPos(150, 550) self.scene.addItem(self.bet) self.bet.event = lambda: self.betClicked()
def write_header(self): text = QGraphicsSimpleTextItem(self.header) text.setFont(QFont("Arial", self.fsize)) text.setParentItem(self.item) text.setPos(0, 5)
def polygon_name_face(node, *args, **kwargs): """create a wedge shaped face in the style of ARB Args: width (int): size in pixels for the width of the wedge height (int): size in pixels for the height of the wedge width_percent (float): change the angle of the point of the wedge. This must be a number between 0 and 1 Returns: QGraphicsRectItem: The Qt graphics item of the polygon """ n_leaves = len(node.get_leaves()) closest_leaf_dist = node.get_closest_leaf()[1] farthest_leaf_dist = node.get_farthest_leaf()[1] base_height = 30 width = 60 height = math.log(n_leaves, 2) + base_height width_percent = closest_leaf_dist / farthest_leaf_dist #print(width, height, width_percent) points = [ (0.0, 0.0), # top left point (width, 0.0), # top right point (width * width_percent, height), # bottom right point (0.0, height), # bottom left point (0.0, 0.0) # back to the beginning ] shape = QPolygonF() for i in points: shape << QtCore.QPointF(*i) ## Creates a main master Item that will contain all other elements ## Items can be standard QGraphicsItem masterItem = QGraphicsRectItem(0, 0, width, height) # Keep a link within the item to access node info masterItem.node = node # I dont want a border around the masterItem masterItem.setPen(QPen(QtCore.Qt.NoPen)) polygon = QGraphicsPolygonItem(shape, masterItem) # Make the wedge grey in color polygon.setBrush(QBrush(QColor( '#D3D3D3'))) # Print the name of the node # Center text according to masterItem size center = masterItem.boundingRect().center() text = QGraphicsSimpleTextItem(node.name) text.setParentItem(polygon) tw = text.boundingRect().width() th = text.boundingRect().height() text.setPos(center.x() + tw/2, center.y() - th/2) # this is a hack to prevent the name being printed twice # we set the node name to blank after we write it with the QGraphicsSimpleTextItem # it must be set to a blank string for it not to be printed later node.name = '' # print the number of collapsed leaves in the polygon leaves_count_text = QGraphicsSimpleTextItem('('+str(n_leaves)+')') leaves_count_text.setParentItem(polygon) leaves_count_text.setFont(QFont('Veranda', 6)) leaves_count_text.setPos(masterItem.boundingRect().x() + 5, center.y() - leaves_count_text.boundingRect().height()/2) polygon.setPos(0, masterItem.boundingRect().y()/1.5) return masterItem
def replot_experiments(self): """Replot the whole quality plot. """ self.scene.clear() labels = [] max_dist = numpy.nanmax(list(filter(None, self.distances))) rug_widgets = [] group_pen = QPen(Qt.black) group_pen.setWidth(2) group_pen.setCapStyle(Qt.RoundCap) background_pen = QPen(QColor(0, 0, 250, 150)) background_pen.setWidth(1) background_pen.setCapStyle(Qt.RoundCap) main_widget = QGraphicsWidget() layout = QGraphicsGridLayout() attributes = self.data.domain.attributes if self.data is not None: for (group, indices), dist_vec in zip(self.groups, self.distances): indices_set = set(indices) rug_items = [] if dist_vec is not None: for i, attr in enumerate(attributes): # Is this a within group distance or background in_group = i in indices_set if in_group: rug_item = ClickableRugItem( dist_vec[i] / max_dist, 1.0, self.on_rug_item_clicked) rug_item.setPen(group_pen) tooltip = experiment_description(attr) rug_item.setToolTip(tooltip) rug_item.group_index = indices.index(i) rug_item.setZValue(rug_item.zValue() + 1) else: rug_item = ClickableRugItem( dist_vec[i] / max_dist, 0.85, self.on_rug_item_clicked) rug_item.setPen(background_pen) tooltip = experiment_description(attr) rug_item.setToolTip(tooltip) rug_item.group = group rug_item.index = i rug_item.in_group = in_group rug_items.append(rug_item) rug_widget = RugGraphicsWidget(parent=main_widget) rug_widget.set_rug(rug_items) rug_widgets.append(rug_widget) label = group_label(self.selected_split_by_labels(), group) label_item = QGraphicsSimpleTextItem(label, main_widget) label_item = GraphicsSimpleTextLayoutItem(label_item, parent=layout) label_item.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) labels.append(label_item) for i, (label, rug_w) in enumerate(zip(labels, rug_widgets)): layout.addItem(label, i, 0, Qt.AlignVCenter) layout.addItem(rug_w, i, 1) layout.setRowMaximumHeight(i, 30) main_widget.setLayout(layout) self.scene.addItem(main_widget) self.main_widget = main_widget self.rug_widgets = rug_widgets self.labels = labels self.on_view_resize(self.scene_view.size())