Use QPersistentModelIndex in textEditView

It is much simpler than catching rowsAboutToBeDeleted signal from model. Also
it fixes #306.
This commit is contained in:
JackXVII 2018-01-18 01:17:19 +03:00 committed by Curtis Gedak
parent 63b471e10d
commit 3a21ddd137

View file

@ -2,7 +2,7 @@
# --!-- coding: utf8 --!--
import re
from PyQt5.QtCore import QTimer, QModelIndex, Qt, QEvent, pyqtSignal, QRegExp, QLocale
from PyQt5.QtCore import QTimer, QModelIndex, Qt, QEvent, pyqtSignal, QRegExp, QLocale, QPersistentModelIndex
from PyQt5.QtGui import QTextBlockFormat, QTextCharFormat, QFont, QColor, QIcon, QMouseEvent, QTextCursor
from PyQt5.QtWidgets import QWidget, QTextEdit, qApp, QAction, QMenu
@ -106,10 +106,6 @@ class textEditView(QTextEdit):
self._model.dataChanged.connect(self.update, F.AUC)
except TypeError:
pass
try:
self._model.rowsAboutToBeRemoved.connect(self.rowsAboutToBeRemoved, F.AUC)
except TypeError:
pass
def setColumn(self, col):
self._column = col
@ -128,7 +124,7 @@ class textEditView(QTextEdit):
self.setEnabled(True)
if index.column() != self._column:
index = index.sibling(index.row(), self._column)
self._index = index
self._index = QPersistentModelIndex(index)
self.setPlaceholderText(self._placeholderText)
@ -169,7 +165,7 @@ class textEditView(QTextEdit):
self.setEnabled(True)
if i.column() != self._column:
i = i.sibling(i.row(), self._column)
self._indexes.append(i)
self._indexes.append(QPersistentModelIndex(i))
if not self._model:
self.setModel(i.model())
@ -264,9 +260,9 @@ class textEditView(QTextEdit):
if self._updateIndexFromID:
# We have to update to a new index
self._index = self._index.model().getIndexByID(
self._updateIndexFromID,
self._column)
index = self._index.model().getIndexByID(self._updateIndexFromID,
self._column)
self._index = QPersistentModelIndex(index)
self._updateIndexFromID = None
if self._index and self._index.isValid():
@ -292,39 +288,6 @@ class textEditView(QTextEdit):
if update:
self.updateText()
def rowsAboutToBeRemoved(self, parent, first, last):
if self._index and self._index.isValid():
# Has my _index just been removed?
if self._index.parent() == parent and \
first <= self._index.row() <= last:
self._index = None
self.setEnabled(False)
return
# FIXME: self._indexes
if self._index.model() != outlineItem:
# The next stuff is only for outlineItems
return
# We check if item is a child of the row about to be removed
child = False
p = self._index.parent()
while p:
if p == parent:
child = True
p = None
elif p.isValid():
p = p.parent()
else:
p = None
if child:
# Item might have moved (so will not be valid any more)
ID = self._index.internalPointer().ID()
# We store ID, and we update it in self.update (after the
# rows have been removed).
self._updateIndexFromID = ID
def disconnectDocument(self):
try:
self.document().contentsChanged.disconnect(self.updateTimer.start)
@ -341,9 +304,9 @@ class textEditView(QTextEdit):
self._updating = True
if self._index:
self.disconnectDocument()
if self.toPlainText() != F.toString(self._model.data(self._index)):
if self.toPlainText() != F.toString(self._index.data()):
# print(" Updating plaintext")
self.document().setPlainText(F.toString(self._model.data(self._index)))
self.document().setPlainText(F.toString(self._index.data()))
self.reconnectDocument()
elif self._indexes:
@ -378,10 +341,11 @@ class textEditView(QTextEdit):
# print("Submitting", self.objectName())
if self._index and self._index.isValid():
# item = self._index.internalPointer()
if self.toPlainText() != self._model.data(self._index):
if self.toPlainText() != self._index.data():
# print(" Submitting plain text")
self._updating = True
self._model.setData(self._index, self.toPlainText())
self._model.setData(QModelIndex(self._index),
self.toPlainText())
self._updating = False
elif self._indexes: