def __init__(self, parent=None): super(CellDelegate, self).__init__(parent) pal = self.parent().palette() col = pal.color(QtGui.QPalette.Active, QtGui.QPalette.Button) self.pen = QtGui.QPen(col) self.stale_color = QtGui.QColor("orange") self.stale_pen = QtGui.QPen(self.stale_color) self.stale_pen.setWidth(2) self.pen.setCosmetic(True) self.stale_pen.setCosmetic(True) self.path = QtGui.QPainterPath() self.path.moveTo(0, 0) self.path.cubicTo(0.6, 0, -0.2, 0.5, 1, 0.5) self.path.cubicTo(-0.2, 0.5, 0.6, 1, 0, 1) highlight_color = pal.color(QtGui.QPalette.Highlight) base_color = pal.color(QtGui.QPalette.Base) c1 = interp_color(highlight_color, base_color, 0.3) c2 = interp_color(highlight_color, base_color, 0.8) grad = QtGui.QLinearGradient(0, 1, 0, 0) grad.setCoordinateMode(QtGui.QGradient.ObjectBoundingMode) grad.setColorAt(0, c1) grad.setColorAt(0.95, c2) grad.setColorAt(1, c1) self.highlight_brush = QtGui.QBrush(grad)
def paint(self, painter, option, index): row = index.row() column = index.column() table = self.parent() cmp_widget = table.cellWidget(row, 2) stale = table.context_model.is_stale() rect = option.rect oldbrush = painter.brush() oldpen = painter.pen() pal = table.palette() def _setpen(to_stale): pen = self.stale_pen if stale and to_stale else self.pen painter.setPen(pen) # determine cell bg color and paint it selected_cells = set( (x.row(), x.column()) for x in table.selectedIndexes()) bg_color = None if (row, column) in selected_cells: bg_color = self.highlight_brush elif cmp_widget and \ ((cmp_widget.left() and column == 1) or (cmp_widget.right() and column == 3)): bg_color = cmp_widget.color else: bg_color = pal.color(QtGui.QPalette.Base) painter.fillRect(rect, bg_color) # draw grid lines r = (rect.topRight(), rect.bottomRight()) b = (rect.bottomLeft(), rect.bottomRight() - QtCore.QPoint(1, 0)) _setpen(column < 2) if column == 0: painter.drawLine(*r) _setpen(False) painter.drawLine(*b) elif column == 1: if not cmp_widget or not cmp_widget.left(): painter.drawLine(*r) if row == table.rowCount() - 1: painter.drawLine(*b) else: if stale and row == 0: painter.drawLine(rect.topLeft(), rect.topRight()) _setpen(False) painter.drawLine(*b) elif column == 2: # draw the curvy bits in the comparison column draw_right_edge = True def _draw_path(): painter.setRenderHints(QtGui.QPainter.Antialiasing, True) painter.drawPath(self.path) painter.resetTransform() painter.setRenderHints(QtGui.QPainter.Antialiasing, False) if cmp_widget: if cmp_widget.left(): painter.translate(rect.topLeft() - QtCore.QPoint(1, 0.5)) painter.scale(rect.width() / 2.5, rect.height()) _setpen(True) if stale: pen = QtGui.QPen(self.stale_color) pen.setCosmetic(True) pen.setWidthF(1.5) painter.setPen(pen) if (row, 1) in selected_cells: painter.setBrush(self.highlight_brush) elif cmp_widget.color: painter.setBrush(QtGui.QBrush(cmp_widget.color)) _draw_path() _setpen(False) if cmp_widget.right(): painter.translate(rect.topRight() - QtCore.QPoint(-1, 0.5)) painter.scale(-rect.width() / 2.5, rect.height()) if (row, 3) in selected_cells: painter.setBrush(self.highlight_brush) elif cmp_widget.color: painter.setBrush(QtGui.QBrush(cmp_widget.color)) _draw_path() draw_right_edge = False if draw_right_edge: painter.drawLine(*r) else: painter.drawLine(*r) painter.drawLine(*b) painter.setPen(oldpen) painter.setBrush(oldbrush) if cmp_widget and column in (1, 3): index = table.model().index(row, 2) table.update(index)