Skip to content

Commit

Permalink
Change ID assignment method for Outline
Browse files Browse the repository at this point in the history
  • Loading branch information
emgineering committed Apr 8, 2021
1 parent 917f1a2 commit bee24d4
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 16 deletions.
4 changes: 3 additions & 1 deletion manuskript/load_save/version_1.py
Original file line number Diff line number Diff line change
Expand Up @@ -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__:
Expand Down
27 changes: 14 additions & 13 deletions manuskript/models/abstractItem.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,19 @@ def __init__(self, model=None, title="", _type="abstract", xml=None, parent=None
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
Expand Down Expand Up @@ -135,8 +143,6 @@ def insertChild(self, row, child):
self.childItems.insert(row, child)
child._parent = self
child.setModel(self._model)
if not child.ID():
child.getUniqueID()

def removeChild(self, row):
"""
Expand Down Expand Up @@ -195,7 +201,7 @@ def siblings(self):
###############################################################################

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():
Expand Down Expand Up @@ -226,14 +232,6 @@ def listAllIDs(self):
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
#######################################################################
Expand All @@ -250,6 +248,9 @@ def setData(self, column, data, role=Qt.DisplayRole):
# 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

Expand Down
13 changes: 11 additions & 2 deletions manuskript/models/abstractModel.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
3 changes: 3 additions & 0 deletions manuskript/models/outlineModel.py
Original file line number Diff line number Diff line change
Expand Up @@ -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``."
Expand Down

0 comments on commit bee24d4

Please sign in to comment.