diff --git a/novelwriter/core/index.py b/novelwriter/core/index.py index fdedb526..39c70c81 100644 --- a/novelwriter/core/index.py +++ b/novelwriter/core/index.py @@ -104,7 +104,7 @@ class NWIndex: """ self.clearIndex() for nwItem in self._project.tree: - if nwItem is not None and nwItem.isFileType(): + if nwItem.isFileType(): tHandle = nwItem.itemHandle theDoc = self._project.storage.getDocument(tHandle) self.scanText(tHandle, theDoc.readDocument() or "") @@ -794,8 +794,6 @@ class ItemIndex: a given root handle, or for all if root handle is None. """ for tItem in self._project.tree: - if tItem is None: - continue if tItem.isNoteLayout(): continue if skipExcl and not tItem.isActive: diff --git a/novelwriter/core/tree.py b/novelwriter/core/tree.py index 1f9960de..c71b1804 100644 --- a/novelwriter/core/tree.py +++ b/novelwriter/core/tree.py @@ -50,7 +50,6 @@ class NWTree: self._treeRoots = {} # The root items of the tree self._trashRoot = None # The handle of the trash root folder self._archRoot = None # The handle of the archive root folder - self._theIndex = 0 # The current iterator index self._treeChanged = False # True if tree structure has changed return @@ -62,12 +61,11 @@ class NWTree: def clear(self): """Clear the item tree entirely. """ - self._projTree = {} - self._treeOrder = [] - self._treeRoots = {} - self._trashRoot = None - self._archRoot = None - self._theIndex = 0 + self._projTree = {} + self._treeOrder = [] + self._treeRoots = {} + self._trashRoot = None + self._archRoot = None self._treeChanged = False return @@ -278,7 +276,7 @@ class NWTree: """ for tHandle in self._treeOrder: nwItem = self.__getitem__(tHandle) - if nwItem is not None and nwItem.isRootType(): + if isinstance(nwItem, NWItem) and nwItem.isRootType(): if itemClass is None or nwItem.itemClass == itemClass: yield tHandle, nwItem return @@ -365,22 +363,18 @@ class NWTree: return True ## - # Meta Methods + # Special Methods ## def __len__(self): - """Return the length counter. Does not check that it is correct! + """The number of items in the project. """ return len(self._treeOrder) def __bool__(self): - """Returns True if the tree has any entries. + """True if there are any items in the project. """ - return len(self._treeOrder) > 0 - - ## - # Item Access Methods - ## + return bool(self._treeOrder) def __getitem__(self, tHandle): """Return a project item based on its handle. Returns None if @@ -417,25 +411,14 @@ class NWTree: """ return tHandle in self._treeOrder - ## - # Iterator Methods - ## - def __iter__(self): - """Initiates the iterator. + """Iterate through project items. """ - self._theIndex = 0 - return self - - def __next__(self): - """Returns the item from the next entry in the _treeOrder list. - """ - if self._theIndex < len(self._treeOrder): - theItem = self.__getitem__(self._treeOrder[self._theIndex]) - self._theIndex += 1 - return theItem - else: - raise StopIteration + for tHandle in self._treeOrder: + tItem = self._projTree.get(tHandle) + if isinstance(tItem, NWItem): + yield tItem + return ## # Internal Functions diff --git a/novelwriter/gui/noveltree.py b/novelwriter/gui/noveltree.py index 12ff53ad..cc809e17 100644 --- a/novelwriter/gui/noveltree.py +++ b/novelwriter/gui/noveltree.py @@ -605,6 +605,22 @@ class GuiNovelTree(QTreeWidget): self.clearSelection() return + def resizeEvent(self, event): + """Elide labels in the extra column. + """ + super().resizeEvent(event) + newW = event.size().width() + oldW = event.oldSize().width() + if newW != oldW: + eliW = int(0.25 * newW) + fMetric = self.fontMetrics() + for i in range(self.topLevelItemCount()): + trItem = self.topLevelItem(i) + if isinstance(trItem, QTreeWidgetItem): + lastText = trItem.data(self.C_EXTRA, Qt.UserRole) + trItem.setText(self.C_EXTRA, fMetric.elidedText(lastText, Qt.ElideRight, eliW)) + return + ## # Private Slots ## @@ -686,10 +702,12 @@ class GuiNovelTree(QTreeWidget): trItem.setData(self.C_MORE, Qt.DecorationRole, self._pMore) # Custom column + mW = int(0.25 * self.viewport().width()) lastText, toolTip = self._getLastColumnText(tHandle, sTitle) - trItem.setText(self.C_EXTRA, lastText) - if lastText: - trItem.setToolTip(self.C_EXTRA, toolTip) + elideText = self.fontMetrics().elidedText(lastText, Qt.ElideRight, mW) + trItem.setText(self.C_EXTRA, elideText) + trItem.setData(self.C_EXTRA, Qt.UserRole, lastText) + trItem.setToolTip(self.C_EXTRA, toolTip) return @@ -699,18 +717,24 @@ class GuiNovelTree(QTreeWidget): if self._lastCol == NovelTreeColumn.HIDDEN: return "", "" + refData = [] + refName = "" theRefs = self.theProject.index.getReferences(tHandle, sTitle) if self._lastCol == NovelTreeColumn.POV: - newText = ", ".join(theRefs[nwKeyWords.POV_KEY]) - return newText, f"{self._povLabel}: {newText}" + refData = theRefs[nwKeyWords.POV_KEY] + refName = self._povLabel elif self._lastCol == NovelTreeColumn.FOCUS: - newText = ", ".join(theRefs[nwKeyWords.FOCUS_KEY]) - return newText, f"{self._focLabel}: {newText}" + refData = theRefs[nwKeyWords.FOCUS_KEY] + refName = self._focLabel elif self._lastCol == NovelTreeColumn.PLOT: - newText = ", ".join(theRefs[nwKeyWords.PLOT_KEY]) - return newText, f"{self._pltLabel}: {newText}" + refData = theRefs[nwKeyWords.PLOT_KEY] + refName = self._pltLabel + + if refData: + toolText = ", ".join(refData) + return refData[0], f"{refName}: {toolText}" return "", "" diff --git a/novelwriter/gui/outline.py b/novelwriter/gui/outline.py index 98d3b36e..ef898237 100644 --- a/novelwriter/gui/outline.py +++ b/novelwriter/gui/outline.py @@ -73,6 +73,7 @@ class GuiOutlineView(QWidget): self.splitOutline = QSplitter(Qt.Vertical) self.splitOutline.addWidget(self.outlineTree) self.splitOutline.addWidget(self.outlineData) + self.splitOutline.setOpaqueResize(False) self.splitOutline.setSizes(self.mainConf.outlinePanePos) # Assemble diff --git a/novelwriter/guimain.py b/novelwriter/guimain.py index 3a5d278d..7e55ecf4 100644 --- a/novelwriter/guimain.py +++ b/novelwriter/guimain.py @@ -140,12 +140,14 @@ class GuiMain(QMainWindow): self.splitView.addWidget(self.docViewer) self.splitView.addWidget(self.viewMeta) self.splitView.setHandleWidth(hWd) + self.splitView.setOpaqueResize(False) self.splitView.setSizes(self.mainConf.viewPanePos) # Splitter : Document Editor / Document Viewer self.splitDocs = QSplitter(Qt.Horizontal) self.splitDocs.addWidget(self.docEditor) self.splitDocs.addWidget(self.splitView) + self.splitDocs.setOpaqueResize(False) self.splitDocs.setHandleWidth(hWd) # Splitter : Project Tree / Main Tabs @@ -153,6 +155,7 @@ class GuiMain(QMainWindow): self.splitMain.setContentsMargins(0, 0, 0, 0) self.splitMain.addWidget(self.treePane) self.splitMain.addWidget(self.splitDocs) + self.splitMain.setOpaqueResize(False) self.splitMain.setHandleWidth(hWd) self.splitMain.setSizes(self.mainConf.mainPanePos) @@ -628,7 +631,7 @@ class GuiMain(QMainWindow): fHandle = None # The first file handle we encounter foundIt = False # We've found tHandle, pick the next we see for tItem in self.theProject.tree: - if tItem is None or not tItem.isFileType(): + if not tItem.isFileType(): continue if fHandle is None: fHandle = tItem.itemHandle diff --git a/tests/test_gui/test_gui_noveltree.py b/tests/test_gui/test_gui_noveltree.py index 15101972..c75a29f3 100644 --- a/tests/test_gui/test_gui_noveltree.py +++ b/tests/test_gui/test_gui_noveltree.py @@ -144,11 +144,11 @@ def testGuiNovelTree_TreeItems(qtbot, monkeypatch, nwGUI, projPath, mockRnd): assert novelTree.lastColType == NovelTreeColumn.HIDDEN assert novelTree._getLastColumnText(C.hSceneDoc, "T0001") == ("", "") - novelBar.setLastColType(NovelTreeColumn.POV) + novelBar.setLastColType(NovelTreeColumn.PLOT) assert novelTree.isColumnHidden(novelTree.C_EXTRA) is False - assert novelTree.lastColType == NovelTreeColumn.POV + assert novelTree.lastColType == NovelTreeColumn.PLOT assert novelTree._getLastColumnText(C.hSceneDoc, "T0001") == ( - "Jane", "Point of View: Jane" + "", "" ) novelBar.setLastColType(NovelTreeColumn.FOCUS) @@ -158,16 +158,20 @@ def testGuiNovelTree_TreeItems(qtbot, monkeypatch, nwGUI, projPath, mockRnd): "Jane", "Focus: Jane" ) - novelBar.setLastColType(NovelTreeColumn.PLOT) + novelBar.setLastColType(NovelTreeColumn.POV) assert novelTree.isColumnHidden(novelTree.C_EXTRA) is False - assert novelTree.lastColType == NovelTreeColumn.PLOT + assert novelTree.lastColType == NovelTreeColumn.POV assert novelTree._getLastColumnText(C.hSceneDoc, "T0001") == ( - "", "Plot: " + "Jane", "Point of View: Jane" ) novelTree._lastCol = None assert novelTree._getLastColumnText("0000000000000", "T0000") == ("", "") + # This forces the resizeEvent function to process labels + spSize = nwGUI.splitMain.sizes() + nwGUI.splitMain.setSizes([spSize[0] + 10, spSize[1] - 10]) + # Item Meta # =========