Samples/Referencing/MBFileRefDemo/NamespaceTreeModel.py

Samples/Referencing/MBFileRefDemo/NamespaceTreeModel.py
1 from PySide2 import QtCore
2 
3 class node:
4  def __init__( self, nodeData = '', parentNode = None ):
5  self.childNodes = []
6  self.nodeData = nodeData
7  self.parentNode = parentNode
8 
9  def addChild( self, childNode ):
10  if not childNode in self.childNodes:
11  self.childNodes.append( childNode )
12  childNode.parentNode = self
13 
14  def removeChild( self, childNode ):
15  if childNode in self.childNodes:
16  self.childNodes.remove( childNode )
17 
18  def removeAll( self ):
19  self.childNodes = []
20 
21  def child( self, rowNum ):
22  if rowNum < 0 or rowNum >= len(self.childNodes): return None
23  return self.childNodes[rowNum]
24 
25  def indexOf( self, childNode ):
26  if not childNode in self.childNodes: return -1
27  return self.childNodes.index( childNode )
28 
29  def childCount( self ):
30  return len( self.childNodes )
31 
32  def columnCount( self ):
33  return 1
34 
35  def row( self ):
36  if self.parentNode <> None:
37  return self.parentNode.indexOf( self )
38  return -1
39 
40  def data( self, column = 0 ):
41  return self.nodeData
42 
43  def parent( self ):
44  return self.parentNode
45 
46  def printNodes( self, level = 0 ):
47  for index in range( 0, level ):
48  print ' ',
49  print self.nodeData
50  for childNode in self.childNodes:
51  childNode.printNodes( level + 1 )
52 
53 class NamespaceTreeModel( QtCore.QAbstractItemModel ):
54  def __init__( self, rootNode = node() ):
55  super( QtCore.QAbstractItemModel, self ).__init__()
56 
57  self.rootNode = rootNode
58 
59  def index( self, rowNum, columnNum, parentIndex ):
60  if not self.hasIndex( rowNum, columnNum, parentIndex ):
61  return QtCore.QModelIndex()
62 
63  if not parentIndex.isValid():
64  parentNode = self.rootNode
65  else:
66  parentNode = parentIndex.internalPointer()
67 
68  #print '::index(%d,%d,%s)' % ( rowNum, columnNum, parentNode.data() )
69 
70  lChildNode = parentNode.child( rowNum )
71  if lChildNode <> None:
72  #print '(%d,%d,%s)' % ( rowNum, columnNum, lChildNode.data() )
73  return self.createIndex( rowNum, columnNum, lChildNode )
74  else:
75  return QtCore.QModelIndex()
76 
77  def parent( self, index ):
78  #print '::parent(index(%d,%d,%s))' % ( index.row(), index.column(), index.internalPointer().data() )
79  if not index.isValid():
80  return QtCore.QModelIndex()
81 
82  curNode = index.internalPointer()
83  if curNode == self.rootNode:
84  return QtCore.QModelIndex()
85 
86  #print '**%s' % ( curNode.data() )
87  return self.createIndex( curNode.row(), 0, curNode.parentNode )
88 
89  def rowCount( self, parentIndex ):
90  #print '::rowCount(parentIndex(%d,%d))' % ( parentIndex.row(), parentIndex.column() )
91  if parentIndex.column() > 0:
92  return 0
93 
94  if not parentIndex.isValid():
95  curNode = self.rootNode
96  else:
97  curNode = parentIndex.internalPointer()
98 
99  return curNode.childCount()
100 
101  def columnCount( self, parentIndex ):
102  #print '::columnCount(parentIndex(%d,%d))' % ( parentIndex.row(), parentIndex.column() )
103  if parentIndex.isValid():
104  return parentIndex.internalPointer().columnCount()
105  else:
106  return self.rootNode.columnCount()
107 
108  def data( self, index, role ):
109  #print '::data(index(%d,%d,%s), %s)' % ( index.row(), index.column(), index.internalPointer().data(), str(role) )
110  if not index.isValid():
111  return None
112 
113  if role <> QtCore.Qt.DisplayRole:
114  return None
115 
116  return index.internalPointer().data( index.column() )
117 
118  def flags( self, index ):
119  #print '::flags(index(%d,%d), %s)' % ( index.row(), index.column() )
120  if not index.isValid():
121  return 0
122 
123  return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable
124 
125  def headerData( self, section, orientation, role ):
126  #print '::headerData(%d, %s, %s)' % ( section, str(orientation), str(role) )
127  if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole:
128  return self.rootNode.data( section )
129 
130  return None