Reduce the list of tag classes in outline view when they are not used
This commit is contained in:
@@ -265,6 +265,14 @@ class NWTree():
|
|||||||
# Tree Root Methods
|
# Tree Root Methods
|
||||||
##
|
##
|
||||||
|
|
||||||
|
def rootClasses(self):
|
||||||
|
"""Return a set of all root classes in use by the project.
|
||||||
|
"""
|
||||||
|
rootClasses = set()
|
||||||
|
for nwItem in self._treeRoots.values():
|
||||||
|
rootClasses.add(nwItem.itemClass)
|
||||||
|
return rootClasses
|
||||||
|
|
||||||
def isRoot(self, tHandle):
|
def isRoot(self, tHandle):
|
||||||
"""Check if a handle is a root item.
|
"""Check if a handle is a root item.
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -39,7 +39,9 @@ from PyQt5.QtWidgets import (
|
|||||||
QWidget, QFrame
|
QWidget, QFrame
|
||||||
)
|
)
|
||||||
|
|
||||||
from novelwriter.enum import nwItemLayout, nwItemType, nwOutline, nwView
|
from novelwriter.enum import (
|
||||||
|
nwItemClass, nwItemLayout, nwItemType, nwOutline, nwView
|
||||||
|
)
|
||||||
from novelwriter.common import checkInt
|
from novelwriter.common import checkInt
|
||||||
from novelwriter.constants import trConst, nwKeyWords, nwLabels
|
from novelwriter.constants import trConst, nwKeyWords, nwLabels
|
||||||
|
|
||||||
@@ -75,6 +77,7 @@ class GuiOutline(QWidget):
|
|||||||
|
|
||||||
# Function Mappings
|
# Function Mappings
|
||||||
self.getSelectedHandle = self.outlineView.getSelectedHandle
|
self.getSelectedHandle = self.outlineView.getSelectedHandle
|
||||||
|
self.updateClasses = self.outlineData.updateClasses
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -96,6 +99,7 @@ class GuiOutline(QWidget):
|
|||||||
|
|
||||||
def closeOutline(self):
|
def closeOutline(self):
|
||||||
self.outlineView.closeOutline()
|
self.outlineView.closeOutline()
|
||||||
|
self.outlineData.updateClasses()
|
||||||
return
|
return
|
||||||
|
|
||||||
def refreshView(self, overRide=False, novelChanged=False):
|
def refreshView(self, overRide=False, novelChanged=False):
|
||||||
@@ -307,7 +311,6 @@ class GuiOutlineView(QTreeWidget):
|
|||||||
tHandle = selItems[0].data(self._colIdx[nwOutline.TITLE], Qt.UserRole)
|
tHandle = selItems[0].data(self._colIdx[nwOutline.TITLE], Qt.UserRole)
|
||||||
sTitle = selItems[0].data(self._colIdx[nwOutline.LINE], Qt.UserRole)
|
sTitle = selItems[0].data(self._colIdx[nwOutline.LINE], Qt.UserRole)
|
||||||
self.theOutline.outlineData.showItem(tHandle, sTitle)
|
self.theOutline.outlineData.showItem(tHandle, sTitle)
|
||||||
self.theParent.treeView.setSelectedHandle(tHandle)
|
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -824,6 +827,8 @@ class GuiOutlineDetails(QScrollArea):
|
|||||||
else:
|
else:
|
||||||
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
|
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
|
||||||
|
|
||||||
|
self.updateClasses()
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
def clearDetails(self):
|
def clearDetails(self):
|
||||||
@@ -846,6 +851,7 @@ class GuiOutlineDetails(QScrollArea):
|
|||||||
self.objKeyValue.setText("")
|
self.objKeyValue.setText("")
|
||||||
self.entKeyValue.setText("")
|
self.entKeyValue.setText("")
|
||||||
self.cstKeyValue.setText("")
|
self.cstKeyValue.setText("")
|
||||||
|
self.updateClasses()
|
||||||
return
|
return
|
||||||
|
|
||||||
def showItem(self, tHandle, sTitle):
|
def showItem(self, tHandle, sTitle):
|
||||||
@@ -895,6 +901,7 @@ class GuiOutlineDetails(QScrollArea):
|
|||||||
# Slots
|
# Slots
|
||||||
##
|
##
|
||||||
|
|
||||||
|
@pyqtSlot(str)
|
||||||
def _tagClicked(self, theLink):
|
def _tagClicked(self, theLink):
|
||||||
"""Capture the click of a tag in the right-most column.
|
"""Capture the click of a tag in the right-most column.
|
||||||
"""
|
"""
|
||||||
@@ -906,6 +913,34 @@ class GuiOutlineDetails(QScrollArea):
|
|||||||
self.theParent.docViewer.loadFromTag(theBits[1])
|
self.theParent.docViewer.loadFromTag(theBits[1])
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@pyqtSlot()
|
||||||
|
def updateClasses(self):
|
||||||
|
"""Update the visibility status of class details.
|
||||||
|
"""
|
||||||
|
usedClasses = self.theProject.projTree.rootClasses()
|
||||||
|
|
||||||
|
pltVisible = nwItemClass.PLOT in usedClasses
|
||||||
|
timVisible = nwItemClass.TIMELINE in usedClasses
|
||||||
|
wldVisible = nwItemClass.WORLD in usedClasses
|
||||||
|
objVisible = nwItemClass.OBJECT in usedClasses
|
||||||
|
entVisible = nwItemClass.ENTITY in usedClasses
|
||||||
|
cstVisible = nwItemClass.CUSTOM in usedClasses
|
||||||
|
|
||||||
|
self.pltKeyLabel.setVisible(pltVisible)
|
||||||
|
self.pltKeyValue.setVisible(pltVisible)
|
||||||
|
self.timKeyLabel.setVisible(timVisible)
|
||||||
|
self.timKeyValue.setVisible(timVisible)
|
||||||
|
self.wldKeyLabel.setVisible(wldVisible)
|
||||||
|
self.wldKeyValue.setVisible(wldVisible)
|
||||||
|
self.objKeyLabel.setVisible(objVisible)
|
||||||
|
self.objKeyValue.setVisible(objVisible)
|
||||||
|
self.entKeyLabel.setVisible(entVisible)
|
||||||
|
self.entKeyValue.setVisible(entVisible)
|
||||||
|
self.cstKeyLabel.setVisible(cstVisible)
|
||||||
|
self.cstKeyValue.setVisible(cstVisible)
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
##
|
##
|
||||||
# Internal Functions
|
# Internal Functions
|
||||||
##
|
##
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ class GuiProjectTree(QTreeWidget):
|
|||||||
novelItemChanged = pyqtSignal()
|
novelItemChanged = pyqtSignal()
|
||||||
noteItemChanged = pyqtSignal()
|
noteItemChanged = pyqtSignal()
|
||||||
wordCountsChanged = pyqtSignal()
|
wordCountsChanged = pyqtSignal()
|
||||||
|
rootFoldersChanged = pyqtSignal()
|
||||||
|
|
||||||
def __init__(self, theParent):
|
def __init__(self, theParent):
|
||||||
QTreeWidget.__init__(self, theParent)
|
QTreeWidget.__init__(self, theParent)
|
||||||
@@ -177,6 +178,7 @@ class GuiProjectTree(QTreeWidget):
|
|||||||
if itemType == nwItemType.ROOT and isinstance(itemClass, nwItemClass):
|
if itemType == nwItemType.ROOT and isinstance(itemClass, nwItemClass):
|
||||||
|
|
||||||
tHandle = self.theProject.newRoot(itemClass)
|
tHandle = self.theProject.newRoot(itemClass)
|
||||||
|
self.rootFoldersChanged.emit()
|
||||||
|
|
||||||
elif itemType in (nwItemType.FILE, nwItemType.FOLDER):
|
elif itemType in (nwItemType.FILE, nwItemType.FOLDER):
|
||||||
|
|
||||||
@@ -450,6 +452,7 @@ class GuiProjectTree(QTreeWidget):
|
|||||||
self.takeTopLevelItem(tIndex)
|
self.takeTopLevelItem(tIndex)
|
||||||
self._deleteTreeItem(tHandle)
|
self._deleteTreeItem(tHandle)
|
||||||
self._setTreeChanged(True)
|
self._setTreeChanged(True)
|
||||||
|
self.rootFoldersChanged.emit()
|
||||||
else:
|
else:
|
||||||
self.theParent.makeAlert(self.tr(
|
self.theParent.makeAlert(self.tr(
|
||||||
"Cannot delete root folder. It is not empty. "
|
"Cannot delete root folder. It is not empty. "
|
||||||
@@ -541,7 +544,7 @@ class GuiProjectTree(QTreeWidget):
|
|||||||
else:
|
else:
|
||||||
expIcon = self.theTheme.getIcon("cross")
|
expIcon = self.theTheme.getIcon("cross")
|
||||||
|
|
||||||
itempStatus, statusIcon = nwItem.getImportStatus()
|
itemStatus, statusIcon = nwItem.getImportStatus()
|
||||||
hLevel = self.theIndex.getHandleHeaderLevel(tHandle)
|
hLevel = self.theIndex.getHandleHeaderLevel(tHandle)
|
||||||
itemIcon = self.theTheme.getItemIcon(
|
itemIcon = self.theTheme.getItemIcon(
|
||||||
nwItem.itemType, nwItem.itemClass, nwItem.itemLayout, hLevel
|
nwItem.itemType, nwItem.itemClass, nwItem.itemLayout, hLevel
|
||||||
@@ -551,7 +554,7 @@ class GuiProjectTree(QTreeWidget):
|
|||||||
trItem.setText(self.C_NAME, nwItem.itemName)
|
trItem.setText(self.C_NAME, nwItem.itemName)
|
||||||
trItem.setIcon(self.C_EXPORT, expIcon)
|
trItem.setIcon(self.C_EXPORT, expIcon)
|
||||||
trItem.setIcon(self.C_STATUS, statusIcon)
|
trItem.setIcon(self.C_STATUS, statusIcon)
|
||||||
trItem.setToolTip(self.C_STATUS, itempStatus)
|
trItem.setToolTip(self.C_STATUS, itemStatus)
|
||||||
|
|
||||||
if self.mainConf.emphLabels and nwItem.itemLayout == nwItemLayout.DOCUMENT:
|
if self.mainConf.emphLabels and nwItem.itemLayout == nwItemLayout.DOCUMENT:
|
||||||
trFont = trItem.font(self.C_NAME)
|
trFont = trItem.font(self.C_NAME)
|
||||||
|
|||||||
@@ -126,6 +126,7 @@ class GuiMain(QMainWindow):
|
|||||||
self.treeView.itemDoubleClicked.connect(self._treeDoubleClick)
|
self.treeView.itemDoubleClicked.connect(self._treeDoubleClick)
|
||||||
self.treeView.novelItemChanged.connect(self._treeNovelItemChanged)
|
self.treeView.novelItemChanged.connect(self._treeNovelItemChanged)
|
||||||
self.treeView.wordCountsChanged.connect(self._updateStatusWordCount)
|
self.treeView.wordCountsChanged.connect(self._updateStatusWordCount)
|
||||||
|
self.treeView.rootFoldersChanged.connect(self.projView.updateClasses)
|
||||||
|
|
||||||
self.viewsBar.viewChangeRequested.connect(self._changeView)
|
self.viewsBar.viewChangeRequested.connect(self._changeView)
|
||||||
self.projView.viewChangeRequested.connect(self._changeView)
|
self.projView.viewChangeRequested.connect(self._changeView)
|
||||||
@@ -352,6 +353,7 @@ class GuiMain(QMainWindow):
|
|||||||
self.rebuildTrees()
|
self.rebuildTrees()
|
||||||
self.saveProject()
|
self.saveProject()
|
||||||
self.docEditor.setDictionaries()
|
self.docEditor.setDictionaries()
|
||||||
|
self.projView.updateClasses()
|
||||||
self.rebuildIndex(beQuiet=True)
|
self.rebuildIndex(beQuiet=True)
|
||||||
self.statusBar.setRefTime(self.theProject.projOpened)
|
self.statusBar.setRefTime(self.theProject.projOpened)
|
||||||
self.statusBar.setProjectStatus(nwState.GOOD)
|
self.statusBar.setProjectStatus(nwState.GOOD)
|
||||||
@@ -499,6 +501,7 @@ class GuiMain(QMainWindow):
|
|||||||
self.docEditor.toggleSpellCheck(self.theProject.spellCheck)
|
self.docEditor.toggleSpellCheck(self.theProject.spellCheck)
|
||||||
self.mainMenu.setAutoOutline(self.theProject.autoOutline)
|
self.mainMenu.setAutoOutline(self.theProject.autoOutline)
|
||||||
self.statusBar.setRefTime(self.theProject.projOpened)
|
self.statusBar.setRefTime(self.theProject.projOpened)
|
||||||
|
self.projView.updateClasses()
|
||||||
self._updateStatusWordCount()
|
self._updateStatusWordCount()
|
||||||
|
|
||||||
# Restore previously open documents, if any
|
# Restore previously open documents, if any
|
||||||
|
|||||||
@@ -149,6 +149,11 @@ def testCoreTree_BuildTree(mockGUI, mockItems):
|
|||||||
assert theTree.isTrash("a000000000003") is True
|
assert theTree.isTrash("a000000000003") is True
|
||||||
assert theTree.isRoot("a000000000002") is True
|
assert theTree.isRoot("a000000000002") is True
|
||||||
|
|
||||||
|
# Check that we have the root classes
|
||||||
|
assert theTree.rootClasses() == {
|
||||||
|
nwItemClass.NOVEL, nwItemClass.CHARACTER, nwItemClass.ARCHIVE, nwItemClass.TRASH
|
||||||
|
}
|
||||||
|
|
||||||
# Check the isTrash function
|
# Check the isTrash function
|
||||||
assert theTree.isTrash("0000000000000") is True # Doesn't exist
|
assert theTree.isTrash("0000000000000") is True # Doesn't exist
|
||||||
assert theTree.isTrash("a000000000003") is True # This the trash folder
|
assert theTree.isTrash("a000000000003") is True # This the trash folder
|
||||||
|
|||||||
Reference in New Issue
Block a user