From 6ba5d90f9b2b0ba25aeb46d0d92f22b1f8d33e90 Mon Sep 17 00:00:00 2001 From: Giovanni Gherdovich Date: Fri, 8 Oct 2010 17:37:42 +0200 Subject: [PATCH 1/1] on the way of getting rid of HTML in XML viz. The model passes a QObject instead of a Qstring --- sface/xmlwidget.py | 137 ++++++++++++++++++++++++++++++++------------- 1 file changed, 99 insertions(+), 38 deletions(-) diff --git a/sface/xmlwidget.py b/sface/xmlwidget.py index a52522a..512d35a 100644 --- a/sface/xmlwidget.py +++ b/sface/xmlwidget.py @@ -37,13 +37,20 @@ class DomModel(QAbstractItemModel): qslist = QStringList() for i in range(attributeMap.count()): attr = attributeMap.item(i) - elem = ' %s="%s"' % (attr.nodeName(), attr.nodeValue()) + elem = ' %s="%s"' % (attr.nodeName(), attr.nodeValue()) qslist.append(elem) - return QString('<%s%s>'% (node.nodeName(), qslist.join(' '))) + ElemNameAndAtts = QString('<%s%s>'% (node.nodeName(), qslist.join(' '))) + obj = QObject() + obj.setProperty('nodeType', QString('element')) + obj.setProperty('content', ElemNameAndAtts) + return obj elif node.nodeType() == QDomNode.AttributeNode: - return QString('Whozat?!') + return QVariant() elif node.nodeType() == QDomNode.TextNode: - return node.nodeValue() + obj = QObject() + obj.setProperty('nodeType', QString('text')) + obj.setProperty('content', node.nodeValue()) + return obj elif node.nodeType() == QDomNode.CDATASectionNode: return QString('unsupported node type') elif node.nodeType() == QDomNode.EntityReferenceNode: @@ -52,9 +59,11 @@ class DomModel(QAbstractItemModel): return QString('unsupported node type') elif node.nodeType() == QDomNode.ProcessingInstructionNode: return QVariant() - #return node.nodeName() elif node.nodeType() == QDomNode.CommentNode: - return QString('#').append(node.nodeValue()) + obj = QObject() + obj.setProperty('nodeType', QString('comment')) + obj.setProperty('content', node.nodeValue()) + return obj elif node.nodeType() == QDomNode.DocumentNode: return QString('unsupported node type') elif node.nodeType() == QDomNode.DocumentTypeNode: @@ -170,6 +179,9 @@ class XmlWindow(QDialog): self.view = XmlView(self) self.delegate = XmlDelegate(self) self.view.setItemDelegate(self.delegate) + self.delegate.insertNodeDelegate('element', ElemNodeDelegate()) + self.delegate.insertNodeDelegate('text', TextNodeDelegate()) + self.delegate.insertNodeDelegate('comment', CommentNodeDelegate()) layout = QVBoxLayout() layout.addWidget(self.view) self.setLayout(layout) @@ -201,44 +213,93 @@ class XmlWindow(QDialog): -class XmlDelegate(QAbstractItemDelegate): +class XmlDelegate(QItemDelegate): def __init__(self, parent=None): QAbstractItemDelegate.__init__(self, parent) + self.delegates = {} + + def insertNodeDelegate(self, nodeType, delegate): + delegate.setParent(self) + self.delegates[nodeType] = delegate + def removeNodeDelegate(self, nodeType, delegate): + if nodeType in self.delegates: + del self.delegates[nodeType] + def paint(self, painter, option, index): - text = index.model().data(index) - palette = QApplication.palette() - document = QTextDocument() - document.setDefaultFont(option.font) - if option.state & QStyle.State_Selected: - rx = QRegExp(QString('')) - rx.setMinimal(True) - # If selected, I remove the by hand, - # and give the highlight color - document.setHtml(QString("%2") \ - .arg(palette.highlightedText().color().name())\ - .arg(text.replace(rx, QString('')). - replace(QString(''),QString('')))) + nodeType = index.model().data(index).property('nodeType') + delegate = self.delegates.get(str(nodeType.toString())) + print "TYPE:", str(type(str(nodeType.toString()))) + print "DELEGS DICT:", self.delegates + print "NODETYPE:", nodeType.toString() + if delegate is not None: + print "WOW DELEG ISNT NONE" + delegate.paint(painter, option, index) else: - document.setHtml(text) - color = palette.highlight().color() \ - if option.state & QStyle.State_Selected \ - else palette.base().color() - painter.save() - # voodoo: if not highlighted, filling the rect - # with the base color makes no difference - painter.fillRect(option.rect, color) - painter.translate(option.rect.x(), option.rect.y()) - document.drawContents(painter) - painter.restore() + print "ELSE BRANCH" + # not sure this will ever work. this delegate + # doesn't know about my QObject strategy. + QItemDelegate.paint(self, painter, option, index) + +class ElemNodeDelegate(QAbstractItemDelegate): + def paint(self, painter, option, index): + print "ELEM DELEG CALLED" + paint(self, painter, option, index) + + def sizeHint(self, option, index): + sizeHint(self, option, index) + +class TextNodeDelegate(QAbstractItemDelegate): + def paint(self, painter, option, index): + print "TEXT DELEG CALLED" + paint(self, painter, option, index) + + def sizeHint(self, option, index): + sizeHint(self, option, index) + +class CommentNodeDelegate(QAbstractItemDelegate): + def paint(self, painter, option, index): + print "TEXT DELEG CALLED" + paint(self, painter, option, index) def sizeHint(self, option, index): - fm = option.fontMetrics - text = index.model().data(index) - document = QTextDocument() - document.setDefaultFont(option.font) + sizeHint(self, option, index) + + +def paint(self, painter, option, index): + text = index.model().data(index).property('content').toString() + palette = QApplication.palette() + document = QTextDocument() + document.setDefaultFont(option.font) + if option.state & QStyle.State_Selected: + rx = QRegExp(QString('')) + rx.setMinimal(True) + # If selected, I remove the by hand, + # and give the highlight color + document.setHtml(QString("%2") \ + .arg(palette.highlightedText().color().name())\ + .arg(text.replace(rx, QString('')). + replace(QString(''),QString('')))) + else: document.setHtml(text) - # the +5 is for margin. The +4 is voodoo; - # fm.height just give it too small. - return QSize(document.idealWidth() + 5, fm.height() + 4) + color = palette.highlight().color() \ + if option.state & QStyle.State_Selected \ + else palette.base().color() + painter.save() + # voodoo: if not highlighted, filling the rect + # with the base color makes no difference + painter.fillRect(option.rect, color) + painter.translate(option.rect.x(), option.rect.y()) + document.drawContents(painter) + painter.restore() + +def sizeHint(self, option, index): + fm = option.fontMetrics + text = index.model().data(index) + document = QTextDocument() + document.setDefaultFont(option.font) + document.setHtml(text) + # the +5 is for margin. The +4 is voodoo; + # fm.height just give it too small. + return QSize(document.idealWidth() + 5, fm.height() + 4) -- 2.43.0