view 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 source

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from c3 import Visitor

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.clicked.connect(self.selectHandler)
      self.modelBuilder = AstModelBuilder()

   def setAst(self, ast):
      """ Create a new model and add all ast elements to it """
      print(ast)
      if ast:
         self.setModel(self.modelBuilder.build(ast))
         self.expandAll()

   def selectHandler(self, index):
      if not index.isValid():
         return
      model = self.model()
      item = model.itemFromIndex(index)
      node = item.data()
      self.sigNodeSelected.emit(node)