from PySide import QtCore, QtGui
class node:
def __init__( self, nodeData = '', parentNode = None ):
self.childNodes = []
self.nodeData = nodeData
self.parentNode = parentNode
def addChild( self, childNode ):
if not childNode in self.childNodes:
self.childNodes.append( childNode )
childNode.parentNode = self
def removeChild( self, childNode ):
if childNode in self.childNodes:
self.childNodes.remove( childNode )
def removeAll( self ):
self.childNodes = []
def child( self, rowNum ):
if rowNum < 0 or rowNum >= len(self.childNodes): return None
return self.childNodes[rowNum]
def indexOf( self, childNode ):
if not childNode in self.childNodes: return -1
return self.childNodes.index( childNode )
def childCount( self ):
return len( self.childNodes )
def columnCount( self ):
return 1
def row( self ):
if self.parentNode <> None:
return self.parentNode.indexOf( self )
return -1
def data( self, column = 0 ):
return self.nodeData
def parent( self ):
return self.parentNode
def printNodes( self, level = 0 ):
for index in range( 0, level ):
print ' ',
print self.nodeData
for childNode in self.childNodes:
childNode.printNodes( level + 1 )
class NamespaceTreeModel( QtCore.QAbstractItemModel ):
def __init__( self, rootNode = node() ):
super( QtCore.QAbstractItemModel, self ).__init__()
self.rootNode = rootNode
def index( self, rowNum, columnNum, parentIndex ):
if not self.hasIndex( rowNum, columnNum, parentIndex ):
return QtCore.QModelIndex()
if not parentIndex.isValid():
parentNode = self.rootNode
else:
parentNode = parentIndex.internalPointer()
lChildNode = parentNode.child( rowNum )
if lChildNode <> None:
return self.createIndex( rowNum, columnNum, lChildNode )
else:
return QtCore.QModelIndex()
def parent( self, index ):
if not index.isValid():
return QtCore.QModelIndex()
curNode = index.internalPointer()
if curNode == self.rootNode:
return QtCore.QModelIndex()
return self.createIndex( curNode.row(), 0, curNode.parentNode )
def rowCount( self, parentIndex ):
if parentIndex.column() > 0:
return 0
if not parentIndex.isValid():
curNode = self.rootNode
else:
curNode = parentIndex.internalPointer()
return curNode.childCount()
def columnCount( self, parentIndex ):
if parentIndex.isValid():
return parentIndex.internalPointer().columnCount()
else:
return self.rootNode.columnCount()
def data( self, index, role ):
if not index.isValid():
return None
if role <> QtCore.Qt.DisplayRole:
return None
return index.internalPointer().data( index.column() )
def flags( self, index ):
if not index.isValid():
return 0
return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable
def headerData( self, section, orientation, role ):
if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole:
return self.rootNode.data( section )
return None