Add a signal for updated word counts

This commit is contained in:
Veronica K. B. Olsen
2021-05-16 17:31:12 +02:00
parent 872b8e7902
commit 1a5076438d
5 changed files with 63 additions and 31 deletions
+4 -3
View File
@@ -67,6 +67,7 @@ class GuiDocEditor(QTextEdit):
# Custom Signals # Custom Signals
spellDictionaryChanged = pyqtSignal(str, str) spellDictionaryChanged = pyqtSignal(str, str)
docEditedStatusChanged = pyqtSignal(bool) docEditedStatusChanged = pyqtSignal(bool)
docCountsChanged = pyqtSignal(str, int, int, int)
def __init__(self, theParent): def __init__(self, theParent):
QTextEdit.__init__(self, theParent) QTextEdit.__init__(self, theParent)
@@ -1193,9 +1194,9 @@ class GuiDocEditor(QTextEdit):
self._nwItem.setWordCount(wCount) self._nwItem.setWordCount(wCount)
self._nwItem.setParaCount(pCount) self._nwItem.setParaCount(pCount)
self.theParent.treeView.propagateCount(self._docHandle, wCount) # Must not be emitted if docHandle is None!
self.theParent.treeView.projectWordCount() self.docCountsChanged.emit(self._docHandle, cCount, wCount, pCount)
self.theParent.treeMeta.updateCounts(self._docHandle, cCount, wCount, pCount)
self._checkDocSize(self._qDocument.characterCount()) self._checkDocSize(self._qDocument.characterCount())
self.docFooter.updateCounts() self.docFooter.updateCounts()
+17 -12
View File
@@ -27,7 +27,7 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
import nw import nw
import logging import logging
from PyQt5.QtCore import Qt from PyQt5.QtCore import Qt, pyqtSlot
from PyQt5.QtGui import QFont, QPixmap from PyQt5.QtGui import QFont, QPixmap
from PyQt5.QtWidgets import QWidget, QGridLayout, QLabel from PyQt5.QtWidgets import QWidget, QGridLayout, QLabel
@@ -212,17 +212,6 @@ class GuiItemDetails(QWidget):
return return
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.
"""
if tHandle == self.theHandle:
self.cCountData.setText(f"{cC:n}")
self.wCountData.setText(f"{wC:n}")
self.pCountData.setText(f"{pC:n}")
return
def updateViewBox(self, tHandle): def updateViewBox(self, tHandle):
"""Populate the details box from a given handle. """Populate the details box from a given handle.
""" """
@@ -281,4 +270,20 @@ class GuiItemDetails(QWidget):
return return
##
# Slots
##
@pyqtSlot(str, int, int, int)
def doUpdateCounts(self, tHandle, cC, wC, pC):
"""Update the counts if the handle is the same as the one we're
already showing. Otherwise, do nothing.
"""
if tHandle == self.theHandle:
self.cCountData.setText(f"{cC:n}")
self.wCountData.setText(f"{wC:n}")
self.pCountData.setText(f"{pC:n}")
return
# END Class GuiItemDetails # END Class GuiItemDetails
+23 -2
View File
@@ -30,7 +30,7 @@ import logging
from time import time from time import time
from PyQt5.QtCore import Qt, QSize, pyqtSignal 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 QTreeWidget, QTreeWidgetItem, QAbstractItemView, QMenu, QAction
@@ -51,6 +51,7 @@ class GuiProjectTree(QTreeWidget):
novelItemChanged = pyqtSignal() novelItemChanged = pyqtSignal()
noteItemChanged = pyqtSignal() noteItemChanged = pyqtSignal()
projectWordCountChanged = pyqtSignal(int, int)
def __init__(self, theParent): def __init__(self, theParent):
QTreeWidget.__init__(self, theParent) QTreeWidget.__init__(self, theParent)
@@ -674,7 +675,8 @@ class GuiProjectTree(QTreeWidget):
self.theProject.setProjectWordCount(nWords) self.theProject.setProjectWordCount(nWords)
sWords = self.theProject.getSessionWordCount() sWords = self.theProject.getSessionWordCount()
self.theParent.statusBar.setStats(nWords, sWords)
self.projectWordCountChanged.emit(nWords, sWords)
return return
@@ -779,6 +781,7 @@ class GuiProjectTree(QTreeWidget):
# Slots # Slots
## ##
@pyqtSlot("QPoint")
def _rightClickMenu(self, clickPos): def _rightClickMenu(self, clickPos):
"""The user right clicked an element in the project tree, so we """The user right clicked an element in the project tree, so we
open a context menu in-place. open a context menu in-place.
@@ -795,6 +798,14 @@ class GuiProjectTree(QTreeWidget):
return return
@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)
self.projectWordCount()
return
## ##
# Events # Events
## ##
@@ -1171,6 +1182,7 @@ class GuiProjectTreeMenu(QMenu):
# Slots # Slots
## ##
@pyqtSlot()
def _doOpenItem(self): def _doOpenItem(self):
"""Forward the open document call to the main GUI window. """Forward the open document call to the main GUI window.
""" """
@@ -1178,6 +1190,7 @@ class GuiProjectTreeMenu(QMenu):
self.theTree.theParent.openDocument(self.theItem.itemHandle, doScroll=False) self.theTree.theParent.openDocument(self.theItem.itemHandle, doScroll=False)
return return
@pyqtSlot()
def _doViewItem(self): def _doViewItem(self):
"""Forward the view document call to the main GUI window. """Forward the view document call to the main GUI window.
""" """
@@ -1185,6 +1198,7 @@ class GuiProjectTreeMenu(QMenu):
self.theTree.theParent.viewDocument(self.theItem.itemHandle) self.theTree.theParent.viewDocument(self.theItem.itemHandle)
return return
@pyqtSlot()
def _doEditItem(self): def _doEditItem(self):
"""Forward the edit item call to the main GUI window. """Forward the edit item call to the main GUI window.
""" """
@@ -1192,6 +1206,7 @@ class GuiProjectTreeMenu(QMenu):
self.theTree.theParent.editItem() self.theTree.theParent.editItem()
return return
@pyqtSlot()
def _doMakeFile(self): def _doMakeFile(self):
"""Forward the new file call to the project tree. """Forward the new file call to the project tree.
""" """
@@ -1199,6 +1214,7 @@ class GuiProjectTreeMenu(QMenu):
self.theTree.newTreeItem(nwItemType.FILE, None) self.theTree.newTreeItem(nwItemType.FILE, None)
return return
@pyqtSlot()
def _doMakeFolder(self): def _doMakeFolder(self):
"""Forward the new folder call to the project tree. """Forward the new folder call to the project tree.
""" """
@@ -1206,6 +1222,7 @@ class GuiProjectTreeMenu(QMenu):
self.theTree.newTreeItem(nwItemType.FOLDER, None) self.theTree.newTreeItem(nwItemType.FOLDER, None)
return return
@pyqtSlot()
def _doToggleExported(self): def _doToggleExported(self):
"""Flip the isExported flag of the current item. """Flip the isExported flag of the current item.
""" """
@@ -1214,6 +1231,7 @@ class GuiProjectTreeMenu(QMenu):
self.theTree.setTreeItemValues(self.theItem.itemHandle) self.theTree.setTreeItemValues(self.theItem.itemHandle)
return return
@pyqtSlot()
def _doDeleteItem(self): def _doDeleteItem(self):
"""Forward the delete item call to the project tree. """Forward the delete item call to the project tree.
""" """
@@ -1221,18 +1239,21 @@ class GuiProjectTreeMenu(QMenu):
self.theTree.deleteItem() self.theTree.deleteItem()
return return
@pyqtSlot()
def _doEmptyTrash(self): def _doEmptyTrash(self):
"""Forward the empty trash call to the project tree. """Forward the empty trash call to the project tree.
""" """
self.theTree.emptyTrash() self.theTree.emptyTrash()
return return
@pyqtSlot()
def _doMoveUp(self): def _doMoveUp(self):
"""Forward the move item call to the project tree. """Forward the move item call to the project tree.
""" """
self.theTree.moveTreeItem(-1) self.theTree.moveTreeItem(-1)
return return
@pyqtSlot()
def _doMoveDown(self): def _doMoveDown(self):
"""Forward the move item call to the project tree. """Forward the move item call to the project tree.
""" """
+9 -8
View File
@@ -125,7 +125,7 @@ class GuiMainStatus(QStatusBar):
""" """
self.setRefTime(None) self.setRefTime(None)
self.setLanguage(None, "") self.setLanguage(None, "")
self.setStats(0, 0) self.doUpdateProjectStats(0, 0)
self.setProjectStatus(nwState.NONE) self.setProjectStatus(nwState.NONE)
self.setDocumentStatus(nwState.NONE) self.setDocumentStatus(nwState.NONE)
self.updateTime() self.updateTime()
@@ -160,13 +160,6 @@ class GuiMainStatus(QStatusBar):
self.docIcon.setState(theState) self.docIcon.setState(theState)
return return
def setStats(self, pWC, sWC):
"""Set the current project statistics.
"""
self.statsText.setText(self.tr("Words: {0} ({1})").format(f"{pWC:n}", f"{sWC:+n}"))
self.statsText.setToolTip(self.tr("Project word count (session change)"))
return
def setUserIdle(self, userIdle): def setUserIdle(self, userIdle):
"""Change the idle status icon. """Change the idle status icon.
""" """
@@ -218,6 +211,14 @@ class GuiMainStatus(QStatusBar):
return return
@pyqtSlot(int, int)
def doUpdateProjectStats(self, pWC, sWC):
"""Update the current project statistics.
"""
self.statsText.setText(self.tr("Words: {0} ({1})").format(f"{pWC:n}", f"{sWC:+n}"))
self.statsText.setToolTip(self.tr("Project word count (session change)"))
return
@pyqtSlot(bool) @pyqtSlot(bool)
def doUpdateProjectStatus(self, isChanged): def doUpdateProjectStatus(self, isChanged):
"""Slot for updating the project status. """Slot for updating the project status.
+10 -6
View File
@@ -119,9 +119,16 @@ class GuiMain(QMainWindow):
self.projMeta = GuiOutlineDetails(self) self.projMeta = GuiOutlineDetails(self)
self.mainMenu = GuiMainMenu(self) self.mainMenu = GuiMainMenu(self)
# Signals Between Main Elements # Connect Signals Between Main Elements
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.treeView.doUpdateCounts)
self.treeView.itemSelectionChanged.connect(self._treeSingleClick)
self.treeView.itemDoubleClicked.connect(self._treeDoubleClick)
self.treeView.novelItemChanged.connect(self._treeNovelItemChanged)
self.treeView.projectWordCountChanged.connect(self.statusBar.doUpdateProjectStats)
# Minor GUI Elements # Minor GUI Elements
self.statusIcons = [] self.statusIcons = []
@@ -231,9 +238,6 @@ class GuiMain(QMainWindow):
self.docEditor.closeSearch() self.docEditor.closeSearch()
# Initialise the Project Tree # Initialise the Project Tree
self.treeView.itemSelectionChanged.connect(self._treeSingleClick)
self.treeView.itemDoubleClicked.connect(self._treeDoubleClick)
self.treeView.novelItemChanged.connect(self._treeNovelItemChanged)
self.rebuildTrees() self.rebuildTrees()
# Set Main Window Elements # Set Main Window Elements
@@ -524,7 +528,7 @@ class GuiMain(QMainWindow):
self.docEditor.setSpellCheck(self.theProject.spellCheck) self.docEditor.setSpellCheck(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.statusBar.setStats(self.theProject.currWCount, 0) self.statusBar.doUpdateProjectStats(self.theProject.currWCount, 0)
# Restore previously open documents, if any # Restore previously open documents, if any
if self.theProject.lastEdited is not None: if self.theProject.lastEdited is not None:
@@ -882,7 +886,7 @@ class GuiMain(QMainWindow):
self.treeView.saveTreeOrder() self.treeView.saveTreeOrder()
self.theIndex.clearIndex() self.theIndex.clearIndex()
for nDone, tItem in enumerate(self.theProject.projTree): for tItem in self.theProject.projTree:
if tItem is not None: if tItem is not None:
self.setStatus(self.tr("Indexing: '{0}'").format(tItem.itemName)) self.setStatus(self.tr("Indexing: '{0}'").format(tItem.itemName))