Merge pull request #827 from emgineering/develop

Change outlineItem ID assignment process for major optimization
This commit is contained in:
Tobias Frisch 2021-04-08 18:33:39 +02:00 committed by GitHub
commit cdb5e3dca7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 31 additions and 17 deletions

View file

@ -935,9 +935,11 @@ def outlineFromMMD(text, parent):
@return: outlineItem
"""
item = outlineItem(parent=parent)
md, body = parseMMDFile(text, asDict=True)
# Assign ID on creation, to avoid generating a new ID for this object
item = outlineItem(parent=parent, ID=md.pop('ID'))
# Store metadata
for k in md:
if k in Outline.__members__:

View file

@ -42,11 +42,19 @@ class abstractItem():
if xml != None:
self.setFromXML(xml)
if parent:
# add this as a child to the parent, and link to the outlineModel of the parent
parent.appendChild(self)
elif not model:
print("Warning: floating outline item (has no parent or associated Outline model).")
if ID:
self._data[self.enum.ID] = ID
self._model.updateAvailableIDs(ID) # Informs the ID distributor that this ID number has been used
else:
self._data[self.enum.ID] = self._model.requestNewID()
if parent:
parent.appendChild(self)
#######################################################################
# Model
@ -135,8 +143,6 @@ class abstractItem():
self.childItems.insert(row, child)
child._parent = self
child.setModel(self._model)
if not child.ID():
child.getUniqueID()
def removeChild(self, row):
"""
@ -195,7 +201,7 @@ class abstractItem():
###############################################################################
def getUniqueID(self, recursive=False):
self.setData(self.enum.ID, self._model.rootItem.findUniqueID())
self.setData(self.enum.ID, self._model.requestNewID())
if recursive:
for c in self.children():
@ -226,14 +232,6 @@ class abstractItem():
IDs.extend(c.listAllIDs())
return IDs
def findUniqueID(self):
IDs = [int(i) for i in self.IDs]
k = 1
while k in IDs:
k += 1
self.IDs.append(str(k))
return str(k)
#######################################################################
# Data
#######################################################################
@ -250,6 +248,9 @@ class abstractItem():
# Setting data
self._data[column] = data
if column == self.enum.ID:
self._model.updateAvailableIDs(data)
# Emit signal
self.emitDataChanged(cols=[column]) # new in 0.5.0

View file

@ -40,13 +40,22 @@ class abstractModel(QAbstractItemModel):
"""
def __init__(self, parent):
QAbstractItemModel.__init__(self, parent)
self.rootItem = outlineItem(self, title="Root", ID="0")
self.nextAvailableID = 1
# Stores removed item, in order to remove them on disk when saving, depending on the file format.
self.removed = []
self._removingRows = False
def requestNewID(self):
newID = self.nextAvailableID
self.nextAvailableID += 1
return str(newID)
# Call this if loading an ID from file rather than assigning a new one.
def updateAvailableIDs(self, addedID):
if int(addedID) >= self.nextAvailableID:
self.nextAvailableID = int(addedID) + 1
def index(self, row, column, parent):
if not self.hasIndex(row, column, parent):

View file

@ -3,11 +3,13 @@
from manuskript.models.abstractModel import abstractModel
from manuskript.models.searchableModel import searchableModel
from manuskript.models.outlineItem import outlineItem
class outlineModel(abstractModel, searchableModel):
def __init__(self, parent):
abstractModel.__init__(self, parent)
self.rootItem = outlineItem(model=self, title="Root", ID="0")
def findItemsByPOV(self, POV):
"Returns a list of IDs of all items whose POV is ``POV``."