Add novel tree method to refresh metadata for item
This commit is contained in:
@@ -501,6 +501,11 @@ class NWIndex:
|
|||||||
yield f"{tHandle}:{sTitle}", tHandle, sTitle, hItem
|
yield f"{tHandle}:{sTitle}", tHandle, sTitle, hItem
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def getItemData(self, tHandle):
|
||||||
|
"""Get the index data for a given item.
|
||||||
|
"""
|
||||||
|
return self._itemIndex[tHandle]
|
||||||
|
|
||||||
def getNovelWordCount(self, skipExcl=True):
|
def getNovelWordCount(self, skipExcl=True):
|
||||||
"""Count the number of words in the novel project.
|
"""Count the number of words in the novel project.
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ from PyQt5.QtWidgets import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
from novelwriter.core import NWSpellEnchant, countWords
|
from novelwriter.core import NWSpellEnchant, countWords
|
||||||
from novelwriter.enum import nwAlert, nwDocAction, nwDocInsert, nwDocMode
|
from novelwriter.enum import nwAlert, nwDocAction, nwDocInsert, nwDocMode, nwItemClass
|
||||||
from novelwriter.common import transferCase
|
from novelwriter.common import transferCase
|
||||||
from novelwriter.constants import nwConst, nwFiles, nwKeyWords, nwUnicode
|
from novelwriter.constants import nwConst, nwFiles, nwKeyWords, nwUnicode
|
||||||
from novelwriter.gui.dochighlight import GuiDocHighlighter
|
from novelwriter.gui.dochighlight import GuiDocHighlighter
|
||||||
@@ -71,6 +71,8 @@ class GuiDocEditor(QTextEdit):
|
|||||||
docEditedStatusChanged = pyqtSignal(bool)
|
docEditedStatusChanged = pyqtSignal(bool)
|
||||||
docCountsChanged = pyqtSignal(str, int, int, int)
|
docCountsChanged = pyqtSignal(str, int, int, int)
|
||||||
loadDocumentTagRequest = pyqtSignal(str, Enum)
|
loadDocumentTagRequest = pyqtSignal(str, Enum)
|
||||||
|
novelStructureChanged = pyqtSignal()
|
||||||
|
novelItemMetaChanged = pyqtSignal(str)
|
||||||
|
|
||||||
def __init__(self, mainGui):
|
def __init__(self, mainGui):
|
||||||
super().__init__(parent=mainGui)
|
super().__init__(parent=mainGui)
|
||||||
@@ -534,11 +536,11 @@ class GuiDocEditor(QTextEdit):
|
|||||||
self.theProject.index.scanText(tHandle, docText)
|
self.theProject.index.scanText(tHandle, docText)
|
||||||
newHeader = self._nwItem.mainHeading
|
newHeader = self._nwItem.mainHeading
|
||||||
|
|
||||||
# ToDo: This should be a signal
|
if self._nwItem.itemClass == nwItemClass.NOVEL:
|
||||||
if self._updateHeaders():
|
if self._updateHeaders():
|
||||||
self.mainGui.requestNovelTreeRefresh()
|
self.novelStructureChanged.emit()
|
||||||
else:
|
else:
|
||||||
self.mainGui.novelView.updateWordCounts(tHandle)
|
self.novelItemMetaChanged.emit(tHandle)
|
||||||
|
|
||||||
# ToDo: This should be a signal
|
# ToDo: This should be a signal
|
||||||
if oldHeader != newHeader:
|
if oldHeader != newHeader:
|
||||||
|
|||||||
@@ -83,7 +83,6 @@ class GuiNovelView(QWidget):
|
|||||||
self.setLayout(self.outerBox)
|
self.setLayout(self.outerBox)
|
||||||
|
|
||||||
# Function Mappings
|
# Function Mappings
|
||||||
self.updateWordCounts = self.novelTree.updateWordCounts
|
|
||||||
self.getSelectedHandle = self.novelTree.getSelectedHandle
|
self.getSelectedHandle = self.novelTree.getSelectedHandle
|
||||||
self.setActiveHandle = self.novelTree.setActiveHandle
|
self.setActiveHandle = self.novelTree.setActiveHandle
|
||||||
|
|
||||||
@@ -107,12 +106,6 @@ class GuiNovelView(QWidget):
|
|||||||
self.novelTree.initSettings()
|
self.novelTree.initSettings()
|
||||||
return
|
return
|
||||||
|
|
||||||
def refreshTree(self):
|
|
||||||
"""Refresh the current tree.
|
|
||||||
"""
|
|
||||||
self.novelTree.refreshTree(rootHandle=self.theProject.data.getLastHandle("novelTree"))
|
|
||||||
return
|
|
||||||
|
|
||||||
def clearProject(self):
|
def clearProject(self):
|
||||||
"""Clear project-related GUI content.
|
"""Clear project-related GUI content.
|
||||||
"""
|
"""
|
||||||
@@ -164,6 +157,13 @@ class GuiNovelView(QWidget):
|
|||||||
# Public Slots
|
# Public Slots
|
||||||
##
|
##
|
||||||
|
|
||||||
|
@pyqtSlot()
|
||||||
|
def refreshTree(self):
|
||||||
|
"""Refresh the current tree.
|
||||||
|
"""
|
||||||
|
self.novelTree.refreshTree(rootHandle=self.theProject.data.getLastHandle("novelTree"))
|
||||||
|
return
|
||||||
|
|
||||||
@pyqtSlot(str)
|
@pyqtSlot(str)
|
||||||
def updateRootItem(self, tHandle):
|
def updateRootItem(self, tHandle):
|
||||||
"""If any root item changes, rebuild the novel root menu.
|
"""If any root item changes, rebuild the novel root menu.
|
||||||
@@ -171,6 +171,14 @@ class GuiNovelView(QWidget):
|
|||||||
self.novelBar.buildNovelRootMenu()
|
self.novelBar.buildNovelRootMenu()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@pyqtSlot(str)
|
||||||
|
def updateNovelItemMeta(self, tHandle):
|
||||||
|
"""The meta data of a novel item has changed, and the tree item
|
||||||
|
needs to be refreshed.
|
||||||
|
"""
|
||||||
|
self.novelTree.refreshHandle(tHandle)
|
||||||
|
return
|
||||||
|
|
||||||
# END Class GuiNovelView
|
# END Class GuiNovelView
|
||||||
|
|
||||||
|
|
||||||
@@ -495,13 +503,39 @@ class GuiNovelTree(QTreeWidget):
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
def updateWordCounts(self, tHandle):
|
def refreshHandle(self, tHandle):
|
||||||
"""Update the word count for a given handle.
|
"""Refresh the data for a given handle.
|
||||||
"""
|
"""
|
||||||
tHeaders = self.theProject.index.getHandleWordCounts(tHandle)
|
idxData = self.theProject.index.getItemData(tHandle)
|
||||||
for titleKey, wCount in tHeaders:
|
if idxData is None:
|
||||||
if titleKey in self._treeMap:
|
return
|
||||||
self._treeMap[titleKey].setText(self.C_WORDS, f"{wCount:n}")
|
|
||||||
|
for sTitle, tHeading in idxData.items():
|
||||||
|
sKey = f"{tHandle}:{sTitle}"
|
||||||
|
trItem = self._treeMap.get(sKey, None)
|
||||||
|
if trItem is None:
|
||||||
|
logger.debug("Heading '%s' not in novel tree", sKey)
|
||||||
|
continue
|
||||||
|
|
||||||
|
iLevel = nwHeaders.H_LEVEL.get(tHeading.level, 0)
|
||||||
|
if iLevel == 0:
|
||||||
|
continue
|
||||||
|
|
||||||
|
hDec = self.mainTheme.getHeaderDecoration(iLevel)
|
||||||
|
|
||||||
|
trItem.setData(self.C_TITLE, Qt.DecorationRole, hDec)
|
||||||
|
trItem.setText(self.C_TITLE, tHeading.title)
|
||||||
|
trItem.setFont(self.C_TITLE, self._hFonts[iLevel])
|
||||||
|
trItem.setText(self.C_WORDS, f"{tHeading.wordCount:n}")
|
||||||
|
trItem.setTextAlignment(self.C_WORDS, Qt.AlignRight)
|
||||||
|
trItem.setData(self.C_MORE, Qt.DecorationRole, self._pMore)
|
||||||
|
|
||||||
|
# Custom column
|
||||||
|
lastText, toolTip = self._getLastColumnText(tHandle, sTitle)
|
||||||
|
trItem.setText(self.C_EXTRA, lastText)
|
||||||
|
if lastText:
|
||||||
|
trItem.setToolTip(self.C_EXTRA, toolTip)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
def getSelectedHandle(self):
|
def getSelectedHandle(self):
|
||||||
|
|||||||
@@ -224,6 +224,8 @@ class GuiMain(QMainWindow):
|
|||||||
self.docEditor.docCountsChanged.connect(self.itemDetails.updateCounts)
|
self.docEditor.docCountsChanged.connect(self.itemDetails.updateCounts)
|
||||||
self.docEditor.docCountsChanged.connect(self.projView.updateCounts)
|
self.docEditor.docCountsChanged.connect(self.projView.updateCounts)
|
||||||
self.docEditor.loadDocumentTagRequest.connect(self._followTag)
|
self.docEditor.loadDocumentTagRequest.connect(self._followTag)
|
||||||
|
self.docEditor.novelStructureChanged.connect(self.novelView.refreshTree)
|
||||||
|
self.docEditor.novelItemMetaChanged.connect(self.novelView.updateNovelItemMeta)
|
||||||
|
|
||||||
self.docViewer.loadDocumentTagRequest.connect(self._followTag)
|
self.docViewer.loadDocumentTagRequest.connect(self._followTag)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user