Merge branch 'main' into actions
This commit is contained in:
@@ -104,7 +104,7 @@ class NWIndex:
|
|||||||
"""
|
"""
|
||||||
self.clearIndex()
|
self.clearIndex()
|
||||||
for nwItem in self._project.tree:
|
for nwItem in self._project.tree:
|
||||||
if nwItem is not None and nwItem.isFileType():
|
if nwItem.isFileType():
|
||||||
tHandle = nwItem.itemHandle
|
tHandle = nwItem.itemHandle
|
||||||
theDoc = self._project.storage.getDocument(tHandle)
|
theDoc = self._project.storage.getDocument(tHandle)
|
||||||
self.scanText(tHandle, theDoc.readDocument() or "")
|
self.scanText(tHandle, theDoc.readDocument() or "")
|
||||||
@@ -794,8 +794,6 @@ class ItemIndex:
|
|||||||
a given root handle, or for all if root handle is None.
|
a given root handle, or for all if root handle is None.
|
||||||
"""
|
"""
|
||||||
for tItem in self._project.tree:
|
for tItem in self._project.tree:
|
||||||
if tItem is None:
|
|
||||||
continue
|
|
||||||
if tItem.isNoteLayout():
|
if tItem.isNoteLayout():
|
||||||
continue
|
continue
|
||||||
if skipExcl and not tItem.isActive:
|
if skipExcl and not tItem.isActive:
|
||||||
|
|||||||
+16
-33
@@ -50,7 +50,6 @@ class NWTree:
|
|||||||
self._treeRoots = {} # The root items of the tree
|
self._treeRoots = {} # The root items of the tree
|
||||||
self._trashRoot = None # The handle of the trash root folder
|
self._trashRoot = None # The handle of the trash root folder
|
||||||
self._archRoot = None # The handle of the archive 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
|
self._treeChanged = False # True if tree structure has changed
|
||||||
|
|
||||||
return
|
return
|
||||||
@@ -62,12 +61,11 @@ class NWTree:
|
|||||||
def clear(self):
|
def clear(self):
|
||||||
"""Clear the item tree entirely.
|
"""Clear the item tree entirely.
|
||||||
"""
|
"""
|
||||||
self._projTree = {}
|
self._projTree = {}
|
||||||
self._treeOrder = []
|
self._treeOrder = []
|
||||||
self._treeRoots = {}
|
self._treeRoots = {}
|
||||||
self._trashRoot = None
|
self._trashRoot = None
|
||||||
self._archRoot = None
|
self._archRoot = None
|
||||||
self._theIndex = 0
|
|
||||||
self._treeChanged = False
|
self._treeChanged = False
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -278,7 +276,7 @@ class NWTree:
|
|||||||
"""
|
"""
|
||||||
for tHandle in self._treeOrder:
|
for tHandle in self._treeOrder:
|
||||||
nwItem = self.__getitem__(tHandle)
|
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:
|
if itemClass is None or nwItem.itemClass == itemClass:
|
||||||
yield tHandle, nwItem
|
yield tHandle, nwItem
|
||||||
return
|
return
|
||||||
@@ -365,22 +363,18 @@ class NWTree:
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
##
|
##
|
||||||
# Meta Methods
|
# Special Methods
|
||||||
##
|
##
|
||||||
|
|
||||||
def __len__(self):
|
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)
|
return len(self._treeOrder)
|
||||||
|
|
||||||
def __bool__(self):
|
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
|
return bool(self._treeOrder)
|
||||||
|
|
||||||
##
|
|
||||||
# Item Access Methods
|
|
||||||
##
|
|
||||||
|
|
||||||
def __getitem__(self, tHandle):
|
def __getitem__(self, tHandle):
|
||||||
"""Return a project item based on its handle. Returns None if
|
"""Return a project item based on its handle. Returns None if
|
||||||
@@ -417,25 +411,14 @@ class NWTree:
|
|||||||
"""
|
"""
|
||||||
return tHandle in self._treeOrder
|
return tHandle in self._treeOrder
|
||||||
|
|
||||||
##
|
|
||||||
# Iterator Methods
|
|
||||||
##
|
|
||||||
|
|
||||||
def __iter__(self):
|
def __iter__(self):
|
||||||
"""Initiates the iterator.
|
"""Iterate through project items.
|
||||||
"""
|
"""
|
||||||
self._theIndex = 0
|
for tHandle in self._treeOrder:
|
||||||
return self
|
tItem = self._projTree.get(tHandle)
|
||||||
|
if isinstance(tItem, NWItem):
|
||||||
def __next__(self):
|
yield tItem
|
||||||
"""Returns the item from the next entry in the _treeOrder list.
|
return
|
||||||
"""
|
|
||||||
if self._theIndex < len(self._treeOrder):
|
|
||||||
theItem = self.__getitem__(self._treeOrder[self._theIndex])
|
|
||||||
self._theIndex += 1
|
|
||||||
return theItem
|
|
||||||
else:
|
|
||||||
raise StopIteration
|
|
||||||
|
|
||||||
##
|
##
|
||||||
# Internal Functions
|
# Internal Functions
|
||||||
|
|||||||
@@ -605,6 +605,22 @@ class GuiNovelTree(QTreeWidget):
|
|||||||
self.clearSelection()
|
self.clearSelection()
|
||||||
return
|
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
|
# Private Slots
|
||||||
##
|
##
|
||||||
@@ -686,10 +702,12 @@ class GuiNovelTree(QTreeWidget):
|
|||||||
trItem.setData(self.C_MORE, Qt.DecorationRole, self._pMore)
|
trItem.setData(self.C_MORE, Qt.DecorationRole, self._pMore)
|
||||||
|
|
||||||
# Custom column
|
# Custom column
|
||||||
|
mW = int(0.25 * self.viewport().width())
|
||||||
lastText, toolTip = self._getLastColumnText(tHandle, sTitle)
|
lastText, toolTip = self._getLastColumnText(tHandle, sTitle)
|
||||||
trItem.setText(self.C_EXTRA, lastText)
|
elideText = self.fontMetrics().elidedText(lastText, Qt.ElideRight, mW)
|
||||||
if lastText:
|
trItem.setText(self.C_EXTRA, elideText)
|
||||||
trItem.setToolTip(self.C_EXTRA, toolTip)
|
trItem.setData(self.C_EXTRA, Qt.UserRole, lastText)
|
||||||
|
trItem.setToolTip(self.C_EXTRA, toolTip)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -699,18 +717,24 @@ class GuiNovelTree(QTreeWidget):
|
|||||||
if self._lastCol == NovelTreeColumn.HIDDEN:
|
if self._lastCol == NovelTreeColumn.HIDDEN:
|
||||||
return "", ""
|
return "", ""
|
||||||
|
|
||||||
|
refData = []
|
||||||
|
refName = ""
|
||||||
theRefs = self.theProject.index.getReferences(tHandle, sTitle)
|
theRefs = self.theProject.index.getReferences(tHandle, sTitle)
|
||||||
if self._lastCol == NovelTreeColumn.POV:
|
if self._lastCol == NovelTreeColumn.POV:
|
||||||
newText = ", ".join(theRefs[nwKeyWords.POV_KEY])
|
refData = theRefs[nwKeyWords.POV_KEY]
|
||||||
return newText, f"{self._povLabel}: {newText}"
|
refName = self._povLabel
|
||||||
|
|
||||||
elif self._lastCol == NovelTreeColumn.FOCUS:
|
elif self._lastCol == NovelTreeColumn.FOCUS:
|
||||||
newText = ", ".join(theRefs[nwKeyWords.FOCUS_KEY])
|
refData = theRefs[nwKeyWords.FOCUS_KEY]
|
||||||
return newText, f"{self._focLabel}: {newText}"
|
refName = self._focLabel
|
||||||
|
|
||||||
elif self._lastCol == NovelTreeColumn.PLOT:
|
elif self._lastCol == NovelTreeColumn.PLOT:
|
||||||
newText = ", ".join(theRefs[nwKeyWords.PLOT_KEY])
|
refData = theRefs[nwKeyWords.PLOT_KEY]
|
||||||
return newText, f"{self._pltLabel}: {newText}"
|
refName = self._pltLabel
|
||||||
|
|
||||||
|
if refData:
|
||||||
|
toolText = ", ".join(refData)
|
||||||
|
return refData[0], f"{refName}: {toolText}"
|
||||||
|
|
||||||
return "", ""
|
return "", ""
|
||||||
|
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ class GuiOutlineView(QWidget):
|
|||||||
self.splitOutline = QSplitter(Qt.Vertical)
|
self.splitOutline = QSplitter(Qt.Vertical)
|
||||||
self.splitOutline.addWidget(self.outlineTree)
|
self.splitOutline.addWidget(self.outlineTree)
|
||||||
self.splitOutline.addWidget(self.outlineData)
|
self.splitOutline.addWidget(self.outlineData)
|
||||||
|
self.splitOutline.setOpaqueResize(False)
|
||||||
self.splitOutline.setSizes(self.mainConf.outlinePanePos)
|
self.splitOutline.setSizes(self.mainConf.outlinePanePos)
|
||||||
|
|
||||||
# Assemble
|
# Assemble
|
||||||
|
|||||||
@@ -140,12 +140,14 @@ class GuiMain(QMainWindow):
|
|||||||
self.splitView.addWidget(self.docViewer)
|
self.splitView.addWidget(self.docViewer)
|
||||||
self.splitView.addWidget(self.viewMeta)
|
self.splitView.addWidget(self.viewMeta)
|
||||||
self.splitView.setHandleWidth(hWd)
|
self.splitView.setHandleWidth(hWd)
|
||||||
|
self.splitView.setOpaqueResize(False)
|
||||||
self.splitView.setSizes(self.mainConf.viewPanePos)
|
self.splitView.setSizes(self.mainConf.viewPanePos)
|
||||||
|
|
||||||
# Splitter : Document Editor / Document Viewer
|
# Splitter : Document Editor / Document Viewer
|
||||||
self.splitDocs = QSplitter(Qt.Horizontal)
|
self.splitDocs = QSplitter(Qt.Horizontal)
|
||||||
self.splitDocs.addWidget(self.docEditor)
|
self.splitDocs.addWidget(self.docEditor)
|
||||||
self.splitDocs.addWidget(self.splitView)
|
self.splitDocs.addWidget(self.splitView)
|
||||||
|
self.splitDocs.setOpaqueResize(False)
|
||||||
self.splitDocs.setHandleWidth(hWd)
|
self.splitDocs.setHandleWidth(hWd)
|
||||||
|
|
||||||
# Splitter : Project Tree / Main Tabs
|
# Splitter : Project Tree / Main Tabs
|
||||||
@@ -153,6 +155,7 @@ class GuiMain(QMainWindow):
|
|||||||
self.splitMain.setContentsMargins(0, 0, 0, 0)
|
self.splitMain.setContentsMargins(0, 0, 0, 0)
|
||||||
self.splitMain.addWidget(self.treePane)
|
self.splitMain.addWidget(self.treePane)
|
||||||
self.splitMain.addWidget(self.splitDocs)
|
self.splitMain.addWidget(self.splitDocs)
|
||||||
|
self.splitMain.setOpaqueResize(False)
|
||||||
self.splitMain.setHandleWidth(hWd)
|
self.splitMain.setHandleWidth(hWd)
|
||||||
self.splitMain.setSizes(self.mainConf.mainPanePos)
|
self.splitMain.setSizes(self.mainConf.mainPanePos)
|
||||||
|
|
||||||
@@ -628,7 +631,7 @@ class GuiMain(QMainWindow):
|
|||||||
fHandle = None # The first file handle we encounter
|
fHandle = None # The first file handle we encounter
|
||||||
foundIt = False # We've found tHandle, pick the next we see
|
foundIt = False # We've found tHandle, pick the next we see
|
||||||
for tItem in self.theProject.tree:
|
for tItem in self.theProject.tree:
|
||||||
if tItem is None or not tItem.isFileType():
|
if not tItem.isFileType():
|
||||||
continue
|
continue
|
||||||
if fHandle is None:
|
if fHandle is None:
|
||||||
fHandle = tItem.itemHandle
|
fHandle = tItem.itemHandle
|
||||||
|
|||||||
@@ -144,11 +144,11 @@ def testGuiNovelTree_TreeItems(qtbot, monkeypatch, nwGUI, projPath, mockRnd):
|
|||||||
assert novelTree.lastColType == NovelTreeColumn.HIDDEN
|
assert novelTree.lastColType == NovelTreeColumn.HIDDEN
|
||||||
assert novelTree._getLastColumnText(C.hSceneDoc, "T0001") == ("", "")
|
assert novelTree._getLastColumnText(C.hSceneDoc, "T0001") == ("", "")
|
||||||
|
|
||||||
novelBar.setLastColType(NovelTreeColumn.POV)
|
novelBar.setLastColType(NovelTreeColumn.PLOT)
|
||||||
assert novelTree.isColumnHidden(novelTree.C_EXTRA) is False
|
assert novelTree.isColumnHidden(novelTree.C_EXTRA) is False
|
||||||
assert novelTree.lastColType == NovelTreeColumn.POV
|
assert novelTree.lastColType == NovelTreeColumn.PLOT
|
||||||
assert novelTree._getLastColumnText(C.hSceneDoc, "T0001") == (
|
assert novelTree._getLastColumnText(C.hSceneDoc, "T0001") == (
|
||||||
"Jane", "Point of View: Jane"
|
"", ""
|
||||||
)
|
)
|
||||||
|
|
||||||
novelBar.setLastColType(NovelTreeColumn.FOCUS)
|
novelBar.setLastColType(NovelTreeColumn.FOCUS)
|
||||||
@@ -158,16 +158,20 @@ def testGuiNovelTree_TreeItems(qtbot, monkeypatch, nwGUI, projPath, mockRnd):
|
|||||||
"Jane", "Focus: Jane"
|
"Jane", "Focus: Jane"
|
||||||
)
|
)
|
||||||
|
|
||||||
novelBar.setLastColType(NovelTreeColumn.PLOT)
|
novelBar.setLastColType(NovelTreeColumn.POV)
|
||||||
assert novelTree.isColumnHidden(novelTree.C_EXTRA) is False
|
assert novelTree.isColumnHidden(novelTree.C_EXTRA) is False
|
||||||
assert novelTree.lastColType == NovelTreeColumn.PLOT
|
assert novelTree.lastColType == NovelTreeColumn.POV
|
||||||
assert novelTree._getLastColumnText(C.hSceneDoc, "T0001") == (
|
assert novelTree._getLastColumnText(C.hSceneDoc, "T0001") == (
|
||||||
"", "Plot: "
|
"Jane", "Point of View: Jane"
|
||||||
)
|
)
|
||||||
|
|
||||||
novelTree._lastCol = None
|
novelTree._lastCol = None
|
||||||
assert novelTree._getLastColumnText("0000000000000", "T0000") == ("", "")
|
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
|
# Item Meta
|
||||||
# =========
|
# =========
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user