Rename outline components
This commit is contained in:
@@ -24,7 +24,7 @@ from novelwriter.gui.docviewer import GuiDocViewer, GuiDocViewDetails
|
||||
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.outline import GuiOutlineView
|
||||
from novelwriter.gui.projtree import GuiProjectView
|
||||
from novelwriter.gui.statusbar import GuiMainStatus
|
||||
from novelwriter.gui.theme import GuiTheme
|
||||
@@ -38,7 +38,7 @@ __all__ = [
|
||||
"GuiMainMenu",
|
||||
"GuiMainStatus",
|
||||
"GuiNovelTree",
|
||||
"GuiOutline",
|
||||
"GuiOutlineView",
|
||||
"GuiProjectView",
|
||||
"GuiTheme",
|
||||
"GuiViewsBar",
|
||||
|
||||
+21
-21
@@ -4,9 +4,9 @@ novelWriter – GUI Project Outline
|
||||
GUI class for the project outline view
|
||||
|
||||
File History:
|
||||
Created: 2022-05-15 [1.7b1] GuiOutline
|
||||
Created: 2022-05-15 [1.7b1] GuiOutlineView
|
||||
Created: 2022-05-22 [1.7b1] GuiOutlineToolBar
|
||||
Created: 2019-11-16 [0.4.1] GuiOutlineView
|
||||
Created: 2019-11-16 [0.4.1] GuiOutlineTree
|
||||
Created: 2019-11-16 [0.4.1] GuiOutlineHeaderMenu
|
||||
Created: 2020-06-02 [0.7.0] GuiOutlineDetails
|
||||
|
||||
@@ -52,7 +52,7 @@ from novelwriter.constants import trConst, nwKeyWords, nwLabels
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class GuiOutline(QWidget):
|
||||
class GuiOutlineView(QWidget):
|
||||
|
||||
loadDocumentTagRequest = pyqtSignal(str, Enum)
|
||||
|
||||
@@ -64,11 +64,11 @@ class GuiOutline(QWidget):
|
||||
|
||||
# Build GUI
|
||||
self.outlineBar = GuiOutlineToolBar(self)
|
||||
self.outlineView = GuiOutlineView(self)
|
||||
self.outlineTree = GuiOutlineTree(self)
|
||||
self.outlineData = GuiOutlineDetails(self)
|
||||
|
||||
self.splitOutline = QSplitter(Qt.Vertical)
|
||||
self.splitOutline.addWidget(self.outlineView)
|
||||
self.splitOutline.addWidget(self.outlineTree)
|
||||
self.splitOutline.addWidget(self.outlineData)
|
||||
self.splitOutline.setSizes(self.mainConf.getOutlinePanePos())
|
||||
|
||||
@@ -81,14 +81,14 @@ class GuiOutline(QWidget):
|
||||
self.setLayout(self.outerBox)
|
||||
|
||||
# Connect Signals
|
||||
self.outlineView.hiddenStateChanged.connect(self._updateMenuColumns)
|
||||
self.outlineView.activeItemChanged.connect(self.outlineData.showItem)
|
||||
self.outlineTree.hiddenStateChanged.connect(self._updateMenuColumns)
|
||||
self.outlineTree.activeItemChanged.connect(self.outlineData.showItem)
|
||||
self.outlineData.itemTagClicked.connect(self._tagClicked)
|
||||
self.outlineBar.loadNovelRootRequest.connect(self._rootItemChanged)
|
||||
self.outlineBar.viewColumnToggled.connect(self.outlineView.menuColumnToggled)
|
||||
self.outlineBar.viewColumnToggled.connect(self.outlineTree.menuColumnToggled)
|
||||
|
||||
# Function Mappings
|
||||
self.getSelectedHandle = self.outlineView.getSelectedHandle
|
||||
self.getSelectedHandle = self.outlineTree.getSelectedHandle
|
||||
|
||||
return
|
||||
|
||||
@@ -104,24 +104,24 @@ class GuiOutline(QWidget):
|
||||
return
|
||||
|
||||
def initOutline(self):
|
||||
self.outlineView.initOutline()
|
||||
self.outlineTree.initOutline()
|
||||
self.outlineData.initDetails()
|
||||
return
|
||||
|
||||
def closeOutline(self):
|
||||
self.outlineView.closeOutline()
|
||||
self.outlineTree.closeOutline()
|
||||
self.outlineData.updateClasses()
|
||||
return
|
||||
|
||||
def refreshView(self, overRide=False, novelChanged=False):
|
||||
self.outlineView.refreshTree(overRide=overRide, novelChanged=novelChanged)
|
||||
self.outlineTree.refreshTree(overRide=overRide, novelChanged=novelChanged)
|
||||
return
|
||||
|
||||
def treeFocus(self):
|
||||
return self.outlineView.hasFocus()
|
||||
return self.outlineTree.hasFocus()
|
||||
|
||||
def setTreeFocus(self):
|
||||
return self.outlineView.setFocus()
|
||||
return self.outlineTree.setFocus()
|
||||
|
||||
##
|
||||
# Public Slots
|
||||
@@ -145,7 +145,7 @@ class GuiOutline(QWidget):
|
||||
checkboxes whenever a signal is received that the hidden state
|
||||
of columns has changed.
|
||||
"""
|
||||
self.outlineBar.setColumnHiddenState(self.outlineView.hiddenColumns)
|
||||
self.outlineBar.setColumnHiddenState(self.outlineTree.hiddenColumns)
|
||||
return
|
||||
|
||||
@pyqtSlot(str)
|
||||
@@ -160,10 +160,10 @@ class GuiOutline(QWidget):
|
||||
def _rootItemChanged(self, handle):
|
||||
"""The root novel handle has changed or needs to be refreshed.
|
||||
"""
|
||||
self.outlineView.refreshTree(rootHandle=(handle or None), overRide=True)
|
||||
self.outlineTree.refreshTree(rootHandle=(handle or None), overRide=True)
|
||||
return
|
||||
|
||||
# END Class GuiOutline
|
||||
# END Class GuiOutlineView
|
||||
|
||||
|
||||
class GuiOutlineToolBar(QToolBar):
|
||||
@@ -271,7 +271,7 @@ class GuiOutlineToolBar(QToolBar):
|
||||
# END Class GuiOutlineToolBar
|
||||
|
||||
|
||||
class GuiOutlineView(QTreeWidget):
|
||||
class GuiOutlineTree(QTreeWidget):
|
||||
|
||||
DEF_WIDTH = {
|
||||
nwOutline.TITLE: 200,
|
||||
@@ -319,7 +319,7 @@ class GuiOutlineView(QTreeWidget):
|
||||
def __init__(self, theOutline):
|
||||
QTreeWidget.__init__(self, theOutline)
|
||||
|
||||
logger.debug("Initialising GuiOutlineView ...")
|
||||
logger.debug("Initialising GuiOutlineTree ...")
|
||||
|
||||
self.mainConf = novelwriter.CONFIG
|
||||
self.mainGui = theOutline.mainGui
|
||||
@@ -355,7 +355,7 @@ class GuiOutlineView(QTreeWidget):
|
||||
|
||||
self.hiddenStateChanged.emit()
|
||||
|
||||
logger.debug("GuiOutlineView initialisation complete")
|
||||
logger.debug("GuiOutlineTree initialisation complete")
|
||||
|
||||
return
|
||||
|
||||
@@ -717,7 +717,7 @@ class GuiOutlineView(QTreeWidget):
|
||||
|
||||
return newItem
|
||||
|
||||
# END Class GuiOutlineView
|
||||
# END Class GuiOutlineTree
|
||||
|
||||
|
||||
class GuiOutlineHeaderMenu(QMenu):
|
||||
|
||||
@@ -40,7 +40,7 @@ from PyQt5.QtWidgets import (
|
||||
|
||||
from novelwriter.gui import (
|
||||
GuiDocEditor, GuiDocViewDetails, GuiDocViewer, GuiItemDetails, GuiMainMenu,
|
||||
GuiMainStatus, GuiNovelTree, GuiOutline, GuiProjectView, GuiTheme,
|
||||
GuiMainStatus, GuiNovelTree, GuiOutlineView, GuiProjectView, GuiTheme,
|
||||
GuiViewsBar
|
||||
)
|
||||
from novelwriter.dialogs import (
|
||||
@@ -111,7 +111,7 @@ class GuiMain(QMainWindow):
|
||||
self.viewMeta = GuiDocViewDetails(self)
|
||||
self.docViewer = GuiDocViewer(self)
|
||||
self.itemDetails = GuiItemDetails(self)
|
||||
self.outlineView = GuiOutline(self)
|
||||
self.outlineView = GuiOutlineView(self)
|
||||
self.mainMenu = GuiMainMenu(self)
|
||||
self.viewsBar = GuiViewsBar(self)
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ from tools import cmpFiles, buildTestProject, XML_IGNORE, writeFile
|
||||
from PyQt5.QtCore import Qt
|
||||
from PyQt5.QtWidgets import QMessageBox, QDialog, QInputDialog
|
||||
|
||||
from novelwriter.gui import GuiDocEditor, GuiNovelTree, GuiOutline
|
||||
from novelwriter.gui import GuiDocEditor, GuiNovelTree, GuiOutlineView
|
||||
from novelwriter.enum import nwItemType, nwWidget
|
||||
from novelwriter.tools import GuiProjectWizard
|
||||
from novelwriter.gui.projtree import GuiProjectTree
|
||||
@@ -147,12 +147,12 @@ def testGuiMain_ProjectTreeItems(qtbot, monkeypatch, nwGUI, fncProj, mockRnd):
|
||||
# Project Outline has focus
|
||||
nwGUI.switchFocus(nwWidget.OUTLINE)
|
||||
with monkeypatch.context() as mp:
|
||||
mp.setattr(GuiOutline, "treeFocus", lambda *a: True)
|
||||
mp.setattr(GuiOutlineView, "treeFocus", lambda *a: True)
|
||||
assert nwGUI.docEditor.docHandle() is None
|
||||
actItem = nwGUI.outlineView.outlineView.topLevelItem(0)
|
||||
actItem = nwGUI.outlineView.outlineTree.topLevelItem(0)
|
||||
chpItem = actItem.child(0)
|
||||
selItem = chpItem.child(0)
|
||||
nwGUI.outlineView.outlineView.setCurrentItem(selItem)
|
||||
nwGUI.outlineView.outlineTree.setCurrentItem(selItem)
|
||||
nwGUI._keyPressReturn()
|
||||
assert nwGUI.docEditor.docHandle() == sHandle
|
||||
assert nwGUI.closeDocument() is True
|
||||
|
||||
@@ -46,57 +46,57 @@ def testGuiOutline_Main(qtbot, monkeypatch, nwGUI, fncDir):
|
||||
nwGUI.rebuildIndex()
|
||||
nwGUI._changeView(nwView.OUTLINE)
|
||||
|
||||
outlineMain = nwGUI.outlineView
|
||||
outlineView = outlineMain.outlineView
|
||||
outlineData = outlineMain.outlineData
|
||||
outlineMenu = outlineMain.outlineBar.mColumns
|
||||
outlineView = nwGUI.outlineView
|
||||
outlineTree = outlineView.outlineTree
|
||||
outlineData = outlineView.outlineData
|
||||
outlineMenu = outlineView.outlineBar.mColumns
|
||||
|
||||
# Toggle scrollbars
|
||||
nwGUI.mainConf.hideVScroll = True
|
||||
nwGUI.mainConf.hideHScroll = True
|
||||
outlineMain.initOutline()
|
||||
assert outlineView.verticalScrollBarPolicy() == Qt.ScrollBarAlwaysOff
|
||||
assert outlineView.horizontalScrollBarPolicy() == Qt.ScrollBarAlwaysOff
|
||||
outlineView.initOutline()
|
||||
assert outlineTree.verticalScrollBarPolicy() == Qt.ScrollBarAlwaysOff
|
||||
assert outlineTree.horizontalScrollBarPolicy() == Qt.ScrollBarAlwaysOff
|
||||
assert outlineData.verticalScrollBarPolicy() == Qt.ScrollBarAlwaysOff
|
||||
assert outlineData.horizontalScrollBarPolicy() == Qt.ScrollBarAlwaysOff
|
||||
|
||||
nwGUI.mainConf.hideVScroll = False
|
||||
nwGUI.mainConf.hideHScroll = False
|
||||
outlineMain.initOutline()
|
||||
assert outlineView.verticalScrollBarPolicy() == Qt.ScrollBarAsNeeded
|
||||
assert outlineView.horizontalScrollBarPolicy() == Qt.ScrollBarAsNeeded
|
||||
outlineView.initOutline()
|
||||
assert outlineTree.verticalScrollBarPolicy() == Qt.ScrollBarAsNeeded
|
||||
assert outlineTree.horizontalScrollBarPolicy() == Qt.ScrollBarAsNeeded
|
||||
assert outlineData.verticalScrollBarPolicy() == Qt.ScrollBarAsNeeded
|
||||
assert outlineData.horizontalScrollBarPolicy() == Qt.ScrollBarAsNeeded
|
||||
|
||||
# Check focus
|
||||
with monkeypatch.context() as mp:
|
||||
mp.setattr(QWidget, "hasFocus", lambda *a: True)
|
||||
assert outlineMain.treeFocus() is True
|
||||
assert outlineView.treeFocus() is True
|
||||
|
||||
outlineMain.setTreeFocus() # Can't check. just ensures that it doesn't error
|
||||
outlineView.setTreeFocus() # Can't check. just ensures that it doesn't error
|
||||
|
||||
# Option State
|
||||
# ============
|
||||
pOptions = nwGUI.theProject.options
|
||||
colNames = [h.name for h in nwOutline]
|
||||
colItems = [h for h in nwOutline]
|
||||
colWidth = {h: outlineView.DEF_WIDTH[h] for h in nwOutline}
|
||||
colHidden = {h: outlineView.DEF_HIDDEN[h] for h in nwOutline}
|
||||
colWidth = {h: outlineTree.DEF_WIDTH[h] for h in nwOutline}
|
||||
colHidden = {h: outlineTree.DEF_HIDDEN[h] for h in nwOutline}
|
||||
|
||||
assert outlineView.topLevelItemCount() > 0
|
||||
assert outlineTree.topLevelItemCount() > 0
|
||||
|
||||
# Save header state not allowed
|
||||
outlineView._lastBuild = 0
|
||||
outlineView._saveHeaderState()
|
||||
outlineTree._lastBuild = 0
|
||||
outlineTree._saveHeaderState()
|
||||
assert pOptions.getValue("GuiOutline", "headerOrder", []) == []
|
||||
|
||||
# Allow saving header state
|
||||
outlineView._lastBuild = time.time()
|
||||
outlineView._saveHeaderState()
|
||||
outlineTree._lastBuild = time.time()
|
||||
outlineTree._saveHeaderState()
|
||||
assert pOptions.getValue("GuiOutline", "headerOrder", []) == colNames
|
||||
assert outlineView._treeOrder == colItems
|
||||
assert outlineView._colWidth == colWidth
|
||||
assert outlineView._colHidden == colHidden
|
||||
assert outlineTree._treeOrder == colItems
|
||||
assert outlineTree._colWidth == colWidth
|
||||
assert outlineTree._colHidden == colHidden
|
||||
|
||||
# Get default values
|
||||
optItems = pOptions.getValue("GuiOutline", "headerOrder", [])
|
||||
@@ -105,49 +105,49 @@ def testGuiOutline_Main(qtbot, monkeypatch, nwGUI, fncDir):
|
||||
|
||||
# Add invalid column name
|
||||
pOptions.setValue("GuiOutline", "headerOrder", optItems + ["blabla"])
|
||||
outlineView._loadHeaderState()
|
||||
assert outlineView._treeOrder == colItems
|
||||
assert outlineView._colHidden == colHidden
|
||||
outlineTree._loadHeaderState()
|
||||
assert outlineTree._treeOrder == colItems
|
||||
assert outlineTree._colHidden == colHidden
|
||||
|
||||
# Add duplicate column name
|
||||
pOptions.setValue("GuiOutline", "headerOrder", optItems + [optItems[-1]])
|
||||
outlineView._loadHeaderState()
|
||||
assert outlineView._treeOrder == colItems
|
||||
assert outlineView._colHidden == colHidden
|
||||
outlineTree._loadHeaderState()
|
||||
assert outlineTree._treeOrder == colItems
|
||||
assert outlineTree._colHidden == colHidden
|
||||
|
||||
# Invalid column width data
|
||||
pOptions.setValue("GuiOutline", "headerOrder", optItems)
|
||||
pOptions.setValue("GuiOutline", "columnWidth", {"blabla": None})
|
||||
outlineView._loadHeaderState()
|
||||
assert outlineView._treeOrder == colItems
|
||||
assert outlineView._colHidden == colHidden
|
||||
outlineTree._loadHeaderState()
|
||||
assert outlineTree._treeOrder == colItems
|
||||
assert outlineTree._colHidden == colHidden
|
||||
|
||||
# Invalid column width data
|
||||
pOptions.setValue("GuiOutline", "headerOrder", optItems)
|
||||
pOptions.setValue("GuiOutline", "columnWidth", optWidth)
|
||||
pOptions.setValue("GuiOutline", "columnHidden", {"bloabla": None})
|
||||
outlineView._loadHeaderState()
|
||||
assert outlineView._treeOrder == colItems
|
||||
assert outlineView._colHidden == colHidden
|
||||
outlineTree._loadHeaderState()
|
||||
assert outlineTree._treeOrder == colItems
|
||||
assert outlineTree._colHidden == colHidden
|
||||
|
||||
# Valid settings
|
||||
pOptions.setValue("GuiOutline", "headerOrder", optItems)
|
||||
pOptions.setValue("GuiOutline", "columnWidth", optWidth)
|
||||
pOptions.setValue("GuiOutline", "columnHidden", optHidden)
|
||||
outlineView._loadHeaderState()
|
||||
assert outlineView._treeOrder == colItems
|
||||
assert outlineView._colHidden == colHidden
|
||||
outlineTree._loadHeaderState()
|
||||
assert outlineTree._treeOrder == colItems
|
||||
assert outlineTree._colHidden == colHidden
|
||||
|
||||
# Header Menu
|
||||
# ===========
|
||||
|
||||
# Trigger the menu entry for all hidden columns
|
||||
for hItem in nwOutline:
|
||||
if outlineView.DEF_HIDDEN[hItem]:
|
||||
if outlineTree.DEF_HIDDEN[hItem]:
|
||||
outlineMenu.actionMap[hItem].activate(QAction.Trigger)
|
||||
|
||||
# Now no columns should be hidden
|
||||
outlineView._saveHeaderState()
|
||||
outlineTree._saveHeaderState()
|
||||
assert not any(pOptions.getValue("GuiOutline", "columnHidden", None).values())
|
||||
|
||||
# qtbot.stop()
|
||||
@@ -169,10 +169,10 @@ def testGuiOutline_Content(qtbot, monkeypatch, nwGUI, nwLipsum):
|
||||
nwGUI.rebuildIndex()
|
||||
nwGUI._changeView(nwView.OUTLINE)
|
||||
|
||||
outlineMain = nwGUI.outlineView
|
||||
outlineBar = outlineMain.outlineBar
|
||||
outlineView = outlineMain.outlineView
|
||||
outlineData = outlineMain.outlineData
|
||||
outlineView = nwGUI.outlineView
|
||||
outlineBar = outlineView.outlineBar
|
||||
outlineTree = outlineView.outlineTree
|
||||
outlineData = outlineView.outlineData
|
||||
|
||||
lipHandle = "b3643d0f92e32"
|
||||
|
||||
@@ -218,10 +218,10 @@ def testGuiOutline_Content(qtbot, monkeypatch, nwGUI, nwLipsum):
|
||||
# =============
|
||||
|
||||
# First Item
|
||||
outlineView.refreshTree()
|
||||
selItem = outlineView.topLevelItem(0)
|
||||
outlineTree.refreshTree()
|
||||
selItem = outlineTree.topLevelItem(0)
|
||||
|
||||
outlineView.setCurrentItem(selItem)
|
||||
outlineTree.setCurrentItem(selItem)
|
||||
assert outlineData.titleLabel.text() == "<b>Title</b>"
|
||||
assert outlineData.titleValue.text() == "Lorem Ipsum"
|
||||
assert outlineData.fileValue.text() == "Lorem Ipsum"
|
||||
@@ -232,12 +232,12 @@ def testGuiOutline_Content(qtbot, monkeypatch, nwGUI, nwLipsum):
|
||||
assert outlineData.pCValue.text() == "3"
|
||||
|
||||
# Scene One
|
||||
actItem = outlineView.topLevelItem(1)
|
||||
actItem = outlineTree.topLevelItem(1)
|
||||
chpItem = actItem.child(0)
|
||||
selItem = chpItem.child(0)
|
||||
|
||||
outlineView.setCurrentItem(selItem)
|
||||
tHandle, tLine = outlineView.getSelectedHandle()
|
||||
outlineTree.setCurrentItem(selItem)
|
||||
tHandle, tLine = outlineTree.getSelectedHandle()
|
||||
assert tHandle == "88243afbe5ed8"
|
||||
assert tLine == 0
|
||||
|
||||
@@ -248,17 +248,17 @@ def testGuiOutline_Content(qtbot, monkeypatch, nwGUI, nwLipsum):
|
||||
|
||||
# Click POV Link
|
||||
assert outlineData.povKeyValue.text() == "<a href='Bod'>Bod</a>"
|
||||
outlineMain._tagClicked("Bod")
|
||||
outlineView._tagClicked("Bod")
|
||||
assert nwGUI.docViewer.docHandle() == "4c4f28287af27"
|
||||
|
||||
# Scene One, Section Two
|
||||
actItem = outlineView.topLevelItem(1)
|
||||
actItem = outlineTree.topLevelItem(1)
|
||||
chpItem = actItem.child(0)
|
||||
scnItem = chpItem.child(0)
|
||||
selItem = scnItem.child(0)
|
||||
|
||||
outlineView.setCurrentItem(selItem)
|
||||
tHandle, tLine = outlineView.getSelectedHandle()
|
||||
outlineTree.setCurrentItem(selItem)
|
||||
tHandle, tLine = outlineTree.getSelectedHandle()
|
||||
assert tHandle == "88243afbe5ed8"
|
||||
assert tLine == 12
|
||||
|
||||
@@ -267,7 +267,7 @@ def testGuiOutline_Content(qtbot, monkeypatch, nwGUI, nwLipsum):
|
||||
assert outlineData.fileValue.text() == "Scene One"
|
||||
assert outlineData.itemValue.text() == "Finished"
|
||||
|
||||
outlineView._treeDoubleClick(selItem, 0)
|
||||
outlineTree._treeDoubleClick(selItem, 0)
|
||||
assert nwGUI.docEditor.docHandle() == "88243afbe5ed8"
|
||||
|
||||
# qtbot.stop()
|
||||
|
||||
Reference in New Issue
Block a user