Restructure the record of root items in the tree class
This commit is contained in:
@@ -208,8 +208,6 @@ class NWIndex():
|
|||||||
text.
|
text.
|
||||||
"""
|
"""
|
||||||
theItem = self.theProject.projTree[tHandle]
|
theItem = self.theProject.projTree[tHandle]
|
||||||
theRoot = self.theProject.projTree.getRootItem(tHandle)
|
|
||||||
|
|
||||||
if theItem is None:
|
if theItem is None:
|
||||||
logger.info("Not indexing unknown item '%s'", tHandle)
|
logger.info("Not indexing unknown item '%s'", tHandle)
|
||||||
return False
|
return False
|
||||||
@@ -232,7 +230,7 @@ class NWIndex():
|
|||||||
if self.theProject.projTree.isTrashRoot(theItem.itemParent):
|
if self.theProject.projTree.isTrashRoot(theItem.itemParent):
|
||||||
logger.debug("Not indexing trash item '%s'", tHandle)
|
logger.debug("Not indexing trash item '%s'", tHandle)
|
||||||
return False
|
return False
|
||||||
if theRoot.itemClass == nwItemClass.ARCHIVE:
|
if self.theProject.projTree.getItemClass(tHandle) == nwItemClass.ARCHIVE:
|
||||||
logger.debug("Not indexing archived item '%s'", tHandle)
|
logger.debug("Not indexing archived item '%s'", tHandle)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|||||||
@@ -608,6 +608,7 @@ class NWProject():
|
|||||||
self.theParent.setStatus(self.tr("Opened Project: {0}").format(self.projName))
|
self.theParent.setStatus(self.tr("Opened Project: {0}").format(self.projName))
|
||||||
|
|
||||||
self._scanProjectFolder()
|
self._scanProjectFolder()
|
||||||
|
self._checkProjectTree()
|
||||||
self._loadProjectLocalisation()
|
self._loadProjectLocalisation()
|
||||||
self.updateWordCounts()
|
self.updateWordCounts()
|
||||||
|
|
||||||
@@ -1340,6 +1341,17 @@ class NWProject():
|
|||||||
xEntry.text = aValue
|
xEntry.text = aValue
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def _checkProjectTree(self):
|
||||||
|
"""Check the project tree and make sure all items have sensible
|
||||||
|
values.
|
||||||
|
"""
|
||||||
|
for tItem in self.projTree:
|
||||||
|
tHandle = tItem.itemHandle
|
||||||
|
logger.verbose("Checking item '%s'", tHandle)
|
||||||
|
if tItem.itemRoot is None:
|
||||||
|
self.projTree.updateItemRoot(tHandle)
|
||||||
|
logger.warning("Corrected the root setting of item '%s'", tHandle)
|
||||||
|
|
||||||
def _scanProjectFolder(self):
|
def _scanProjectFolder(self):
|
||||||
"""Scan the project folder and check that the files in it are
|
"""Scan the project folder and check that the files in it are
|
||||||
also in the project XML file. If they aren't, import them as
|
also in the project XML file. If they aren't, import them as
|
||||||
|
|||||||
+29
-15
@@ -47,7 +47,7 @@ class NWTree():
|
|||||||
|
|
||||||
self._projTree = {} # Holds all the items of the project
|
self._projTree = {} # Holds all the items of the project
|
||||||
self._treeOrder = [] # The order of the tree items on the tree view
|
self._treeOrder = [] # The order of the tree items on the tree view
|
||||||
self._treeRoots = [] # The root items of the tree
|
self._treeRoots = {} # The root items of the tree
|
||||||
self._trashRoot = None # The handle of the trash root folder
|
self._trashRoot = None # The handle of the trash root folder
|
||||||
self._archRoot = None # The handle of the archive root folder
|
self._archRoot = None # The handle of the archive root folder
|
||||||
self._theIndex = 0 # The current iterator index
|
self._theIndex = 0 # The current iterator index
|
||||||
@@ -67,7 +67,7 @@ class NWTree():
|
|||||||
"""
|
"""
|
||||||
self._projTree = {}
|
self._projTree = {}
|
||||||
self._treeOrder = []
|
self._treeOrder = []
|
||||||
self._treeRoots = []
|
self._treeRoots = {}
|
||||||
self._trashRoot = None
|
self._trashRoot = None
|
||||||
self._archRoot = None
|
self._archRoot = None
|
||||||
self._theIndex = 0
|
self._theIndex = 0
|
||||||
@@ -98,7 +98,7 @@ class NWTree():
|
|||||||
|
|
||||||
if nwItem.itemType == nwItemType.ROOT:
|
if nwItem.itemType == nwItemType.ROOT:
|
||||||
logger.verbose("Item '%s' is a root item", str(tHandle))
|
logger.verbose("Item '%s' is a root item", str(tHandle))
|
||||||
self._treeRoots.append(tHandle)
|
self._treeRoots[tHandle] = nwItem
|
||||||
if nwItem.itemClass == nwItemClass.ARCHIVE:
|
if nwItem.itemClass == nwItemClass.ARCHIVE:
|
||||||
logger.verbose("Item '%s' is the archive folder", str(tHandle))
|
logger.verbose("Item '%s' is the archive folder", str(tHandle))
|
||||||
self._archRoot = tHandle
|
self._archRoot = tHandle
|
||||||
@@ -253,20 +253,34 @@ class NWTree():
|
|||||||
return tItem.itemHandle
|
return tItem.itemHandle
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def getRootItem(self, tHandle):
|
def isRoot(self, tHandle):
|
||||||
"""Iterate upwards in the tree until we find the item with
|
"""Check if a handle is a root item.
|
||||||
parent None, the root item. We do this with a for loop with a
|
"""
|
||||||
maximum depth to make infinite loops impossible.
|
return tHandle in self._treeRoots
|
||||||
|
|
||||||
|
def updateItemRoot(self, tHandle):
|
||||||
|
"""Update the root item handle of a given item.
|
||||||
|
"""
|
||||||
|
tItem = self.__getitem__(tHandle)
|
||||||
|
iItem = tItem
|
||||||
|
if iItem is not None:
|
||||||
|
for _ in range(nwConst.MAX_DEPTH + 1):
|
||||||
|
if iItem.itemParent is None:
|
||||||
|
tItem.setRoot(iItem.itemHandle)
|
||||||
|
return iItem.itemHandle
|
||||||
|
else:
|
||||||
|
tHandle = iItem.itemParent
|
||||||
|
iItem = self.__getitem__(tHandle)
|
||||||
|
return None
|
||||||
|
|
||||||
|
def getItemClass(self, tHandle):
|
||||||
|
"""Return the class of a given item.
|
||||||
"""
|
"""
|
||||||
tItem = self.__getitem__(tHandle)
|
tItem = self.__getitem__(tHandle)
|
||||||
if tItem is not None:
|
if tItem is not None:
|
||||||
for i in range(nwConst.MAX_DEPTH + 1):
|
if tItem.itemRoot in self._treeRoots:
|
||||||
if tItem.itemParent is None:
|
return self._treeRoots[tItem.itemRoot].itemClass
|
||||||
return tItem
|
return nwItemClass.NO_CLASS
|
||||||
else:
|
|
||||||
tHandle = tItem.itemParent
|
|
||||||
tItem = self.__getitem__(tHandle)
|
|
||||||
return None
|
|
||||||
|
|
||||||
def getItemPath(self, tHandle):
|
def getItemPath(self, tHandle):
|
||||||
"""Iterate upwards in the tree until we find the item with
|
"""Iterate upwards in the tree until we find the item with
|
||||||
@@ -405,7 +419,7 @@ class NWTree():
|
|||||||
return
|
return
|
||||||
|
|
||||||
if tHandle in self._treeRoots:
|
if tHandle in self._treeRoots:
|
||||||
self._treeRoots.remove(tHandle)
|
del self._treeRoots[tHandle]
|
||||||
if tHandle == self._trashRoot:
|
if tHandle == self._trashRoot:
|
||||||
self._trashRoot = None
|
self._trashRoot = None
|
||||||
if tHandle == self._archRoot:
|
if tHandle == self._archRoot:
|
||||||
|
|||||||
@@ -799,8 +799,7 @@ class GuiBuildNovel(QDialog):
|
|||||||
if isNovel and not novelFiles:
|
if isNovel and not novelFiles:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
rootItem = self.theProject.projTree.getRootItem(theItem.itemHandle)
|
if self.theProject.projTree.getItemClass(theItem.itemHandle) == nwItemClass.ARCHIVE:
|
||||||
if rootItem.itemClass == nwItemClass.ARCHIVE:
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version='1.0' encoding='utf-8'?>
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
<novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-02-17 21:57:32">
|
<novelWriterXML appVersion="1.7-alpha0" hexVersion="0x010700a0" fileVersion="1.4" timeStamp="2022-04-02 18:36:55">
|
||||||
<project>
|
<project>
|
||||||
<name>New Project</name>
|
<name>New Project</name>
|
||||||
<title></title>
|
<title></title>
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
<entry blue="0" green="200" red="50">Main</entry>
|
<entry blue="0" green="200" red="50">Main</entry>
|
||||||
</importance>
|
</importance>
|
||||||
</settings>
|
</settings>
|
||||||
<content count="12">
|
<content count="16">
|
||||||
<item handle="73475cb40a568" parent="None" order="0" type="ROOT" class="NOVEL">
|
<item handle="73475cb40a568" parent="None" order="0" type="ROOT" class="NOVEL">
|
||||||
<meta expanded="False"/>
|
<meta expanded="False"/>
|
||||||
<name status="New">Novel</name>
|
<name status="New">Novel</name>
|
||||||
@@ -72,19 +72,35 @@
|
|||||||
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
<meta charCount="0" wordCount="0" paraCount="0" cursorPos="0"/>
|
||||||
<name status="New" exported="True">New Scene</name>
|
<name status="New" exported="True">New Scene</name>
|
||||||
</item>
|
</item>
|
||||||
<item handle="1a6562590ef19" parent="None" order="0" type="ROOT" class="TIMELINE">
|
<item handle="1a6562590ef19" parent="None" order="0" type="ROOT" class="NOVEL">
|
||||||
|
<meta expanded="False"/>
|
||||||
|
<name status="New">Novel</name>
|
||||||
|
</item>
|
||||||
|
<item handle="031b4af5197ec" parent="None" order="0" type="ROOT" class="PLOT">
|
||||||
|
<meta expanded="False"/>
|
||||||
|
<name status="New">Plot</name>
|
||||||
|
</item>
|
||||||
|
<item handle="41cfc0d1f2d12" parent="None" order="0" type="ROOT" class="CHARACTER">
|
||||||
|
<meta expanded="False"/>
|
||||||
|
<name status="New">Character</name>
|
||||||
|
</item>
|
||||||
|
<item handle="2858dcd1057d3" parent="None" order="0" type="ROOT" class="WORLD">
|
||||||
|
<meta expanded="False"/>
|
||||||
|
<name status="New">World</name>
|
||||||
|
</item>
|
||||||
|
<item handle="2fca346db6561" parent="None" order="0" type="ROOT" class="TIMELINE">
|
||||||
<meta expanded="False"/>
|
<meta expanded="False"/>
|
||||||
<name status="New">Timeline</name>
|
<name status="New">Timeline</name>
|
||||||
</item>
|
</item>
|
||||||
<item handle="031b4af5197ec" parent="None" order="0" type="ROOT" class="OBJECT">
|
<item handle="02d20bbd7e394" parent="None" order="0" type="ROOT" class="OBJECT">
|
||||||
<meta expanded="False"/>
|
<meta expanded="False"/>
|
||||||
<name status="New">Object</name>
|
<name status="New">Object</name>
|
||||||
</item>
|
</item>
|
||||||
<item handle="41cfc0d1f2d12" parent="None" order="0" type="ROOT" class="CUSTOM">
|
<item handle="7688b6ef52555" parent="None" order="0" type="ROOT" class="CUSTOM">
|
||||||
<meta expanded="False"/>
|
<meta expanded="False"/>
|
||||||
<name status="New">Custom1</name>
|
<name status="New">Custom1</name>
|
||||||
</item>
|
</item>
|
||||||
<item handle="2858dcd1057d3" parent="None" order="0" type="ROOT" class="CUSTOM">
|
<item handle="c837649cce43f" parent="None" order="0" type="ROOT" class="CUSTOM">
|
||||||
<meta expanded="False"/>
|
<meta expanded="False"/>
|
||||||
<name status="New">Custom2</name>
|
<name status="New">Custom2</name>
|
||||||
</item>
|
</item>
|
||||||
|
|||||||
@@ -284,6 +284,7 @@ def testCoreIndex_ScanText(nwMinimal, mockGUI):
|
|||||||
aHandle = theProject.newRoot("Archive", nwItemClass.ARCHIVE)
|
aHandle = theProject.newRoot("Archive", nwItemClass.ARCHIVE)
|
||||||
assert theProject.projTree[aHandle] is not None
|
assert theProject.projTree[aHandle] is not None
|
||||||
xItem.setParent(aHandle)
|
xItem.setParent(aHandle)
|
||||||
|
xItem.setRoot(aHandle)
|
||||||
assert theIndex.scanText(xHandle, "Hello World!") is False
|
assert theIndex.scanText(xHandle, "Hello World!") is False
|
||||||
|
|
||||||
# Make some usable items
|
# Make some usable items
|
||||||
|
|||||||
@@ -224,17 +224,10 @@ def testCoreTree_Methods(mockGUI, mockItems):
|
|||||||
assert theTree.checkType("c000000000001", nwItemType.FILE) is True
|
assert theTree.checkType("c000000000001", nwItemType.FILE) is True
|
||||||
|
|
||||||
# Root item lookup
|
# Root item lookup
|
||||||
theTree._treeRoots.append("stuff")
|
|
||||||
assert theTree.findRoot(nwItemClass.WORLD) is None
|
assert theTree.findRoot(nwItemClass.WORLD) is None
|
||||||
assert theTree.findRoot(nwItemClass.NOVEL) == "a000000000001"
|
assert theTree.findRoot(nwItemClass.NOVEL) == "a000000000001"
|
||||||
assert theTree.findRoot(nwItemClass.CHARACTER) == "a000000000004"
|
assert theTree.findRoot(nwItemClass.CHARACTER) == "a000000000004"
|
||||||
|
|
||||||
# Find root item of child item
|
|
||||||
assert theTree.getRootItem("b000000000001").itemHandle == "a000000000001"
|
|
||||||
assert theTree.getRootItem("c000000000001").itemHandle == "a000000000001"
|
|
||||||
assert theTree.getRootItem("c000000000002").itemHandle == "a000000000001"
|
|
||||||
assert theTree.getRootItem("stuff") is None
|
|
||||||
|
|
||||||
# Get item path
|
# Get item path
|
||||||
assert theTree.getItemPath("stuff") == []
|
assert theTree.getItemPath("stuff") == []
|
||||||
assert theTree.getItemPath("c000000000001") == [
|
assert theTree.getItemPath("c000000000001") == [
|
||||||
|
|||||||
Reference in New Issue
Block a user