Merge branch 'release'
This commit is contained in:
@@ -121,7 +121,7 @@ class NWStatus:
|
|||||||
return key
|
return key
|
||||||
|
|
||||||
def update(self, update: list[tuple[str | None, StatusEntry]]) -> None:
|
def update(self, update: list[tuple[str | None, StatusEntry]]) -> None:
|
||||||
"""Update the list of statuses, and from removed list."""
|
"""Update the list of statuses."""
|
||||||
self._store.clear()
|
self._store.clear()
|
||||||
for key, entry in update:
|
for key, entry in update:
|
||||||
self._store[self._checkKey(key)] = entry
|
self._store[self._checkKey(key)] = entry
|
||||||
@@ -130,6 +130,9 @@ class NWStatus:
|
|||||||
if self._default not in self._store:
|
if self._default not in self._store:
|
||||||
self._default = next(iter(self._store)) if self._store else None
|
self._default = next(iter(self._store)) if self._store else None
|
||||||
|
|
||||||
|
# Emit the change signal
|
||||||
|
SHARED.projectSingalProxy({"event": "statusLabels", "kind": self._prefix})
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
def check(self, value: str) -> str:
|
def check(self, value: str) -> str:
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ class GuiProjectSettings(NDialog):
|
|||||||
PAGE_IMPORT = 2
|
PAGE_IMPORT = 2
|
||||||
PAGE_REPLACE = 3
|
PAGE_REPLACE = 3
|
||||||
|
|
||||||
newProjectSettingsReady = pyqtSignal(bool)
|
newProjectSettingsReady = pyqtSignal()
|
||||||
|
|
||||||
def __init__(self, parent: QWidget, gotoPage: int = PAGE_SETTINGS) -> None:
|
def __init__(self, parent: QWidget, gotoPage: int = PAGE_SETTINGS) -> None:
|
||||||
super().__init__(parent=parent)
|
super().__init__(parent=parent)
|
||||||
@@ -175,7 +175,7 @@ class GuiProjectSettings(NDialog):
|
|||||||
projAuthor = self.settingsPage.projAuthor.text()
|
projAuthor = self.settingsPage.projAuthor.text()
|
||||||
projLang = self.settingsPage.projLang.currentData()
|
projLang = self.settingsPage.projLang.currentData()
|
||||||
spellLang = self.settingsPage.spellLang.currentData()
|
spellLang = self.settingsPage.spellLang.currentData()
|
||||||
doBackup = not self.settingsPage.doBackup.isChecked()
|
doBackup = not self.settingsPage.noBackup.isChecked()
|
||||||
|
|
||||||
project.data.setName(projName)
|
project.data.setName(projName)
|
||||||
project.data.setAuthor(projAuthor)
|
project.data.setAuthor(projAuthor)
|
||||||
@@ -183,23 +183,19 @@ class GuiProjectSettings(NDialog):
|
|||||||
project.data.setSpellLang(spellLang)
|
project.data.setSpellLang(spellLang)
|
||||||
project.setProjectLang(projLang)
|
project.setProjectLang(projLang)
|
||||||
|
|
||||||
rebuildTrees = False
|
|
||||||
|
|
||||||
if self.statusPage.changed:
|
if self.statusPage.changed:
|
||||||
logger.debug("Updating status labels")
|
logger.debug("Updating status labels")
|
||||||
project.data.itemStatus.update(self.statusPage.getNewList())
|
project.data.itemStatus.update(self.statusPage.getNewList())
|
||||||
rebuildTrees = True
|
|
||||||
|
|
||||||
if self.importPage.changed:
|
if self.importPage.changed:
|
||||||
logger.debug("Updating importance labels")
|
logger.debug("Updating importance labels")
|
||||||
project.data.itemImport.update(self.importPage.getNewList())
|
project.data.itemImport.update(self.importPage.getNewList())
|
||||||
rebuildTrees = True
|
|
||||||
|
|
||||||
if self.replacePage.changed:
|
if self.replacePage.changed:
|
||||||
logger.debug("Updating auto-replace settings")
|
logger.debug("Updating auto-replace settings")
|
||||||
project.data.setAutoReplace(self.replacePage.getNewList())
|
project.data.setAutoReplace(self.replacePage.getNewList())
|
||||||
|
|
||||||
self.newProjectSettingsReady.emit(rebuildTrees)
|
self.newProjectSettingsReady.emit()
|
||||||
QApplication.processEvents()
|
QApplication.processEvents()
|
||||||
self.close()
|
self.close()
|
||||||
|
|
||||||
@@ -289,10 +285,10 @@ class _SettingsPage(NScrollableForm):
|
|||||||
self.spellLang.setCurrentIndex(idx)
|
self.spellLang.setCurrentIndex(idx)
|
||||||
|
|
||||||
# Backup on Close
|
# Backup on Close
|
||||||
self.doBackup = NSwitch(self)
|
self.noBackup = NSwitch(self)
|
||||||
self.doBackup.setChecked(not data.doBackup)
|
self.noBackup.setChecked(not data.doBackup)
|
||||||
self.addRow(
|
self.addRow(
|
||||||
self.tr("Disable backup on close"), self.doBackup,
|
self.tr("Disable backup on close"), self.noBackup,
|
||||||
self.tr("Overrides main preferences.")
|
self.tr("Overrides main preferences.")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -189,6 +189,13 @@ class GuiDocViewerPanel(QWidget):
|
|||||||
self._updateTabVisibility()
|
self._updateTabVisibility()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@pyqtSlot(str)
|
||||||
|
def updateStatusLabels(self, kind: str) -> None:
|
||||||
|
"""Update the importance labels."""
|
||||||
|
if kind == "i":
|
||||||
|
self._loadAllTags()
|
||||||
|
return
|
||||||
|
|
||||||
##
|
##
|
||||||
# Private Slots
|
# Private Slots
|
||||||
##
|
##
|
||||||
|
|||||||
+66
-49
@@ -166,6 +166,7 @@ class GuiProjectView(QWidget):
|
|||||||
|
|
||||||
def openProjectTasks(self) -> None:
|
def openProjectTasks(self) -> None:
|
||||||
"""Run open project tasks."""
|
"""Run open project tasks."""
|
||||||
|
self.populateTree()
|
||||||
self.projBar.buildQuickLinksMenu()
|
self.projBar.buildQuickLinksMenu()
|
||||||
self.projBar.setEnabled(True)
|
self.projBar.setEnabled(True)
|
||||||
return
|
return
|
||||||
@@ -213,7 +214,8 @@ class GuiProjectView(QWidget):
|
|||||||
@pyqtSlot(str)
|
@pyqtSlot(str)
|
||||||
def updateItemValues(self, tHandle: str) -> None:
|
def updateItemValues(self, tHandle: str) -> None:
|
||||||
"""Update tree item."""
|
"""Update tree item."""
|
||||||
self.projTree.setTreeItemValues(tHandle)
|
if nwItem := SHARED.project.tree[tHandle]:
|
||||||
|
self.projTree.setTreeItemValues(nwItem)
|
||||||
return
|
return
|
||||||
|
|
||||||
@pyqtSlot(str)
|
@pyqtSlot(str)
|
||||||
@@ -242,6 +244,12 @@ class GuiProjectView(QWidget):
|
|||||||
self.projTree.createNewNote(tag, itemClass)
|
self.projTree.createNewNote(tag, itemClass)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@pyqtSlot(str)
|
||||||
|
def refreshUserLabels(self, kind: str) -> None:
|
||||||
|
"""Refresh status or importance labels."""
|
||||||
|
self.projTree.refreshUserLabels(kind)
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
class GuiProjectToolBar(QWidget):
|
class GuiProjectToolBar(QWidget):
|
||||||
|
|
||||||
@@ -792,11 +800,11 @@ class GuiProjectTree(QTreeWidget):
|
|||||||
|
|
||||||
def renameTreeItem(self, tHandle: str, name: str = "") -> None:
|
def renameTreeItem(self, tHandle: str, name: str = "") -> None:
|
||||||
"""Open a dialog to edit the label of an item."""
|
"""Open a dialog to edit the label of an item."""
|
||||||
if tItem := SHARED.project.tree[tHandle]:
|
if nwItem := SHARED.project.tree[tHandle]:
|
||||||
newLabel, dlgOk = GuiEditLabel.getLabel(self, text=name or tItem.itemName)
|
newLabel, dlgOk = GuiEditLabel.getLabel(self, text=name or nwItem.itemName)
|
||||||
if dlgOk:
|
if dlgOk:
|
||||||
tItem.setName(newLabel)
|
nwItem.setName(newLabel)
|
||||||
self.setTreeItemValues(tHandle)
|
self.setTreeItemValues(nwItem)
|
||||||
self._alertTreeChange(tHandle, flush=False)
|
self._alertTreeChange(tHandle, flush=False)
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -1010,44 +1018,52 @@ class GuiProjectTree(QTreeWidget):
|
|||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def setTreeItemValues(self, tHandle: str) -> None:
|
def refreshUserLabels(self, kind: str) -> None:
|
||||||
"""Set the name and flag values for a tree item from a handle in
|
"""Refresh status or importance labels."""
|
||||||
the project tree. Does not trigger a tree change as the data is
|
if kind == "s":
|
||||||
already coming from the project tree.
|
for nwItem in SHARED.project.tree:
|
||||||
|
if nwItem.isNovelLike():
|
||||||
|
self.setTreeItemValues(nwItem)
|
||||||
|
elif kind == "i":
|
||||||
|
for nwItem in SHARED.project.tree:
|
||||||
|
if not nwItem.isNovelLike():
|
||||||
|
self.setTreeItemValues(nwItem)
|
||||||
|
return
|
||||||
|
|
||||||
|
def setTreeItemValues(self, nwItem: NWItem | None) -> None:
|
||||||
|
"""Set the name and flag values for a tree item in the project
|
||||||
|
tree. Does not trigger a tree change as the data is already
|
||||||
|
coming from project data.
|
||||||
"""
|
"""
|
||||||
trItem = self._getTreeItem(tHandle)
|
if isinstance(nwItem, NWItem) and (trItem := self._getTreeItem(nwItem.itemHandle)):
|
||||||
nwItem = SHARED.project.tree[tHandle]
|
itemStatus, statusIcon = nwItem.getImportStatus()
|
||||||
if trItem is None or nwItem is None:
|
hLevel = nwItem.mainHeading
|
||||||
return
|
itemIcon = SHARED.theme.getItemIcon(
|
||||||
|
nwItem.itemType, nwItem.itemClass, nwItem.itemLayout, hLevel
|
||||||
|
)
|
||||||
|
|
||||||
itemStatus, statusIcon = nwItem.getImportStatus()
|
trItem.setIcon(self.C_NAME, itemIcon)
|
||||||
hLevel = nwItem.mainHeading
|
trItem.setText(self.C_NAME, nwItem.itemName)
|
||||||
itemIcon = SHARED.theme.getItemIcon(
|
trItem.setIcon(self.C_STATUS, statusIcon)
|
||||||
nwItem.itemType, nwItem.itemClass, nwItem.itemLayout, hLevel
|
trItem.setToolTip(self.C_STATUS, itemStatus)
|
||||||
)
|
|
||||||
|
|
||||||
trItem.setIcon(self.C_NAME, itemIcon)
|
if nwItem.isFileType():
|
||||||
trItem.setText(self.C_NAME, nwItem.itemName)
|
iconName = "checked" if nwItem.isActive else "unchecked"
|
||||||
trItem.setIcon(self.C_STATUS, statusIcon)
|
toolTip = self.trActive if nwItem.isActive else self.trInactive
|
||||||
trItem.setToolTip(self.C_STATUS, itemStatus)
|
trItem.setToolTip(self.C_ACTIVE, toolTip)
|
||||||
|
else:
|
||||||
|
iconName = "noncheckable"
|
||||||
|
|
||||||
if nwItem.isFileType():
|
trItem.setIcon(self.C_ACTIVE, SHARED.theme.getIcon(iconName))
|
||||||
iconName = "checked" if nwItem.isActive else "unchecked"
|
|
||||||
toolTip = self.trActive if nwItem.isActive else self.trInactive
|
|
||||||
trItem.setToolTip(self.C_ACTIVE, toolTip)
|
|
||||||
else:
|
|
||||||
iconName = "noncheckable"
|
|
||||||
|
|
||||||
trItem.setIcon(self.C_ACTIVE, SHARED.theme.getIcon(iconName))
|
if CONFIG.emphLabels and nwItem.isDocumentLayout():
|
||||||
|
trFont = trItem.font(self.C_NAME)
|
||||||
|
trFont.setBold(hLevel == "H1" or hLevel == "H2")
|
||||||
|
trFont.setUnderline(hLevel == "H1")
|
||||||
|
trItem.setFont(self.C_NAME, trFont)
|
||||||
|
|
||||||
if CONFIG.emphLabels and nwItem.isDocumentLayout():
|
# Emit Refresh Signal
|
||||||
trFont = trItem.font(self.C_NAME)
|
self.itemRefreshed.emit(nwItem.itemHandle, nwItem, itemIcon)
|
||||||
trFont.setBold(hLevel == "H1" or hLevel == "H2")
|
|
||||||
trFont.setUnderline(hLevel == "H1")
|
|
||||||
trItem.setFont(self.C_NAME, trFont)
|
|
||||||
|
|
||||||
# Emit Refresh Signal
|
|
||||||
self.itemRefreshed.emit(tHandle, nwItem, itemIcon)
|
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -1353,7 +1369,8 @@ class GuiProjectTree(QTreeWidget):
|
|||||||
SHARED.project.index.deleteHandle(mHandle)
|
SHARED.project.index.deleteHandle(mHandle)
|
||||||
else:
|
else:
|
||||||
SHARED.project.index.reIndexHandle(mHandle)
|
SHARED.project.index.reIndexHandle(mHandle)
|
||||||
self.setTreeItemValues(mHandle)
|
if mItem := SHARED.project.tree[mHandle]:
|
||||||
|
self.setTreeItemValues(mItem)
|
||||||
|
|
||||||
# Update word count
|
# Update word count
|
||||||
self.propagateCount(tHandle, nwItemS.wordCount, countChildren=True)
|
self.propagateCount(tHandle, nwItemS.wordCount, countChildren=True)
|
||||||
@@ -1594,7 +1611,7 @@ class GuiProjectTree(QTreeWidget):
|
|||||||
|
|
||||||
self._treeMap[tHandle] = newItem
|
self._treeMap[tHandle] = newItem
|
||||||
self.propagateCount(tHandle, nwItem.wordCount, countChildren=True)
|
self.propagateCount(tHandle, nwItem.wordCount, countChildren=True)
|
||||||
self.setTreeItemValues(tHandle)
|
self.setTreeItemValues(nwItem)
|
||||||
newItem.setExpanded(nwItem.isExpanded)
|
newItem.setExpanded(nwItem.isExpanded)
|
||||||
|
|
||||||
return newItem
|
return newItem
|
||||||
@@ -1971,7 +1988,7 @@ class _TreeContextMenu(QMenu):
|
|||||||
def _toggleItemActive(self) -> None:
|
def _toggleItemActive(self) -> None:
|
||||||
"""Toggle the active status of an item."""
|
"""Toggle the active status of an item."""
|
||||||
self._item.setActive(not self._item.isActive)
|
self._item.setActive(not self._item.isActive)
|
||||||
self.projTree.setTreeItemValues(self._handle)
|
self.projTree.setTreeItemValues(self._item)
|
||||||
self.projTree._alertTreeChange(self._handle, flush=False)
|
self.projTree._alertTreeChange(self._handle, flush=False)
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -1984,14 +2001,14 @@ class _TreeContextMenu(QMenu):
|
|||||||
for tItem in self._items:
|
for tItem in self._items:
|
||||||
if tItem and tItem.isFileType():
|
if tItem and tItem.isFileType():
|
||||||
tItem.setActive(isActive)
|
tItem.setActive(isActive)
|
||||||
self.projTree.setTreeItemValues(tItem.itemHandle)
|
self.projTree.setTreeItemValues(tItem)
|
||||||
self.projTree._alertTreeChange(tItem.itemHandle, flush=False)
|
self.projTree._alertTreeChange(tItem.itemHandle, flush=False)
|
||||||
return
|
return
|
||||||
|
|
||||||
def _changeItemStatus(self, key: str) -> None:
|
def _changeItemStatus(self, key: str) -> None:
|
||||||
"""Set a new status value of an item."""
|
"""Set a new status value of an item."""
|
||||||
self._item.setStatus(key)
|
self._item.setStatus(key)
|
||||||
self.projTree.setTreeItemValues(self._handle)
|
self.projTree.setTreeItemValues(self._item)
|
||||||
self.projTree._alertTreeChange(self._handle, flush=False)
|
self.projTree._alertTreeChange(self._handle, flush=False)
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -2000,14 +2017,14 @@ class _TreeContextMenu(QMenu):
|
|||||||
for tItem in self._items:
|
for tItem in self._items:
|
||||||
if tItem and tItem.isNovelLike():
|
if tItem and tItem.isNovelLike():
|
||||||
tItem.setStatus(key)
|
tItem.setStatus(key)
|
||||||
self.projTree.setTreeItemValues(tItem.itemHandle)
|
self.projTree.setTreeItemValues(tItem)
|
||||||
self.projTree._alertTreeChange(tItem.itemHandle, flush=False)
|
self.projTree._alertTreeChange(tItem.itemHandle, flush=False)
|
||||||
return
|
return
|
||||||
|
|
||||||
def _changeItemImport(self, key: str) -> None:
|
def _changeItemImport(self, key: str) -> None:
|
||||||
"""Set a new importance value of an item."""
|
"""Set a new importance value of an item."""
|
||||||
self._item.setImport(key)
|
self._item.setImport(key)
|
||||||
self.projTree.setTreeItemValues(self._handle)
|
self.projTree.setTreeItemValues(self._item)
|
||||||
self.projTree._alertTreeChange(self._handle, flush=False)
|
self.projTree._alertTreeChange(self._handle, flush=False)
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -2016,7 +2033,7 @@ class _TreeContextMenu(QMenu):
|
|||||||
for tItem in self._items:
|
for tItem in self._items:
|
||||||
if tItem and not tItem.isNovelLike():
|
if tItem and not tItem.isNovelLike():
|
||||||
tItem.setImport(key)
|
tItem.setImport(key)
|
||||||
self.projTree.setTreeItemValues(tItem.itemHandle)
|
self.projTree.setTreeItemValues(tItem)
|
||||||
self.projTree._alertTreeChange(tItem.itemHandle, flush=False)
|
self.projTree._alertTreeChange(tItem.itemHandle, flush=False)
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -2024,11 +2041,11 @@ class _TreeContextMenu(QMenu):
|
|||||||
"""Set a new item layout value of an item."""
|
"""Set a new item layout value of an item."""
|
||||||
if itemLayout == nwItemLayout.DOCUMENT and self._item.documentAllowed():
|
if itemLayout == nwItemLayout.DOCUMENT and self._item.documentAllowed():
|
||||||
self._item.setLayout(nwItemLayout.DOCUMENT)
|
self._item.setLayout(nwItemLayout.DOCUMENT)
|
||||||
self.projTree.setTreeItemValues(self._handle)
|
self.projTree.setTreeItemValues(self._item)
|
||||||
self.projTree._alertTreeChange(self._handle, flush=False)
|
self.projTree._alertTreeChange(self._handle, flush=False)
|
||||||
elif itemLayout == nwItemLayout.NOTE:
|
elif itemLayout == nwItemLayout.NOTE:
|
||||||
self._item.setLayout(nwItemLayout.NOTE)
|
self._item.setLayout(nwItemLayout.NOTE)
|
||||||
self.projTree.setTreeItemValues(self._handle)
|
self.projTree.setTreeItemValues(self._item)
|
||||||
self.projTree._alertTreeChange(self._handle, flush=False)
|
self.projTree._alertTreeChange(self._handle, flush=False)
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -2042,12 +2059,12 @@ class _TreeContextMenu(QMenu):
|
|||||||
if msgYes and itemLayout == nwItemLayout.DOCUMENT and self._item.documentAllowed():
|
if msgYes and itemLayout == nwItemLayout.DOCUMENT and self._item.documentAllowed():
|
||||||
self._item.setType(nwItemType.FILE)
|
self._item.setType(nwItemType.FILE)
|
||||||
self._item.setLayout(nwItemLayout.DOCUMENT)
|
self._item.setLayout(nwItemLayout.DOCUMENT)
|
||||||
self.projTree.setTreeItemValues(self._handle)
|
self.projTree.setTreeItemValues(self._item)
|
||||||
self.projTree._alertTreeChange(self._handle, flush=False)
|
self.projTree._alertTreeChange(self._handle, flush=False)
|
||||||
elif msgYes and itemLayout == nwItemLayout.NOTE:
|
elif msgYes and itemLayout == nwItemLayout.NOTE:
|
||||||
self._item.setType(nwItemType.FILE)
|
self._item.setType(nwItemType.FILE)
|
||||||
self._item.setLayout(nwItemLayout.NOTE)
|
self._item.setLayout(nwItemLayout.NOTE)
|
||||||
self.projTree.setTreeItemValues(self._handle)
|
self.projTree.setTreeItemValues(self._item)
|
||||||
self.projTree._alertTreeChange(self._handle, flush=False)
|
self.projTree._alertTreeChange(self._handle, flush=False)
|
||||||
else:
|
else:
|
||||||
logger.info("Folder conversion cancelled")
|
logger.info("Folder conversion cancelled")
|
||||||
|
|||||||
+4
-13
@@ -189,9 +189,6 @@ class GuiMain(QMainWindow):
|
|||||||
self.splitView.setVisible(False)
|
self.splitView.setVisible(False)
|
||||||
self.docEditor.closeSearch()
|
self.docEditor.closeSearch()
|
||||||
|
|
||||||
# Initialise the Project Tree
|
|
||||||
self.rebuildTrees()
|
|
||||||
|
|
||||||
# Assemble Main Window Elements
|
# Assemble Main Window Elements
|
||||||
self.mainBox = QHBoxLayout()
|
self.mainBox = QHBoxLayout()
|
||||||
self.mainBox.addWidget(self.sideBar)
|
self.mainBox.addWidget(self.sideBar)
|
||||||
@@ -222,6 +219,8 @@ class GuiMain(QMainWindow):
|
|||||||
SHARED.projectStatusChanged.connect(self.mainStatus.updateProjectStatus)
|
SHARED.projectStatusChanged.connect(self.mainStatus.updateProjectStatus)
|
||||||
SHARED.projectStatusMessage.connect(self.mainStatus.setStatusMessage)
|
SHARED.projectStatusMessage.connect(self.mainStatus.setStatusMessage)
|
||||||
SHARED.spellLanguageChanged.connect(self.mainStatus.setLanguage)
|
SHARED.spellLanguageChanged.connect(self.mainStatus.setLanguage)
|
||||||
|
SHARED.statusLabelsChanged.connect(self.docViewerPanel.updateStatusLabels)
|
||||||
|
SHARED.statusLabelsChanged.connect(self.projView.refreshUserLabels)
|
||||||
|
|
||||||
self.mainMenu.requestDocAction.connect(self._passDocumentAction)
|
self.mainMenu.requestDocAction.connect(self._passDocumentAction)
|
||||||
self.mainMenu.requestDocInsert.connect(self._passDocumentInsert)
|
self.mainMenu.requestDocInsert.connect(self._passDocumentInsert)
|
||||||
@@ -461,7 +460,6 @@ class GuiMain(QMainWindow):
|
|||||||
|
|
||||||
# Update GUI
|
# Update GUI
|
||||||
self._updateWindowTitle(SHARED.project.data.name)
|
self._updateWindowTitle(SHARED.project.data.name)
|
||||||
self.rebuildTrees()
|
|
||||||
self.docEditor.toggleSpellCheck(SHARED.project.data.spellCheck)
|
self.docEditor.toggleSpellCheck(SHARED.project.data.spellCheck)
|
||||||
self.mainStatus.setRefTime(SHARED.project.projOpened)
|
self.mainStatus.setRefTime(SHARED.project.projOpened)
|
||||||
self.projView.openProjectTasks()
|
self.projView.openProjectTasks()
|
||||||
@@ -735,11 +733,6 @@ class GuiMain(QMainWindow):
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
def rebuildTrees(self) -> None:
|
|
||||||
"""Rebuild the project tree."""
|
|
||||||
self.projView.populateTree()
|
|
||||||
return
|
|
||||||
|
|
||||||
def rebuildIndex(self, beQuiet: bool = False) -> None:
|
def rebuildIndex(self, beQuiet: bool = False) -> None:
|
||||||
"""Rebuild the entire index."""
|
"""Rebuild the entire index."""
|
||||||
if SHARED.hasProject:
|
if SHARED.hasProject:
|
||||||
@@ -1098,15 +1091,13 @@ class GuiMain(QMainWindow):
|
|||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
@pyqtSlot(bool)
|
@pyqtSlot()
|
||||||
def _processProjectSettingsChanges(self, rebuildTrees: bool) -> None:
|
def _processProjectSettingsChanges(self) -> None:
|
||||||
"""Refresh data dependent on project settings."""
|
"""Refresh data dependent on project settings."""
|
||||||
logger.debug("Applying new project settings")
|
logger.debug("Applying new project settings")
|
||||||
SHARED.updateSpellCheckLanguage()
|
SHARED.updateSpellCheckLanguage()
|
||||||
self.itemDetails.refreshDetails()
|
self.itemDetails.refreshDetails()
|
||||||
self._updateWindowTitle(SHARED.project.data.name)
|
self._updateWindowTitle(SHARED.project.data.name)
|
||||||
if rebuildTrees:
|
|
||||||
self.rebuildTrees()
|
|
||||||
return
|
return
|
||||||
|
|
||||||
@pyqtSlot()
|
@pyqtSlot()
|
||||||
|
|||||||
@@ -64,6 +64,7 @@ class SharedData(QObject):
|
|||||||
indexCleared = pyqtSignal()
|
indexCleared = pyqtSignal()
|
||||||
indexAvailable = pyqtSignal()
|
indexAvailable = pyqtSignal()
|
||||||
mainClockTick = pyqtSignal()
|
mainClockTick = pyqtSignal()
|
||||||
|
statusLabelsChanged = pyqtSignal(str)
|
||||||
|
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
super().__init__()
|
super().__init__()
|
||||||
@@ -309,6 +310,14 @@ class SharedData(QObject):
|
|||||||
self.indexAvailable.emit()
|
self.indexAvailable.emit()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def projectSingalProxy(self, data: dict) -> None:
|
||||||
|
"""Emit signals on project data change."""
|
||||||
|
event = data.get("event")
|
||||||
|
logger.debug("Received '%s' event from project data", event)
|
||||||
|
if event == "statusLabels":
|
||||||
|
self.statusLabelsChanged.emit(data.get("kind", ""))
|
||||||
|
return
|
||||||
|
|
||||||
##
|
##
|
||||||
# Alert Boxes
|
# Alert Boxes
|
||||||
##
|
##
|
||||||
|
|||||||
@@ -113,13 +113,13 @@ def testDlgProjSettings_SettingsPage(qtbot, monkeypatch, nwGUI, fncPath, projPat
|
|||||||
assert settings.projAuthor.text() == "Jane Smith"
|
assert settings.projAuthor.text() == "Jane Smith"
|
||||||
assert settings.projLang.currentData() == "en"
|
assert settings.projLang.currentData() == "en"
|
||||||
assert settings.spellLang.currentData() == "en"
|
assert settings.spellLang.currentData() == "en"
|
||||||
assert settings.doBackup.isChecked() is False
|
assert settings.noBackup.isChecked() is False
|
||||||
|
|
||||||
settings.projName.setText("Project Name")
|
settings.projName.setText("Project Name")
|
||||||
settings.projAuthor.setText("Jane Doe")
|
settings.projAuthor.setText("Jane Doe")
|
||||||
settings.projLang.setCurrentIndex(settings.projLang.findData("de"))
|
settings.projLang.setCurrentIndex(settings.projLang.findData("de"))
|
||||||
settings.spellLang.setCurrentIndex(settings.spellLang.findData("de"))
|
settings.spellLang.setCurrentIndex(settings.spellLang.findData("de"))
|
||||||
settings.doBackup.setChecked(True)
|
settings.noBackup.setChecked(True)
|
||||||
|
|
||||||
projSettings._doSave()
|
projSettings._doSave()
|
||||||
assert project.data.name == "Project Name"
|
assert project.data.name == "Project Name"
|
||||||
@@ -128,7 +128,7 @@ def testDlgProjSettings_SettingsPage(qtbot, monkeypatch, nwGUI, fncPath, projPat
|
|||||||
assert project.data.spellLang == "de"
|
assert project.data.spellLang == "de"
|
||||||
assert project.data.doBackup is False
|
assert project.data.doBackup is False
|
||||||
|
|
||||||
nwGUI._processProjectSettingsChanges(False)
|
nwGUI._processProjectSettingsChanges()
|
||||||
assert nwGUI.windowTitle() == "Project Name - novelWriter"
|
assert nwGUI.windowTitle() == "Project Name - novelWriter"
|
||||||
|
|
||||||
# qtbot.stop()
|
# qtbot.stop()
|
||||||
@@ -161,7 +161,7 @@ def testDlgProjSettings_StatusImport(qtbot, monkeypatch, nwGUI, projPath, mockRn
|
|||||||
project.tree[hCharNote].setImport(C.iMajor) # type: ignore
|
project.tree[hCharNote].setImport(C.iMajor) # type: ignore
|
||||||
project.tree[hWorldNote].setImport(C.iMain) # type: ignore
|
project.tree[hWorldNote].setImport(C.iMain) # type: ignore
|
||||||
|
|
||||||
nwGUI.rebuildTrees()
|
nwGUI.projView.populateTree()
|
||||||
project.countStatus()
|
project.countStatus()
|
||||||
|
|
||||||
assert [e.count for _, e in project.data.itemStatus.iterItems()] == [2, 0, 2, 1]
|
assert [e.count for _, e in project.data.itemStatus.iterItems()] == [2, 0, 2, 1]
|
||||||
|
|||||||
@@ -221,8 +221,14 @@ def testGuiViewerPanel_Tags(qtbot, monkeypatch, caplog, nwGUI, projPath, mockRnd
|
|||||||
nwJohn = SHARED.project.tree[hJohn]
|
nwJohn = SHARED.project.tree[hJohn]
|
||||||
assert isinstance(nwJohn, NWItem)
|
assert isinstance(nwJohn, NWItem)
|
||||||
nwJohn.setActive(False)
|
nwJohn.setActive(False)
|
||||||
projTree.setTreeItemValues(hJohn)
|
projTree.setTreeItemValues(nwJohn)
|
||||||
projTree._alertTreeChange(hJohn, flush=False)
|
projTree._alertTreeChange(hJohn, flush=False)
|
||||||
assert charTab.topLevelItemCount() == 1
|
assert charTab.topLevelItemCount() == 1
|
||||||
|
|
||||||
|
# Update Labels
|
||||||
|
assert charTab.topLevelItem(0).text(charTab.C_IMPORT) == "New"
|
||||||
|
SHARED.project.data.itemImport.add(C.iNew, "Stuff", (100, 100, 100), "SQUARE", 0)
|
||||||
|
viewPanel.updateStatusLabels("i")
|
||||||
|
assert charTab.topLevelItem(0).text(charTab.C_IMPORT) == "Stuff"
|
||||||
|
|
||||||
# qtbot.stop()
|
# qtbot.stop()
|
||||||
|
|||||||
@@ -186,6 +186,10 @@ def testGuiProjTree_NewItems(qtbot, caplog, monkeypatch, nwGUI, projPath, mockRn
|
|||||||
# Adding an invalid item directly to the tree should also fail
|
# Adding an invalid item directly to the tree should also fail
|
||||||
assert projTree._addTreeItem(None) is None
|
assert projTree._addTreeItem(None) is None
|
||||||
|
|
||||||
|
# Setting values for a non-existing tree item should be handled
|
||||||
|
projTree.setTreeItemValues(None)
|
||||||
|
projTree.setTreeItemValues(C.hInvalid) # The function used to take handles
|
||||||
|
|
||||||
# Clean up
|
# Clean up
|
||||||
# qtbot.stop()
|
# qtbot.stop()
|
||||||
nwGUI.closeProject()
|
nwGUI.closeProject()
|
||||||
|
|||||||
+1
-1
@@ -197,7 +197,7 @@ def buildTestProject(obj: object, projPath: Path) -> None:
|
|||||||
project._valid = True
|
project._valid = True
|
||||||
|
|
||||||
if nwGUI is not None:
|
if nwGUI is not None:
|
||||||
nwGUI.rebuildTrees()
|
nwGUI.projView.populateTree()
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user