3 from PyQt4.QtCore import *
4 from PyQt4.QtGui import *
5 from PyQt4.QtXml import *
7 from sface.config import config
10 class DomModel(QAbstractItemModel):
11 def __init__(self, document, parent = 0):
12 QAbstractItemModel.__init__(self, parent)
13 self.domDocument = document
14 self.rootItem = DomItem(document, 0);
16 def data(self, index, role):
17 if not index.isValid():
19 if role != Qt.DisplayRole:
21 node = index.internalPointer().node()
22 attributeMap = node.attributes()
26 if node.nodeType() == QDomNode.ElementNode:
27 qslist = QStringList()
28 for i in range(attributeMap.count()):
29 attr = attributeMap.item(i)
30 elem = (attr.nodeName()
31 .append(QString('="'))
32 .append(attr.nodeValue())
33 .append(QString('"')))
36 append(node.nodeName()).
38 append(qslist.join(' ')).
40 elif node.nodeType() == QDomNode.AttributeNode:
41 return QString('Whozat?!')
42 elif node.nodeType() == QDomNode.TextNode:
43 return node.nodeValue()
44 elif node.nodeType() == QDomNode.CDATASectionNode:
45 return QString('unsupported node type')
46 elif node.nodeType() == QDomNode.EntityReferenceNode:
47 return QString('unsupported node type')
48 elif node.nodeType() == QDomNode.EntityNode:
49 return QString('unsupported node type')
50 elif node.nodeType() == QDomNode.ProcessingInstructionNode:
51 return node.nodeName()
52 elif node.nodeType() == QDomNode.CommentNode:
53 return QString('#').append(node.nodeValue())
54 elif node.nodeType() == QDomNode.DocumentNode:
55 return QString('unsupported node type')
56 elif node.nodeType() == QDomNode.DocumentTypeNode:
57 return QString('unsupported node type')
58 elif node.nodeType() == QDomNode.DocumentFragmentNode:
59 return QString('unsupported node type')
60 elif node.nodeType() == QDomNode.NotationNode:
61 return QString('unsupported node type')
62 elif node.nodeType() == QDomNode.BaseNode:
63 return QString('unsupported node type')
64 elif node.nodeType() == QDomNode.CharacterDataNode:
65 return QString('unsupported node type')
71 def flags(self, index):
72 if not index.isValid():
73 return Qt.ItemIsEnabled
74 # does this `|` thing hold?
75 return Qt.ItemIsEnabled | Qt.ItemIsSelectable
77 def headerData(self, section, orientation, role):
78 if orientation == Qt.Horizontal and role == Qt.DisplayRole:
80 return QString("Do I need an header?")
86 def index(self, row, column, parent):
87 if not parent.isValid():
88 parentItem = self.rootItem
90 parentItem = parent.internalPointer()
92 childItem = parentItem.child(row)
93 # childItem would be None to say "false"?
95 return self.createIndex(row, column, childItem)
99 def parent(self, child):
100 if not child.isValid():
102 childItem = child.internalPointer()
103 parentItem = childItem.parent()
105 if not parentItem or parentItem == self.rootItem:
107 return self.createIndex(parentItem.row(), 0, parentItem)
109 def rowCount(self, parent):
110 if not parent.isValid():
111 parentItem = self.rootItem
113 parentItem = parent.internalPointer()
115 return parentItem.node().childNodes().count()
117 def columnCount(self, parent):
119 # we'll print tag name (and attributes)
125 # wrapper around PyQt4.QtXml.QDomNode
126 # it keeps an hash of childrens for
127 # performance reasons
129 def __init__(self, node, row, parent = 0):
130 # node is of type PyQt4.QtXml.QDomNode
132 self.parentItem = parent
137 if i in self.childItems:
138 return self.childItems[i]
139 if i >= 0 and i < self.domNode.childNodes().count():
140 childNode = self.domNode.childNodes().item(i)
141 childItem = DomItem(childNode, i, self)
142 self.childItems[i] = childItem
147 return self.parentItem
153 return self.rowNumber
157 class XmlWindow(QDialog):
158 def __init__(self, parent=None):
159 QDialog.__init__(self, parent)
161 document = QDomDocument("Current RSpec")
162 rspec_file = config.getSliceRSpecFile()
163 document.setContent(open(rspec_file,'r').read())
165 model = DomModel(document, self)
166 self.view = QTreeView()
167 self.view.setModel(model)
169 layout = QVBoxLayout()
170 layout.addWidget(self.view)
171 self.setLayout(layout)
173 self.setWindowTitle("Current Slice's RSpec")