import logging log = logging.getLogger(__name__) class Node(dict): """A node that can be represented in a tree view. The node can store data just like a dictionary. >>> data = {"name": "John", "score": 10} >>> node = Node(data) >>> assert node["name"] == "John" """ def __init__(self, data=None): super(Node, self).__init__() self._children = list() self._parent = None if data is not None: assert isinstance(data, dict) self.update(data) def childCount(self): return len(self._children) def child(self, row): if row >= len(self._children): log.warning("Invalid row as child: {0}".format(row)) return return self._children[row] def children(self): return self._children def parent(self): return self._parent def row(self): """ Returns: int: Index of this node under parent""" if self._parent is not None: siblings = self.parent().children() return siblings.index(self) def add_child(self, child): """Add a child to this node""" child._parent = self self._children.append(child)