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 # one of the children of the rootItem is the 'xml' thing.
30 childList = document.childNodes()
31 for i in range(childList.count()):
32 currElem = childList.item(i)
33 if (currElem.nodeType() ==
34 QDomNode.ProcessingInstructionNode):
35 document.removeChild(currElem)
37 self.rootItem = DomItem(document, 0);
39 def data(self, index, role):
40 if not index.isValid():
42 if role != Qt.DisplayRole:
44 node = index.internalPointer().node()
45 attributeMap = node.attributes()
49 if node.nodeType() == QDomNode.ElementNode:
50 qslist = QStringList()
51 for i in range(attributeMap.count()):
52 attr = attributeMap.item(i)
53 elem = (attr.nodeName()
54 .append(QString('="'))
55 .append(attr.nodeValue())
56 .append(QString('"')))
59 append(node.nodeName()).
61 append(qslist.join(' ')).
63 elif node.nodeType() == QDomNode.AttributeNode:
64 return QString('Whozat?!')
65 elif node.nodeType() == QDomNode.TextNode:
66 return node.nodeValue()
67 elif node.nodeType() == QDomNode.CDATASectionNode:
68 return QString('unsupported node type')
69 elif node.nodeType() == QDomNode.EntityReferenceNode:
70 return QString('unsupported node type')
71 elif node.nodeType() == QDomNode.EntityNode:
72 return QString('unsupported node type')
73 elif node.nodeType() == QDomNode.ProcessingInstructionNode:
75 #return node.nodeName()
76 elif node.nodeType() == QDomNode.CommentNode:
77 return QString('#').append(node.nodeValue())
78 elif node.nodeType() == QDomNode.DocumentNode:
79 return QString('unsupported node type')
80 elif node.nodeType() == QDomNode.DocumentTypeNode:
81 return QString('unsupported node type')
82 elif node.nodeType() == QDomNode.DocumentFragmentNode:
83 return QString('unsupported node type')
84 elif node.nodeType() == QDomNode.NotationNode:
85 return QString('unsupported node type')
86 elif node.nodeType() == QDomNode.BaseNode:
87 return QString('unsupported node type')
88 elif node.nodeType() == QDomNode.CharacterDataNode:
89 return QString('unsupported node type')
95 def flags(self, index):
96 if not index.isValid():
97 return Qt.ItemIsEnabled
98 # does this `|` thing hold?
99 return Qt.ItemIsEnabled | Qt.ItemIsSelectable
101 def headerData(self, section, orientation, role):
104 def index(self, row, column, parent):
105 if not parent.isValid():
106 parentItem = self.rootItem
108 parentItem = parent.internalPointer()
110 childItem = parentItem.child(row)
111 # childItem would be None to say "false"?
113 return self.createIndex(row, column, childItem)
117 def parent(self, child):
118 if not child.isValid():
120 childItem = child.internalPointer()
121 parentItem = childItem.parent()
123 if not parentItem or parentItem == self.rootItem:
125 return self.createIndex(parentItem.row(), 0, parentItem)
127 def rowCount(self, parent):
128 if not parent.isValid():
129 parentItem = self.rootItem
131 parentItem = parent.internalPointer()
133 return parentItem.node().childNodes().count()
135 def columnCount(self, parent):
137 # we'll print tag name (and attributes)
143 # wrapper around PyQt4.QtXml.QDomNode
144 # it keeps an hash of childrens for
145 # performance reasons
147 def __init__(self, node, row, parent = 0):
148 # node is of type PyQt4.QtXml.QDomNode
150 self.parentItem = parent
155 if i in self.childItems:
156 return self.childItems[i]
157 if i >= 0 and i < self.domNode.childNodes().count():
158 childNode = self.domNode.childNodes().item(i)
159 childItem = DomItem(childNode, i, self)
160 self.childItems[i] = childItem
165 return self.parentItem
171 return self.rowNumber
175 class RSpecWidget(QWidget):
176 def __init__(self, parent=None):
177 QWidget.__init__(self, parent)
180 def updateView(self):
181 document = QDomDocument("RSpec")
182 rspec_file = config.getSliceRSpecFile()
183 if not os.path.exists(rspec_file):
186 document.setContent(open(rspec_file,'r').read())
187 model = DomModel(document, self)
189 view = RSpecView(self)
194 layout = QVBoxLayout()
195 layout.addWidget(view)
196 self.setLayout(layout)
199 class RSpecScreen(SfaScreen):
200 def __init__(self, parent):
201 SfaScreen.__init__(self, parent)
203 widget = RSpecWidget(self)
204 self.init(widget, "RSpec Window", "RSPec View")
206 def rspecUpdated(self):
207 self.widget.updateView()