X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=sface%2Fxmlwidget.py;h=39fe7ac5e9e9faa1e737283b3b9416041f215234;hb=2645a941b86c97e016af657ec1ea90009c886b59;hp=34578df222e363df253941b376a68c1d555794d9;hpb=5c18c5b0393cb0970ccc6b839d056a504e4177d7;p=sface.git diff --git a/sface/xmlwidget.py b/sface/xmlwidget.py index 34578df..39fe7ac 100644 --- a/sface/xmlwidget.py +++ b/sface/xmlwidget.py @@ -1,5 +1,6 @@ import os import sys +import re from PyQt4.QtCore import * from PyQt4.QtGui import * @@ -8,6 +9,17 @@ from PyQt4.QtXml import * from sface.config import config from sface.screens.sfascreen import SfaScreen +class nodeData(QVariant): + def __init__(self, *args, **kws): + QVariant.__init__(self, *args, **kws) + self.type = None + + def setType(self, typ): + self.type = typ + + def getType(self): + return self.type + class DomModel(QAbstractItemModel): def __init__(self, document, parent = 0): QAbstractItemModel.__init__(self, parent) @@ -40,15 +52,15 @@ class DomModel(QAbstractItemModel): elem = ' %s="%s"' % (attr.nodeName(), attr.nodeValue()) qslist.append(elem) ElemNameAndAtts = '%s%s'% (node.nodeName(), qslist.join(' ')) - return QVariant( - {QString('nodeType'):QVariant(QString('element')), - QString('content'):ElemNameAndAtts}) + answer = nodeData(ElemNameAndAtts) + answer.setType('element') + return answer elif node.nodeType() == QDomNode.AttributeNode: return QVariant() elif node.nodeType() == QDomNode.TextNode: - return QVariant( - {QString('nodeType'):QVariant(QString('text')), - QString('content'):node.nodeValue()}) + answer = nodeData(node.nodeValue()) + answer.setType('text') + return answer elif node.nodeType() == QDomNode.CDATASectionNode: return QString('unsupported node type') elif node.nodeType() == QDomNode.EntityReferenceNode: @@ -58,9 +70,9 @@ class DomModel(QAbstractItemModel): elif node.nodeType() == QDomNode.ProcessingInstructionNode: return QVariant() elif node.nodeType() == QDomNode.CommentNode: - return QVariant( - {QString('nodeType'):QVariant(QString('comment')), - QString('content'):node.nodeValue()}) + answer = nodeData(node.nodeValue()) + answer.setType('comment') + return answer elif node.nodeType() == QDomNode.DocumentNode: return QString('unsupported node type') elif node.nodeType() == QDomNode.DocumentTypeNode: @@ -154,9 +166,15 @@ class DomItem: return self.rowNumber class XmlView(QTreeView): - def __init__(self, parent): + def __init__(self, parent=None): QTreeView.__init__(self, parent) + delegate = XmlDelegate(self) + delegate.insertNodeDelegate('element', ElemNodeDelegate()) + delegate.insertNodeDelegate('text', TextNodeDelegate()) + delegate.insertNodeDelegate('comment', CommentNodeDelegate()) + self.setItemDelegate(delegate) + self.setAnimated(True) self.setItemsExpandable(True) self.setRootIsDecorated(True) @@ -164,52 +182,6 @@ class XmlView(QTreeView): self.setAttribute(Qt.WA_MacShowFocusRect, 0) self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) -class XmlWindow(QDialog): - def __init__(self, parent=None, title='XML Window'): - QDialog.__init__(self, parent) - self.setWindowTitle(title) - - self.document = None - self.model = None - self.title = title - - 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) - - self.updateView() - - def show(self): - self.updateView() - QDialog.show(self) - - def updateView(self): - del self.document - del self.model - self.document = None - self.model = None - - self.document = QDomDocument(self.title) - self.model = DomModel(self.document, self) - - self.view.setModel(self.model) - self.view.expand(self.model.index(0, 0)) #expand first level only - - #move the code below to rspec window - rspec_file = config.getSliceRSpecFile() - if not os.path.exists(rspec_file): - return - - self.document.setContent(open(rspec_file,'r').read()) - - - class XmlDelegate(QItemDelegate): def __init__(self, parent=None): @@ -225,42 +197,32 @@ class XmlDelegate(QItemDelegate): del self.delegates[nodeType] def paint(self, painter, option, index): - QVarMapAccess = lambda qv, key: qv.toMap()[QString(key)].toString() - dataAsQVarMap = index.model().data(index) - nodeType = str(QVarMapAccess(dataAsQVarMap, 'nodeType')) + nodeData = index.model().data(index) + nodeType = nodeData.getType() delegate = self.delegates.get(nodeType) - print "WTF IS THIS TYPE:", type(index.model().data(index)) - print "NODE TYPE:", nodeType - #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: - #print "ELSE BRANCH" - # not sure this will ever work. this delegate - # doesn't know about my QObject strategy. QItemDelegate.paint(self, painter, option, index) -# def sizeHint(self, option, index): -# fm = option.fontMetrics -# print "TYPE:", str(type(index.model().data(index).convert(QObject))) -# text = "the fish doesn't talk" -# #text = str(index.model().data(index).property('content').toString()) -# nodeType = str(index.model().data(index).property('nodeType').toString()) -# if nodeType == 'element' or nodeType == 'comment': -# numlines = 1 -# elif nodeType == 'text': -# numlines = text.count('\n') -# sys.__stdout__.write("TEXT: \n" + text) -# else: -# numlines = 1 -# 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) * numlines) + def sizeHint(self, option, index): + fm = option.fontMetrics + nodeData = index.model().data(index) + nodeType = nodeData.getType() + text = nodeData.toString() + if nodeType == 'element' or nodeType == 'comment': + numlines = 1 + elif nodeType == 'text': + nl = text.count('\n') + numlines = nl if nl > 0 else 1 + else: + numlines = 1 + 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) * numlines) class ElemNodeDelegate(QAbstractItemDelegate): def paint(self, painter, option, index): @@ -277,19 +239,21 @@ class ElemNodeDelegate(QAbstractItemDelegate): AttListHtml = '' if len(tmp) > 1: # many elems don't have atts... - attList = tmp[1].split() + pttrnAtt = ' *?.+.?=".*?"' + attList = re.compile(pttrnAtt, re.DOTALL).findall(tmp[1]) for att in attList: tmp = att.split('=') attName = tmp[0] attValue = tmp[1][1:-1] - AttListHtml += (nonHighAttPattern % (attName, attValue)) + AttListHtml += (attPattern % (attName, attValue)) html = (globPattern % (elemName, AttListHtml)) return html def colorize(color, text): return '' + text + '' - QVarMapAccess = lambda qv, key: qv.toMap()[QString(key)].toString() - dataAsQVarMap = index.model().data(index) - text = str(QVarMapAccess(dataAsQVarMap, 'content')) + nodeData = index.model().data(index) + nodeType = nodeData.getType() + # Uff... QString Vs string... + text = str(nodeData.toString()) if option.state & QStyle.State_Selected: htmlText = colorize(palette.highlightedText().color().name(), getHtmlText(text, highGlobPattern, highAttPattern)) @@ -318,9 +282,9 @@ class TextNodeDelegate(QAbstractItemDelegate): return '
' + text + '' + text + ''
-        QVarMapAccess = lambda qv, key: qv.toMap()[QString(key)].toString()
-        dataAsQVarMap = index.model().data(index)
-        text = str(QVarMapAccess(dataAsQVarMap, 'content'))
+        nodeData = index.model().data(index)
+        nodeType = nodeData.getType()
+        text = nodeData.toString()
         if option.state & QStyle.State_Selected:
             htmlText = colorize(palette.highlightedText().color().name(),
                                 verbatimize(text))