From 2ee6adcf352de52113806753a767a9189a2f6c54 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Tue, 25 Oct 2022 15:47:40 +0200 Subject: [PATCH] Clean up function mappings in project tree class --- novelwriter/gui/projtree.py | 13 ++- novelwriter/guimain.py | 12 +-- tests/test_gui/test_gui_doceditor.py | 2 +- tests/test_gui/test_gui_outline.py | 4 +- tests/test_gui/test_gui_projtree.py | 120 ++++++++++++++------------- tests/test_gui/test_gui_statusbar.py | 2 +- 6 files changed, 79 insertions(+), 74 deletions(-) diff --git a/novelwriter/gui/projtree.py b/novelwriter/gui/projtree.py index f4b60161..bd77a57a 100644 --- a/novelwriter/gui/projtree.py +++ b/novelwriter/gui/projtree.py @@ -105,9 +105,6 @@ class GuiProjectView(QWidget): self.keyContext.activated.connect(lambda: self.projTree.openContextOnSelected()) # Function Mappings - self.revealNewTreeItem = self.projTree.revealNewTreeItem - self.renameTreeItem = self.projTree.renameTreeItem - self.getTreeFromHandle = self.projTree.getTreeFromHandle self.emptyTrash = self.projTree.emptyTrash self.requestDeleteItem = self.projTree.requestDeleteItem self.setTreeItemValues = self.projTree.setTreeItemValues @@ -164,6 +161,16 @@ class GuiProjectView(QWidget): """ 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 ## diff --git a/novelwriter/guimain.py b/novelwriter/guimain.py index 4025dd05..cf0a9dff 100644 --- a/novelwriter/guimain.py +++ b/novelwriter/guimain.py @@ -807,15 +807,11 @@ class GuiMain(QMainWindow): logger.error("No project open") return False - if tHandle is None: - if self.docEditor.anyFocus() or self.isFocusMode: - tHandle = self.docEditor.docHandle() - else: - tHandle = self.projView.getSelectedHandle() - if tHandle: - return self.projView.renameTreeItem(tHandle) + if tHandle is None and (self.docEditor.anyFocus() or self.isFocusMode): + tHandle = self.docEditor.docHandle() + self.projView.renameTreeItem(tHandle) - return False + return True def rebuildTrees(self): """Rebuild the project tree. diff --git a/tests/test_gui/test_gui_doceditor.py b/tests/test_gui/test_gui_doceditor.py index b3bc49b1..68f02c71 100644 --- a/tests/test_gui/test_gui_doceditor.py +++ b/tests/test_gui/test_gui_doceditor.py @@ -1144,7 +1144,7 @@ def testGuiEditor_Tags(qtbot, monkeypatch, nwGUI, nwMinimal, ipsumText): assert nwGUI.openDocument(cHandle) is True assert nwGUI.docEditor.replaceText(theText) is True assert nwGUI.saveDocument() is True - assert nwGUI.projView.revealNewTreeItem(cHandle) + assert nwGUI.projView.projTree.revealNewTreeItem(cHandle) nwGUI.docEditor.updateTagHighLighting() # Follow Tag diff --git a/tests/test_gui/test_gui_outline.py b/tests/test_gui/test_gui_outline.py index 2f33cf7a..457be313 100644 --- a/tests/test_gui/test_gui_outline.py +++ b/tests/test_gui/test_gui_outline.py @@ -183,7 +183,7 @@ def testGuiOutline_Content(qtbot, monkeypatch, nwGUI, nwLipsum): # Add a second novel folder newHandle = nwGUI.theProject.newRoot(nwItemClass.NOVEL) - nwGUI.projView.revealNewTreeItem(newHandle) + nwGUI.projView.projTree.revealNewTreeItem(newHandle) # Check new values in dropdown list assert outlineBar.novelValue.itemData(0) == lipHandle @@ -202,7 +202,7 @@ def testGuiOutline_Content(qtbot, monkeypatch, nwGUI, nwLipsum): aHandle = nwGUI.theProject.newFile(dTitle, newHandle) hHash = "#"*hLevel 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() diff --git a/tests/test_gui/test_gui_projtree.py b/tests/test_gui/test_gui_projtree.py index b5201846..ecf78341 100644 --- a/tests/test_gui/test_gui_projtree.py +++ b/tests/test_gui/test_gui_projtree.py @@ -160,11 +160,11 @@ def testGuiProjTree_NewItems(qtbot, caplog, monkeypatch, nwGUI, fncDir, mockRnd) # ============ # 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 nHandle = theProject.newFile("Test", None) - assert projView.revealNewTreeItem(nHandle) is False + assert projView.projTree.revealNewTreeItem(nHandle) is False # Clean up # qtbot.stop() @@ -184,10 +184,11 @@ def testGuiProjTree_MoveItems(qtbot, monkeypatch, nwGUI, fncDir, mockRnd): monkeypatch.setattr(QMessageBox, "information", lambda *a: QMessageBox.Yes) 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 - assert nwTree.projTree.moveTreeItem(1) is False + assert projView.projTree.moveTreeItem(1) is False # Create a project prjDir = os.path.join(fncDir, "project") @@ -197,68 +198,68 @@ def testGuiProjTree_MoveItems(qtbot, monkeypatch, nwGUI, fncDir, mockRnd): # ============== # Add some files - nwTree.setSelectedHandle(C.hChapterDir) - assert nwTree.projTree.newTreeItem(nwItemType.FILE) is True - assert nwTree.projTree.newTreeItem(nwItemType.FILE) is True - assert nwTree.projTree.newTreeItem(nwItemType.FILE) is True - assert nwTree.getTreeFromHandle(C.hChapterDir) == [ + projView.setSelectedHandle(C.hChapterDir) + assert projTree.newTreeItem(nwItemType.FILE) is True + assert projTree.newTreeItem(nwItemType.FILE) is True + assert projTree.newTreeItem(nwItemType.FILE) is True + assert projTree.getTreeFromHandle(C.hChapterDir) == [ C.hChapterDir, C.hChapterDoc, C.hSceneDoc, "0000000000010", "0000000000011", "0000000000012", ] # Move with no selections - nwTree.projTree.clearSelection() - assert nwTree.projTree.moveTreeItem(1) is False + projTree.clearSelection() + assert projTree.moveTreeItem(1) is False # Move second item up twice (should give same result) - nwTree.setSelectedHandle(C.hSceneDoc) - assert nwTree.projTree.moveTreeItem(-1) is True - assert nwTree.getTreeFromHandle(C.hChapterDir) == [ + projView.setSelectedHandle(C.hSceneDoc) + assert projTree.moveTreeItem(-1) is True + assert projTree.getTreeFromHandle(C.hChapterDir) == [ C.hChapterDir, C.hSceneDoc, C.hChapterDoc, "0000000000010", "0000000000011", "0000000000012", ] - assert nwTree.projTree.moveTreeItem(-1) is False - assert nwTree.getTreeFromHandle(C.hChapterDir) == [ + assert projTree.moveTreeItem(-1) is False + assert projTree.getTreeFromHandle(C.hChapterDir) == [ C.hChapterDir, C.hSceneDoc, C.hChapterDoc, "0000000000010", "0000000000011", "0000000000012", ] # Restore - assert nwTree.projTree.moveTreeItem(1) is True - assert nwTree.getTreeFromHandle(C.hChapterDir) == [ + assert projTree.moveTreeItem(1) is True + assert projTree.getTreeFromHandle(C.hChapterDir) == [ C.hChapterDir, C.hChapterDoc, C.hSceneDoc, "0000000000010", "0000000000011", "0000000000012", ] # Move fifth item down twice (should give same result) - nwTree.setSelectedHandle("0000000000011") - assert nwTree.projTree.moveTreeItem(1) is True - assert nwTree.getTreeFromHandle(C.hChapterDir) == [ + projView.setSelectedHandle("0000000000011") + assert projTree.moveTreeItem(1) is True + assert projTree.getTreeFromHandle(C.hChapterDir) == [ C.hChapterDir, C.hChapterDoc, C.hSceneDoc, "0000000000010", "0000000000012", "0000000000011", ] - assert nwTree.projTree.moveTreeItem(1) is False - assert nwTree.getTreeFromHandle(C.hChapterDir) == [ + assert projTree.moveTreeItem(1) is False + assert projTree.getTreeFromHandle(C.hChapterDir) == [ C.hChapterDir, C.hChapterDoc, C.hSceneDoc, "0000000000010", "0000000000012", "0000000000011", ] # Restore - assert nwTree.projTree.moveTreeItem(-1) is True - assert nwTree.getTreeFromHandle(C.hChapterDir) == [ + assert projTree.moveTreeItem(-1) is True + assert projTree.getTreeFromHandle(C.hChapterDir) == [ C.hChapterDir, C.hChapterDoc, C.hSceneDoc, "0000000000010", "0000000000011", "0000000000012", ] # Move down again, and restore via undo - nwTree.setSelectedHandle("0000000000011") - assert nwTree.projTree.moveTreeItem(1) is True - assert nwTree.getTreeFromHandle(C.hChapterDir) == [ + projView.setSelectedHandle("0000000000011") + assert projTree.moveTreeItem(1) is True + assert projTree.getTreeFromHandle(C.hChapterDir) == [ C.hChapterDir, C.hChapterDoc, C.hSceneDoc, "0000000000010", "0000000000012", "0000000000011", ] - assert nwTree.projTree.undoLastMove() is True - assert nwTree.getTreeFromHandle(C.hChapterDir) == [ + assert projTree.undoLastMove() is True + assert projTree.getTreeFromHandle(C.hChapterDir) == [ C.hChapterDir, C.hChapterDoc, C.hSceneDoc, "0000000000010", "0000000000011", "0000000000012", ] @@ -266,19 +267,19 @@ def testGuiProjTree_MoveItems(qtbot, monkeypatch, nwGUI, fncDir, mockRnd): # Root Folder # =========== - nwTree.setSelectedHandle(C.hNovelRoot) + projView.setSelectedHandle(C.hNovelRoot) assert nwGUI.theProject.tree._treeOrder.index(C.hNovelRoot) == 0 # 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 # 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 # 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 # Clean up @@ -299,76 +300,77 @@ def testGuiProjTree_RequestDeleteItem(qtbot, caplog, monkeypatch, nwGUI, fncDir, monkeypatch.setattr(QMessageBox, "information", lambda *a: QMessageBox.Yes) 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 - assert nwView.requestDeleteItem() is False + assert projView.requestDeleteItem() is False # Create a project prjDir = os.path.join(fncDir, "project") buildTestProject(nwGUI, prjDir) # 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 - nwView.setSelectedHandle(C.hChapterDir) - assert nwView.projTree.newTreeItem(nwItemType.FILE) is True - assert nwView.projTree.newTreeItem(nwItemType.FILE) is True - assert nwView.projTree.newTreeItem(nwItemType.FILE) is True - assert nwView.getTreeFromHandle(C.hChapterDir) == [ + projView.setSelectedHandle(C.hChapterDir) + assert projTree.newTreeItem(nwItemType.FILE) is True + assert projTree.newTreeItem(nwItemType.FILE) is True + assert projTree.newTreeItem(nwItemType.FILE) is True + assert projTree.getTreeFromHandle(C.hChapterDir) == [ C.hChapterDir, C.hChapterDoc, C.hSceneDoc, "0000000000010", "0000000000011", "0000000000012", ] # Delete item without focus -> blocked monkeypatch.setattr(GuiProjectTree, "hasFocus", lambda *a: False) - nwView.setSelectedHandle("0000000000012") - assert nwView.requestDeleteItem() is False + projView.setSelectedHandle("0000000000012") + assert projView.requestDeleteItem() is False monkeypatch.setattr(GuiProjectTree, "hasFocus", lambda *a: True) # No selection made - nwView.projTree.clearSelection() + projTree.clearSelection() caplog.clear() - assert nwView.requestDeleteItem() is False + assert projView.requestDeleteItem() is False assert "no item to delete" in caplog.text # Not a valid handle - nwView.projTree.clearSelection() + projTree.clearSelection() caplog.clear() - assert nwView.requestDeleteItem("0000000000000") is False + assert projView.requestDeleteItem("0000000000000") is False assert "No tree item with handle '0000000000000'" in caplog.text # Delete Root Folders # =================== - assert nwView.requestDeleteItem(C.hNovelRoot) is False # Novel Root is blocked - assert nwView.requestDeleteItem(C.hCharRoot) is True # Character Root + assert projView.requestDeleteItem(C.hNovelRoot) is False # Novel Root is blocked + assert projView.requestDeleteItem(C.hCharRoot) is True # Character Root # Delete File # =========== # Block adding trash folder - funcPointer = nwView.projTree._addTrashRoot - nwView.projTree._addTrashRoot = lambda *a: None - assert nwView.requestDeleteItem("0000000000012") is False - nwView.projTree._addTrashRoot = funcPointer + funcPointer = projTree._addTrashRoot + projTree._addTrashRoot = lambda *a: None + assert projView.requestDeleteItem("0000000000012") is False + projTree._addTrashRoot = funcPointer # Delete last two documents, which also adds the trash folder - assert nwView.requestDeleteItem("0000000000012") is True - assert nwView.requestDeleteItem("0000000000011") is True - assert nwView.getTreeFromHandle(C.hChapterDir) == [ + assert projView.requestDeleteItem("0000000000012") is True + assert projView.requestDeleteItem("0000000000011") is True + assert projTree.getTreeFromHandle(C.hChapterDir) == [ C.hChapterDir, C.hChapterDoc, C.hSceneDoc, "0000000000010" ] trashHandle = nwGUI.theProject.tree.trashRoot() - assert nwView.getTreeFromHandle(trashHandle) == [ + assert projTree.getTreeFromHandle(trashHandle) == [ trashHandle, "0000000000012", "0000000000011" ] # Try to delete the trash folder caplog.clear() - assert nwView.requestDeleteItem("0000000000013") is False + assert projView.requestDeleteItem("0000000000013") is False assert "Cannot delete the Trash folder" in caplog.text nwGUI.closeProject() diff --git a/tests/test_gui/test_gui_statusbar.py b/tests/test_gui/test_gui_statusbar.py index 6c99642f..e2e9a5bb 100644 --- a/tests/test_gui/test_gui_statusbar.py +++ b/tests/test_gui/test_gui_statusbar.py @@ -40,7 +40,7 @@ def testGuiStatusBar_Main(qtbot, monkeypatch, nwGUI, fncProj, mockRnd): cHandle = nwGUI.theProject.newFile("A Note", C.hCharRoot) newDoc = NWDoc(nwGUI.theProject, cHandle) newDoc.writeDocument("# A Note\n\n") - nwGUI.projView.revealNewTreeItem(cHandle) + nwGUI.projView.projTree.revealNewTreeItem(cHandle) nwGUI.rebuildIndex(beQuiet=True) # Reference Time