tcustom_model.py - electrum - Electrum Bitcoin wallet
HTML git clone https://git.parazyd.org/electrum
DIR Log
DIR Files
DIR Refs
DIR Submodules
---
tcustom_model.py (2620B)
---
1 # loosely based on
2 # http://trevorius.com/scrapbook/uncategorized/pyqt-custom-abstractitemmodel/
3
4 from PyQt5 import QtCore, QtWidgets
5
6 class CustomNode:
7
8 def __init__(self, model, data):
9 self.model = model
10 self._data = data
11 self._children = []
12 self._parent = None
13 self._row = 0
14
15 def get_data(self):
16 return self._data
17
18 def get_data_for_role(self, index, role):
19 # define in child class
20 raise NotImplementedError()
21
22 def childCount(self):
23 return len(self._children)
24
25 def child(self, row):
26 if row >= 0 and row < self.childCount():
27 return self._children[row]
28
29 def parent(self):
30 return self._parent
31
32 def row(self):
33 return self._row
34
35 def addChild(self, child):
36 child._parent = self
37 child._row = len(self._children)
38 self._children.append(child)
39
40
41
42 class CustomModel(QtCore.QAbstractItemModel):
43
44 def __init__(self, parent, columncount):
45 QtCore.QAbstractItemModel.__init__(self, parent)
46 self._root = CustomNode(self, None)
47 self._columncount = columncount
48
49 def rowCount(self, index):
50 if index.isValid():
51 return index.internalPointer().childCount()
52 return self._root.childCount()
53
54 def columnCount(self, index):
55 return self._columncount
56
57 def addChild(self, node, _parent):
58 if not _parent or not _parent.isValid():
59 parent = self._root
60 else:
61 parent = _parent.internalPointer()
62 parent.addChild(self, node)
63
64 def index(self, row, column, _parent=None):
65 if not _parent or not _parent.isValid():
66 parent = self._root
67 else:
68 parent = _parent.internalPointer()
69
70 if not QtCore.QAbstractItemModel.hasIndex(self, row, column, _parent):
71 return QtCore.QModelIndex()
72
73 child = parent.child(row)
74 if child:
75 return QtCore.QAbstractItemModel.createIndex(self, row, column, child)
76 else:
77 return QtCore.QModelIndex()
78
79 def parent(self, index):
80 if index.isValid():
81 node = index.internalPointer()
82 if node:
83 p = node.parent()
84 if p:
85 return QtCore.QAbstractItemModel.createIndex(self, p.row(), 0, p)
86 else:
87 return QtCore.QModelIndex()
88 return QtCore.QModelIndex()
89
90 def data(self, index, role):
91 if not index.isValid():
92 return None
93 node = index.internalPointer()
94 return node.get_data_for_role(index, role)