From 2779c8e69fd3dfc0575eb5fe61a3525566755988 Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com> Date: Sun, 20 Dec 2020 16:50:01 +0100 Subject: [PATCH] Use build time to update novel tree, and restore last selected item on tab change --- nw/gui/noveltree.py | 29 ++++++++++++++++++++++++++--- nw/gui/projtree.py | 6 +----- nw/guimain.py | 38 ++++++++++++++++++++++++++++++-------- 3 files changed, 57 insertions(+), 16 deletions(-) diff --git a/nw/gui/noveltree.py b/nw/gui/noveltree.py index d44d2bc0..9c9e562b 100644 --- a/nw/gui/noveltree.py +++ b/nw/gui/noveltree.py @@ -126,7 +126,20 @@ class GuiNovelTree(QTreeWidget): def refreshTree(self, overRide=False): """Called whenever the Novel tab is activated. """ + if self.lastBuild >= self.theIndex.timeNovel: + logger.verbose("Novel tree more recent than the novel index: not updating") + return + + selItem = self.selectedItems() + titleKey = None + if selItem: + titleKey = selItem[0].data(self.C_TITLE, Qt.UserRole)[2] + self._populateTree() + + if titleKey is not None and titleKey in self.treeMap: + self.treeMap[titleKey].setSelected(True) + return def getColumnSizes(self): @@ -138,6 +151,16 @@ class GuiNovelTree(QTreeWidget): ] return retVals + def getSelectedHandle(self): + """Get the currently selected handle. If multiple items are + selected, return the first. + """ + selItem = self.selectedItems() + if selItem: + return selItem[0].data(self.C_TITLE, Qt.UserRole)[0] + + return None + ## # Slots ## @@ -193,7 +216,7 @@ class GuiNovelTree(QTreeWidget): continue tLevel = self.theIndex.novelIndex[tHandle][sTitle]["level"] - tItem = self._createTreeItem(tHandle, sTitle, tLevel) + tItem = self._createTreeItem(tHandle, sTitle, tLevel, titleKey) self.treeMap[titleKey] = tItem if tLevel == "H1": @@ -232,14 +255,14 @@ class GuiNovelTree(QTreeWidget): return - def _createTreeItem(self, tHandle, sTitle, tLevel): + def _createTreeItem(self, tHandle, sTitle, tLevel, titleKey): """Populate a tree item with all the column values. """ novIdx = self.theIndex.novelIndex[tHandle][sTitle] newItem = QTreeWidgetItem() hIcon = "doc_%s" % tLevel.lower() - theData = (tHandle, sTitle[1:].lstrip("0")) + theData = (tHandle, sTitle[1:].lstrip("0"), titleKey) wC = int(novIdx["wCount"]) diff --git a/nw/gui/projtree.py b/nw/gui/projtree.py index 2c52c4cb..290c4391 100644 --- a/nw/gui/projtree.py +++ b/nw/gui/projtree.py @@ -640,11 +640,7 @@ class GuiProjectTree(QTreeWidget): selected, return the first. """ selItem = self.selectedItems() - - if len(selItem) == 0: - return None - - if isinstance(selItem[0], QTreeWidgetItem): + if selItem: return selItem[0].data(self.C_NAME, Qt.UserRole) return None diff --git a/nw/guimain.py b/nw/guimain.py index e807a591..4efba144 100644 --- a/nw/guimain.py +++ b/nw/guimain.py @@ -118,6 +118,7 @@ class GuiMain(QMainWindow): self.projTabs.setStyleSheet("QTabWidget::pane {border: 0;};") self.projTabs.addTab(self.treeView, "Project") self.projTabs.addTab(self.novelView, "Novel") + self.projTabs.currentChanged.connect(self._projTabsChanged) tabFont = self.projTabs.tabBar().font() tabFont.setPointSize(round(0.9*self.theTheme.fontPointSize)) @@ -166,14 +167,16 @@ class GuiMain(QMainWindow): self.splitMain.setSizes(self.mainConf.getMainPanePos()) # Indices of All Splitter Widgets - self.idxTree = self.splitMain.indexOf(self.treePane) - self.idxMain = self.splitMain.indexOf(self.mainTabs) - self.idxEditor = self.splitDocs.indexOf(self.docEditor) - self.idxViewer = self.splitDocs.indexOf(self.splitView) - self.idxViewDoc = self.splitView.indexOf(self.docViewer) - self.idxViewMeta = self.splitView.indexOf(self.viewMeta) - self.idxTabEdit = self.mainTabs.indexOf(self.splitDocs) - self.idxTabProj = self.mainTabs.indexOf(self.splitOutline) + self.idxTree = self.splitMain.indexOf(self.treePane) + self.idxMain = self.splitMain.indexOf(self.mainTabs) + self.idxEditor = self.splitDocs.indexOf(self.docEditor) + self.idxViewer = self.splitDocs.indexOf(self.splitView) + self.idxViewDoc = self.splitView.indexOf(self.docViewer) + self.idxViewMeta = self.splitView.indexOf(self.viewMeta) + self.idxTabEdit = self.mainTabs.indexOf(self.splitDocs) + self.idxTabProj = self.mainTabs.indexOf(self.splitOutline) + self.idxTreeView = self.projTabs.indexOf(self.treeView) + self.idxNovelView = self.projTabs.indexOf(self.novelView) # Splitter Behaviour self.splitMain.setCollapsible(self.idxTree, False) @@ -1375,4 +1378,23 @@ class GuiMain(QMainWindow): self.projView.refreshTree() return + def _projTabsChanged(self, tabIndex): + """Activated when the project view tab is changed. + """ + tHandle = None + + if tabIndex == self.idxTreeView: + logger.verbose("Project tree tab activated") + tHandle = self.treeView.getSelectedHandle() + + elif tabIndex == self.idxNovelView: + logger.verbose("Novel tree tab activated") + if self.hasProject: + self.novelView.refreshTree() + tHandle = self.novelView.getSelectedHandle() + + self.treeMeta.updateViewBox(tHandle) + + return + # END Class GuiMain