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 RSpecView(QTreeView):
13 def __init__(self, parent):
14 QTreeView.__init__(self, parent)
16 self.setAnimated(True)
17 self.setItemsExpandable(True)
18 self.setRootIsDecorated(True)
19 self.setHeaderHidden(True)
20 self.setAttribute(Qt.WA_MacShowFocusRect, 0)
21 self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
24 class DomModel(QAbstractItemModel):
25 def __init__(self, document, parent = 0):
26 QAbstractItemModel.__init__(self, parent)
27 self.domDocument = document
28 self.rootItem = DomItem(document, 0);
30 def data(self, index, role):
31 if not index.isValid():
33 if role != Qt.DisplayRole:
35 node = index.internalPointer().node()
36 attributeMap = node.attributes()
40 if node.nodeType() == QDomNode.ElementNode:
41 qslist = QStringList()
42 for i in range(attributeMap.count()):
43 attr = attributeMap.item(i)
44 elem = (attr.nodeName()
45 .append(QString('="'))
46 .append(attr.nodeValue())
47 .append(QString('"')))
50 append(node.nodeName()).
52 append(qslist.join(' ')).
54 elif node.nodeType() == QDomNode.AttributeNode:
55 return QString('Whozat?!')
56 elif node.nodeType() == QDomNode.TextNode:
57 return node.nodeValue()
58 elif node.nodeType() == QDomNode.CDATASectionNode:
59 return QString('unsupported node type')
60 elif node.nodeType() == QDomNode.EntityReferenceNode:
61 return QString('unsupported node type')
62 elif node.nodeType() == QDomNode.EntityNode:
63 return QString('unsupported node type')
64 elif node.nodeType() == QDomNode.ProcessingInstructionNode:
65 return node.nodeName()
66 elif node.nodeType() == QDomNode.CommentNode:
67 return QString('#').append(node.nodeValue())
68 elif node.nodeType() == QDomNode.DocumentNode:
69 return QString('unsupported node type')
70 elif node.nodeType() == QDomNode.DocumentTypeNode:
71 return QString('unsupported node type')
72 elif node.nodeType() == QDomNode.DocumentFragmentNode:
73 return QString('unsupported node type')
74 elif node.nodeType() == QDomNode.NotationNode:
75 return QString('unsupported node type')
76 elif node.nodeType() == QDomNode.BaseNode:
77 return QString('unsupported node type')
78 elif node.nodeType() == QDomNode.CharacterDataNode:
79 return QString('unsupported node type')
85 def flags(self, index):
86 if not index.isValid():
87 return Qt.ItemIsEnabled
88 # does this `|` thing hold?
89 return Qt.ItemIsEnabled | Qt.ItemIsSelectable
91 def headerData(self, section, orientation, role):
94 def index(self, row, column, parent):
95 if not parent.isValid():
96 parentItem = self.rootItem
98 parentItem = parent.internalPointer()
100 childItem = parentItem.child(row)
101 # childItem would be None to say "false"?
103 return self.createIndex(row, column, childItem)
107 def parent(self, child):
108 if not child.isValid():
110 childItem = child.internalPointer()
111 parentItem = childItem.parent()
113 if not parentItem or parentItem == self.rootItem:
115 return self.createIndex(parentItem.row(), 0, parentItem)
117 def rowCount(self, parent):
118 if not parent.isValid():
119 parentItem = self.rootItem
121 parentItem = parent.internalPointer()
123 return parentItem.node().childNodes().count()
125 def columnCount(self, parent):
127 # we'll print tag name (and attributes)
133 # wrapper around PyQt4.QtXml.QDomNode
134 # it keeps an hash of childrens for
135 # performance reasons
137 def __init__(self, node, row, parent = 0):
138 # node is of type PyQt4.QtXml.QDomNode
140 self.parentItem = parent
145 if i in self.childItems:
146 return self.childItems[i]
147 if i >= 0 and i < self.domNode.childNodes().count():
148 childNode = self.domNode.childNodes().item(i)
149 childItem = DomItem(childNode, i, self)
150 self.childItems[i] = childItem
155 return self.parentItem
161 return self.rowNumber
165 class RSpecWidget(QWidget):
166 def __init__(self, parent=None):
167 QWidget.__init__(self, parent)
169 self.view = RSpecView(self)
173 def updateView(self):
174 document = QDomDocument("RSpec")
175 rspec_file = config.getSliceRSpecFile()
176 if not os.path.exists(rspec_file):
179 document.setContent(open(rspec_file,'r').read())
180 model = DomModel(document, self)
182 view = RSpecView(self)
187 layout = QVBoxLayout()
188 layout.addWidget(view)
189 self.setLayout(layout)
192 class RSpecScreen(SfaScreen):
193 def __init__(self, parent):
194 SfaScreen.__init__(self, parent)
196 widget = RSpecWidget(self)
197 self.init(widget, "RSpec Window", "RSPec View")
199 def rspecUpdated(self):
200 self.widget.updateView()