Wrap project tree in an outer widget with a toolbar

This commit is contained in:
Veronica Berglyd Olsen
2022-06-06 15:50:46 +02:00
parent b88cdb7677
commit d07f5dc520
13 changed files with 238 additions and 117 deletions
+1 -1
View File
@@ -107,7 +107,7 @@ class GuiPreferences(PagedDialog):
), nwAlert.INFO) ), nwAlert.INFO)
if refreshTree: if refreshTree:
self.theParent.treeView.buildTree() self.theParent.treeView.populateTree()
self._saveWindowSize() self._saveWindowSize()
self.accept() self.accept()
+2 -2
View File
@@ -25,7 +25,7 @@ from novelwriter.gui.itemdetails import GuiItemDetails
from novelwriter.gui.mainmenu import GuiMainMenu from novelwriter.gui.mainmenu import GuiMainMenu
from novelwriter.gui.noveltree import GuiNovelTree from novelwriter.gui.noveltree import GuiNovelTree
from novelwriter.gui.outline import GuiOutline 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.statusbar import GuiMainStatus
from novelwriter.gui.theme import GuiTheme from novelwriter.gui.theme import GuiTheme
from novelwriter.gui.viewsbar import GuiViewsBar from novelwriter.gui.viewsbar import GuiViewsBar
@@ -39,7 +39,7 @@ __all__ = [
"GuiMainStatus", "GuiMainStatus",
"GuiNovelTree", "GuiNovelTree",
"GuiOutline", "GuiOutline",
"GuiProjectTree", "GuiProjectWiew",
"GuiTheme", "GuiTheme",
"GuiViewsBar", "GuiViewsBar",
] ]
+1 -1
View File
@@ -296,7 +296,7 @@ class GuiItemDetails(QWidget):
return return
@pyqtSlot(str, int, int, int) @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 """Update the counts if the handle is the same as the one we're
already showing. Otherwise, do nothing. already showing. Otherwise, do nothing.
""" """
+3
View File
@@ -62,6 +62,7 @@ class GuiOutline(QWidget):
self.mainConf = novelwriter.CONFIG self.mainConf = novelwriter.CONFIG
self.theParent = theParent self.theParent = theParent
# Build GUI
self.outlineBar = GuiOutlineToolBar(self) self.outlineBar = GuiOutlineToolBar(self)
self.outlineView = GuiOutlineView(self) self.outlineView = GuiOutlineView(self)
self.outlineData = GuiOutlineDetails(self) self.outlineData = GuiOutlineDetails(self)
@@ -225,6 +226,8 @@ class GuiOutlineToolBar(QToolBar):
logger.debug("GuiOutlineToolBar initialisation complete") logger.debug("GuiOutlineToolBar initialisation complete")
return
## ##
# Methods # Methods
## ##
+152 -33
View File
@@ -6,6 +6,8 @@ GUI classes for the main window project tree
File History: File History:
Created: 2018-09-29 [0.0.1] GuiProjectTree Created: 2018-09-29 [0.0.1] GuiProjectTree
Created: 2020-06-04 [0.7] GuiProjectTreeMenu 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 This file is a part of novelWriter
Copyright 20182022, Veronica Berglyd Olsen Copyright 20182022, Veronica Berglyd Olsen
@@ -34,7 +36,8 @@ from PyQt5.QtCore import Qt, QSize, pyqtSignal, pyqtSlot
from PyQt5.QtGui import QIcon from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import ( from PyQt5.QtWidgets import (
QTreeWidget, QTreeWidgetItem, QAbstractItemView, QMenu, QAction, QFrame, QTreeWidget, QTreeWidgetItem, QAbstractItemView, QMenu, QAction, QFrame,
QDialog, QHeaderView QDialog, QHeaderView, QWidget, QVBoxLayout, QToolBar, QLabel, QToolButton,
QSizePolicy
) )
from novelwriter.core import NWDoc from novelwriter.core import NWDoc
@@ -45,12 +48,11 @@ from novelwriter.dialogs.itemeditor import GuiItemEditor
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class GuiProjectTree(QTreeWidget): class GuiProjectWiew(QWidget):
"""This is a wrapper class holding all the elements of the project
C_NAME = 0 tree. The core object is the project tree itself. Most methods
C_COUNT = 1 available are mapped through to the project tree class.
C_EXPORT = 2 """
C_STATUS = 3
# Signals triggered when the meta data values of items change # Signals triggered when the meta data values of items change
treeItemChanged = pyqtSignal(str) treeItemChanged = pyqtSignal(str)
@@ -63,14 +65,143 @@ class GuiProjectTree(QTreeWidget):
openDocumentRequest = pyqtSignal(str, Enum) openDocumentRequest = pyqtSignal(str, Enum)
def __init__(self, theParent): 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 ...") logger.debug("Initialising GuiProjectTree ...")
self.mainConf = novelwriter.CONFIG self.mainConf = novelwriter.CONFIG
self.theParent = theParent self.theWidget = theWidget
self.theTheme = theParent.theTheme self.theParent = theWidget.theParent
self.theProject = theParent.theProject self.theTheme = theWidget.theParent.theTheme
self.theProject = theWidget.theParent.theProject
# Internal Variables # Internal Variables
self._treeMap = {} self._treeMap = {}
@@ -125,13 +256,13 @@ class GuiProjectTree(QTreeWidget):
self.itemSelectionChanged.connect(self._treeSelectionChange) self.itemSelectionChanged.connect(self._treeSelectionChange)
# Set custom settings # Set custom settings
self.initTree() self.initSettings()
logger.debug("GuiProjectTree initialisation complete") logger.debug("GuiProjectTree initialisation complete")
return return
def initTree(self): def initSettings(self):
"""Set or update tree widget settings. """Set or update tree widget settings.
""" """
# Scroll bars # Scroll bars
@@ -248,7 +379,7 @@ class GuiProjectTree(QTreeWidget):
# Get Word Counts # Get Word Counts
_, wC, _ = pIndex.getCounts(tHandle) _, wC, _ = pIndex.getCounts(tHandle)
self.propagateCount(tHandle, wC) self.propagateCount(tHandle, wC)
self.wordCountsChanged.emit() self.theWidget.wordCountsChanged.emit()
return True return True
@@ -494,7 +625,7 @@ class GuiProjectTree(QTreeWidget):
self._deleteTreeItem(dHandle) self._deleteTreeItem(dHandle)
self._alertTreeChange(tHandle=tHandle, flush=autoFlush) self._alertTreeChange(tHandle=tHandle, flush=autoFlush)
self.wordCountsChanged.emit() self.theWidget.wordCountsChanged.emit()
else: else:
# The item is not already in the trash folder, so we # The item is not already in the trash folder, so we
@@ -690,18 +821,6 @@ class GuiProjectTree(QTreeWidget):
""" """
return self._timeChanged > checkTime 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 # Private Slots
## ##
@@ -712,7 +831,7 @@ class GuiProjectTree(QTreeWidget):
""" """
tHandle = self.getSelectedHandle() tHandle = self.getSelectedHandle()
if tHandle is not None: if tHandle is not None:
self.selectedItemChanged.emit(tHandle) self.theWidget.selectedItemChanged.emit(tHandle)
return return
@pyqtSlot("QTreeWidgetItem*", int) @pyqtSlot("QTreeWidgetItem*", int)
@@ -729,7 +848,7 @@ class GuiProjectTree(QTreeWidget):
return return
if tItem.itemType == nwItemType.FILE: if tItem.itemType == nwItemType.FILE:
self.openDocumentRequest.emit(tHandle, nwDocMode.EDIT) self.theWidget.openDocumentRequest.emit(tHandle, nwDocMode.EDIT)
else: else:
trItem = self._getTreeItem(tHandle) trItem = self._getTreeItem(tHandle)
if trItem is not None: if trItem is not None:
@@ -781,7 +900,7 @@ class GuiProjectTree(QTreeWidget):
return return
if tItem.itemType == nwItemType.FILE: if tItem.itemType == nwItemType.FILE:
self.openDocumentRequest.emit(tHandle, nwDocMode.VIEW) self.theWidget.openDocumentRequest.emit(tHandle, nwDocMode.VIEW)
return return
@@ -988,11 +1107,11 @@ class GuiProjectTree(QTreeWidget):
itemType = tItem.itemType itemType = tItem.itemType
if itemType == nwItemType.ROOT: if itemType == nwItemType.ROOT:
self.rootFolderChanged.emit(tHandle) self.theWidget.rootFolderChanged.emit(tHandle)
elif itemType == nwItemType.FILE and tItem.isNovelLike(): 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 return
+10 -10
View File
@@ -40,7 +40,7 @@ from PyQt5.QtWidgets import (
from novelwriter.gui import ( from novelwriter.gui import (
GuiDocEditor, GuiDocViewDetails, GuiDocViewer, GuiItemDetails, GuiMainMenu, GuiDocEditor, GuiDocViewDetails, GuiDocViewer, GuiItemDetails, GuiMainMenu,
GuiMainStatus, GuiNovelTree, GuiOutline, GuiProjectTree, GuiTheme, GuiMainStatus, GuiNovelTree, GuiOutline, GuiProjectWiew, GuiTheme,
GuiViewsBar GuiViewsBar
) )
from novelwriter.dialogs import ( from novelwriter.dialogs import (
@@ -105,7 +105,7 @@ class GuiMain(QMainWindow):
# Main GUI Elements # Main GUI Elements
self.statusBar = GuiMainStatus(self) self.statusBar = GuiMainStatus(self)
self.treeView = GuiProjectTree(self) self.treeView = GuiProjectWiew(self)
self.novelView = GuiNovelTree(self) self.novelView = GuiNovelTree(self)
self.docEditor = GuiDocEditor(self) self.docEditor = GuiDocEditor(self)
self.viewMeta = GuiDocViewDetails(self) self.viewMeta = GuiDocViewDetails(self)
@@ -208,8 +208,8 @@ class GuiMain(QMainWindow):
self.docEditor.spellDictionaryChanged.connect(self.statusBar.setLanguage) self.docEditor.spellDictionaryChanged.connect(self.statusBar.setLanguage)
self.docEditor.docEditedStatusChanged.connect(self.statusBar.doUpdateDocumentStatus) self.docEditor.docEditedStatusChanged.connect(self.statusBar.doUpdateDocumentStatus)
self.docEditor.docCountsChanged.connect(self.treeMeta.doUpdateCounts) self.docEditor.docCountsChanged.connect(self.treeMeta.updateCounts)
self.docEditor.docCountsChanged.connect(self.treeView.doUpdateCounts) self.docEditor.docCountsChanged.connect(self.treeView.updateCounts)
self.docEditor.loadDocumentTagRequest.connect(self._followTag) self.docEditor.loadDocumentTagRequest.connect(self._followTag)
self.docViewer.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. """Wrapper function to clear all sub-elements of the main GUI.
""" """
# Project Area # Project Area
self.treeView.clearTree() self.treeView.clearProject()
self.novelView.clearTree() self.novelView.clearTree()
self.treeMeta.clearDetails() self.treeMeta.clearDetails()
@@ -541,7 +541,7 @@ class GuiMain(QMainWindow):
logger.error("No project open") logger.error("No project open")
return False return False
self.treeView.saveTreeOrder() self.treeView.saveProjectTree()
if self.theProject.saveProject(autoSave=autoSave): if self.theProject.saveProject(autoSave=autoSave):
self.theProject.index.saveIndex() self.theProject.index.saveIndex()
@@ -789,7 +789,7 @@ class GuiMain(QMainWindow):
tHandle = None tHandle = None
tLine = None tLine = None
if self.treeView.hasFocus(): if self.treeView.treeFocus():
tHandle = self.treeView.getSelectedHandle() tHandle = self.treeView.getSelectedHandle()
elif self.novelView.hasFocus(): elif self.novelView.hasFocus():
tHandle, tLine = self.novelView.getSelectedHandle() tHandle, tLine = self.novelView.getSelectedHandle()
@@ -824,7 +824,7 @@ class GuiMain(QMainWindow):
def rebuildTrees(self): def rebuildTrees(self):
"""Rebuild the project tree. """Rebuild the project tree.
""" """
self.treeView.buildTree() self.treeView.populateTree()
self.novelView.refreshTree() self.novelView.refreshTree()
return return
@@ -847,7 +847,7 @@ class GuiMain(QMainWindow):
qApp.setOverrideCursor(QCursor(Qt.WaitCursor)) qApp.setOverrideCursor(QCursor(Qt.WaitCursor))
tStart = time() tStart = time()
self.treeView.saveTreeOrder() self.treeView.saveProjectTree()
self.theProject.index.clearIndex() self.theProject.index.clearIndex()
for tItem in self.theProject.tree: for tItem in self.theProject.tree:
@@ -919,7 +919,7 @@ class GuiMain(QMainWindow):
self.saveDocument() self.saveDocument()
self.docEditor.initEditor() self.docEditor.initEditor()
self.docViewer.initViewer() self.docViewer.initViewer()
self.treeView.initTree() self.treeView.initSettings()
self.novelView.initTree() self.novelView.initTree()
self.projView.initOutline() self.projView.initOutline()
self._updateStatusWordCount() self._updateStatusWordCount()
+14 -14
View File
@@ -56,11 +56,11 @@ def testDlgMerge_Main(qtbot, monkeypatch, nwGUI, fncProj, mockRnd):
# Add Project Content # Add Project Content
monkeypatch.setattr(GuiItemEditor, "exec_", lambda *a: QDialog.Accepted) monkeypatch.setattr(GuiItemEditor, "exec_", lambda *a: QDialog.Accepted)
nwGUI.switchFocus(nwWidget.TREE) nwGUI.switchFocus(nwWidget.TREE)
nwGUI.treeView.clearSelection() nwGUI.treeView.projTree.clearSelection()
nwGUI.treeView._getTreeItem(hChapterDir).setSelected(True) nwGUI.treeView.projTree._getTreeItem(hChapterDir).setSelected(True)
nwGUI.treeView.newTreeItem(nwItemType.FILE) nwGUI.treeView.projTree.newTreeItem(nwItemType.FILE)
nwGUI.treeView.newTreeItem(nwItemType.FILE) nwGUI.treeView.projTree.newTreeItem(nwItemType.FILE)
nwGUI.treeView.newTreeItem(nwItemType.FILE) nwGUI.treeView.projTree.newTreeItem(nwItemType.FILE)
assert nwGUI.saveProject() is True assert nwGUI.saveProject() is True
assert nwGUI.closeProject() is True assert nwGUI.closeProject() is True
@@ -82,8 +82,8 @@ def testDlgMerge_Main(qtbot, monkeypatch, nwGUI, fncProj, mockRnd):
# Open the Merge tool # Open the Merge tool
nwGUI.switchFocus(nwWidget.TREE) nwGUI.switchFocus(nwWidget.TREE)
nwGUI.treeView.clearSelection() nwGUI.treeView.projTree.clearSelection()
nwGUI.treeView._getTreeItem(hChapterDir).setSelected(True) nwGUI.treeView.projTree._getTreeItem(hChapterDir).setSelected(True)
monkeypatch.setattr(GuiDocMerge, "exec_", lambda *a: None) monkeypatch.setattr(GuiDocMerge, "exec_", lambda *a: None)
nwGUI.mainMenu.aMergeDocs.activate(QAction.Trigger) nwGUI.mainMenu.aMergeDocs.activate(QAction.Trigger)
@@ -101,27 +101,27 @@ def testDlgMerge_Main(qtbot, monkeypatch, nwGUI, fncProj, mockRnd):
assert nwMerge.listBox.count() == 0 assert nwMerge.listBox.count() == 0
# No item selected # No item selected
nwGUI.treeView.clearSelection() nwGUI.treeView.projTree.clearSelection()
assert nwMerge._populateList() is False assert nwMerge._populateList() is False
assert nwMerge.listBox.count() == 0 assert nwMerge.listBox.count() == 0
# Non-existing item # Non-existing item
with monkeypatch.context() as mp: with monkeypatch.context() as mp:
mp.setattr(NWTree, "__getitem__", lambda *a: None) mp.setattr(NWTree, "__getitem__", lambda *a: None)
nwGUI.treeView.clearSelection() nwGUI.treeView.projTree.clearSelection()
nwGUI.treeView._getTreeItem(hChapterDir).setSelected(True) nwGUI.treeView.projTree._getTreeItem(hChapterDir).setSelected(True)
assert nwMerge._populateList() is False assert nwMerge._populateList() is False
assert nwMerge.listBox.count() == 0 assert nwMerge.listBox.count() == 0
# Select a non-folder # Select a non-folder
nwGUI.treeView.clearSelection() nwGUI.treeView.projTree.clearSelection()
nwGUI.treeView._getTreeItem(hChapterOne).setSelected(True) nwGUI.treeView.projTree._getTreeItem(hChapterOne).setSelected(True)
assert nwMerge._populateList() is False assert nwMerge._populateList() is False
assert nwMerge.listBox.count() == 0 assert nwMerge.listBox.count() == 0
# Select the chapter folder # Select the chapter folder
nwGUI.treeView.clearSelection() nwGUI.treeView.projTree.clearSelection()
nwGUI.treeView._getTreeItem(hChapterDir).setSelected(True) nwGUI.treeView.projTree._getTreeItem(hChapterDir).setSelected(True)
assert nwMerge._populateList() is True assert nwMerge._populateList() is True
assert nwMerge.listBox.count() == 5 assert nwMerge.listBox.count() == 5
+10 -10
View File
@@ -60,9 +60,9 @@ def testDlgSplit_Main(qtbot, monkeypatch, nwGUI, fncProj, mockRnd):
# Add Project Content # Add Project Content
monkeypatch.setattr(GuiItemEditor, "exec_", lambda *a: QDialog.Accepted) monkeypatch.setattr(GuiItemEditor, "exec_", lambda *a: QDialog.Accepted)
nwGUI.switchFocus(nwWidget.TREE) nwGUI.switchFocus(nwWidget.TREE)
nwGUI.treeView.clearSelection() nwGUI.treeView.projTree.clearSelection()
nwGUI.treeView._getTreeItem(hNovelRoot).setSelected(True) nwGUI.treeView.projTree._getTreeItem(hNovelRoot).setSelected(True)
nwGUI.treeView.newTreeItem(nwItemType.FILE) nwGUI.treeView.projTree.newTreeItem(nwItemType.FILE)
assert nwGUI.saveProject() is True assert nwGUI.saveProject() is True
assert nwGUI.closeProject() is True assert nwGUI.closeProject() is True
@@ -89,8 +89,8 @@ def testDlgSplit_Main(qtbot, monkeypatch, nwGUI, fncProj, mockRnd):
# Open the Split tool # Open the Split tool
nwGUI.switchFocus(nwWidget.TREE) nwGUI.switchFocus(nwWidget.TREE)
nwGUI.treeView.clearSelection() nwGUI.treeView.projTree.clearSelection()
nwGUI.treeView._getTreeItem(hToSplit).setSelected(True) nwGUI.treeView.projTree._getTreeItem(hToSplit).setSelected(True)
monkeypatch.setattr(GuiDocSplit, "exec_", lambda *a: None) monkeypatch.setattr(GuiDocSplit, "exec_", lambda *a: None)
nwGUI.mainMenu.aSplitDoc.activate(QAction.Trigger) nwGUI.mainMenu.aSplitDoc.activate(QAction.Trigger)
@@ -109,7 +109,7 @@ def testDlgSplit_Main(qtbot, monkeypatch, nwGUI, fncProj, mockRnd):
# No item selected # No item selected
nwSplit.sourceItem = None nwSplit.sourceItem = None
nwGUI.treeView.clearSelection() nwGUI.treeView.projTree.clearSelection()
assert nwSplit._populateList() is False assert nwSplit._populateList() is False
assert nwSplit.listBox.count() == 0 assert nwSplit.listBox.count() == 0
@@ -117,15 +117,15 @@ def testDlgSplit_Main(qtbot, monkeypatch, nwGUI, fncProj, mockRnd):
with monkeypatch.context() as mp: with monkeypatch.context() as mp:
mp.setattr(NWTree, "__getitem__", lambda *a: None) mp.setattr(NWTree, "__getitem__", lambda *a: None)
nwSplit.sourceItem = None nwSplit.sourceItem = None
nwGUI.treeView.clearSelection() nwGUI.treeView.projTree.clearSelection()
nwGUI.treeView._getTreeItem(hToSplit).setSelected(True) nwGUI.treeView.projTree._getTreeItem(hToSplit).setSelected(True)
assert nwSplit._populateList() is False assert nwSplit._populateList() is False
assert nwSplit.listBox.count() == 0 assert nwSplit.listBox.count() == 0
# Select a non-file # Select a non-file
nwSplit.sourceItem = None nwSplit.sourceItem = None
nwGUI.treeView.clearSelection() nwGUI.treeView.projTree.clearSelection()
nwGUI.treeView._getTreeItem(hChapterDir).setSelected(True) nwGUI.treeView.projTree._getTreeItem(hChapterDir).setSelected(True)
assert nwSplit._populateList() is False assert nwSplit._populateList() is False
assert nwSplit.listBox.count() == 0 assert nwSplit.listBox.count() == 0
+5 -5
View File
@@ -25,10 +25,10 @@ from tools import getGuiItem, buildTestProject
from PyQt5.QtWidgets import QAction, QDialog, QMessageBox from PyQt5.QtWidgets import QAction, QDialog, QMessageBox
from novelwriter.gui import GuiProjectTree
from novelwriter.enum import nwItemLayout, nwItemType from novelwriter.enum import nwItemLayout, nwItemType
from novelwriter.dialogs import GuiItemEditor from novelwriter.dialogs import GuiItemEditor
from novelwriter.core.tree import NWTree from novelwriter.core.tree import NWTree
from novelwriter.gui.projtree import GuiProjectTree
statusKeys = ["s000000", "s000001", "s000002", "s000003"] statusKeys = ["s000000", "s000001", "s000002", "s000003"]
importKeys = ["i000004", "i000005", "i000006", "i000007"] importKeys = ["i000004", "i000005", "i000006", "i000007"]
@@ -52,7 +52,7 @@ def testDlgItemEditor_Dialog(qtbot, monkeypatch, nwGUI, fncProj, mockRnd):
tHandle = "000000000000f" tHandle = "000000000000f"
# No Selection # No Selection
nwGUI.treeView.clearSelection() nwGUI.treeView.projTree.clearSelection()
assert nwGUI.editItem() is False assert nwGUI.editItem() is False
# Force opening from editor # Force opening from editor
@@ -163,9 +163,9 @@ def testDlgItemEditor_Note(qtbot, monkeypatch, nwGUI, fncProj, mockRnd):
assert nwGUI.theProject.importItems.name(importKeys[1]) == "Minor" assert nwGUI.theProject.importItems.name(importKeys[1]) == "Minor"
# Create Note # Create Note
nwGUI.treeView.clearSelection() nwGUI.treeView.projTree.clearSelection()
nwGUI.treeView._getTreeItem("000000000000a").setSelected(True) nwGUI.treeView.projTree._getTreeItem("000000000000a").setSelected(True)
nwGUI.treeView.newTreeItem(nwItemType.FILE, None) nwGUI.treeView.projTree.newTreeItem(nwItemType.FILE, None)
# Open Note # Open Note
assert nwGUI.openDocument("0000000000010") assert nwGUI.openDocument("0000000000010")
+3 -3
View File
@@ -54,9 +54,9 @@ def testGuiViewer_Main(qtbot, monkeypatch, nwGUI, nwLipsum):
nwGUI.treeView.setSelectedHandle("88243afbe5ed8") nwGUI.treeView.setSelectedHandle("88243afbe5ed8")
# Middle-click the selected item # Middle-click the selected item
theItem = nwGUI.treeView._getTreeItem("88243afbe5ed8") theItem = nwGUI.treeView.projTree._getTreeItem("88243afbe5ed8")
theRect = nwGUI.treeView.visualItemRect(theItem) theRect = nwGUI.treeView.projTree.visualItemRect(theItem)
qtbot.mouseClick(nwGUI.treeView.viewport(), Qt.MidButton, pos=theRect.center()) qtbot.mouseClick(nwGUI.treeView.projTree.viewport(), Qt.MidButton, pos=theRect.center())
assert nwGUI.docViewer.docHandle() == "88243afbe5ed8" assert nwGUI.docViewer.docHandle() == "88243afbe5ed8"
# Reload the text # Reload the text
+24 -25
View File
@@ -28,11 +28,10 @@ from tools import cmpFiles, buildTestProject, XML_IGNORE, writeFile
from PyQt5.QtCore import Qt from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QMessageBox, QDialog from PyQt5.QtWidgets import QMessageBox, QDialog
from novelwriter.gui import ( from novelwriter.gui import GuiDocEditor, GuiNovelTree, GuiOutline
GuiDocEditor, GuiProjectTree, GuiNovelTree, GuiOutline
)
from novelwriter.enum import nwItemType, nwWidget from novelwriter.enum import nwItemType, nwWidget
from novelwriter.tools import GuiProjectWizard from novelwriter.tools import GuiProjectWizard
from novelwriter.gui.projtree import GuiProjectTree
from novelwriter.dialogs.itemeditor import GuiItemEditor from novelwriter.dialogs.itemeditor import GuiItemEditor
keyDelay = 2 keyDelay = 2
@@ -126,7 +125,7 @@ def testGuiMain_ProjectTreeItems(qtbot, monkeypatch, nwGUI, fncProj, mockRnd):
with monkeypatch.context() as mp: with monkeypatch.context() as mp:
mp.setattr(GuiProjectTree, "hasFocus", lambda *a: True) mp.setattr(GuiProjectTree, "hasFocus", lambda *a: True)
assert nwGUI.docEditor.docHandle() is None assert nwGUI.docEditor.docHandle() is None
nwGUI.treeView._getTreeItem(sHandle).setSelected(True) nwGUI.treeView.projTree._getTreeItem(sHandle).setSelected(True)
nwGUI._keyPressReturn() nwGUI._keyPressReturn()
assert nwGUI.docEditor.docHandle() == sHandle assert nwGUI.docEditor.docHandle() == sHandle
assert nwGUI.closeDocument() is True 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 assert nwGUI.theProject.spellCheck is False
# Check that tree items have been created # Check that tree items have been created
assert nwGUI.treeView._getTreeItem("0000000000008") is not None assert nwGUI.treeView.projTree._getTreeItem("0000000000008") is not None
assert nwGUI.treeView._getTreeItem("0000000000009") is not None assert nwGUI.treeView.projTree._getTreeItem("0000000000009") is not None
assert nwGUI.treeView._getTreeItem("000000000000a") is not None assert nwGUI.treeView.projTree._getTreeItem("000000000000a") is not None
assert nwGUI.treeView._getTreeItem("000000000000b") is not None assert nwGUI.treeView.projTree._getTreeItem("000000000000b") is not None
assert nwGUI.treeView._getTreeItem("000000000000c") is not None assert nwGUI.treeView.projTree._getTreeItem("000000000000c") is not None
assert nwGUI.treeView._getTreeItem("000000000000d") is not None assert nwGUI.treeView.projTree._getTreeItem("000000000000d") is not None
assert nwGUI.treeView._getTreeItem("000000000000e") is not None assert nwGUI.treeView.projTree._getTreeItem("000000000000e") is not None
assert nwGUI.treeView._getTreeItem("000000000000f") is not None assert nwGUI.treeView.projTree._getTreeItem("000000000000f") is not None
nwGUI.mainMenu.aSpellCheck.setChecked(True) nwGUI.mainMenu.aSpellCheck.setChecked(True)
assert nwGUI.mainMenu._toggleSpellCheck() assert nwGUI.mainMenu._toggleSpellCheck()
@@ -240,9 +239,9 @@ def testGuiMain_Editing(qtbot, monkeypatch, nwGUI, fncProj, refDir, outDir, mock
# Add a Character File # Add a Character File
nwGUI.switchFocus(nwWidget.TREE) nwGUI.switchFocus(nwWidget.TREE)
nwGUI.treeView.clearSelection() nwGUI.treeView.projTree.clearSelection()
nwGUI.treeView._getTreeItem("000000000000a").setSelected(True) nwGUI.treeView.projTree._getTreeItem("000000000000a").setSelected(True)
nwGUI.treeView.newTreeItem(nwItemType.FILE, None) nwGUI.treeView.projTree.newTreeItem(nwItemType.FILE, None)
assert nwGUI.openSelectedItem() assert nwGUI.openSelectedItem()
# Type something into the document # Type something into the document
@@ -262,9 +261,9 @@ def testGuiMain_Editing(qtbot, monkeypatch, nwGUI, fncProj, refDir, outDir, mock
# Add a Plot File # Add a Plot File
nwGUI.switchFocus(nwWidget.TREE) nwGUI.switchFocus(nwWidget.TREE)
nwGUI.treeView.clearSelection() nwGUI.treeView.projTree.clearSelection()
nwGUI.treeView._getTreeItem("0000000000009").setSelected(True) nwGUI.treeView.projTree._getTreeItem("0000000000009").setSelected(True)
nwGUI.treeView.newTreeItem(nwItemType.FILE, None) nwGUI.treeView.projTree.newTreeItem(nwItemType.FILE, None)
assert nwGUI.openSelectedItem() assert nwGUI.openSelectedItem()
# Type something into the document # Type something into the document
@@ -284,9 +283,9 @@ def testGuiMain_Editing(qtbot, monkeypatch, nwGUI, fncProj, refDir, outDir, mock
# Add a World File # Add a World File
nwGUI.switchFocus(nwWidget.TREE) nwGUI.switchFocus(nwWidget.TREE)
nwGUI.treeView.clearSelection() nwGUI.treeView.projTree.clearSelection()
nwGUI.treeView._getTreeItem("000000000000b").setSelected(True) nwGUI.treeView.projTree._getTreeItem("000000000000b").setSelected(True)
nwGUI.treeView.newTreeItem(nwItemType.FILE, None) nwGUI.treeView.projTree.newTreeItem(nwItemType.FILE, None)
assert nwGUI.openSelectedItem() assert nwGUI.openSelectedItem()
# Add Some Text # Add Some Text
@@ -315,10 +314,10 @@ def testGuiMain_Editing(qtbot, monkeypatch, nwGUI, fncProj, refDir, outDir, mock
# Select the 'New Scene' file # Select the 'New Scene' file
nwGUI.switchFocus(nwWidget.TREE) nwGUI.switchFocus(nwWidget.TREE)
nwGUI.treeView.clearSelection() nwGUI.treeView.projTree.clearSelection()
nwGUI.treeView._getTreeItem("0000000000008").setExpanded(True) nwGUI.treeView.projTree._getTreeItem("0000000000008").setExpanded(True)
nwGUI.treeView._getTreeItem("000000000000d").setExpanded(True) nwGUI.treeView.projTree._getTreeItem("000000000000d").setExpanded(True)
nwGUI.treeView._getTreeItem("000000000000f").setSelected(True) nwGUI.treeView.projTree._getTreeItem("000000000000f").setSelected(True)
assert nwGUI.openSelectedItem() assert nwGUI.openSelectedItem()
# Type something into the document # Type something into the document
+3 -3
View File
@@ -467,7 +467,7 @@ def testGuiMenu_Insert(qtbot, monkeypatch, nwGUI, fncDir, fncProj, mockRnd):
buildTestProject(nwGUI, fncProj) 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 assert nwGUI.openDocument("000000000000f") is True
nwGUI.docEditor.clear() nwGUI.docEditor.clear()
@@ -476,10 +476,10 @@ def testGuiMenu_Insert(qtbot, monkeypatch, nwGUI, fncDir, fncProj, mockRnd):
assert nwGUI.docEditor.getText() == "hello world" assert nwGUI.docEditor.getText() == "hello world"
nwGUI.docEditor.clear() 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 nwGUI.docEditor.isEmpty()
assert not nwGUI.docEditor.insertText(None) assert nwGUI.docEditor.insertText(None) is False
assert nwGUI.docEditor.isEmpty() assert nwGUI.docEditor.isEmpty()
# qtbot.stopForInteraction() # qtbot.stopForInteraction()
+10 -10
View File
@@ -52,7 +52,7 @@ def testGuiProjTree_NewItems(qtbot, caplog, monkeypatch, nwGUI, fncDir, mockRnd)
buildTestProject(nwGUI, prjDir) buildTestProject(nwGUI, prjDir)
# No itemType set # No itemType set
nwTree.clearSelection() nwTree.projTree.clearSelection()
assert nwTree.newTreeItem(None) is False assert nwTree.newTreeItem(None) is False
# Root Items # Root Items
@@ -69,7 +69,7 @@ def testGuiProjTree_NewItems(qtbot, caplog, monkeypatch, nwGUI, fncDir, mockRnd)
# ================= # =================
# No location selected for new item # No location selected for new item
nwTree.clearSelection() nwTree.projTree.clearSelection()
caplog.clear() caplog.clear()
assert nwTree.newTreeItem(nwItemType.FILE) is False assert nwTree.newTreeItem(nwItemType.FILE) is False
assert nwTree.newTreeItem(nwItemType.FOLDER) 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") nwGUI.theProject.tree["0000000000013"].setParent("0000000000011")
# Get the trash folder # Get the trash folder
nwTree._addTrashRoot() nwTree.projTree._addTrashRoot()
trashHandle = nwGUI.theProject.trashFolder() trashHandle = nwGUI.theProject.trashFolder()
nwTree.setSelectedHandle(trashHandle) nwTree.setSelectedHandle(trashHandle)
assert nwTree.newTreeItem(nwItemType.FILE) is False 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) monkeypatch.setattr(GuiProjectTree, "hasFocus", lambda *a: True)
# Move with no selections # Move with no selections
nwTree.clearSelection() nwTree.projTree.clearSelection()
assert nwTree.moveTreeItem(1) is False assert nwTree.moveTreeItem(1) is False
# Move second item up twice (should give same result) # 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) monkeypatch.setattr(GuiProjectTree, "hasFocus", lambda *a: True)
# No selection made # No selection made
nwTree.clearSelection() nwTree.projTree.clearSelection()
caplog.clear() caplog.clear()
assert nwTree.deleteItem() is False assert nwTree.deleteItem() 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
nwTree.clearSelection() nwTree.projTree.clearSelection()
caplog.clear() caplog.clear()
assert nwTree.deleteItem("0000000000000") is False assert nwTree.deleteItem("0000000000000") is False
assert "Could not find tree item" in caplog.text 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 # Block adding trash folder
funcPointer = nwTree._addTrashRoot funcPointer = nwTree.projTree._addTrashRoot
nwTree._addTrashRoot = lambda *a: None nwTree.projTree._addTrashRoot = lambda *a: None
assert nwTree.deleteItem("0000000000012") is False assert nwTree.deleteItem("0000000000012") is False
nwTree._addTrashRoot = funcPointer nwTree.projTree._addTrashRoot = funcPointer
# Delete last two documents, which also adds the trash folder # Delete last two documents, which also adds the trash folder
assert nwTree.deleteItem("0000000000012") is True 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")) assert os.path.isfile(os.path.join(fncDir, "project", "content", "000000000000e.nwd"))
# Delete proper # 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")) assert not os.path.isfile(os.path.join(fncDir, "project", "content", "000000000000e.nwd"))
# Clean up # Clean up