From: Giovanni Gherdovich Date: Wed, 20 Oct 2010 13:36:44 +0000 (+0200) Subject: now data() yelds a subclass of QVariant, and not a QVariant-embedded dict (goal was... X-Git-Url: http://git.onelab.eu/?p=sface.git;a=commitdiff_plain;h=40456613e902f122d2fd13c1aac32bc72c0c1642 now data() yelds a subclass of QVariant, and not a QVariant-embedded dict (goal was: typed data from the model) --- diff --git a/sface/mainwindow.py b/sface/mainwindow.py index 0b52d95..b064769 100644 --- a/sface/mainwindow.py +++ b/sface/mainwindow.py @@ -175,5 +175,6 @@ class MainWindow(QWidget): self.status.set(msg, timeout) def nodeSelectionChanged(self, hostname): + print "nodeSelectionChanged" if self.rspecWindow.isVisible(): self.rspecWindow.showNode(hostname) diff --git a/sface/rspecwindow.py b/sface/rspecwindow.py index b6b8f0a..021d8fa 100644 --- a/sface/rspecwindow.py +++ b/sface/rspecwindow.py @@ -15,6 +15,7 @@ class RSpecView(XmlView): XmlView.__init__(self, parent) def expandMatchingText(self, txt): + print "LHS", txt self.collapseAll() self.expandToDepth(0) @@ -27,6 +28,7 @@ class RSpecView(XmlView): self.expand(index) def search(index): + print index.data().toString() if index.data().toString() == txt: recursiveExpand(index) self.scrollTo(index, self.PositionAtCenter) @@ -62,6 +64,7 @@ class RSpecWindow(QDialog): self.updateView() def showNode(self, hostname): + print "SHOWNODE" self.view.expandMatchingText(hostname) def updateView(self): diff --git a/sface/xmlwidget.py b/sface/xmlwidget.py index 2a57587..35cc64a 100644 --- a/sface/xmlwidget.py +++ b/sface/xmlwidget.py @@ -8,18 +8,32 @@ from PyQt4.QtXml import * from sface.config import config from sface.screens.sfascreen import SfaScreen +import time + + + def QVarMapAccess(qv, key): # helper function. qv is a dict wrapped into a QVariant - print 10*'=' - print "DICT:", qv.toMap() - if len(qv.toMap().keys()) == 0: - print "EMPTY!" - import traceback - traceback.print_stack() - return None - else: - return qv.toMap()[QString(key)].toString() - + #print 10*'=' + #print "DICT:", qv.toMap() +# if len(qv.toMap().keys()) == 0: +# print "EMPTY!" +# import traceback +# traceback.print_stack() +# return None +# else: + return qv.toMap()[QString(key)].toString() + +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): @@ -54,18 +68,18 @@ class DomModel(QAbstractItemModel): elem = ' %s="%s"' % (attr.nodeName(), attr.nodeValue()) qslist.append(elem) ElemNameAndAtts = '%s%s'% (node.nodeName(), qslist.join(' ')) - print "1" - return QVariant( - {'nodeType':QVariant(QString('element')), - 'content':ElemNameAndAtts}) + #print "1" + answer = nodeData(ElemNameAndAtts) + answer.setType('element') + return answer elif node.nodeType() == QDomNode.AttributeNode: print "2" return QVariant() elif node.nodeType() == QDomNode.TextNode: - print "3" - return QVariant( - {'nodeType':QVariant(QString('text')), - 'content':node.nodeValue()}) + #print "3" + answer = nodeData(node.nodeValue()) + answer.setType('text') + return answer elif node.nodeType() == QDomNode.CDATASectionNode: print "4" return QString('unsupported node type') @@ -79,10 +93,9 @@ class DomModel(QAbstractItemModel): print "7" return QVariant() elif node.nodeType() == QDomNode.CommentNode: - print "8" - return QVariant( - {'nodeType':QVariant(QString('comment')), - 'content':node.nodeValue()}) + answer = nodeData(node.nodeValue()) + answer.setType('comment') + return answer elif node.nodeType() == QDomNode.DocumentNode: print "9" return QString('unsupported node type') @@ -215,10 +228,11 @@ class XmlDelegate(QItemDelegate): del self.delegates[nodeType] def paint(self, painter, option, index): - print "ASKING FOR DATA" - dataAsQVarMap = index.model().data(index) - print "GOT DATA" - nodeType = str(QVarMapAccess(dataAsQVarMap, 'nodeType')) + start = time.time() + #print "ASKING FOR DATA" + nodeData = index.model().data(index) + #print "GOT DATA" + nodeType = nodeData.getType() delegate = self.delegates.get(nodeType) #print "DELEGS DICT:", self.delegates #print "NODETYPE:", nodeType.toString() @@ -230,12 +244,14 @@ class XmlDelegate(QItemDelegate): # not sure this will ever work. this delegate # doesn't know about my QMap strategy. QItemDelegate.paint(self, painter, option, index) + #print time.strftime('%M:%S'),"[%.3f s]"%(time.time()-start), 'paint' ,'Done' def sizeHint(self, option, index): + start = time.time() fm = option.fontMetrics - text = "the fish doesn't talk" - dataAsQVarMap = index.model().data(index) - nodeType = str(QVarMapAccess(dataAsQVarMap, 'nodeType')) + nodeData = index.model().data(index) + nodeType = nodeData.getType() + text = nodeData.toString() if nodeType == 'element' or nodeType == 'comment': numlines = 1 elif nodeType == 'text': @@ -249,6 +265,7 @@ class XmlDelegate(QItemDelegate): document.setHtml(text) # the +5 is for margin. The +4 is voodoo; # fm.height just give it too small. + #print time.strftime('%M:%S'),"[%.3f s]"%(time.time()-start), 'hint' ,'Done' return QSize(document.idealWidth() + 5, (fm.height() + 4) * numlines) class ElemNodeDelegate(QAbstractItemDelegate): @@ -276,13 +293,15 @@ class ElemNodeDelegate(QAbstractItemDelegate): return html def colorize(color, text): return '' + text + '' - 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)) - print htmlText - print getHtmlText(text, highGlobPattern, highAttPattern) + #print htmlText + #print getHtmlText(text, highGlobPattern, highAttPattern) document.setHtml(QString(htmlText)) else: htmlText = getHtmlText(text, nonHighGlobPattern, nonHighAttPattern) @@ -308,8 +327,9 @@ class TextNodeDelegate(QAbstractItemDelegate): return '
' + text + '' + text + ''
-        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))