Add a quick links dropdown menu to the project tree (#1137)

This commit is contained in:
Veronica Berglyd Olsen
2022-10-14 17:30:28 +02:00
parent bbbad2b170
commit 77ec0a9eed
3 changed files with 91 additions and 18 deletions
+6 -4
View File
@@ -274,11 +274,13 @@ class NWTree:
return rootClasses return rootClasses
def iterRoots(self, itemClass): def iterRoots(self, itemClass):
"""Iterate over all items of a given class. """Iterate over all root items of a given class in order.
""" """
for tHandle, nwItem in self._treeRoots.items(): for tHandle in self._treeOrder:
if nwItem.itemClass == itemClass: nwItem = self.__getitem__(tHandle)
yield tHandle, nwItem if nwItem is not None and nwItem.isRootType():
if itemClass is None or nwItem.itemClass == itemClass:
yield tHandle, nwItem
return return
def isRoot(self, tHandle): def isRoot(self, tHandle):
+80 -12
View File
@@ -121,18 +121,33 @@ class GuiProjectView(QWidget):
## ##
def initSettings(self): def initSettings(self):
"""Initialise GUI elements that depend on specific settings.
"""
self.projTree.initSettings() self.projTree.initSettings()
return return
def clearProject(self): def clearProject(self):
"""Clear project-related GUI content.
"""
self.projBar.clearContent()
self.projTree.clearTree() self.projTree.clearTree()
return return
def saveProjectTree(self): def openProjectTasks(self):
"""Run open project tasks.
"""
self.projBar.buildQuickLinkMenu()
return
def saveProjectTasks(self):
"""Run save project tasks.
"""
self.projTree.saveTreeOrder() self.projTree.saveTreeOrder()
return return
def populateTree(self): def populateTree(self):
"""Build the tree structure from project data.
"""
self.projTree.buildTree() self.projTree.buildTree()
return return
@@ -159,6 +174,13 @@ class GuiProjectView(QWidget):
self.wordCountsChanged.emit() self.wordCountsChanged.emit()
return return
@pyqtSlot(str)
def updateRootItem(self, tHandle):
"""If any root item changes, rebuild the quick link root menu.
"""
self.projBar.buildQuickLinkMenu()
return
# END Class GuiProjectView # END Class GuiProjectView
@@ -197,6 +219,18 @@ class GuiProjectToolBar(QWidget):
self.viewLabel.setContentsMargins(0, 0, 0, 0) self.viewLabel.setContentsMargins(0, 0, 0, 0)
self.viewLabel.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.viewLabel.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
# Quick Links
self.mQuick = QMenu()
self.tbQuick = QToolButton(self)
self.tbQuick.setToolTip("%s [Ctrl+L]" % self.tr("Quick Links"))
self.tbQuick.setShortcut("Ctrl+L")
self.tbQuick.setIcon(self.mainTheme.getIcon("bookmark"))
self.tbQuick.setIconSize(QSize(iPx, iPx))
self.tbQuick.setStyleSheet(buttonStyle)
self.tbQuick.setMenu(self.mQuick)
self.tbQuick.setPopupMode(QToolButton.InstantPopup)
# Move Buttons # Move Buttons
self.tbMoveU = QToolButton(self) self.tbMoveU = QToolButton(self)
self.tbMoveU.setToolTip("%s [Ctrl+Up]" % self.tr("Move Up")) self.tbMoveU.setToolTip("%s [Ctrl+Up]" % self.tr("Move Up"))
@@ -292,6 +326,7 @@ class GuiProjectToolBar(QWidget):
# Assemble # Assemble
self.outerBox = QHBoxLayout() self.outerBox = QHBoxLayout()
self.outerBox.addWidget(self.viewLabel) self.outerBox.addWidget(self.viewLabel)
self.outerBox.addWidget(self.tbQuick)
self.outerBox.addWidget(self.tbMoveU) self.outerBox.addWidget(self.tbMoveU)
self.outerBox.addWidget(self.tbMoveD) self.outerBox.addWidget(self.tbMoveD)
self.outerBox.addWidget(self.tbAdd) self.outerBox.addWidget(self.tbAdd)
@@ -305,6 +340,32 @@ class GuiProjectToolBar(QWidget):
return return
##
# Methods
##
def clearContent(self):
"""Clear dynamic content on the tool bar.
"""
self.mQuick.clear()
return
def buildQuickLinkMenu(self):
"""Build the quick link menu.
"""
logger.verbose("Rebuilding quick links menu")
self.mQuick.clear()
for n, (tHandle, nwItem) in enumerate(self.theProject.tree.iterRoots(None)):
aRoot = self.mQuick.addAction(nwItem.itemName)
aRoot.setData(tHandle)
aRoot.setIcon(self.mainTheme.getIcon(nwLabels.CLASS_ICON[nwItem.itemClass]))
aRoot.triggered.connect(
lambda n, tHandle=tHandle: self.projView.setSelectedHandle(tHandle, doScroll=True)
)
return
## ##
# Internal Functions # Internal Functions
## ##
@@ -545,8 +606,7 @@ class GuiProjectTree(QTreeWidget):
self._treeMap[pHandle].setExpanded(True) self._treeMap[pHandle].setExpanded(True)
self._alertTreeChange(tHandle, flush=True) self._alertTreeChange(tHandle, flush=True)
self.clearSelection() self.setCurrentItem(trItem)
trItem.setSelected(True)
return True return True
@@ -585,8 +645,7 @@ class GuiProjectTree(QTreeWidget):
self._recordLastMove(cItem, pItem, tIndex) self._recordLastMove(cItem, pItem, tIndex)
self._alertTreeChange(tHandle, flush=True) self._alertTreeChange(tHandle, flush=True)
self.clearSelection() self.setCurrentItem(trItem)
trItem.setSelected(True)
trItem.setExpanded(isExp) trItem.setExpanded(isExp)
return True return True
@@ -790,6 +849,11 @@ class GuiProjectTree(QTreeWidget):
self._treeMap.pop(tHandle, None) self._treeMap.pop(tHandle, None)
self._alertTreeChange(tHandle, flush=True) self._alertTreeChange(tHandle, flush=True)
# These are not emitted by the alert function because the
# item has already been deleted
self.projView.rootFolderChanged.emit(tHandle)
self.projView.treeItemChanged.emit(tHandle)
else: else:
if askFirst: if askFirst:
msgYes = self.mainGui.askQuestion( msgYes = self.mainGui.askQuestion(
@@ -817,6 +881,10 @@ class GuiProjectTree(QTreeWidget):
self._alertTreeChange(tHandle, flush=flush) self._alertTreeChange(tHandle, flush=flush)
self.projView.wordCountsChanged.emit() self.projView.wordCountsChanged.emit()
# This is not emitted by the alert function because the item
# has already been deleted
self.projView.treeItemChanged.emit(tHandle)
return True return True
def setTreeItemValues(self, tHandle): def setTreeItemValues(self, tHandle):
@@ -945,8 +1013,7 @@ class GuiProjectTree(QTreeWidget):
self._postItemMove(sHandle, wCount) self._postItemMove(sHandle, wCount)
self._alertTreeChange(sHandle, flush=True) self._alertTreeChange(sHandle, flush=True)
self.clearSelection() self.setCurrentItem(movItem)
movItem.setSelected(True)
self._lastMove = {} self._lastMove = {}
return True return True
@@ -968,12 +1035,13 @@ class GuiProjectTree(QTreeWidget):
if tItem is None: if tItem is None:
return False return False
self.clearSelection() self.setFocus()
self._treeMap[tHandle].setSelected(True) if tHandle in self._treeMap:
self.setCurrentItem(self._treeMap[tHandle])
selItems = self.selectedIndexes() selIndex = self.selectedIndexes()
if selItems and doScroll: if selIndex and doScroll:
self.scrollTo(selItems[0], QAbstractItemView.PositionAtCenter) self.scrollTo(selIndex[0], QAbstractItemView.PositionAtCenter)
return True return True
+5 -2
View File
@@ -206,6 +206,7 @@ class GuiMain(QMainWindow):
self.projView.treeItemChanged.connect(self.itemDetails.updateViewBox) self.projView.treeItemChanged.connect(self.itemDetails.updateViewBox)
self.projView.rootFolderChanged.connect(self.outlineView.updateRootItem) self.projView.rootFolderChanged.connect(self.outlineView.updateRootItem)
self.projView.rootFolderChanged.connect(self.novelView.updateRootItem) self.projView.rootFolderChanged.connect(self.novelView.updateRootItem)
self.projView.rootFolderChanged.connect(self.projView.updateRootItem)
self.novelView.selectedItemChanged.connect(self.itemDetails.updateViewBox) self.novelView.selectedItemChanged.connect(self.itemDetails.updateViewBox)
self.novelView.openDocumentRequest.connect(self._openDocument) self.novelView.openDocumentRequest.connect(self._openDocument)
@@ -370,6 +371,7 @@ class GuiMain(QMainWindow):
self.saveProject() self.saveProject()
self.docEditor.setDictionaries() self.docEditor.setDictionaries()
self.projView.openProjectTasks()
self.novelView.openProjectTasks() self.novelView.openProjectTasks()
self.outlineView.openProjectTasks() self.outlineView.openProjectTasks()
self.rebuildIndex(beQuiet=True) self.rebuildIndex(beQuiet=True)
@@ -522,6 +524,7 @@ class GuiMain(QMainWindow):
self.docEditor.setDictionaries() self.docEditor.setDictionaries()
self.docEditor.toggleSpellCheck(self.theProject.spellCheck) self.docEditor.toggleSpellCheck(self.theProject.spellCheck)
self.statusBar.setRefTime(self.theProject.projOpened) self.statusBar.setRefTime(self.theProject.projOpened)
self.projView.openProjectTasks()
self.novelView.openProjectTasks() self.novelView.openProjectTasks()
self.outlineView.openProjectTasks() self.outlineView.openProjectTasks()
self._updateStatusWordCount() self._updateStatusWordCount()
@@ -556,7 +559,7 @@ class GuiMain(QMainWindow):
logger.error("No project open") logger.error("No project open")
return False return False
self.projView.saveProjectTree() self.projView.saveProjectTasks()
if self.theProject.saveProject(autoSave=autoSave): if self.theProject.saveProject(autoSave=autoSave):
self.theProject.index.saveIndex() self.theProject.index.saveIndex()
@@ -841,7 +844,7 @@ class GuiMain(QMainWindow):
qApp.setOverrideCursor(QCursor(Qt.WaitCursor)) qApp.setOverrideCursor(QCursor(Qt.WaitCursor))
tStart = time() tStart = time()
self.projView.saveProjectTree() self.projView.saveProjectTasks()
self.theProject.index.clearIndex() self.theProject.index.clearIndex()
for tItem in self.theProject.tree: for tItem in self.theProject.tree: