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():