mirror of
https://github.com/olivierkes/manuskript.git
synced 2024-06-29 19:50:43 +12:00
Attributes unique IDs to outlineItems
This commit is contained in:
parent
fd94cc1288
commit
9094a18e24
|
@ -2,8 +2,6 @@
|
||||||
#--!-- coding: utf8 --!--
|
#--!-- coding: utf8 --!--
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# As seen on http://stackoverflow.com/questions/36932/how-can-i-represent-an-enum-in-python
|
# As seen on http://stackoverflow.com/questions/36932/how-can-i-represent-an-enum-in-python
|
||||||
|
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
|
|
|
@ -14,7 +14,7 @@ class outlineModel(QAbstractItemModel):
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
QAbstractItemModel.__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):
|
def index(self, row, column, parent):
|
||||||
|
|
||||||
|
@ -327,8 +327,8 @@ class outlineModel(QAbstractItemModel):
|
||||||
else:
|
else:
|
||||||
root = ET.fromstring(xml)
|
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=""):
|
def pathToIndex(self, index, path=""):
|
||||||
if not index.isValid():
|
if not index.isValid():
|
||||||
|
@ -352,13 +352,14 @@ class outlineModel(QAbstractItemModel):
|
||||||
|
|
||||||
class outlineItem():
|
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._data = {}
|
||||||
self.childItems = []
|
self.childItems = []
|
||||||
self._parent = None
|
self._parent = None
|
||||||
self._model = model
|
self._model = model
|
||||||
self.defaultTextType = None
|
self.defaultTextType = None
|
||||||
|
self.IDs = [] # used by root item to store unique IDs
|
||||||
|
|
||||||
if title:
|
if title:
|
||||||
self._data[Outline.title] = title
|
self._data[Outline.title] = title
|
||||||
|
@ -369,6 +370,12 @@ class outlineItem():
|
||||||
if xml is not None:
|
if xml is not None:
|
||||||
self.setFromXML(xml)
|
self.setFromXML(xml)
|
||||||
|
|
||||||
|
if parent:
|
||||||
|
parent.appendChild(self)
|
||||||
|
|
||||||
|
if ID:
|
||||||
|
self._data[Outline.ID] = ID
|
||||||
|
|
||||||
|
|
||||||
def child(self, row):
|
def child(self, row):
|
||||||
return self.childItems[row]
|
return self.childItems[row]
|
||||||
|
@ -521,6 +528,8 @@ class outlineItem():
|
||||||
self.childItems.insert(row, child)
|
self.childItems.insert(row, child)
|
||||||
child._parent = self
|
child._parent = self
|
||||||
child.setModel(self._model)
|
child.setModel(self._model)
|
||||||
|
if not child.data(Outline.ID.value):
|
||||||
|
child.getUniqueID()
|
||||||
self.updateWordCount()
|
self.updateWordCount()
|
||||||
|
|
||||||
def setModel(self, model):
|
def setModel(self, model):
|
||||||
|
@ -627,5 +636,40 @@ class outlineItem():
|
||||||
self.setData(Outline.__members__[k].value, str(root.attrib[k]))
|
self.setData(Outline.__members__[k].value, str(root.attrib[k]))
|
||||||
|
|
||||||
for child in root:
|
for child in root:
|
||||||
item = outlineItem(self._model, xml=ET.tostring(child))
|
item = outlineItem(self._model, xml=ET.tostring(child), parent=self)
|
||||||
self.appendChild(item)
|
|
||||||
|
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)
|
|
@ -371,10 +371,11 @@ class welcome(QWidget, Ui_welcome):
|
||||||
item = outlineItem(title="{} {}".format(
|
item = outlineItem(title="{} {}".format(
|
||||||
datas[0][1],
|
datas[0][1],
|
||||||
str(n)),
|
str(n)),
|
||||||
_type=_type)
|
_type=_type,
|
||||||
|
parent=parent)
|
||||||
if len(datas) == 2:
|
if len(datas) == 2:
|
||||||
item.setData(Outline.setGoal.value, datas[1][0])
|
item.setData(Outline.setGoal.value, datas[1][0])
|
||||||
parent.appendChild(item)
|
#parent.appendChild(item)
|
||||||
else:
|
else:
|
||||||
n = 0
|
n = 0
|
||||||
for i in range(datas[0][0]):
|
for i in range(datas[0][0]):
|
||||||
|
@ -382,8 +383,9 @@ class welcome(QWidget, Ui_welcome):
|
||||||
item = outlineItem(title="{} {}".format(
|
item = outlineItem(title="{} {}".format(
|
||||||
datas[0][1],
|
datas[0][1],
|
||||||
str(n)),
|
str(n)),
|
||||||
_type="folder")
|
_type="folder",
|
||||||
parent.appendChild(item)
|
parent=parent)
|
||||||
|
#parent.appendChild(item)
|
||||||
addElement(item, datas[1:])
|
addElement(item, datas[1:])
|
||||||
|
|
||||||
if self.template:
|
if self.template:
|
||||||
|
|
Loading…
Reference in a new issue