Add Expand/Collapse All functionality to project tree

This commit is contained in:
Veronica Berglyd Olsen
2022-10-01 21:17:47 +02:00
parent bdc7e4dc10
commit ba51fb4c46
2 changed files with 47 additions and 6 deletions
+46 -4
View File
@@ -268,6 +268,12 @@ class GuiProjectToolBar(QWidget):
# More Options Menu
self.mMore = QMenu()
self.aExpand = self.mMore.addAction(self.tr("Expand All"))
self.aExpand.triggered.connect(lambda: self.projTree.setExpandedFromHandle(None, True))
self.aCollapse = self.mMore.addAction(self.tr("Collapse All"))
self.aCollapse.triggered.connect(lambda: self.projTree.setExpandedFromHandle(None, False))
self.aMoreUndo = self.mMore.addAction(self.tr("Undo Move"))
self.aMoreUndo.triggered.connect(lambda: self.projTree.undoLastMove())
@@ -938,6 +944,15 @@ class GuiProjectTree(QTreeWidget):
return True
def setExpandedFromHandle(self, tHandle, isExpanded):
"""Iterate through items below tHandle and change expanded
status for all child items. If tHandle is None, it affects the
entire tree.
"""
trItem = self._getTreeItem(tHandle) or self.invisibleRootItem()
self._recursiveSetExpanded(trItem, isExpanded)
return
def openContextOnSelected(self):
"""Open the context menu on the current selected item.
"""
@@ -1022,7 +1037,7 @@ class GuiProjectTree(QTreeWidget):
isRoot = tItem.isRootType()
isFolder = tItem.isFolderType()
isFile = tItem.isFileType()
isEmpty = selItem.childCount() == 0
hasChild = selItem.childCount() > 0
if isFile:
ctxMenu.addAction(
@@ -1094,10 +1109,24 @@ class GuiProjectTree(QTreeWidget):
ctxMenu.addSeparator()
# Expand/Collapse
# ===============
if hasChild:
ctxMenu.addSeparator()
ctxMenu.addAction(
self.tr("Expand All"),
lambda: self.setExpandedFromHandle(tHandle, True)
)
ctxMenu.addAction(
self.tr("Collapse All"),
lambda: self.setExpandedFromHandle(tHandle, False)
)
# Delete Item
# ===========
if tItem.itemClass == nwItemClass.TRASH or isRoot or (isFolder and isEmpty):
if tItem.itemClass == nwItemClass.TRASH or isRoot or (isFolder and not hasChild):
ctxMenu.addAction(
self.tr("Delete Permanently"), lambda: self.deleteItem(tHandle)
)
@@ -1253,6 +1282,18 @@ class GuiProjectTree(QTreeWidget):
self._alertTreeChange(tHandle, flush=False)
return
def _recursiveSetExpanded(self, trItem, isExpanded):
"""Recursive function to set expanded status starting from (and
not including) a given item.
"""
if isinstance(trItem, QTreeWidgetItem):
chCount = trItem.childCount()
for i in range(chCount):
chItem = trItem.child(i)
chItem.setExpanded(isExpanded)
self._recursiveSetExpanded(chItem, isExpanded)
return
def _changeItemStatus(self, tHandle, tStatus):
"""Set a new status value of an item.
"""
@@ -1323,8 +1364,9 @@ class GuiProjectTree(QTreeWidget):
# Update tree-related meta data
nwItem = self.theProject.tree[tHandle]
nwItem.setExpanded(tItem.isExpanded() and cCount > 0)
nwItem.setOrder(tIndex)
if nwItem is not None:
nwItem.setExpanded(tItem.isExpanded() and cCount > 0)
nwItem.setOrder(tIndex)
theList.append(tHandle)
for i in range(cCount):
+1 -2
View File
@@ -486,8 +486,7 @@ def testGuiProjTree_ContextMenu(qtbot, monkeypatch, nwGUI, fncDir, mockRnd):
hNovelNote = "0000000000012"
projTree = nwGUI.projView.projTree
projTree._getTreeItem(hNovelRoot).setExpanded(True)
projTree._getTreeItem(hChapterDir).setExpanded(True)
projTree.setExpandedFromHandle(None, True)
projTree._addTrashRoot()
hTrashRoot = projTree.theProject.tree.trashRoot()