Mercurial > lcfOS
view python/ide/astviewer.py @ 410:6aa9743ed362 tip
Reflect change in c3 public modifier
author | Windel Bouwman |
---|---|
date | Mon, 23 Feb 2015 21:06:04 +0100 |
parents | dcae6574c974 |
children |
line wrap: on
line source
from qtwrapper import QtGui, QtCore, QtWidgets, pyqtSignal, get_icon from ppci.c3 import Visitor, astnodes class AstModelBuilder: def __init__(self): self.functionIco = get_icon('functionicon.png') self.variableIco = get_icon('variableicon.png') self.model = QtGui.QStandardItemModel() self.model.setHorizontalHeaderLabels(['Object', 'Type']) def build(self, pkg): #self.model.clear() c = self.model.rowCount() self.model.removeRows(0, c) self.curItem = self.model.invisibleRootItem() if pkg: visitor = Visitor() visitor.visit(pkg, self.p1, self.p2) def p1(self, node): if type(node) is astnodes.Variable: i = QStandardItem(self.variableIco, str(node)) elif type(node) is astnodes.Function: i = QStandardItem(self.functionIco, str(node)) elif type(node) is astnodes.Package: i = QStandardItem(str(node)) else: return typ = str(node.typ) if hasattr(node, 'typ') else '' ti = QtGui.QStandardItem(str(typ)) ti.setData(node) i.setData(node) self.curItem.appendRow([i, ti]) self.curItem = i def p2(self, node): if type(node) in [astnodes.Variable, astnodes.Function, astnodes.Package]: self.curItem = self.curItem.parent() # The actual widget: class AstViewer(QtWidgets.QTreeView): sigNodeSelected = pyqtSignal(object) def __init__(self, parent=None): super().__init__(parent) self.clicked.connect(self.selectHandler) self.modelBuilder = AstModelBuilder() self.setModel(self.modelBuilder.model) def setAst(self, ast): """ Create a new model and add all ast elements to it """ 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)