def updateLines(self): pen = QPen(QColor.fromHsl(0, 100, 100)) sortedNodes = sorted(self.nodes, key=lambda x: x.pos().x()) for index in range(len(self.nodes)-1): node = sortedNodes[index] nextNode = sortedNodes[index+1] if index < len(self.lines): # Just update the line segment lineItem = self.lines[index] else: # Create a new line segment lineItem = QGraphicsLineItem() lineItem.setZValue(250) lineItem.setPen(pen) self.histogramWidget.scene().addItem(lineItem) self.lines.append(lineItem) line = QLineF(node.pos(), nextNode.pos()) lineItem.setLine(line) # Clean up redundent lines if len(self.lines) >= len(self.nodes): # Remove the redundant line segments from the scene for index in range(len(self.nodes)-1, len(self.lines)): lineItem = self.lines[index] self.histogramWidget.scene().removeItem(lineItem) # Delete the line segments from the list del self.lines[len(self.nodes)-1:] assert len(self.lines) == len(self.nodes) - 1 self.histogramWidget._scene.update()
def updateLines(self): pen = QPen(QColor.fromHsl(0, 100, 100)) sortedNodes = sorted(self.nodes, key=lambda x: x.pos().x()) for index in range(len(self.nodes) - 1): node = sortedNodes[index] nextNode = sortedNodes[index + 1] if index < len(self.lines): # Just update the line segment lineItem = self.lines[index] else: # Create a new line segment lineItem = QGraphicsLineItem() lineItem.setZValue(250) lineItem.setPen(pen) self.histogramWidget.scene().addItem(lineItem) self.lines.append(lineItem) line = QLineF(node.pos(), nextNode.pos()) lineItem.setLine(line) # Clean up redundent lines if len(self.lines) >= len(self.nodes): # Remove the redundant line segments from the scene for index in range(len(self.nodes) - 1, len(self.lines)): lineItem = self.lines[index] self.histogramWidget.scene().removeItem(lineItem) # Delete the line segments from the list del self.lines[len(self.nodes) - 1:] assert len(self.lines) == len(self.nodes) - 1 self.histogramWidget._scene.update()
def finish_bar(self): if self.insignificant_values > 0: self.add_bar(self.insignificant_values, QBrush(Qt.lightGray), None, True, None) if len(self.values) == 0: return total_width = 0 for w, h, brush, hoover_text, order_part in self.values: total_width += w gi = QGraphicsLineItem(self.start_x, self.base_y - self.bar_height, self.start_x + total_width + self.bar_width * 2, self.base_y - self.bar_height) gi.setPen(QPen(Qt.lightGray)) self.scene.addItem(gi) gi = QGraphicsLineItem(self.start_x, self.base_y, self.start_x + total_width + self.bar_width * 2, self.base_y) gi.setPen(QPen(Qt.lightGray)) self.scene.addItem(gi) gi = QGraphicsLineItem(self.start_x, self.base_y - self.bar_height * 0.25, self.start_x + total_width + self.bar_width * 2, self.base_y - self.bar_height * 0.25) gi.setPen(QPen(Qt.lightGray)) self.scene.addItem(gi) gi = QGraphicsLineItem(self.start_x, self.base_y - self.bar_height * 0.75, self.start_x + total_width + self.bar_width * 2, self.base_y - self.bar_height * 0.75) gi.setPen(QPen(Qt.lightGray)) self.scene.addItem(gi) self.current_x = self.start_x + self.bar_width for w, h, brush, hoover_text, order_part in self.values: self._draw_bar(w, h, brush, hoover_text, order_part)
def draw(self, scene, y): span_height = 15 flag_height = span_height * 1.2 min_time, max_time = day_span(self.base_time) # Draw a time line nb_hours = 12 length = self.time_to_x(self.base_time + timedelta(float(nb_hours) / 24.0)) scene.addLine(QLineF(0, y, length, y), QPen(Qt.gray)) x = self.base_time - timedelta(0, seconds=self.base_time.second, minutes=self.base_time.minute, microseconds=self.base_time.microsecond) end_x = self.base_time + timedelta(hours=12) while x <= end_x: tx = self.time_to_x(x) scene.addLine(QLineF(tx, y - 5, tx, y + 5), QPen(Qt.gray)) description = QGraphicsSimpleTextItem() description.setText(str(x.hour)) description.setPos(tx + 5, y) # y - br.height()/2) description.setBrush(QBrush(Qt.gray)) scene.addItem(description) x = x + timedelta(hours=1) # Draw spans total_time = timedelta(0) for start, end, description in self.spans: mainlog.debug("Span : {} -> {}".format(start, end)) s = self.time_to_x(max(min_time, start)) e = self.time_to_x(min(max_time, end)) total_time += end - start # mainlog.debug("Total time += {}".format(end - start)) glass_path(scene, s, y - span_height / 2, e - s, span_height, QColor(self.span_color)) r = HooverBar(QRect(s, y - span_height / 2, e - s, span_height), None) if not description: r.description = [ _("Duration"), duration_to_hm((end - start).total_seconds() / 3600.0) ] elif isinstance(description, list): r.description = description else: r.description = [description] scene.addItem(r) # Make the timeline clickable r = QGraphicsRectItem(QRect(0, 0, length, 30), None) scene.addItem(r) r.setPos(0, y - 15) r.setPen(QPen(Qt.transparent)) r.setCursor(Qt.PointingHandCursor) r.setFlags(r.flags() | QGraphicsItem.ItemIsSelectable) r.setData(0, self.task) # Draw flags for t, kind, data, hoover_text in self.flags: x = self.time_to_x(t) # mainlog.debug("Drawing a flag on {} at {}".format(t,x)) l = QGraphicsLineItem(0.0, float(-flag_height), 0.0, float(+flag_height), None) l.setPen(QPen(Qt.black)) scene.addItem(l) l.setPos(x, y) #scene.addLine ( QLineF(x,y-flag_height,x,y+flag_height), QPen(Qt.black) ) if kind == Timeline.START: scene.addRect(QRect(x, y - flag_height, 5, 5), QPen(Qt.black), QBrush(Qt.black)) scene.addRect(QRect(x, y + flag_height - 5, 5, 5), QPen(Qt.black), QBrush(Qt.black)) elif kind == Timeline.END: scene.addRect(QRect(x - 5, y - flag_height, 5, 5), QPen(Qt.black), QBrush(Qt.black)) scene.addRect(QRect(x - 5, y + flag_height - 5, 5, 5), QPen(Qt.black), QBrush(Qt.black)) r = HooverBar(QRect(0, 0, 10, 2 * flag_height), None) r.description = hoover_text scene.addItem(r) r.setPos(x - 5, y - flag_height) r.setPen(QPen(Qt.transparent)) # item = scene.addRect ( QRect(x-5,y-flag_height,10,2*flag_height), QPen(Qt.white)) r.setCursor(Qt.PointingHandCursor) r.setFlags(r.flags() | QGraphicsItem.ItemIsSelectable) r.setData(0, data) # Timeline's text description = QGraphicsSimpleTextItem() duration = "" if total_time.seconds > 60 or total_time.days > 0: duration = " - " + duration_to_hm( total_time.total_seconds() / 3600.0) tname = self.task_name.replace('\n', ' ') if len(tname) > 80: tname = tname[0:80] + u"..." description.setText(u"{}{}".format(tname, duration)) br = QRect(0, 0, description.boundingRect().width(), description.boundingRect().height()) description.setPos(0, y - br.height() - flag_height) # y - br.height()/2) r = QGraphicsRectItem(QRect(0, 0, br.width() + 10, br.height() + 10), None) r.setPos(-5, y - 5 - br.height() - flag_height) # y - br.height()/2 - 5) r.setPen(QPen(Qt.transparent)) r.setBrush(QBrush(QColor(255, 255, 255, 128))) scene.addItem(r) scene.addItem(description)
def draw_line(self, linef): line = QGraphicsLineItem(linef) line.setPen(QPen(QBrush(QColor(0, 0, 0)), 1)) self.addItem(line)
def draw_line(self, linef): line = QGraphicsLineItem(linef) line.setPen(QPen(QBrush(QColor(0, 0, 0)), 1)) self.addItem(line)