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):
80 if orientation == Qt.Horizontal and role == Qt.DisplayRole:
82 return QString("Do I need an header?")
88 def index(self, row, column, parent):
89 if not parent.isValid():
90 parentItem = self.rootItem
92 parentItem = parent.internalPointer()
94 childItem = parentItem.child(row)
95 # childItem would be None to say "false"?
97 return self.createIndex(row, column, childItem)
101 def parent(self, child):
102 if not child.isValid():
104 childItem = child.internalPointer()
105 parentItem = childItem.parent()
107 if not parentItem or parentItem == self.rootItem:
109 return self.createIndex(parentItem.row(), 0, parentItem)
111 def rowCount(self, parent):
112 if not parent.isValid():
113 parentItem = self.rootItem
115 parentItem = parent.internalPointer()
117 return parentItem.node().childNodes().count()
119 def columnCount(self, parent):
121 # we'll print tag name (and attributes)
127 # wrapper around PyQt4.QtXml.QDomNode
128 # it keeps an hash of childrens for
129 # performance reasons
131 def __init__(self, node, row, parent = 0):
132 # node is of type PyQt4.QtXml.QDomNode
134 self.parentItem = parent
139 if i in self.childItems:
140 return self.childItems[i]
141 if i >= 0 and i < self.domNode.childNodes().count():
142 childNode = self.domNode.childNodes().item(i)
143 childItem = DomItem(childNode, i, self)
144 self.childItems[i] = childItem
149 return self.parentItem
155 return self.rowNumber
158 class RSpecWidget(QWidget):
159 def __init__(self, parent=None):
160 QWidget.__init__(self, parent)
163 def update_view(self):
164 document = QDomDocument("RSpec")
165 rspec_file = config.getSliceRSpecFile()
166 if not os.path.exists(rspec_file):
169 document.setContent(open(rspec_file,'r').read())
170 model = DomModel(document, self)
172 view = QTreeView(self)
175 layout = QVBoxLayout()
176 layout.addWidget(view)
177 self.setLayout(layout)
180 class RSpecScreen(SfaScreen):
181 def __init__(self, parent):
182 SfaScreen.__init__(self, parent)
184 widget = RSpecWidget(self)
185 self.init(widget, "RSpec Window", "RSPec View")