4 from PyQt4.QtCore import *
5 from PyQt4.QtGui import *
6 from PyQt4.QtXml import *
8 from sface.config import config
9 from sface.screens.sfascreen import SfaScreen
12 class DomModel(QAbstractItemModel):
13 def __init__(self, document, parent = 0):
14 QAbstractItemModel.__init__(self, parent)
15 self.domDocument = document
16 self.rootItem = DomItem(document, 0);
18 def data(self, index, role):
19 if not index.isValid():
21 if role != Qt.DisplayRole:
23 node = index.internalPointer().node()
24 attributeMap = node.attributes()
28 if node.nodeType() == QDomNode.ElementNode:
29 qslist = QStringList()
30 for i in range(attributeMap.count()):
31 attr = attributeMap.item(i)
32 elem = (attr.nodeName()
33 .append(QString('="'))
34 .append(attr.nodeValue())
35 .append(QString('"')))
38 append(node.nodeName()).
40 append(qslist.join(' ')).
42 elif node.nodeType() == QDomNode.AttributeNode:
43 return QString('Whozat?!')
44 elif node.nodeType() == QDomNode.TextNode:
45 return node.nodeValue()
46 elif node.nodeType() == QDomNode.CDATASectionNode:
47 return QString('unsupported node type')
48 elif node.nodeType() == QDomNode.EntityReferenceNode:
49 return QString('unsupported node type')
50 elif node.nodeType() == QDomNode.EntityNode:
51 return QString('unsupported node type')
52 elif node.nodeType() == QDomNode.ProcessingInstructionNode:
53 return node.nodeName()
54 elif node.nodeType() == QDomNode.CommentNode:
55 return QString('#').append(node.nodeValue())
56 elif node.nodeType() == QDomNode.DocumentNode:
57 return QString('unsupported node type')
58 elif node.nodeType() == QDomNode.DocumentTypeNode:
59 return QString('unsupported node type')
60 elif node.nodeType() == QDomNode.DocumentFragmentNode:
61 return QString('unsupported node type')
62 elif node.nodeType() == QDomNode.NotationNode:
63 return QString('unsupported node type')
64 elif node.nodeType() == QDomNode.BaseNode:
65 return QString('unsupported node type')
66 elif node.nodeType() == QDomNode.CharacterDataNode:
67 return QString('unsupported node type')
73 def flags(self, index):
74 if not index.isValid():
75 return Qt.ItemIsEnabled
76 # does this `|` thing hold?
77 return Qt.ItemIsEnabled | Qt.ItemIsSelectable
79 def headerData(self, section, orientation, role):
82 def index(self, row, column, parent):
83 if not parent.isValid():
84 parentItem = self.rootItem
86 parentItem = parent.internalPointer()
88 childItem = parentItem.child(row)
89 # childItem would be None to say "false"?
91 return self.createIndex(row, column, childItem)
95 def parent(self, child):
96 if not child.isValid():
98 childItem = child.internalPointer()
99 parentItem = childItem.parent()
101 if not parentItem or parentItem == self.rootItem:
103 return self.createIndex(parentItem.row(), 0, parentItem)
105 def rowCount(self, parent):
106 if not parent.isValid():
107 parentItem = self.rootItem
109 parentItem = parent.internalPointer()
111 return parentItem.node().childNodes().count()
113 def columnCount(self, parent):
115 # we'll print tag name (and attributes)
121 # wrapper around PyQt4.QtXml.QDomNode
122 # it keeps an hash of childrens for
123 # performance reasons
125 def __init__(self, node, row, parent = 0):
126 # node is of type PyQt4.QtXml.QDomNode
128 self.parentItem = parent
133 if i in self.childItems:
134 return self.childItems[i]
135 if i >= 0 and i < self.domNode.childNodes().count():
136 childNode = self.domNode.childNodes().item(i)
137 childItem = DomItem(childNode, i, self)
138 self.childItems[i] = childItem
143 return self.parentItem
149 return self.rowNumber
152 class RSpecWidget(QWidget):
153 def __init__(self, parent=None):
154 QWidget.__init__(self, parent)
157 def updateView(self):
158 document = QDomDocument("RSpec")
159 rspec_file = config.getSliceRSpecFile()
160 if not os.path.exists(rspec_file):
163 document.setContent(open(rspec_file,'r').read())
164 model = DomModel(document, self)
166 view = QTreeView(self)
167 view.setHeaderHidden(True)
170 layout = QVBoxLayout()
171 layout.addWidget(view)
172 self.setLayout(layout)
175 class RSpecScreen(SfaScreen):
176 def __init__(self, parent):
177 SfaScreen.__init__(self, parent)
179 widget = RSpecWidget(self)
180 self.init(widget, "RSpec Window", "RSPec View")
182 def rspecUpdated(self):
183 self.widget.updateView()