def paint_icon(self, painter, option, index, align=None): """ Draws the icon for the item :param painter: QPainter :param option: QStyleOptionViewItem :param index: int :param align: Qt.Align """ column = index.column() pixmap = self.pixmap(column) if not pixmap: return rect = self.icon_rect(option) pixmap = self._scale_pixmap(pixmap, rect) pixmap_rect = QRect(rect) pixmap_rect.setWidth(pixmap.width()) pixmap_rect.setHeight(pixmap.height()) align = align or Qt.AlignHCenter | Qt.AlignVCenter x, y = 0, 0 align_bottom_a = Qt.AlignBottom | Qt.AlignLeft align_bottom_b = align == Qt.AlignBottom | Qt.AlignHCenter or align == Qt.AlignBottom | Qt.AlignRight align_h_center_a = Qt.AlignHCenter or align == Qt.AlignCenter align_h_center_b = align == Qt.AlignHCenter | Qt.AlignBottom or align == Qt.AlignHCenter | Qt.AlignTop align_v_center_a = align == Qt.AlignVCenter | Qt.AlignLeft or align == Qt.AlignVCenter | Qt.AlignRight align_v_center_b = Qt.AlignVCenter or align == Qt.AlignCenter is_align_bottom = align == align_bottom_a or align_bottom_b is_align_h_center = align == align_h_center_a or align_h_center_b is_align_v_center = align == align_v_center_a or align_v_center_b if is_align_h_center: x += float(rect.width() - pixmap.width()) / 2 elif is_align_v_center: y += float(rect.height() - pixmap.height()) / 2 elif is_align_bottom: y += float(rect.height() - pixmap.height()) pixmap_rect.translate(x, y) painter.drawPixmap(pixmap_rect, pixmap)
def _paint_text(self, painter, option, column): """ Internal function used to paint the text :param painter: QPainter :param option: QStyleOption :param column: int """ if self.viewer().is_icon_view(): text = self.item.full_name() if self.item else self.name() else: label = self.label_from_column(column) text = self.display_text(label) color = self.text_color() is_selected = option.state & QStyle.State_Selected if is_selected: color = self.text_selected_color() visual_rect = self.visual_rect(option) width = visual_rect.width() height = visual_rect.height() padding = self.padding() x = padding / 2 y = padding / 2 visual_rect.translate(x, y) visual_rect.setWidth(width - padding) visual_rect.setHeight(height - padding) font = self.font(column) align = self.textAlignment(column) metrics = QFontMetrics(font) text_width = 1 if text: text_width = metrics.width(text) if text_width > visual_rect.width() - padding: visual_width = visual_rect.width() text = metrics.elidedText(text, Qt.ElideMiddle, visual_width) align = Qt.AlignLeft align = align | Qt.AlignVCenter rect = QRect(visual_rect) if self.viewer().is_icon_view(): if self.is_label_over_item() or self.is_label_under_item(): padding = 8 if padding < 8 else padding height = metrics.height() + (padding / 2) y = (rect.y() + rect.height()) - height rect.setY(y) rect.setHeight(height) if self.is_label_over_item(): color2 = self.viewer().background_color().toRgb() color2.setAlpha(200) painter.setPen(Qt.NoPen) painter.setBrush(QBrush(color2)) painter.drawRect(rect) pen = QPen(color) painter.setPen(pen) painter.setFont(font) painter.drawText(rect, align, text)