diff --git a/manuskript/load_save/version_1.py b/manuskript/load_save/version_1.py index 6c4f91d..9168e12 100644 --- a/manuskript/load_save/version_1.py +++ b/manuskript/load_save/version_1.py @@ -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__: diff --git a/manuskript/models/abstractItem.py b/manuskript/models/abstractItem.py index f3fa049..11c8cfd 100644 --- a/manuskript/models/abstractItem.py +++ b/manuskript/models/abstractItem.py @@ -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 diff --git a/manuskript/models/abstractModel.py b/manuskript/models/abstractModel.py index a536084..438ace2 100644 --- a/manuskript/models/abstractModel.py +++ b/manuskript/models/abstractModel.py @@ -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): diff --git a/manuskript/models/outlineModel.py b/manuskript/models/outlineModel.py index 63494e2..87c6f13 100644 --- a/manuskript/models/outlineModel.py +++ b/manuskript/models/outlineModel.py @@ -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``."