Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Change outlineItem ID assignment process for major optimization #827

Merged
merged 2 commits into from
Apr 8, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 3 additions & 1 deletion manuskript/load_save/version_1.py
Original file line number Diff line number Diff line change
Expand Up @@ -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__:
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 != 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
4 changes: 3 additions & 1 deletion manuskript/models/outlineModel.py
Original file line number Diff line number Diff line change
Expand Up @@ -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``."
Expand Down