import os import sys from PyQt4.QtCore import * from PyQt4.QtGui import * from PyQt4.QtXml import * from sface.config import config from sface.screens.sfascreen import SfaScreen class DomModel(QAbstractItemModel): def __init__(self, document, parent = 0): QAbstractItemModel.__init__(self, parent) self.domDocument = document self.rootItem = DomItem(document, 0); def data(self, index, role): if not index.isValid(): return QVariant() if role != Qt.DisplayRole: return QVariant() node = index.internalPointer().node() attributeMap = node.attributes() col = index.column() if col == 0: if node.nodeType() == QDomNode.ElementNode: qslist = QStringList() for i in range(attributeMap.count()): attr = attributeMap.item(i) elem = (attr.nodeName() .append(QString('="')) .append(attr.nodeValue()) .append(QString('"'))) qslist.append(elem) return (QString('<'). append(node.nodeName()). append(' '). append(qslist.join(' ')). append('>')) elif node.nodeType() == QDomNode.AttributeNode: return QString('Whozat?!') elif node.nodeType() == QDomNode.TextNode: return node.nodeValue() elif node.nodeType() == QDomNode.CDATASectionNode: return QString('unsupported node type') elif node.nodeType() == QDomNode.EntityReferenceNode: return QString('unsupported node type') elif node.nodeType() == QDomNode.EntityNode: return QString('unsupported node type') elif node.nodeType() == QDomNode.ProcessingInstructionNode: return node.nodeName() elif node.nodeType() == QDomNode.CommentNode: return QString('#').append(node.nodeValue()) elif node.nodeType() == QDomNode.DocumentNode: return QString('unsupported node type') elif node.nodeType() == QDomNode.DocumentTypeNode: return QString('unsupported node type') elif node.nodeType() == QDomNode.DocumentFragmentNode: return QString('unsupported node type') elif node.nodeType() == QDomNode.NotationNode: return QString('unsupported node type') elif node.nodeType() == QDomNode.BaseNode: return QString('unsupported node type') elif node.nodeType() == QDomNode.CharacterDataNode: return QString('unsupported node type') else: return QVariant() else: return QVariant() def flags(self, index): if not index.isValid(): return Qt.ItemIsEnabled # does this `|` thing hold? return Qt.ItemIsEnabled | Qt.ItemIsSelectable def headerData(self, section, orientation, role): if orientation == Qt.Horizontal and role == Qt.DisplayRole: if section == 0: return QString("Do I need an header?") else: return QVariant() else: return QVariant() def index(self, row, column, parent): if not parent.isValid(): parentItem = self.rootItem else: parentItem = parent.internalPointer() childItem = parentItem.child(row) # childItem would be None to say "false"? if childItem: return self.createIndex(row, column, childItem) else: return QModelIndex() def parent(self, child): if not child.isValid(): return QModelIndex() childItem = child.internalPointer() parentItem = childItem.parent() if not parentItem or parentItem == self.rootItem: return QModelIndex() return self.createIndex(parentItem.row(), 0, parentItem) def rowCount(self, parent): if not parent.isValid(): parentItem = self.rootItem else: parentItem = parent.internalPointer() return parentItem.node().childNodes().count() def columnCount(self, parent): # just one column # we'll print tag name (and attributes) # or the tag content return 1 class DomItem: # wrapper around PyQt4.QtXml.QDomNode # it keeps an hash of childrens for # performance reasons def __init__(self, node, row, parent = 0): # node is of type PyQt4.QtXml.QDomNode self.domNode = node self.parentItem = parent self.rowNumber = row self.childItems = {} def child(self, i): if i in self.childItems: return self.childItems[i] if i >= 0 and i < self.domNode.childNodes().count(): childNode = self.domNode.childNodes().item(i) childItem = DomItem(childNode, i, self) self.childItems[i] = childItem return childItem return None def parent(self): return self.parentItem def node(self): return self.domNode def row(self): return self.rowNumber class RSpecWidget(QWidget): def __init__(self, parent=None): QWidget.__init__(self, parent) self.update_view() def update_view(self): document = QDomDocument("RSpec") rspec_file = config.getSliceRSpecFile() if not os.path.exists(rspec_file): return document.setContent(open(rspec_file,'r').read()) model = DomModel(document, self) view = QTreeView(self) view.setModel(model) layout = QVBoxLayout() layout.addWidget(view) self.setLayout(layout) class RSpecScreen(SfaScreen): def __init__(self, parent): SfaScreen.__init__(self, parent) widget = RSpecWidget(self) self.init(widget, "RSpec Window", "RSPec View")