Mercurial > lcfOS
diff 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 |
line wrap: on
line diff
--- a/python/astviewer.py Mon Mar 18 22:15:57 2013 +0100 +++ b/python/astviewer.py Fri Mar 22 15:12:38 2013 +0100 @@ -2,30 +2,40 @@ from PyQt4.QtGui import * from c3 import Visitor -def astToNamedElement(astNode, parentNode): - """ Helper to convert and AST tree to NamedElement tree: """ - item = QStandardItem(str(astNode)) - item.setData(astNode) - parentNode.appendRow(item) - for c in astNode.getChildren(): - astToNamedElement(c, item) +class AstModelBuilder: + def __init__(self): + self.visitor = Visitor(self.p1, self.p2) + def build(self, pkg): + model = QStandardItemModel() + model.setHorizontalHeaderLabels(['Object', 'Type']) + self.curItem = model.invisibleRootItem() + self.visitor.visit(pkg) + return model + def p1(self, node): + i = QStandardItem(str(node)) + typ = str(node.typ) if hasattr(node, 'typ') else '' + ti = QStandardItem(str(typ)) + ti.setData(node) + i.setData(node) + self.curItem.appendRow([i, ti]) + self.curItem = i + def p2(self, node): + self.curItem = self.curItem.parent() # The actual widget: class AstViewer(QTreeView): sigNodeSelected = pyqtSignal(object) def __init__(self, parent=None): super(AstViewer, self).__init__(parent) - self.setHeaderHidden(True) self.clicked.connect(self.selectHandler) + self.modelBuilder = AstModelBuilder() def setAst(self, ast): """ Create a new model and add all ast elements to it """ - model = QStandardItemModel() print(ast) if ast: - astToNamedElement(ast, model.invisibleRootItem()) - self.setModel(model) - self.expandAll() + self.setModel(self.modelBuilder.build(ast)) + self.expandAll() def selectHandler(self, index): if not index.isValid():