From a9d59743469fd31c13ff722c0fc2188b82af2e08 Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com> Date: Tue, 9 May 2023 22:00:30 +0200 Subject: [PATCH] Add root class filtering --- novelwriter/core/buildsettings.py | 21 +++++++++++++-- novelwriter/tools/mbuild.py | 44 ++++++++++++++----------------- 2 files changed, 39 insertions(+), 26 deletions(-) diff --git a/novelwriter/core/buildsettings.py b/novelwriter/core/buildsettings.py index acd2c921..787101eb 100644 --- a/novelwriter/core/buildsettings.py +++ b/novelwriter/core/buildsettings.py @@ -103,10 +103,11 @@ SETTINGS_LABELS = { class FilterMode(Enum): - UNKNOWN = 0 + UNKNOWN = 0 FILTERED = 1 INCLUDED = 2 EXCLUDED = 3 + SKIPPED = 4 # END Enum FilterMode @@ -114,6 +115,7 @@ class FilterMode(Enum): class BuildSettings: def __init__(self): + self._skiproot = set() self._excluded = set() self._included = set() self._settings = {k: v[1] for k, v in SETTINGS_TEMPLATE.items()} @@ -128,6 +130,9 @@ class BuildSettings: def isExcluded(self, tHandle): return tHandle in self._excluded + def isRootAllowed(self, tHandle): + return tHandle not in self._skiproot + def setFiltered(self, tHandle): """Set an item as filtered. """ @@ -149,6 +154,15 @@ class BuildSettings: self._included.discard(tHandle) return + def setSkipRoot(self, tHandle, state): + """Set a specific root folder as skipped or not. + """ + if state is True: + self._skiproot.discard(tHandle) + elif state is False: + self._skiproot.add(tHandle) + return + def setValue(self, key, value): """Set a specific value for a build setting. """ @@ -190,8 +204,11 @@ class BuildSettings: if not isinstance(item, NWItem): result[tHandle] = (False, FilterMode.UNKNOWN) continue + if item.isInactiveClass() or (item.itemRoot in self._skiproot): + result[tHandle] = (False, FilterMode.SKIPPED) + continue if not item.isFileType(): - result[tHandle] = (False, FilterMode.FILTERED) + result[tHandle] = (False, FilterMode.SKIPPED) continue if tHandle in self._included: result[tHandle] = (True, FilterMode.INCLUDED) diff --git a/novelwriter/tools/mbuild.py b/novelwriter/tools/mbuild.py index f9a1de6b..74231c9f 100644 --- a/novelwriter/tools/mbuild.py +++ b/novelwriter/tools/mbuild.py @@ -170,10 +170,7 @@ class GuiBuildFilterTab(QWidget): C_STATUS = 2 D_HANDLE = Qt.UserRole - D_FILTER = Qt.UserRole + 1 - D_FILE = Qt.UserRole + 2 - D_NOVEL = Qt.UserRole + 3 - D_ACTIVE = Qt.UserRole + 4 + D_FILE = Qt.UserRole + 1 F_NONE = 0 F_FILTERED = 1 @@ -213,7 +210,6 @@ class GuiBuildFilterTab(QWidget): self.optTree.setHeaderHidden(True) self.optTree.setIndentation(iPx) self.optTree.setColumnCount(3) - self.optTree.setRootIsDecorated(False) treeHeader = self.optTree.header() treeHeader.setStretchLastSection(False) @@ -269,18 +265,19 @@ class GuiBuildFilterTab(QWidget): def populateTree(self): """Build the tree of project items. """ + logger.debug("Building project tree") self._treeMap = {} self.optTree.clear() + bSettings = self.buildOpts["settings"] for nwItem in self.theProject.getProjectItems(): tHandle = nwItem.itemHandle pHandle = nwItem.itemParent + rHandle = nwItem.itemRoot isFile = nwItem.isFileType() - isNovel = nwItem.isNovelLike() isActive = nwItem.isActive - if nwItem.isInactiveClass(): - logger.debug("Skipping inactive class item '%s'", tHandle) + if nwItem.isInactiveClass() or not bSettings.isRootAllowed(rHandle): continue hLevel = nwItem.mainHeading @@ -297,10 +294,7 @@ class GuiBuildFilterTab(QWidget): trItem.setIcon(self.C_NAME, itemIcon) trItem.setText(self.C_NAME, nwItem.itemName) trItem.setData(self.C_DATA, self.D_HANDLE, tHandle) - trItem.setData(self.C_DATA, self.D_FILTER, False) trItem.setData(self.C_DATA, self.D_FILE, isFile) - trItem.setData(self.C_DATA, self.D_NOVEL, isNovel) - trItem.setData(self.C_DATA, self.D_ACTIVE, isActive) trItem.setIcon(self.C_ACTIVE, self.mainTheme.getIcon(iconName)) trItem.setTextAlignment(self.C_NAME, Qt.AlignLeft) @@ -330,26 +324,26 @@ class GuiBuildFilterTab(QWidget): """Populate the filter options switches. """ self.filterOpt.clear() - buildSettings = self.buildOpts["settings"] + bSettings = self.buildOpts["settings"] - self.filterOpt.addLabel(buildSettings.getLabel("filter")) + self.filterOpt.addLabel(bSettings.getLabel("filter")) self.filterOpt.addItem( self.mainTheme.getIcon("proj_scene"), - buildSettings.getLabel("filter.includeNovel"), + bSettings.getLabel("filter.includeNovel"), "doc:filter.includeNovel", - default=buildSettings.getValue("filter.includeNovel") or False + default=bSettings.getValue("filter.includeNovel") or False ) self.filterOpt.addItem( self.mainTheme.getIcon("proj_note"), - buildSettings.getLabel("filter.includeNotes"), + bSettings.getLabel("filter.includeNotes"), "doc:filter.includeNotes", - default=buildSettings.getValue("filter.includeNotes") or False + default=bSettings.getValue("filter.includeNotes") or False ) self.filterOpt.addItem( self.mainTheme.getIcon("unchecked"), - buildSettings.getLabel("filter.includeInactive"), + bSettings.getLabel("filter.includeInactive"), "doc:filter.includeInactive", - default=buildSettings.getValue("filter.includeInactive") or False + default=bSettings.getValue("filter.includeInactive") or False ) self.filterOpt.addSeparator() @@ -376,6 +370,9 @@ class GuiBuildFilterTab(QWidget): if key.startswith("doc:"): self.buildOpts["settings"].setValue(key[4:], state) self._setTreeItemMode() + elif key.startswith("root:"): + self.buildOpts["settings"].setSkipRoot(key[5:], state) + self.populateTree() return ## @@ -385,7 +382,7 @@ class GuiBuildFilterTab(QWidget): def _setSelectedMode(self, mode): """Set the mode for the selected items. """ - buildSettings = self.buildOpts["settings"] + bSettings = self.buildOpts["settings"] for item in self.optTree.selectedItems(): if not isinstance(item, QTreeWidgetItem): @@ -395,11 +392,11 @@ class GuiBuildFilterTab(QWidget): isFile = item.data(self.C_DATA, self.D_FILE) if isFile: if mode == self.F_FILTERED: - buildSettings.setFiltered(tHandle) + bSettings.setFiltered(tHandle) elif mode == self.F_INCLUDED: - buildSettings.setIncluded(tHandle) + bSettings.setIncluded(tHandle) elif mode == self.F_EXCLUDED: - buildSettings.setExcluded(tHandle) + bSettings.setExcluded(tHandle) self._setTreeItemMode() @@ -419,7 +416,6 @@ class GuiBuildFilterTab(QWidget): item.setIcon(self.C_STATUS, self._statusFlags[self.F_FILTERED][1]) else: item.setIcon(self.C_STATUS, self._statusFlags[self.F_NONE][1]) - return # END Class GuiBuildFilterTab