From 48af930b11cbaea92f684d24e12947e78f5ed445 Mon Sep 17 00:00:00 2001 From: TheJackiMonster Date: Wed, 10 Aug 2022 12:17:14 +0200 Subject: [PATCH] Added checking for rootItem in models Signed-off-by: TheJackiMonster --- manuskript/models/abstractModel.py | 61 ++++++++++++++++++++++++------ 1 file changed, 49 insertions(+), 12 deletions(-) diff --git a/manuskript/models/abstractModel.py b/manuskript/models/abstractModel.py index dec77e1..16de33c 100644 --- a/manuskript/models/abstractModel.py +++ b/manuskript/models/abstractModel.py @@ -29,6 +29,7 @@ import time, os import logging LOGGER = logging.getLogger(__name__) + class abstractModel(QAbstractItemModel): """ Abstract model is the base class for all others models we use. @@ -45,6 +46,7 @@ class abstractModel(QAbstractItemModel): """ def __init__(self, parent): QAbstractItemModel.__init__(self, parent) + self.rootItem = None self.nextAvailableID = 1 # Stores removed item, in order to remove them on disk when saving, depending on the file format. @@ -62,7 +64,6 @@ class abstractModel(QAbstractItemModel): self.nextAvailableID = int(addedID) + 1 def index(self, row, column, parent): - if not self.hasIndex(row, column, parent): return QModelIndex() @@ -71,6 +72,9 @@ class abstractModel(QAbstractItemModel): else: parentItem = parent.internalPointer() + if not parentItem: + return QModelIndex() + childItem = parentItem.child(row) if childItem: return self.createIndex(row, column, childItem) @@ -85,11 +89,9 @@ class abstractModel(QAbstractItemModel): if not parent: parent = self.rootItem - if len(parent.children()) == 0: + if (not parent) or (len(parent.children()) == 0): return None - #LOGGER.debug("%s: %s", item.title(), [i.title() for i in parent.children()]) - row = parent.children().index(item) col = column return self.createIndex(row, col, item) @@ -104,6 +106,9 @@ class abstractModel(QAbstractItemModel): Returns a list of IDs of all items containing `text` in columns `columns` (being a list of int). """ + if not self.rootItem: + return list() + return self.rootItem.findItemsContaining(text, columns, mainWindow(), caseSensitive) def getItemByID(self, ID, ignore=None): @@ -121,6 +126,9 @@ class abstractModel(QAbstractItemModel): if r: return r + if not self.rootItem: + return None + item = search(self.rootItem) return item @@ -145,7 +153,7 @@ class abstractModel(QAbstractItemModel): # Check whether the parent is the root, or is otherwise invalid. # That is to say: no parent or the parent lacks a parent. if (parentItem == self.rootItem) or \ - (parentItem == None) or (parentItem.parent() == None): + (not parentItem) or (not parentItem.parent()): return QModelIndex() return self.createIndex(parentItem.row(), 0, parentItem) @@ -159,13 +167,21 @@ class abstractModel(QAbstractItemModel): else: parentItem = parent.internalPointer() + if not parentItem: + return 0 + return parentItem.childCount() def columnCount(self, parent=QModelIndex()): if parent.isValid(): - return parent.internalPointer().columnCount() + parentItem = parent.internalPointer() else: - return self.rootItem.columnCount() + parentItem = self.rootItem + + if not parentItem: + return 0 + + return parentItem.columnCount() def data(self, index, role=Qt.DisplayRole): if not index.isValid(): @@ -224,8 +240,6 @@ class abstractModel(QAbstractItemModel): else: return QVariant() - return True - def maxLevel(self): """Returns the max depth of the model.""" def depth(item, d=-1): @@ -235,6 +249,9 @@ class abstractModel(QAbstractItemModel): r = max(r, depth(c, d)) return r + if not self.rootItem: + return 0 + d = depth(self.rootItem) return d @@ -297,7 +314,7 @@ class abstractModel(QAbstractItemModel): # # Gets encoded mime data to retrieve the item items = self.decodeMimeData(data) - if items == None: + if not items: return False # We check if parent is not a child of one of the items @@ -319,6 +336,9 @@ class abstractModel(QAbstractItemModel): else: parentItem = parent.internalPointer() + if not parentItem: + return False + for item in items: # Get parentItem's parents IDs in a list path = parentItem.pathID() # path to item in the form [(ID, title), ...] @@ -335,7 +355,7 @@ class abstractModel(QAbstractItemModel): return None encodedData = bytes(data.data("application/xml")).decode() root = ET.XML(encodedData) - if root == None: + if not root: return None if root.tag != "outlineItems": @@ -452,7 +472,6 @@ class abstractModel(QAbstractItemModel): removeIDs(item) r = self.insertItems(items, beginRow, parent) - return r ################# ADDING AND REMOVING ################# @@ -466,6 +485,9 @@ class abstractModel(QAbstractItemModel): else: parentItem = parent.internalPointer() + if not parentItem: + return False + if parent.isValid() and parent.column() != 0: parent = parentItem.index() @@ -489,6 +511,9 @@ class abstractModel(QAbstractItemModel): else: parentItem = parent.internalPointer() + if not parentItem: + return + if parent.isValid() and parent.column() != 0: parent = parentItem.index() @@ -530,6 +555,9 @@ class abstractModel(QAbstractItemModel): else: parentItem = parent.internalPointer() + if not parentItem: + return False + self._removingRows = True # Views that are updating can easily know # if this is due to row removal. @@ -557,10 +585,15 @@ class abstractModel(QAbstractItemModel): ################# XML / saving / loading ################# def saveToXML(self, xml=None): + if not self.rootItem: + return str() + "If xml (filename) is given, saves the items to xml. Otherwise returns as string." root = ET.XML(self.rootItem.toXML()) + if xml: ET.ElementTree(root).write(xml, encoding="UTF-8", xml_declaration=True, pretty_print=True) + return str() else: return ET.tostring(root, encoding="UTF-8", xml_declaration=True, pretty_print=True) @@ -577,6 +610,10 @@ class abstractModel(QAbstractItemModel): def indexFromPath(self, path): path = path.split(",") item = self.rootItem + + if not item: + return None + for p in path: if p != "" and int(p) < item.childCount(): item = item.child(int(p))