diff --git a/nw/gui/elements/outline.py b/nw/gui/elements/outline.py index 6fbe3d21..75e4f396 100644 --- a/nw/gui/elements/outline.py +++ b/nw/gui/elements/outline.py @@ -20,35 +20,53 @@ from PyQt5.QtWidgets import ( QWidget, QVBoxLayout, QTreeWidget, QTreeWidgetItem ) -from nw.constants import nwItemLayout +from nw.constants import nwItemLayout, nwKeyWords, nwLabels logger = logging.getLogger(__name__) class GuiProjectOutline(QWidget): - I_TITLE = 0 - I_LEVEL = 1 - I_LABEL = 2 - I_LINE = 3 - I_WORDS = 4 - I_CHARS = 5 - I_PARAS = 6 - I_SYNOP = 7 + I_TITLE = 0 + I_LEVEL = 1 + I_LABEL = 2 + I_LINE = 3 + I_WCOUNT = 4 + I_CCOUNT = 5 + I_PCOUNT = 6 + I_SYNOP = 7 + I_POV = 8 + I_CHAR = 9 + I_PLOT = 10 + I_TIME = 11 + I_WORLD = 12 + I_OBJECT = 13 + I_ENTITY = 14 + I_CUSTOM = 15 COL_ORDER = [ - I_TITLE, I_LEVEL, I_LABEL, I_LINE, - I_WORDS, I_CHARS, I_PARAS, I_SYNOP, + I_TITLE, I_LEVEL, I_LABEL, I_LINE, + I_WCOUNT, I_CCOUNT, I_PCOUNT, I_SYNOP, + I_POV, I_CHAR, I_PLOT, I_TIME, + I_WORLD, I_OBJECT, I_ENTITY, I_CUSTOM, ] COL_LABELS = { - I_TITLE : "Title", - I_LEVEL : "Level", - I_LABEL : "Document", - I_LINE : "Line", - I_WORDS : "Words", - I_CHARS : "Chars", - I_PARAS : "Pars", - I_SYNOP : "Synopsis", + I_TITLE : "Title", + I_LEVEL : "Level", + I_LABEL : "Document", + I_LINE : "Line", + I_WCOUNT : "Words", + I_CCOUNT : "Chars", + I_PCOUNT : "Pars", + I_SYNOP : "Synopsis", + I_POV : nwLabels.KEY_NAME[nwKeyWords.POV_KEY], + I_CHAR : nwLabels.KEY_NAME[nwKeyWords.CHAR_KEY], + I_PLOT : nwLabels.KEY_NAME[nwKeyWords.PLOT_KEY], + I_TIME : nwLabels.KEY_NAME[nwKeyWords.TIME_KEY], + I_WORLD : nwLabels.KEY_NAME[nwKeyWords.WORLD_KEY], + I_OBJECT : nwLabels.KEY_NAME[nwKeyWords.OBJECT_KEY], + I_ENTITY : nwLabels.KEY_NAME[nwKeyWords.ENTITY_KEY], + I_CUSTOM : nwLabels.KEY_NAME[nwKeyWords.CUSTOM_KEY], } def __init__(self, theParent, theProject): @@ -82,14 +100,14 @@ class GuiProjectOutline(QWidget): theLabels = [] for n in self.treeOrder: theLabels.append(self.COL_LABELS[n]) - + self.mainTree.clear() self.mainTree.setHeaderLabels(theLabels) - + treeHead = self.mainTree.headerItem() - treeHead.setTextAlignment(self.I_CHARS,Qt.AlignRight) - treeHead.setTextAlignment(self.I_WORDS,Qt.AlignRight) - treeHead.setTextAlignment(self.I_PARAS,Qt.AlignRight) + treeHead.setTextAlignment(self.I_CCOUNT,Qt.AlignRight) + treeHead.setTextAlignment(self.I_WCOUNT,Qt.AlignRight) + treeHead.setTextAlignment(self.I_PCOUNT,Qt.AlignRight) currTitle = None currChapter = None @@ -106,54 +124,102 @@ class GuiProjectOutline(QWidget): for tEntry in self.theIndex.novelIndex[tHandle]: - theLine = str(tEntry[0]) - - newItem = QTreeWidgetItem([""]*4) - newItem.setText(self.I_TITLE, tEntry[2]) - newItem.setText(self.I_LEVEL, str(tEntry[1])) - newItem.setText(self.I_LABEL, nwItem.itemName) - newItem.setText(self.I_LINE, theLine) - - cC, wC, pC = self.theIndex.getCounts(tHandle, theLine) - newItem.setText(self.I_CHARS, str(cC)) - newItem.setText(self.I_WORDS, str(wC)) - newItem.setText(self.I_PARAS, str(pC)) - newItem.setTextAlignment(self.I_CHARS,Qt.AlignRight) - newItem.setTextAlignment(self.I_WORDS,Qt.AlignRight) - newItem.setTextAlignment(self.I_PARAS,Qt.AlignRight) + nTitle = str(tEntry[0]) + tTitle = tEntry[2] + tLevel = str(tEntry[1]) + tLabel = nwItem.itemName + tItem = self._createTreeItem(tHandle, nTitle, tTitle, tLevel, tLabel) if tEntry[1] == 1: - currTitle = newItem - self.mainTree.addTopLevelItem(newItem) + currTitle = tItem + self.mainTree.addTopLevelItem(tItem) elif tEntry[1] == 2: if currTitle is None: - self.mainTree.addTopLevelItem(newItem) + self.mainTree.addTopLevelItem(tItem) else: - currTitle.addChild(newItem) - currChapter = newItem + currTitle.addChild(tItem) + currChapter = tItem elif tEntry[1] == 3: if currChapter is None: if currTitle is None: - self.mainTree.addTopLevelItem(newItem) + self.mainTree.addTopLevelItem(tItem) else: - currTitle.addChild(newItem) + currTitle.addChild(tItem) else: - currChapter.addChild(newItem) - currScene = newItem + currChapter.addChild(tItem) + currScene = tItem elif tEntry[1] == 4: if currScene is None: if currChapter is None: if currTitle is None: - self.mainTree.addTopLevelItem(newItem) + self.mainTree.addTopLevelItem(tItem) else: - currTitle.addChild(newItem) + currTitle.addChild(tItem) else: - currChapter.addChild(newItem) + currChapter.addChild(tItem) else: - currScene.addChild(newItem) + currScene.addChild(tItem) - newItem.setExpanded(True) + tItem.setExpanded(True) return + ## + # Internal Functions + ## + + def _createTreeItem(self, tHandle, nTitle, tTitle, tLevel, tLabel): + + newItem = QTreeWidgetItem() + newItem.setText(self.I_TITLE, tTitle) + newItem.setText(self.I_LEVEL, tLevel) + newItem.setText(self.I_LABEL, tLabel) + newItem.setText(self.I_LINE, nTitle) + + cC, wC, pC = self.theIndex.getCounts(tHandle, nTitle) + newItem.setText(self.I_CCOUNT, str(cC)) + newItem.setText(self.I_WCOUNT, str(wC)) + newItem.setText(self.I_PCOUNT, str(pC)) + newItem.setTextAlignment(self.I_CCOUNT,Qt.AlignRight) + newItem.setTextAlignment(self.I_WCOUNT,Qt.AlignRight) + newItem.setTextAlignment(self.I_PCOUNT,Qt.AlignRight) + + povList = [] + charList = [] + plotList = [] + timeList = [] + worldList = [] + objectList = [] + entityList = [] + customList = [] + for tKey, tTag in self.theIndex.getReferences(tHandle, nTitle): + if tKey == nwKeyWords.POV_KEY: + povList.append(tTag) + elif tKey == nwKeyWords.CHAR_KEY: + charList.append(tTag) + elif tKey == nwKeyWords.PLOT_KEY: + plotList.append(tTag) + elif tKey == nwKeyWords.TIME_KEY: + timeList.append(tTag) + elif tKey == nwKeyWords.WORLD_KEY: + worldList.append(tTag) + elif tKey == nwKeyWords.OBJECT_KEY: + objectList.append(tTag) + elif tKey == nwKeyWords.ENTITY_KEY: + entityList.append(tTag) + elif tKey == nwKeyWords.CUSTOM_KEY: + customList.append(tTag) + + newItem.setText(self.I_POV, ", ".join(povList)) + newItem.setText(self.I_CHAR, ", ".join(charList)) + newItem.setText(self.I_PLOT, ", ".join(plotList)) + newItem.setText(self.I_TIME, ", ".join(timeList)) + newItem.setText(self.I_WORLD, ", ".join(worldList)) + newItem.setText(self.I_OBJECT, ", ".join(objectList)) + newItem.setText(self.I_ENTITY, ", ".join(entityList)) + newItem.setText(self.I_CUSTOM, ", ".join(customList)) + + return newItem + + # END Class GuiProjectOutline diff --git a/nw/project/index.py b/nw/project/index.py index e9bb2661..0378adc2 100644 --- a/nw/project/index.py +++ b/nw/project/index.py @@ -475,29 +475,44 @@ class NWIndex(): # Extract Data ## - def getCounts(self, tHandle, tLine=None): + def getCounts(self, tHandle, nTitle=None): """Returns the counts for a file, or a section of a file - starting at line tLine. + starting at title nTitle. """ cC = 0 wC = 0 pC = 0 - if tLine is None: + if nTitle is None: if tHandle in self.fileCounts: cC = self.fileCounts[tHandle][0] wC = self.fileCounts[tHandle][1] pC = self.fileCounts[tHandle][2] else: if tHandle in self.textCounts: - if tLine in self.textCounts[tHandle]: - cC = self.textCounts[tHandle][tLine][0] - wC = self.textCounts[tHandle][tLine][1] - pC = self.textCounts[tHandle][tLine][2] + if nTitle in self.textCounts[tHandle]: + cC = self.textCounts[tHandle][nTitle][0] + wC = self.textCounts[tHandle][nTitle][1] + pC = self.textCounts[tHandle][nTitle][2] return cC, wC, pC + def getReferences(self, tHandle, tTitle=None): + """Extract all references made in a file, and optionally title + section. tTitle must be a string. + """ + + theRefs = [] + if tHandle not in self.refIndex: + return theRefs + + for nLine, tKey, tTag, nTitle in self.refIndex[tHandle]: + if tTitle is None or tTitle == str(nTitle): + theRefs.append((tKey, tTag)) + + return theRefs + def buildNovelList(self): """Build a list of the content of the novel. """