Clean up function mappings in project tree class

This commit is contained in:
Veronica Berglyd Olsen
2022-10-25 15:47:40 +02:00
parent e89f004532
commit 2ee6adcf35
6 changed files with 79 additions and 74 deletions
+10 -3
View File
@@ -105,9 +105,6 @@ class GuiProjectView(QWidget):
self.keyContext.activated.connect(lambda: self.projTree.openContextOnSelected()) self.keyContext.activated.connect(lambda: self.projTree.openContextOnSelected())
# Function Mappings # Function Mappings
self.revealNewTreeItem = self.projTree.revealNewTreeItem
self.renameTreeItem = self.projTree.renameTreeItem
self.getTreeFromHandle = self.projTree.getTreeFromHandle
self.emptyTrash = self.projTree.emptyTrash self.emptyTrash = self.projTree.emptyTrash
self.requestDeleteItem = self.projTree.requestDeleteItem self.requestDeleteItem = self.projTree.requestDeleteItem
self.setTreeItemValues = self.projTree.setTreeItemValues self.setTreeItemValues = self.projTree.setTreeItemValues
@@ -164,6 +161,16 @@ class GuiProjectView(QWidget):
""" """
return self.projTree.hasFocus() return self.projTree.hasFocus()
def renameTreeItem(self, tHandle=None):
"""External request to rename an item or the currently selected
item. This is triggered by the global menu or keyboard shortcut.
"""
if tHandle is None:
tHandle = self.projTree.getSelectedHandle()
if tHandle:
return self.projTree.renameTreeItem(tHandle)
return
## ##
# Public Slots # Public Slots
## ##
+4 -8
View File
@@ -807,15 +807,11 @@ class GuiMain(QMainWindow):
logger.error("No project open") logger.error("No project open")
return False return False
if tHandle is None: if tHandle is None and (self.docEditor.anyFocus() or self.isFocusMode):
if self.docEditor.anyFocus() or self.isFocusMode: tHandle = self.docEditor.docHandle()
tHandle = self.docEditor.docHandle() self.projView.renameTreeItem(tHandle)
else:
tHandle = self.projView.getSelectedHandle()
if tHandle:
return self.projView.renameTreeItem(tHandle)
return False return True
def rebuildTrees(self): def rebuildTrees(self):
"""Rebuild the project tree. """Rebuild the project tree.
+1 -1
View File
@@ -1144,7 +1144,7 @@ def testGuiEditor_Tags(qtbot, monkeypatch, nwGUI, nwMinimal, ipsumText):
assert nwGUI.openDocument(cHandle) is True assert nwGUI.openDocument(cHandle) is True
assert nwGUI.docEditor.replaceText(theText) is True assert nwGUI.docEditor.replaceText(theText) is True
assert nwGUI.saveDocument() is True assert nwGUI.saveDocument() is True
assert nwGUI.projView.revealNewTreeItem(cHandle) assert nwGUI.projView.projTree.revealNewTreeItem(cHandle)
nwGUI.docEditor.updateTagHighLighting() nwGUI.docEditor.updateTagHighLighting()
# Follow Tag # Follow Tag
+2 -2
View File
@@ -183,7 +183,7 @@ def testGuiOutline_Content(qtbot, monkeypatch, nwGUI, nwLipsum):
# Add a second novel folder # Add a second novel folder
newHandle = nwGUI.theProject.newRoot(nwItemClass.NOVEL) newHandle = nwGUI.theProject.newRoot(nwItemClass.NOVEL)
nwGUI.projView.revealNewTreeItem(newHandle) nwGUI.projView.projTree.revealNewTreeItem(newHandle)
# Check new values in dropdown list # Check new values in dropdown list
assert outlineBar.novelValue.itemData(0) == lipHandle assert outlineBar.novelValue.itemData(0) == lipHandle
@@ -202,7 +202,7 @@ def testGuiOutline_Content(qtbot, monkeypatch, nwGUI, nwLipsum):
aHandle = nwGUI.theProject.newFile(dTitle, newHandle) aHandle = nwGUI.theProject.newFile(dTitle, newHandle)
hHash = "#"*hLevel hHash = "#"*hLevel
writeFile(os.path.join(nwLipsum, "content", f"{aHandle}.nwd"), f"{hHash} {dTitle}\n\n") writeFile(os.path.join(nwLipsum, "content", f"{aHandle}.nwd"), f"{hHash} {dTitle}\n\n")
nwGUI.projView.revealNewTreeItem(aHandle) nwGUI.projView.projTree.revealNewTreeItem(aHandle)
nwGUI.rebuildIndex() nwGUI.rebuildIndex()
+61 -59
View File
@@ -160,11 +160,11 @@ def testGuiProjTree_NewItems(qtbot, caplog, monkeypatch, nwGUI, fncDir, mockRnd)
# ============ # ============
# Also check error handling in reveal function # Also check error handling in reveal function
assert projView.revealNewTreeItem("abc") is False assert projView.projTree.revealNewTreeItem("abc") is False
# Add an item that cannot be displayed in the tree # Add an item that cannot be displayed in the tree
nHandle = theProject.newFile("Test", None) nHandle = theProject.newFile("Test", None)
assert projView.revealNewTreeItem(nHandle) is False assert projView.projTree.revealNewTreeItem(nHandle) is False
# Clean up # Clean up
# qtbot.stop() # qtbot.stop()
@@ -184,10 +184,11 @@ def testGuiProjTree_MoveItems(qtbot, monkeypatch, nwGUI, fncDir, mockRnd):
monkeypatch.setattr(QMessageBox, "information", lambda *a: QMessageBox.Yes) monkeypatch.setattr(QMessageBox, "information", lambda *a: QMessageBox.Yes)
monkeypatch.setattr(GuiEditLabel, "getLabel", lambda *a, text: (text, True)) monkeypatch.setattr(GuiEditLabel, "getLabel", lambda *a, text: (text, True))
nwTree = nwGUI.projView projView = nwGUI.projView
projTree = nwGUI.projView.projTree
# Try to move item with no project # Try to move item with no project
assert nwTree.projTree.moveTreeItem(1) is False assert projView.projTree.moveTreeItem(1) is False
# Create a project # Create a project
prjDir = os.path.join(fncDir, "project") prjDir = os.path.join(fncDir, "project")
@@ -197,68 +198,68 @@ def testGuiProjTree_MoveItems(qtbot, monkeypatch, nwGUI, fncDir, mockRnd):
# ============== # ==============
# Add some files # Add some files
nwTree.setSelectedHandle(C.hChapterDir) projView.setSelectedHandle(C.hChapterDir)
assert nwTree.projTree.newTreeItem(nwItemType.FILE) is True assert projTree.newTreeItem(nwItemType.FILE) is True
assert nwTree.projTree.newTreeItem(nwItemType.FILE) is True assert projTree.newTreeItem(nwItemType.FILE) is True
assert nwTree.projTree.newTreeItem(nwItemType.FILE) is True assert projTree.newTreeItem(nwItemType.FILE) is True
assert nwTree.getTreeFromHandle(C.hChapterDir) == [ assert projTree.getTreeFromHandle(C.hChapterDir) == [
C.hChapterDir, C.hChapterDoc, C.hSceneDoc, C.hChapterDir, C.hChapterDoc, C.hSceneDoc,
"0000000000010", "0000000000011", "0000000000012", "0000000000010", "0000000000011", "0000000000012",
] ]
# Move with no selections # Move with no selections
nwTree.projTree.clearSelection() projTree.clearSelection()
assert nwTree.projTree.moveTreeItem(1) is False assert projTree.moveTreeItem(1) is False
# Move second item up twice (should give same result) # Move second item up twice (should give same result)
nwTree.setSelectedHandle(C.hSceneDoc) projView.setSelectedHandle(C.hSceneDoc)
assert nwTree.projTree.moveTreeItem(-1) is True assert projTree.moveTreeItem(-1) is True
assert nwTree.getTreeFromHandle(C.hChapterDir) == [ assert projTree.getTreeFromHandle(C.hChapterDir) == [
C.hChapterDir, C.hSceneDoc, C.hChapterDoc, C.hChapterDir, C.hSceneDoc, C.hChapterDoc,
"0000000000010", "0000000000011", "0000000000012", "0000000000010", "0000000000011", "0000000000012",
] ]
assert nwTree.projTree.moveTreeItem(-1) is False assert projTree.moveTreeItem(-1) is False
assert nwTree.getTreeFromHandle(C.hChapterDir) == [ assert projTree.getTreeFromHandle(C.hChapterDir) == [
C.hChapterDir, C.hSceneDoc, C.hChapterDoc, C.hChapterDir, C.hSceneDoc, C.hChapterDoc,
"0000000000010", "0000000000011", "0000000000012", "0000000000010", "0000000000011", "0000000000012",
] ]
# Restore # Restore
assert nwTree.projTree.moveTreeItem(1) is True assert projTree.moveTreeItem(1) is True
assert nwTree.getTreeFromHandle(C.hChapterDir) == [ assert projTree.getTreeFromHandle(C.hChapterDir) == [
C.hChapterDir, C.hChapterDoc, C.hSceneDoc, C.hChapterDir, C.hChapterDoc, C.hSceneDoc,
"0000000000010", "0000000000011", "0000000000012", "0000000000010", "0000000000011", "0000000000012",
] ]
# Move fifth item down twice (should give same result) # Move fifth item down twice (should give same result)
nwTree.setSelectedHandle("0000000000011") projView.setSelectedHandle("0000000000011")
assert nwTree.projTree.moveTreeItem(1) is True assert projTree.moveTreeItem(1) is True
assert nwTree.getTreeFromHandle(C.hChapterDir) == [ assert projTree.getTreeFromHandle(C.hChapterDir) == [
C.hChapterDir, C.hChapterDoc, C.hSceneDoc, C.hChapterDir, C.hChapterDoc, C.hSceneDoc,
"0000000000010", "0000000000012", "0000000000011", "0000000000010", "0000000000012", "0000000000011",
] ]
assert nwTree.projTree.moveTreeItem(1) is False assert projTree.moveTreeItem(1) is False
assert nwTree.getTreeFromHandle(C.hChapterDir) == [ assert projTree.getTreeFromHandle(C.hChapterDir) == [
C.hChapterDir, C.hChapterDoc, C.hSceneDoc, C.hChapterDir, C.hChapterDoc, C.hSceneDoc,
"0000000000010", "0000000000012", "0000000000011", "0000000000010", "0000000000012", "0000000000011",
] ]
# Restore # Restore
assert nwTree.projTree.moveTreeItem(-1) is True assert projTree.moveTreeItem(-1) is True
assert nwTree.getTreeFromHandle(C.hChapterDir) == [ assert projTree.getTreeFromHandle(C.hChapterDir) == [
C.hChapterDir, C.hChapterDoc, C.hSceneDoc, C.hChapterDir, C.hChapterDoc, C.hSceneDoc,
"0000000000010", "0000000000011", "0000000000012", "0000000000010", "0000000000011", "0000000000012",
] ]
# Move down again, and restore via undo # Move down again, and restore via undo
nwTree.setSelectedHandle("0000000000011") projView.setSelectedHandle("0000000000011")
assert nwTree.projTree.moveTreeItem(1) is True assert projTree.moveTreeItem(1) is True
assert nwTree.getTreeFromHandle(C.hChapterDir) == [ assert projTree.getTreeFromHandle(C.hChapterDir) == [
C.hChapterDir, C.hChapterDoc, C.hSceneDoc, C.hChapterDir, C.hChapterDoc, C.hSceneDoc,
"0000000000010", "0000000000012", "0000000000011", "0000000000010", "0000000000012", "0000000000011",
] ]
assert nwTree.projTree.undoLastMove() is True assert projTree.undoLastMove() is True
assert nwTree.getTreeFromHandle(C.hChapterDir) == [ assert projTree.getTreeFromHandle(C.hChapterDir) == [
C.hChapterDir, C.hChapterDoc, C.hSceneDoc, C.hChapterDir, C.hChapterDoc, C.hSceneDoc,
"0000000000010", "0000000000011", "0000000000012", "0000000000010", "0000000000011", "0000000000012",
] ]
@@ -266,19 +267,19 @@ def testGuiProjTree_MoveItems(qtbot, monkeypatch, nwGUI, fncDir, mockRnd):
# Root Folder # Root Folder
# =========== # ===========
nwTree.setSelectedHandle(C.hNovelRoot) projView.setSelectedHandle(C.hNovelRoot)
assert nwGUI.theProject.tree._treeOrder.index(C.hNovelRoot) == 0 assert nwGUI.theProject.tree._treeOrder.index(C.hNovelRoot) == 0
# Move novel folder up # Move novel folder up
assert nwTree.projTree.moveTreeItem(-1) is False assert projTree.moveTreeItem(-1) is False
assert nwGUI.theProject.tree._treeOrder.index(C.hNovelRoot) == 0 assert nwGUI.theProject.tree._treeOrder.index(C.hNovelRoot) == 0
# Move novel folder down # Move novel folder down
assert nwTree.projTree.moveTreeItem(1) is True assert projTree.moveTreeItem(1) is True
assert nwGUI.theProject.tree._treeOrder.index(C.hNovelRoot) == 1 assert nwGUI.theProject.tree._treeOrder.index(C.hNovelRoot) == 1
# Move novel folder up again # Move novel folder up again
assert nwTree.projTree.moveTreeItem(-1) is True assert projTree.moveTreeItem(-1) is True
assert nwGUI.theProject.tree._treeOrder.index(C.hNovelRoot) == 0 assert nwGUI.theProject.tree._treeOrder.index(C.hNovelRoot) == 0
# Clean up # Clean up
@@ -299,76 +300,77 @@ def testGuiProjTree_RequestDeleteItem(qtbot, caplog, monkeypatch, nwGUI, fncDir,
monkeypatch.setattr(QMessageBox, "information", lambda *a: QMessageBox.Yes) monkeypatch.setattr(QMessageBox, "information", lambda *a: QMessageBox.Yes)
monkeypatch.setattr(GuiEditLabel, "getLabel", lambda *a, text: (text, True)) monkeypatch.setattr(GuiEditLabel, "getLabel", lambda *a, text: (text, True))
nwView = nwGUI.projView projView = nwGUI.projView
projTree = nwGUI.projView.projTree
# Try to run with no project # Try to run with no project
assert nwView.requestDeleteItem() is False assert projView.requestDeleteItem() is False
# Create a project # Create a project
prjDir = os.path.join(fncDir, "project") prjDir = os.path.join(fncDir, "project")
buildTestProject(nwGUI, prjDir) buildTestProject(nwGUI, prjDir)
# Try emptying the trash already now, when there is no trash folder # Try emptying the trash already now, when there is no trash folder
assert nwView.emptyTrash() is False assert projView.emptyTrash() is False
# Add some files # Add some files
nwView.setSelectedHandle(C.hChapterDir) projView.setSelectedHandle(C.hChapterDir)
assert nwView.projTree.newTreeItem(nwItemType.FILE) is True assert projTree.newTreeItem(nwItemType.FILE) is True
assert nwView.projTree.newTreeItem(nwItemType.FILE) is True assert projTree.newTreeItem(nwItemType.FILE) is True
assert nwView.projTree.newTreeItem(nwItemType.FILE) is True assert projTree.newTreeItem(nwItemType.FILE) is True
assert nwView.getTreeFromHandle(C.hChapterDir) == [ assert projTree.getTreeFromHandle(C.hChapterDir) == [
C.hChapterDir, C.hChapterDoc, C.hSceneDoc, C.hChapterDir, C.hChapterDoc, C.hSceneDoc,
"0000000000010", "0000000000011", "0000000000012", "0000000000010", "0000000000011", "0000000000012",
] ]
# Delete item without focus -> blocked # Delete item without focus -> blocked
monkeypatch.setattr(GuiProjectTree, "hasFocus", lambda *a: False) monkeypatch.setattr(GuiProjectTree, "hasFocus", lambda *a: False)
nwView.setSelectedHandle("0000000000012") projView.setSelectedHandle("0000000000012")
assert nwView.requestDeleteItem() is False assert projView.requestDeleteItem() is False
monkeypatch.setattr(GuiProjectTree, "hasFocus", lambda *a: True) monkeypatch.setattr(GuiProjectTree, "hasFocus", lambda *a: True)
# No selection made # No selection made
nwView.projTree.clearSelection() projTree.clearSelection()
caplog.clear() caplog.clear()
assert nwView.requestDeleteItem() is False assert projView.requestDeleteItem() is False
assert "no item to delete" in caplog.text assert "no item to delete" in caplog.text
# Not a valid handle # Not a valid handle
nwView.projTree.clearSelection() projTree.clearSelection()
caplog.clear() caplog.clear()
assert nwView.requestDeleteItem("0000000000000") is False assert projView.requestDeleteItem("0000000000000") is False
assert "No tree item with handle '0000000000000'" in caplog.text assert "No tree item with handle '0000000000000'" in caplog.text
# Delete Root Folders # Delete Root Folders
# =================== # ===================
assert nwView.requestDeleteItem(C.hNovelRoot) is False # Novel Root is blocked assert projView.requestDeleteItem(C.hNovelRoot) is False # Novel Root is blocked
assert nwView.requestDeleteItem(C.hCharRoot) is True # Character Root assert projView.requestDeleteItem(C.hCharRoot) is True # Character Root
# Delete File # Delete File
# =========== # ===========
# Block adding trash folder # Block adding trash folder
funcPointer = nwView.projTree._addTrashRoot funcPointer = projTree._addTrashRoot
nwView.projTree._addTrashRoot = lambda *a: None projTree._addTrashRoot = lambda *a: None
assert nwView.requestDeleteItem("0000000000012") is False assert projView.requestDeleteItem("0000000000012") is False
nwView.projTree._addTrashRoot = funcPointer projTree._addTrashRoot = funcPointer
# Delete last two documents, which also adds the trash folder # Delete last two documents, which also adds the trash folder
assert nwView.requestDeleteItem("0000000000012") is True assert projView.requestDeleteItem("0000000000012") is True
assert nwView.requestDeleteItem("0000000000011") is True assert projView.requestDeleteItem("0000000000011") is True
assert nwView.getTreeFromHandle(C.hChapterDir) == [ assert projTree.getTreeFromHandle(C.hChapterDir) == [
C.hChapterDir, C.hChapterDoc, C.hSceneDoc, C.hChapterDir, C.hChapterDoc, C.hSceneDoc,
"0000000000010" "0000000000010"
] ]
trashHandle = nwGUI.theProject.tree.trashRoot() trashHandle = nwGUI.theProject.tree.trashRoot()
assert nwView.getTreeFromHandle(trashHandle) == [ assert projTree.getTreeFromHandle(trashHandle) == [
trashHandle, "0000000000012", "0000000000011" trashHandle, "0000000000012", "0000000000011"
] ]
# Try to delete the trash folder # Try to delete the trash folder
caplog.clear() caplog.clear()
assert nwView.requestDeleteItem("0000000000013") is False assert projView.requestDeleteItem("0000000000013") is False
assert "Cannot delete the Trash folder" in caplog.text assert "Cannot delete the Trash folder" in caplog.text
nwGUI.closeProject() nwGUI.closeProject()
+1 -1
View File
@@ -40,7 +40,7 @@ def testGuiStatusBar_Main(qtbot, monkeypatch, nwGUI, fncProj, mockRnd):
cHandle = nwGUI.theProject.newFile("A Note", C.hCharRoot) cHandle = nwGUI.theProject.newFile("A Note", C.hCharRoot)
newDoc = NWDoc(nwGUI.theProject, cHandle) newDoc = NWDoc(nwGUI.theProject, cHandle)
newDoc.writeDocument("# A Note\n\n") newDoc.writeDocument("# A Note\n\n")
nwGUI.projView.revealNewTreeItem(cHandle) nwGUI.projView.projTree.revealNewTreeItem(cHandle)
nwGUI.rebuildIndex(beQuiet=True) nwGUI.rebuildIndex(beQuiet=True)
# Reference Time # Reference Time