From d07f5dc520162c6228de07f726f5041e47665d02 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Mon, 6 Jun 2022 15:50:46 +0200 Subject: [PATCH] Wrap project tree in an outer widget with a toolbar --- novelwriter/dialogs/preferences.py | 2 +- novelwriter/gui/__init__.py | 4 +- novelwriter/gui/itemdetails.py | 2 +- novelwriter/gui/outline.py | 3 + novelwriter/gui/projtree.py | 185 ++++++++++++++++++---- novelwriter/guimain.py | 20 +-- tests/test_dialogs/test_dlg_docmerge.py | 28 ++-- tests/test_dialogs/test_dlg_docsplit.py | 20 +-- tests/test_dialogs/test_dlg_itemeditor.py | 10 +- tests/test_gui/test_gui_docviewer.py | 6 +- tests/test_gui/test_gui_guimain.py | 49 +++--- tests/test_gui/test_gui_mainmenu.py | 6 +- tests/test_gui/test_gui_projtree.py | 20 +-- 13 files changed, 238 insertions(+), 117 deletions(-) diff --git a/novelwriter/dialogs/preferences.py b/novelwriter/dialogs/preferences.py index d38a4ab6..755b9198 100644 --- a/novelwriter/dialogs/preferences.py +++ b/novelwriter/dialogs/preferences.py @@ -107,7 +107,7 @@ class GuiPreferences(PagedDialog): ), nwAlert.INFO) if refreshTree: - self.theParent.treeView.buildTree() + self.theParent.treeView.populateTree() self._saveWindowSize() self.accept() diff --git a/novelwriter/gui/__init__.py b/novelwriter/gui/__init__.py index e3560a99..0ae23024 100644 --- a/novelwriter/gui/__init__.py +++ b/novelwriter/gui/__init__.py @@ -25,7 +25,7 @@ from novelwriter.gui.itemdetails import GuiItemDetails from novelwriter.gui.mainmenu import GuiMainMenu from novelwriter.gui.noveltree import GuiNovelTree from novelwriter.gui.outline import GuiOutline -from novelwriter.gui.projtree import GuiProjectTree +from novelwriter.gui.projtree import GuiProjectWiew from novelwriter.gui.statusbar import GuiMainStatus from novelwriter.gui.theme import GuiTheme from novelwriter.gui.viewsbar import GuiViewsBar @@ -39,7 +39,7 @@ __all__ = [ "GuiMainStatus", "GuiNovelTree", "GuiOutline", - "GuiProjectTree", + "GuiProjectWiew", "GuiTheme", "GuiViewsBar", ] diff --git a/novelwriter/gui/itemdetails.py b/novelwriter/gui/itemdetails.py index 643479a4..cf9e8017 100644 --- a/novelwriter/gui/itemdetails.py +++ b/novelwriter/gui/itemdetails.py @@ -296,7 +296,7 @@ class GuiItemDetails(QWidget): return @pyqtSlot(str, int, int, int) - def doUpdateCounts(self, tHandle, cC, wC, pC): + def updateCounts(self, tHandle, cC, wC, pC): """Update the counts if the handle is the same as the one we're already showing. Otherwise, do nothing. """ diff --git a/novelwriter/gui/outline.py b/novelwriter/gui/outline.py index 34cb35da..65bffdbd 100644 --- a/novelwriter/gui/outline.py +++ b/novelwriter/gui/outline.py @@ -62,6 +62,7 @@ class GuiOutline(QWidget): self.mainConf = novelwriter.CONFIG self.theParent = theParent + # Build GUI self.outlineBar = GuiOutlineToolBar(self) self.outlineView = GuiOutlineView(self) self.outlineData = GuiOutlineDetails(self) @@ -225,6 +226,8 @@ class GuiOutlineToolBar(QToolBar): logger.debug("GuiOutlineToolBar initialisation complete") + return + ## # Methods ## diff --git a/novelwriter/gui/projtree.py b/novelwriter/gui/projtree.py index c6d077b8..7286f87f 100644 --- a/novelwriter/gui/projtree.py +++ b/novelwriter/gui/projtree.py @@ -6,6 +6,8 @@ GUI classes for the main window project tree File History: Created: 2018-09-29 [0.0.1] GuiProjectTree Created: 2020-06-04 [0.7] GuiProjectTreeMenu +Created: 2022-06-06 [1.7b1] GuiProjectWiew +Created: 2022-06-06 [1.7b1] GuiProjectToolBar This file is a part of novelWriter Copyright 2018–2022, Veronica Berglyd Olsen @@ -34,7 +36,8 @@ from PyQt5.QtCore import Qt, QSize, pyqtSignal, pyqtSlot from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import ( QTreeWidget, QTreeWidgetItem, QAbstractItemView, QMenu, QAction, QFrame, - QDialog, QHeaderView + QDialog, QHeaderView, QWidget, QVBoxLayout, QToolBar, QLabel, QToolButton, + QSizePolicy ) from novelwriter.core import NWDoc @@ -45,12 +48,11 @@ from novelwriter.dialogs.itemeditor import GuiItemEditor logger = logging.getLogger(__name__) -class GuiProjectTree(QTreeWidget): - - C_NAME = 0 - C_COUNT = 1 - C_EXPORT = 2 - C_STATUS = 3 +class GuiProjectWiew(QWidget): + """This is a wrapper class holding all the elements of the project + tree. The core object is the project tree itself. Most methods + available are mapped through to the project tree class. + """ # Signals triggered when the meta data values of items change treeItemChanged = pyqtSignal(str) @@ -63,14 +65,143 @@ class GuiProjectTree(QTreeWidget): openDocumentRequest = pyqtSignal(str, Enum) def __init__(self, theParent): - QTreeWidget.__init__(self, theParent) + QWidget.__init__(self, theParent) + + self.theParent = theParent + + # Build GUI + self.projBar = GuiProjectToolBar(self) + self.projTree = GuiProjectTree(self) + + # Assemble + self.outerBox = QVBoxLayout() + self.outerBox.addWidget(self.projBar) + self.outerBox.addWidget(self.projTree) + self.outerBox.setContentsMargins(0, 0, 0, 0) + self.outerBox.setSpacing(0) + + self.setLayout(self.outerBox) + + # Function Mappings + self.newTreeItem = self.projTree.newTreeItem + self.revealNewTreeItem = self.projTree.revealNewTreeItem + self.moveTreeItem = self.projTree.moveTreeItem + self.editTreeItem = self.projTree.editTreeItem + self.getTreeFromHandle = self.projTree.getTreeFromHandle + self.emptyTrash = self.projTree.emptyTrash + self.deleteItem = self.projTree.deleteItem + self.setTreeItemValues = self.projTree.setTreeItemValues + self.propagateCount = self.projTree.propagateCount + self.undoLastMove = self.projTree.undoLastMove + self.getSelectedHandle = self.projTree.getSelectedHandle + self.setSelectedHandle = self.projTree.setSelectedHandle + self.changedSince = self.projTree.changedSince + + return + + ## + # Methods + ## + + def initSettings(self): + self.projTree.initSettings() + return + + def clearProject(self): + self.projTree.clearTree() + return + + def saveProjectTree(self): + self.projTree.saveTreeOrder() + return + + def populateTree(self): + self.projTree.buildTree() + return + + def treeFocus(self): + return self.projTree.hasFocus() + + ## + # Public Solts + ## + + @pyqtSlot(str, int, int, int) + def updateCounts(self, tHandle, cCount, wCount, pCount): + """Slot for updating the word count of a specific item. + """ + self.projTree.propagateCount(tHandle, wCount, countChildren=True) + self.wordCountsChanged.emit() + return + +# END Class GuiProjectWiew + + +class GuiProjectToolBar(QToolBar): + + def __init__(self, theWidget): + QTreeWidget.__init__(self, theWidget) + + logger.debug("Initialising GuiProjectToolBar ...") + + self.mainConf = novelwriter.CONFIG + self.theParent = theWidget.theParent + self.theProject = theWidget.theParent.theProject + self.theTheme = theWidget.theParent.theTheme + + iPx = self.theTheme.baseIconSize + mPx = self.mainConf.pxInt(12) + + self.setMovable(False) + self.setIconSize(QSize(iPx, iPx)) + self.setContentsMargins(0, 0, 0, 0) + self.setStyleSheet("QToolBar {border: 0px;}") + + # Novel Selector + self.projLabel = QLabel(self.tr("Project")) + self.projLabel.setContentsMargins(0, 0, mPx, 0) + self.projLabel.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) + + # Itemss Menu + self.tbItems = QToolButton(self) + self.tbItems.setIcon(self.theTheme.getIcon("add")) + self.tbItems.setPopupMode(QToolButton.InstantPopup) + + # Settings Menu + self.tbSettings = QToolButton(self) + self.tbSettings.setIcon(self.theTheme.getIcon("menu")) + self.tbSettings.setPopupMode(QToolButton.InstantPopup) + + # Assemble + self.addWidget(self.projLabel) + self.addSeparator() + self.addWidget(self.tbItems) + self.addWidget(self.tbSettings) + + logger.debug("GuiProjectToolBar initialisation complete") + + return + +# END Class GuiProjectToolBar + + +class GuiProjectTree(QTreeWidget): + + C_NAME = 0 + C_COUNT = 1 + C_EXPORT = 2 + C_STATUS = 3 + + def __init__(self, theWidget): + QTreeWidget.__init__(self, theWidget) logger.debug("Initialising GuiProjectTree ...") self.mainConf = novelwriter.CONFIG - self.theParent = theParent - self.theTheme = theParent.theTheme - self.theProject = theParent.theProject + self.theWidget = theWidget + self.theParent = theWidget.theParent + self.theTheme = theWidget.theParent.theTheme + self.theProject = theWidget.theParent.theProject # Internal Variables self._treeMap = {} @@ -125,13 +256,13 @@ class GuiProjectTree(QTreeWidget): self.itemSelectionChanged.connect(self._treeSelectionChange) # Set custom settings - self.initTree() + self.initSettings() logger.debug("GuiProjectTree initialisation complete") return - def initTree(self): + def initSettings(self): """Set or update tree widget settings. """ # Scroll bars @@ -248,7 +379,7 @@ class GuiProjectTree(QTreeWidget): # Get Word Counts _, wC, _ = pIndex.getCounts(tHandle) self.propagateCount(tHandle, wC) - self.wordCountsChanged.emit() + self.theWidget.wordCountsChanged.emit() return True @@ -494,7 +625,7 @@ class GuiProjectTree(QTreeWidget): self._deleteTreeItem(dHandle) self._alertTreeChange(tHandle=tHandle, flush=autoFlush) - self.wordCountsChanged.emit() + self.theWidget.wordCountsChanged.emit() else: # The item is not already in the trash folder, so we @@ -690,18 +821,6 @@ class GuiProjectTree(QTreeWidget): """ return self._timeChanged > checkTime - ## - # Public Solts - ## - - @pyqtSlot(str, int, int, int) - def doUpdateCounts(self, tHandle, cCount, wCount, pCount): - """Slot for updating the word count of a specific item. - """ - self.propagateCount(tHandle, wCount, countChildren=True) - self.wordCountsChanged.emit() - return - ## # Private Slots ## @@ -712,7 +831,7 @@ class GuiProjectTree(QTreeWidget): """ tHandle = self.getSelectedHandle() if tHandle is not None: - self.selectedItemChanged.emit(tHandle) + self.theWidget.selectedItemChanged.emit(tHandle) return @pyqtSlot("QTreeWidgetItem*", int) @@ -729,7 +848,7 @@ class GuiProjectTree(QTreeWidget): return if tItem.itemType == nwItemType.FILE: - self.openDocumentRequest.emit(tHandle, nwDocMode.EDIT) + self.theWidget.openDocumentRequest.emit(tHandle, nwDocMode.EDIT) else: trItem = self._getTreeItem(tHandle) if trItem is not None: @@ -781,7 +900,7 @@ class GuiProjectTree(QTreeWidget): return if tItem.itemType == nwItemType.FILE: - self.openDocumentRequest.emit(tHandle, nwDocMode.VIEW) + self.theWidget.openDocumentRequest.emit(tHandle, nwDocMode.VIEW) return @@ -988,11 +1107,11 @@ class GuiProjectTree(QTreeWidget): itemType = tItem.itemType if itemType == nwItemType.ROOT: - self.rootFolderChanged.emit(tHandle) + self.theWidget.rootFolderChanged.emit(tHandle) elif itemType == nwItemType.FILE and tItem.isNovelLike(): - self.novelItemChanged.emit(tHandle) + self.theWidget.novelItemChanged.emit(tHandle) - self.treeItemChanged.emit(tHandle) + self.theWidget.treeItemChanged.emit(tHandle) return diff --git a/novelwriter/guimain.py b/novelwriter/guimain.py index 7afd1675..d18d4d17 100644 --- a/novelwriter/guimain.py +++ b/novelwriter/guimain.py @@ -40,7 +40,7 @@ from PyQt5.QtWidgets import ( from novelwriter.gui import ( GuiDocEditor, GuiDocViewDetails, GuiDocViewer, GuiItemDetails, GuiMainMenu, - GuiMainStatus, GuiNovelTree, GuiOutline, GuiProjectTree, GuiTheme, + GuiMainStatus, GuiNovelTree, GuiOutline, GuiProjectWiew, GuiTheme, GuiViewsBar ) from novelwriter.dialogs import ( @@ -105,7 +105,7 @@ class GuiMain(QMainWindow): # Main GUI Elements self.statusBar = GuiMainStatus(self) - self.treeView = GuiProjectTree(self) + self.treeView = GuiProjectWiew(self) self.novelView = GuiNovelTree(self) self.docEditor = GuiDocEditor(self) self.viewMeta = GuiDocViewDetails(self) @@ -208,8 +208,8 @@ class GuiMain(QMainWindow): self.docEditor.spellDictionaryChanged.connect(self.statusBar.setLanguage) self.docEditor.docEditedStatusChanged.connect(self.statusBar.doUpdateDocumentStatus) - self.docEditor.docCountsChanged.connect(self.treeMeta.doUpdateCounts) - self.docEditor.docCountsChanged.connect(self.treeView.doUpdateCounts) + self.docEditor.docCountsChanged.connect(self.treeMeta.updateCounts) + self.docEditor.docCountsChanged.connect(self.treeView.updateCounts) self.docEditor.loadDocumentTagRequest.connect(self._followTag) self.docViewer.loadDocumentTagRequest.connect(self._followTag) @@ -291,7 +291,7 @@ class GuiMain(QMainWindow): """Wrapper function to clear all sub-elements of the main GUI. """ # Project Area - self.treeView.clearTree() + self.treeView.clearProject() self.novelView.clearTree() self.treeMeta.clearDetails() @@ -541,7 +541,7 @@ class GuiMain(QMainWindow): logger.error("No project open") return False - self.treeView.saveTreeOrder() + self.treeView.saveProjectTree() if self.theProject.saveProject(autoSave=autoSave): self.theProject.index.saveIndex() @@ -789,7 +789,7 @@ class GuiMain(QMainWindow): tHandle = None tLine = None - if self.treeView.hasFocus(): + if self.treeView.treeFocus(): tHandle = self.treeView.getSelectedHandle() elif self.novelView.hasFocus(): tHandle, tLine = self.novelView.getSelectedHandle() @@ -824,7 +824,7 @@ class GuiMain(QMainWindow): def rebuildTrees(self): """Rebuild the project tree. """ - self.treeView.buildTree() + self.treeView.populateTree() self.novelView.refreshTree() return @@ -847,7 +847,7 @@ class GuiMain(QMainWindow): qApp.setOverrideCursor(QCursor(Qt.WaitCursor)) tStart = time() - self.treeView.saveTreeOrder() + self.treeView.saveProjectTree() self.theProject.index.clearIndex() for tItem in self.theProject.tree: @@ -919,7 +919,7 @@ class GuiMain(QMainWindow): self.saveDocument() self.docEditor.initEditor() self.docViewer.initViewer() - self.treeView.initTree() + self.treeView.initSettings() self.novelView.initTree() self.projView.initOutline() self._updateStatusWordCount() diff --git a/tests/test_dialogs/test_dlg_docmerge.py b/tests/test_dialogs/test_dlg_docmerge.py index a82c77bd..ce5c68d4 100644 --- a/tests/test_dialogs/test_dlg_docmerge.py +++ b/tests/test_dialogs/test_dlg_docmerge.py @@ -56,11 +56,11 @@ def testDlgMerge_Main(qtbot, monkeypatch, nwGUI, fncProj, mockRnd): # Add Project Content monkeypatch.setattr(GuiItemEditor, "exec_", lambda *a: QDialog.Accepted) nwGUI.switchFocus(nwWidget.TREE) - nwGUI.treeView.clearSelection() - nwGUI.treeView._getTreeItem(hChapterDir).setSelected(True) - nwGUI.treeView.newTreeItem(nwItemType.FILE) - nwGUI.treeView.newTreeItem(nwItemType.FILE) - nwGUI.treeView.newTreeItem(nwItemType.FILE) + nwGUI.treeView.projTree.clearSelection() + nwGUI.treeView.projTree._getTreeItem(hChapterDir).setSelected(True) + nwGUI.treeView.projTree.newTreeItem(nwItemType.FILE) + nwGUI.treeView.projTree.newTreeItem(nwItemType.FILE) + nwGUI.treeView.projTree.newTreeItem(nwItemType.FILE) assert nwGUI.saveProject() is True assert nwGUI.closeProject() is True @@ -82,8 +82,8 @@ def testDlgMerge_Main(qtbot, monkeypatch, nwGUI, fncProj, mockRnd): # Open the Merge tool nwGUI.switchFocus(nwWidget.TREE) - nwGUI.treeView.clearSelection() - nwGUI.treeView._getTreeItem(hChapterDir).setSelected(True) + nwGUI.treeView.projTree.clearSelection() + nwGUI.treeView.projTree._getTreeItem(hChapterDir).setSelected(True) monkeypatch.setattr(GuiDocMerge, "exec_", lambda *a: None) nwGUI.mainMenu.aMergeDocs.activate(QAction.Trigger) @@ -101,27 +101,27 @@ def testDlgMerge_Main(qtbot, monkeypatch, nwGUI, fncProj, mockRnd): assert nwMerge.listBox.count() == 0 # No item selected - nwGUI.treeView.clearSelection() + nwGUI.treeView.projTree.clearSelection() assert nwMerge._populateList() is False assert nwMerge.listBox.count() == 0 # Non-existing item with monkeypatch.context() as mp: mp.setattr(NWTree, "__getitem__", lambda *a: None) - nwGUI.treeView.clearSelection() - nwGUI.treeView._getTreeItem(hChapterDir).setSelected(True) + nwGUI.treeView.projTree.clearSelection() + nwGUI.treeView.projTree._getTreeItem(hChapterDir).setSelected(True) assert nwMerge._populateList() is False assert nwMerge.listBox.count() == 0 # Select a non-folder - nwGUI.treeView.clearSelection() - nwGUI.treeView._getTreeItem(hChapterOne).setSelected(True) + nwGUI.treeView.projTree.clearSelection() + nwGUI.treeView.projTree._getTreeItem(hChapterOne).setSelected(True) assert nwMerge._populateList() is False assert nwMerge.listBox.count() == 0 # Select the chapter folder - nwGUI.treeView.clearSelection() - nwGUI.treeView._getTreeItem(hChapterDir).setSelected(True) + nwGUI.treeView.projTree.clearSelection() + nwGUI.treeView.projTree._getTreeItem(hChapterDir).setSelected(True) assert nwMerge._populateList() is True assert nwMerge.listBox.count() == 5 diff --git a/tests/test_dialogs/test_dlg_docsplit.py b/tests/test_dialogs/test_dlg_docsplit.py index 90e3375d..0e3174c7 100644 --- a/tests/test_dialogs/test_dlg_docsplit.py +++ b/tests/test_dialogs/test_dlg_docsplit.py @@ -60,9 +60,9 @@ def testDlgSplit_Main(qtbot, monkeypatch, nwGUI, fncProj, mockRnd): # Add Project Content monkeypatch.setattr(GuiItemEditor, "exec_", lambda *a: QDialog.Accepted) nwGUI.switchFocus(nwWidget.TREE) - nwGUI.treeView.clearSelection() - nwGUI.treeView._getTreeItem(hNovelRoot).setSelected(True) - nwGUI.treeView.newTreeItem(nwItemType.FILE) + nwGUI.treeView.projTree.clearSelection() + nwGUI.treeView.projTree._getTreeItem(hNovelRoot).setSelected(True) + nwGUI.treeView.projTree.newTreeItem(nwItemType.FILE) assert nwGUI.saveProject() is True assert nwGUI.closeProject() is True @@ -89,8 +89,8 @@ def testDlgSplit_Main(qtbot, monkeypatch, nwGUI, fncProj, mockRnd): # Open the Split tool nwGUI.switchFocus(nwWidget.TREE) - nwGUI.treeView.clearSelection() - nwGUI.treeView._getTreeItem(hToSplit).setSelected(True) + nwGUI.treeView.projTree.clearSelection() + nwGUI.treeView.projTree._getTreeItem(hToSplit).setSelected(True) monkeypatch.setattr(GuiDocSplit, "exec_", lambda *a: None) nwGUI.mainMenu.aSplitDoc.activate(QAction.Trigger) @@ -109,7 +109,7 @@ def testDlgSplit_Main(qtbot, monkeypatch, nwGUI, fncProj, mockRnd): # No item selected nwSplit.sourceItem = None - nwGUI.treeView.clearSelection() + nwGUI.treeView.projTree.clearSelection() assert nwSplit._populateList() is False assert nwSplit.listBox.count() == 0 @@ -117,15 +117,15 @@ def testDlgSplit_Main(qtbot, monkeypatch, nwGUI, fncProj, mockRnd): with monkeypatch.context() as mp: mp.setattr(NWTree, "__getitem__", lambda *a: None) nwSplit.sourceItem = None - nwGUI.treeView.clearSelection() - nwGUI.treeView._getTreeItem(hToSplit).setSelected(True) + nwGUI.treeView.projTree.clearSelection() + nwGUI.treeView.projTree._getTreeItem(hToSplit).setSelected(True) assert nwSplit._populateList() is False assert nwSplit.listBox.count() == 0 # Select a non-file nwSplit.sourceItem = None - nwGUI.treeView.clearSelection() - nwGUI.treeView._getTreeItem(hChapterDir).setSelected(True) + nwGUI.treeView.projTree.clearSelection() + nwGUI.treeView.projTree._getTreeItem(hChapterDir).setSelected(True) assert nwSplit._populateList() is False assert nwSplit.listBox.count() == 0 diff --git a/tests/test_dialogs/test_dlg_itemeditor.py b/tests/test_dialogs/test_dlg_itemeditor.py index 95b1ee71..501d1e3b 100644 --- a/tests/test_dialogs/test_dlg_itemeditor.py +++ b/tests/test_dialogs/test_dlg_itemeditor.py @@ -25,10 +25,10 @@ from tools import getGuiItem, buildTestProject from PyQt5.QtWidgets import QAction, QDialog, QMessageBox -from novelwriter.gui import GuiProjectTree from novelwriter.enum import nwItemLayout, nwItemType from novelwriter.dialogs import GuiItemEditor from novelwriter.core.tree import NWTree +from novelwriter.gui.projtree import GuiProjectTree statusKeys = ["s000000", "s000001", "s000002", "s000003"] importKeys = ["i000004", "i000005", "i000006", "i000007"] @@ -52,7 +52,7 @@ def testDlgItemEditor_Dialog(qtbot, monkeypatch, nwGUI, fncProj, mockRnd): tHandle = "000000000000f" # No Selection - nwGUI.treeView.clearSelection() + nwGUI.treeView.projTree.clearSelection() assert nwGUI.editItem() is False # Force opening from editor @@ -163,9 +163,9 @@ def testDlgItemEditor_Note(qtbot, monkeypatch, nwGUI, fncProj, mockRnd): assert nwGUI.theProject.importItems.name(importKeys[1]) == "Minor" # Create Note - nwGUI.treeView.clearSelection() - nwGUI.treeView._getTreeItem("000000000000a").setSelected(True) - nwGUI.treeView.newTreeItem(nwItemType.FILE, None) + nwGUI.treeView.projTree.clearSelection() + nwGUI.treeView.projTree._getTreeItem("000000000000a").setSelected(True) + nwGUI.treeView.projTree.newTreeItem(nwItemType.FILE, None) # Open Note assert nwGUI.openDocument("0000000000010") diff --git a/tests/test_gui/test_gui_docviewer.py b/tests/test_gui/test_gui_docviewer.py index 1fa6b2c7..d1d8797a 100644 --- a/tests/test_gui/test_gui_docviewer.py +++ b/tests/test_gui/test_gui_docviewer.py @@ -54,9 +54,9 @@ def testGuiViewer_Main(qtbot, monkeypatch, nwGUI, nwLipsum): nwGUI.treeView.setSelectedHandle("88243afbe5ed8") # Middle-click the selected item - theItem = nwGUI.treeView._getTreeItem("88243afbe5ed8") - theRect = nwGUI.treeView.visualItemRect(theItem) - qtbot.mouseClick(nwGUI.treeView.viewport(), Qt.MidButton, pos=theRect.center()) + theItem = nwGUI.treeView.projTree._getTreeItem("88243afbe5ed8") + theRect = nwGUI.treeView.projTree.visualItemRect(theItem) + qtbot.mouseClick(nwGUI.treeView.projTree.viewport(), Qt.MidButton, pos=theRect.center()) assert nwGUI.docViewer.docHandle() == "88243afbe5ed8" # Reload the text diff --git a/tests/test_gui/test_gui_guimain.py b/tests/test_gui/test_gui_guimain.py index 5f49d51d..78c2af66 100644 --- a/tests/test_gui/test_gui_guimain.py +++ b/tests/test_gui/test_gui_guimain.py @@ -28,11 +28,10 @@ from tools import cmpFiles, buildTestProject, XML_IGNORE, writeFile from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QMessageBox, QDialog -from novelwriter.gui import ( - GuiDocEditor, GuiProjectTree, GuiNovelTree, GuiOutline -) +from novelwriter.gui import GuiDocEditor, GuiNovelTree, GuiOutline from novelwriter.enum import nwItemType, nwWidget from novelwriter.tools import GuiProjectWizard +from novelwriter.gui.projtree import GuiProjectTree from novelwriter.dialogs.itemeditor import GuiItemEditor keyDelay = 2 @@ -126,7 +125,7 @@ def testGuiMain_ProjectTreeItems(qtbot, monkeypatch, nwGUI, fncProj, mockRnd): with monkeypatch.context() as mp: mp.setattr(GuiProjectTree, "hasFocus", lambda *a: True) assert nwGUI.docEditor.docHandle() is None - nwGUI.treeView._getTreeItem(sHandle).setSelected(True) + nwGUI.treeView.projTree._getTreeItem(sHandle).setSelected(True) nwGUI._keyPressReturn() assert nwGUI.docEditor.docHandle() == sHandle assert nwGUI.closeDocument() is True @@ -220,14 +219,14 @@ def testGuiMain_Editing(qtbot, monkeypatch, nwGUI, fncProj, refDir, outDir, mock assert nwGUI.theProject.spellCheck is False # Check that tree items have been created - assert nwGUI.treeView._getTreeItem("0000000000008") is not None - assert nwGUI.treeView._getTreeItem("0000000000009") is not None - assert nwGUI.treeView._getTreeItem("000000000000a") is not None - assert nwGUI.treeView._getTreeItem("000000000000b") is not None - assert nwGUI.treeView._getTreeItem("000000000000c") is not None - assert nwGUI.treeView._getTreeItem("000000000000d") is not None - assert nwGUI.treeView._getTreeItem("000000000000e") is not None - assert nwGUI.treeView._getTreeItem("000000000000f") is not None + assert nwGUI.treeView.projTree._getTreeItem("0000000000008") is not None + assert nwGUI.treeView.projTree._getTreeItem("0000000000009") is not None + assert nwGUI.treeView.projTree._getTreeItem("000000000000a") is not None + assert nwGUI.treeView.projTree._getTreeItem("000000000000b") is not None + assert nwGUI.treeView.projTree._getTreeItem("000000000000c") is not None + assert nwGUI.treeView.projTree._getTreeItem("000000000000d") is not None + assert nwGUI.treeView.projTree._getTreeItem("000000000000e") is not None + assert nwGUI.treeView.projTree._getTreeItem("000000000000f") is not None nwGUI.mainMenu.aSpellCheck.setChecked(True) assert nwGUI.mainMenu._toggleSpellCheck() @@ -240,9 +239,9 @@ def testGuiMain_Editing(qtbot, monkeypatch, nwGUI, fncProj, refDir, outDir, mock # Add a Character File nwGUI.switchFocus(nwWidget.TREE) - nwGUI.treeView.clearSelection() - nwGUI.treeView._getTreeItem("000000000000a").setSelected(True) - nwGUI.treeView.newTreeItem(nwItemType.FILE, None) + nwGUI.treeView.projTree.clearSelection() + nwGUI.treeView.projTree._getTreeItem("000000000000a").setSelected(True) + nwGUI.treeView.projTree.newTreeItem(nwItemType.FILE, None) assert nwGUI.openSelectedItem() # Type something into the document @@ -262,9 +261,9 @@ def testGuiMain_Editing(qtbot, monkeypatch, nwGUI, fncProj, refDir, outDir, mock # Add a Plot File nwGUI.switchFocus(nwWidget.TREE) - nwGUI.treeView.clearSelection() - nwGUI.treeView._getTreeItem("0000000000009").setSelected(True) - nwGUI.treeView.newTreeItem(nwItemType.FILE, None) + nwGUI.treeView.projTree.clearSelection() + nwGUI.treeView.projTree._getTreeItem("0000000000009").setSelected(True) + nwGUI.treeView.projTree.newTreeItem(nwItemType.FILE, None) assert nwGUI.openSelectedItem() # Type something into the document @@ -284,9 +283,9 @@ def testGuiMain_Editing(qtbot, monkeypatch, nwGUI, fncProj, refDir, outDir, mock # Add a World File nwGUI.switchFocus(nwWidget.TREE) - nwGUI.treeView.clearSelection() - nwGUI.treeView._getTreeItem("000000000000b").setSelected(True) - nwGUI.treeView.newTreeItem(nwItemType.FILE, None) + nwGUI.treeView.projTree.clearSelection() + nwGUI.treeView.projTree._getTreeItem("000000000000b").setSelected(True) + nwGUI.treeView.projTree.newTreeItem(nwItemType.FILE, None) assert nwGUI.openSelectedItem() # Add Some Text @@ -315,10 +314,10 @@ def testGuiMain_Editing(qtbot, monkeypatch, nwGUI, fncProj, refDir, outDir, mock # Select the 'New Scene' file nwGUI.switchFocus(nwWidget.TREE) - nwGUI.treeView.clearSelection() - nwGUI.treeView._getTreeItem("0000000000008").setExpanded(True) - nwGUI.treeView._getTreeItem("000000000000d").setExpanded(True) - nwGUI.treeView._getTreeItem("000000000000f").setSelected(True) + nwGUI.treeView.projTree.clearSelection() + nwGUI.treeView.projTree._getTreeItem("0000000000008").setExpanded(True) + nwGUI.treeView.projTree._getTreeItem("000000000000d").setExpanded(True) + nwGUI.treeView.projTree._getTreeItem("000000000000f").setSelected(True) assert nwGUI.openSelectedItem() # Type something into the document diff --git a/tests/test_gui/test_gui_mainmenu.py b/tests/test_gui/test_gui_mainmenu.py index 801abd68..274746d7 100644 --- a/tests/test_gui/test_gui_mainmenu.py +++ b/tests/test_gui/test_gui_mainmenu.py @@ -467,7 +467,7 @@ def testGuiMenu_Insert(qtbot, monkeypatch, nwGUI, fncDir, fncProj, mockRnd): buildTestProject(nwGUI, fncProj) - assert nwGUI.treeView._getTreeItem("000000000000f") is not None + assert nwGUI.treeView.projTree._getTreeItem("000000000000f") is not None assert nwGUI.openDocument("000000000000f") is True nwGUI.docEditor.clear() @@ -476,10 +476,10 @@ def testGuiMenu_Insert(qtbot, monkeypatch, nwGUI, fncDir, fncProj, mockRnd): assert nwGUI.docEditor.getText() == "hello world" nwGUI.docEditor.clear() - assert not nwGUI.docEditor.insertText(nwDocInsert.NO_INSERT) + assert nwGUI.docEditor.insertText(nwDocInsert.NO_INSERT) is False assert nwGUI.docEditor.isEmpty() - assert not nwGUI.docEditor.insertText(None) + assert nwGUI.docEditor.insertText(None) is False assert nwGUI.docEditor.isEmpty() # qtbot.stopForInteraction() diff --git a/tests/test_gui/test_gui_projtree.py b/tests/test_gui/test_gui_projtree.py index 258ad150..7b66f305 100644 --- a/tests/test_gui/test_gui_projtree.py +++ b/tests/test_gui/test_gui_projtree.py @@ -52,7 +52,7 @@ def testGuiProjTree_NewItems(qtbot, caplog, monkeypatch, nwGUI, fncDir, mockRnd) buildTestProject(nwGUI, prjDir) # No itemType set - nwTree.clearSelection() + nwTree.projTree.clearSelection() assert nwTree.newTreeItem(None) is False # Root Items @@ -69,7 +69,7 @@ def testGuiProjTree_NewItems(qtbot, caplog, monkeypatch, nwGUI, fncDir, mockRnd) # ================= # No location selected for new item - nwTree.clearSelection() + nwTree.projTree.clearSelection() caplog.clear() assert nwTree.newTreeItem(nwItemType.FILE) is False assert nwTree.newTreeItem(nwItemType.FOLDER) is False @@ -116,7 +116,7 @@ def testGuiProjTree_NewItems(qtbot, caplog, monkeypatch, nwGUI, fncDir, mockRnd) nwGUI.theProject.tree["0000000000013"].setParent("0000000000011") # Get the trash folder - nwTree._addTrashRoot() + nwTree.projTree._addTrashRoot() trashHandle = nwGUI.theProject.trashFolder() nwTree.setSelectedHandle(trashHandle) assert nwTree.newTreeItem(nwItemType.FILE) is False @@ -182,7 +182,7 @@ def testGuiProjTree_MoveItems(qtbot, monkeypatch, nwGUI, fncDir, mockRnd): monkeypatch.setattr(GuiProjectTree, "hasFocus", lambda *a: True) # Move with no selections - nwTree.clearSelection() + nwTree.projTree.clearSelection() assert nwTree.moveTreeItem(1) is False # Move second item up twice (should give same result) @@ -304,13 +304,13 @@ def testGuiProjTree_DeleteItems(qtbot, caplog, monkeypatch, nwGUI, fncDir, mockR monkeypatch.setattr(GuiProjectTree, "hasFocus", lambda *a: True) # No selection made - nwTree.clearSelection() + nwTree.projTree.clearSelection() caplog.clear() assert nwTree.deleteItem() is False assert "no item to delete" in caplog.text # Not a valid handle - nwTree.clearSelection() + nwTree.projTree.clearSelection() caplog.clear() assert nwTree.deleteItem("0000000000000") is False assert "Could not find tree item" in caplog.text @@ -326,10 +326,10 @@ def testGuiProjTree_DeleteItems(qtbot, caplog, monkeypatch, nwGUI, fncDir, mockR # =========== # Block adding trash folder - funcPointer = nwTree._addTrashRoot - nwTree._addTrashRoot = lambda *a: None + funcPointer = nwTree.projTree._addTrashRoot + nwTree.projTree._addTrashRoot = lambda *a: None assert nwTree.deleteItem("0000000000012") is False - nwTree._addTrashRoot = funcPointer + nwTree.projTree._addTrashRoot = funcPointer # Delete last two documents, which also adds the trash folder assert nwTree.deleteItem("0000000000012") is True @@ -441,7 +441,7 @@ def testGuiProjTree_DeleteItems(qtbot, caplog, monkeypatch, nwGUI, fncDir, mockR assert os.path.isfile(os.path.join(fncDir, "project", "content", "000000000000e.nwd")) # Delete proper - assert nwTree._deleteTreeItem("000000000000e") is True + assert nwTree.projTree._deleteTreeItem("000000000000e") is True assert not os.path.isfile(os.path.join(fncDir, "project", "content", "000000000000e.nwd")) # Clean up