-class RowData(object):
-
- HEADERS = ["", "Equation", "Result"]
- ALIGNMENT = [QtCore.Qt.AlignLeft, QtCore.Qt.AlignLeft, QtCore.Qt.AlignLeft]
- CLOSE_COLUMN = 0
- EQ_COLUMN = 1
- RESULT_COLUMN = 2
-
- def __init__(self, renderer, node, simpleNode):
- self._node = node
- self._simpleNode = simpleNode
- self._prettyRenderer = renderer
-
- @property
- def node(self):
- return self._node
-
- @property
- def simpleNode(self):
- return self._simpleNode
-
- @property
- def equation(self):
- return operation.render_operation(self._prettyRenderer, self._node)
-
- @property
- def result(self):
- return operation.render_operation(self._prettyRenderer, self._simpleNode)
-
- def data(self, column):
- if column == self.CLOSE_COLUMN:
- return ""
- elif column == self.EQ_COLUMN:
- return self.equation
- elif column == self.RESULT_COLUMN:
- return self.result
- else:
- return None
-
-
-class HistoryModel(QtCore.QAbstractItemModel):
-
- def __init__(self, parent=None):
- super(HistoryModel, self).__init__(parent)
-
- self._children = []
-
- @misc_utils.log_exception(_moduleLogger)
- def columnCount(self, parent):
- if parent.isValid():
- return 0
- else:
- return len(RowData.HEADERS)
-
- @misc_utils.log_exception(_moduleLogger)
- def data(self, index, role):
- if not index.isValid():
- return None
-
- if role == QtCore.Qt.DisplayRole:
- item = index.internalPointer()
- if isinstance(item, RowData):
- print "d-rw", item.data(index.column())
- return item.data(index.column())
- elif item is RowData.HEADERS:
- print "d-h", item[index.column()]
- return item[index.column()]
- elif role == QtCore.Qt.TextAlignmentRole:
- return RowData.ALIGNMENT[index.column()]
- elif role == QtCore.Qt.DecorationRole:
- if index.column() == RowData.CLOSE_COLUMN:
- return None
- else:
- return None
- else:
- return None
-
- @misc_utils.log_exception(_moduleLogger)
- def flags(self, index):
- if not index.isValid():
- return QtCore.Qt.NoItemFlags
-
- return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable
-
- @misc_utils.log_exception(_moduleLogger)
- def headerData(self, section, orientation, role):
- if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole:
- return RowData.HEADERS[section]
-
- return None
-
- @misc_utils.log_exception(_moduleLogger)
- def index(self, row, column, parent):
- if not self.hasIndex(row, column, parent):
- return QtCore.QModelIndex()
-
- elif parent.isValid():
- return QtCore.QModelIndex()
-
- parentItem = RowData.HEADERS
- childItem = self._children[row]
- if childItem:
- print "i", row, column, childItem
- return self.createIndex(row, column, childItem)
- else:
- return QtCore.QModelIndex()
-
- @misc_utils.log_exception(_moduleLogger)
- def parent(self, index):
- if not index.isValid():
- return QtCore.QModelIndex()
-
- childItem = index.internalPointer()
- if isinstance(childItem, RowData):
- return QtCore.QModelIndex()
- elif childItem is RowData.HEADERS:
- return None
-
- @misc_utils.log_exception(_moduleLogger)
- def rowCount(self, parent):
- if 0 < parent.column():
- return 0
-
- if not parent.isValid():
- print "rc", len(self._children)
- return len(self._children)
- else:
- print "rc", len(self._children)
- return len(self._children)
-
- def push(self, row):
- self._children.append(row)
- self._signal_rows_added()
- print "push", row
- print "push", len(self._children)
-
- def pop(self):
- data = self._children[-1]
- del self._children[-1]
- self._signal_rows_removed()
- print "pop", data
- return data
-
- def peek(self):
- data = self._children[-1]
- return data
-
- def clear(self):
- del self._children[:]
- self._all_changed
-
- def __len__(self):
- return len(self._children)
-
- def __iter__(self):
- return iter(self._children)
-
- def _signal_rows_added(self):
- # @todo Only signal new rows
- self._all_changed()
-
- def _signal_rows_removed(self):
- # @todo Only signal new rows
- self._all_changed()
-
- def _all_changed(self):
- if not self._children:
- return
- topLeft = self.createIndex(0, 0, self._children[0])
- bottomRight = self.createIndex(len(self._children)-1, len(RowData.HEADERS)-1, self._children[-1])
- self.dataChanged.emit(topLeft, bottomRight)
-
-