Change ID assignment method for Outline

This commit is contained in:
emgineering 2021-01-04 13:02:14 -07:00
parent 917f1a2f73
commit bee24d45b0
4 changed files with 31 additions and 16 deletions

View file

@ -934,9 +934,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 is not 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

@ -2,11 +2,14 @@
# --!-- coding: utf8 --!--
from manuskript.models.abstractModel import abstractModel
from manuskript.models import outlineItem
class outlineModel(abstractModel):
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``."