comparison python/astviewer.py @ 165:598d3888a11c

Added front class and fided AST view
author Windel Bouwman
date Fri, 22 Mar 2013 15:12:38 +0100
parents e023d3ce1d63
children 49f1ab80d040
comparison
equal deleted inserted replaced
164:e023d3ce1d63 165:598d3888a11c
1 from PyQt4.QtCore import * 1 from PyQt4.QtCore import *
2 from PyQt4.QtGui import * 2 from PyQt4.QtGui import *
3 from c3 import Visitor 3 from c3 import Visitor
4 4
5 def astToNamedElement(astNode, parentNode): 5 class AstModelBuilder:
6 """ Helper to convert and AST tree to NamedElement tree: """ 6 def __init__(self):
7 item = QStandardItem(str(astNode)) 7 self.visitor = Visitor(self.p1, self.p2)
8 item.setData(astNode) 8 def build(self, pkg):
9 parentNode.appendRow(item) 9 model = QStandardItemModel()
10 for c in astNode.getChildren(): 10 model.setHorizontalHeaderLabels(['Object', 'Type'])
11 astToNamedElement(c, item) 11 self.curItem = model.invisibleRootItem()
12 self.visitor.visit(pkg)
13 return model
14 def p1(self, node):
15 i = QStandardItem(str(node))
16 typ = str(node.typ) if hasattr(node, 'typ') else ''
17 ti = QStandardItem(str(typ))
18 ti.setData(node)
19 i.setData(node)
20 self.curItem.appendRow([i, ti])
21 self.curItem = i
22 def p2(self, node):
23 self.curItem = self.curItem.parent()
12 24
13 # The actual widget: 25 # The actual widget:
14 class AstViewer(QTreeView): 26 class AstViewer(QTreeView):
15 sigNodeSelected = pyqtSignal(object) 27 sigNodeSelected = pyqtSignal(object)
16 def __init__(self, parent=None): 28 def __init__(self, parent=None):
17 super(AstViewer, self).__init__(parent) 29 super(AstViewer, self).__init__(parent)
18 self.setHeaderHidden(True)
19 self.clicked.connect(self.selectHandler) 30 self.clicked.connect(self.selectHandler)
31 self.modelBuilder = AstModelBuilder()
20 32
21 def setAst(self, ast): 33 def setAst(self, ast):
22 """ Create a new model and add all ast elements to it """ 34 """ Create a new model and add all ast elements to it """
23 model = QStandardItemModel()
24 print(ast) 35 print(ast)
25 if ast: 36 if ast:
26 astToNamedElement(ast, model.invisibleRootItem()) 37 self.setModel(self.modelBuilder.build(ast))
27 self.setModel(model) 38 self.expandAll()
28 self.expandAll()
29 39
30 def selectHandler(self, index): 40 def selectHandler(self, index):
31 if not index.isValid(): 41 if not index.isValid():
32 return 42 return
33 model = self.model() 43 model = self.model()