# htmldelegate.py - HTML QStyledItemDelegate # # Copyright 2010 Steve Borho # # This software may be used and distributed according to the terms of the # GNU General Public License version 2, incorporated herein by reference. from __future__ import absolute_import from .qtcore import ( QPointF, QSize, ) from .qtgui import ( QAbstractTextDocumentLayout, QPalette, QStyle, QStyleOptionViewItemV4, QStyledItemDelegate, QTextDocument, ) class HTMLDelegate(QStyledItemDelegate): def paint(self, painter, option, index): # draw selection option = QStyleOptionViewItemV4(option) self.parent().style().drawControl(QStyle.CE_ItemViewItem, option, painter) # draw text doc = self._builddoc(option, index) painter.save() painter.setClipRect(option.rect) painter.translate(QPointF( option.rect.left(), option.rect.top() + (option.rect.height() - doc.size().height()) / 2)) ctx = QAbstractTextDocumentLayout.PaintContext() ctx.palette = option.palette if option.state & QStyle.State_Selected: if option.state & QStyle.State_Active: ctx.palette.setCurrentColorGroup(QPalette.Active) else: ctx.palette.setCurrentColorGroup(QPalette.Inactive) ctx.palette.setBrush(QPalette.Text, ctx.palette.highlightedText()) elif not option.state & QStyle.State_Enabled: ctx.palette.setCurrentColorGroup(QPalette.Disabled) doc.documentLayout().draw(painter, ctx) painter.restore() def sizeHint(self, option, index): doc = self._builddoc(option, index) return QSize(doc.idealWidth() + 5, doc.size().height()) def _builddoc(self, option, index): doc = QTextDocument(defaultFont=option.font) doc.setHtml(index.data()) return doc