From 9094a18e24d362fccdcb5ab80840a56f5444ce76 Mon Sep 17 00:00:00 2001 From: Olivier Keshavjee Date: Fri, 26 Jun 2015 17:33:55 +0200 Subject: [PATCH] Attributes unique IDs to outlineItems --- src/enums.py | 2 -- src/models/outlineModel.py | 56 ++++++++++++++++++++++++++++++++++---- src/ui/welcome.py | 10 ++++--- 3 files changed, 56 insertions(+), 12 deletions(-) diff --git a/src/enums.py b/src/enums.py index 21377f62..086888be 100644 --- a/src/enums.py +++ b/src/enums.py @@ -2,8 +2,6 @@ #--!-- coding: utf8 --!-- - - # As seen on http://stackoverflow.com/questions/36932/how-can-i-represent-an-enum-in-python from enum import Enum diff --git a/src/models/outlineModel.py b/src/models/outlineModel.py index d8dfca7b..4e160e7e 100644 --- a/src/models/outlineModel.py +++ b/src/models/outlineModel.py @@ -14,7 +14,7 @@ class outlineModel(QAbstractItemModel): def __init__(self, parent): QAbstractItemModel.__init__(self, parent) - self.rootItem = outlineItem(self, title="root") + self.rootItem = outlineItem(self, title="root", ID="0") def index(self, row, column, parent): @@ -327,8 +327,8 @@ class outlineModel(QAbstractItemModel): else: root = ET.fromstring(xml) - self.rootItem = outlineItem(self, xml=ET.tostring(root)) - + self.rootItem = outlineItem(model=self, xml=ET.tostring(root), ID="0") + self.rootItem.checkIDs() def pathToIndex(self, index, path=""): if not index.isValid(): @@ -352,13 +352,14 @@ class outlineModel(QAbstractItemModel): class outlineItem(): - def __init__(self, model=None, title="", _type="folder", xml=None): + def __init__(self, model=None, title="", _type="folder", xml=None, parent=None, ID=None): self._data = {} self.childItems = [] self._parent = None self._model = model self.defaultTextType = None + self.IDs = [] # used by root item to store unique IDs if title: self._data[Outline.title] = title @@ -368,6 +369,12 @@ class outlineItem(): if xml is not None: self.setFromXML(xml) + + if parent: + parent.appendChild(self) + + if ID: + self._data[Outline.ID] = ID def child(self, row): @@ -521,6 +528,8 @@ class outlineItem(): self.childItems.insert(row, child) child._parent = self child.setModel(self._model) + if not child.data(Outline.ID.value): + child.getUniqueID() self.updateWordCount() def setModel(self, model): @@ -627,5 +636,40 @@ class outlineItem(): self.setData(Outline.__members__[k].value, str(root.attrib[k])) for child in root: - item = outlineItem(self._model, xml=ET.tostring(child)) - self.appendChild(item) \ No newline at end of file + item = outlineItem(self._model, xml=ET.tostring(child), parent=self) + + def getUniqueID(self): + self.setData(Outline.ID.value, self._model.rootItem.findUniqueID()) + + def checkIDs(self): + """This is called when a model is loaded. + + Makes a list of all sub-items IDs, that is used to generate unique IDs afterwards. + """ + self.IDs = self.listAllIDs() + + if max([self.IDs.count(i) for i in self.IDs if i]) != 1: + print("There are some doublons:", [i for i in self.IDs if i and self.IDs.count(i) != 1]) + + def checkChildren(item): + for c in item.children(): + _id = c.data(Outline.ID.value) + if not _id or _id == "0": + c.getUniqueID() + checkChildren(c) + + checkChildren(self) + + + def listAllIDs(self): + IDs = [self.data(Outline.ID.value)] + for c in self.children(): + IDs.extend(c.listAllIDs()) + return IDs + + def findUniqueID(self): + k = 0 + while str(k) in self.IDs: + k += 1 + self.IDs.append(str(k)) + return str(k) \ No newline at end of file diff --git a/src/ui/welcome.py b/src/ui/welcome.py index 2520a77a..0b0a4a30 100644 --- a/src/ui/welcome.py +++ b/src/ui/welcome.py @@ -371,10 +371,11 @@ class welcome(QWidget, Ui_welcome): item = outlineItem(title="{} {}".format( datas[0][1], str(n)), - _type=_type) + _type=_type, + parent=parent) if len(datas) == 2: item.setData(Outline.setGoal.value, datas[1][0]) - parent.appendChild(item) + #parent.appendChild(item) else: n = 0 for i in range(datas[0][0]): @@ -382,8 +383,9 @@ class welcome(QWidget, Ui_welcome): item = outlineItem(title="{} {}".format( datas[0][1], str(n)), - _type="folder") - parent.appendChild(item) + _type="folder", + parent=parent) + #parent.appendChild(item) addElement(item, datas[1:]) if self.template: