Add root class filtering

This commit is contained in:
Veronica K. B. Olsen
2023-05-09 22:00:30 +02:00
parent 4c4139078a
commit a9d5974346
2 changed files with 39 additions and 26 deletions
+19 -2
View File
@@ -103,10 +103,11 @@ SETTINGS_LABELS = {
class FilterMode(Enum): class FilterMode(Enum):
UNKNOWN = 0 UNKNOWN = 0
FILTERED = 1 FILTERED = 1
INCLUDED = 2 INCLUDED = 2
EXCLUDED = 3 EXCLUDED = 3
SKIPPED = 4
# END Enum FilterMode # END Enum FilterMode
@@ -114,6 +115,7 @@ class FilterMode(Enum):
class BuildSettings: class BuildSettings:
def __init__(self): def __init__(self):
self._skiproot = set()
self._excluded = set() self._excluded = set()
self._included = set() self._included = set()
self._settings = {k: v[1] for k, v in SETTINGS_TEMPLATE.items()} self._settings = {k: v[1] for k, v in SETTINGS_TEMPLATE.items()}
@@ -128,6 +130,9 @@ class BuildSettings:
def isExcluded(self, tHandle): def isExcluded(self, tHandle):
return tHandle in self._excluded return tHandle in self._excluded
def isRootAllowed(self, tHandle):
return tHandle not in self._skiproot
def setFiltered(self, tHandle): def setFiltered(self, tHandle):
"""Set an item as filtered. """Set an item as filtered.
""" """
@@ -149,6 +154,15 @@ class BuildSettings:
self._included.discard(tHandle) self._included.discard(tHandle)
return 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): def setValue(self, key, value):
"""Set a specific value for a build setting. """Set a specific value for a build setting.
""" """
@@ -190,8 +204,11 @@ class BuildSettings:
if not isinstance(item, NWItem): if not isinstance(item, NWItem):
result[tHandle] = (False, FilterMode.UNKNOWN) result[tHandle] = (False, FilterMode.UNKNOWN)
continue continue
if item.isInactiveClass() or (item.itemRoot in self._skiproot):
result[tHandle] = (False, FilterMode.SKIPPED)
continue
if not item.isFileType(): if not item.isFileType():
result[tHandle] = (False, FilterMode.FILTERED) result[tHandle] = (False, FilterMode.SKIPPED)
continue continue
if tHandle in self._included: if tHandle in self._included:
result[tHandle] = (True, FilterMode.INCLUDED) result[tHandle] = (True, FilterMode.INCLUDED)
+20 -24
View File
@@ -170,10 +170,7 @@ class GuiBuildFilterTab(QWidget):
C_STATUS = 2 C_STATUS = 2
D_HANDLE = Qt.UserRole D_HANDLE = Qt.UserRole
D_FILTER = Qt.UserRole + 1 D_FILE = Qt.UserRole + 1
D_FILE = Qt.UserRole + 2
D_NOVEL = Qt.UserRole + 3
D_ACTIVE = Qt.UserRole + 4
F_NONE = 0 F_NONE = 0
F_FILTERED = 1 F_FILTERED = 1
@@ -213,7 +210,6 @@ class GuiBuildFilterTab(QWidget):
self.optTree.setHeaderHidden(True) self.optTree.setHeaderHidden(True)
self.optTree.setIndentation(iPx) self.optTree.setIndentation(iPx)
self.optTree.setColumnCount(3) self.optTree.setColumnCount(3)
self.optTree.setRootIsDecorated(False)
treeHeader = self.optTree.header() treeHeader = self.optTree.header()
treeHeader.setStretchLastSection(False) treeHeader.setStretchLastSection(False)
@@ -269,18 +265,19 @@ class GuiBuildFilterTab(QWidget):
def populateTree(self): def populateTree(self):
"""Build the tree of project items. """Build the tree of project items.
""" """
logger.debug("Building project tree")
self._treeMap = {} self._treeMap = {}
self.optTree.clear() self.optTree.clear()
bSettings = self.buildOpts["settings"]
for nwItem in self.theProject.getProjectItems(): for nwItem in self.theProject.getProjectItems():
tHandle = nwItem.itemHandle tHandle = nwItem.itemHandle
pHandle = nwItem.itemParent pHandle = nwItem.itemParent
rHandle = nwItem.itemRoot
isFile = nwItem.isFileType() isFile = nwItem.isFileType()
isNovel = nwItem.isNovelLike()
isActive = nwItem.isActive isActive = nwItem.isActive
if nwItem.isInactiveClass(): if nwItem.isInactiveClass() or not bSettings.isRootAllowed(rHandle):
logger.debug("Skipping inactive class item '%s'", tHandle)
continue continue
hLevel = nwItem.mainHeading hLevel = nwItem.mainHeading
@@ -297,10 +294,7 @@ class GuiBuildFilterTab(QWidget):
trItem.setIcon(self.C_NAME, itemIcon) trItem.setIcon(self.C_NAME, itemIcon)
trItem.setText(self.C_NAME, nwItem.itemName) trItem.setText(self.C_NAME, nwItem.itemName)
trItem.setData(self.C_DATA, self.D_HANDLE, tHandle) 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_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.setIcon(self.C_ACTIVE, self.mainTheme.getIcon(iconName))
trItem.setTextAlignment(self.C_NAME, Qt.AlignLeft) trItem.setTextAlignment(self.C_NAME, Qt.AlignLeft)
@@ -330,26 +324,26 @@ class GuiBuildFilterTab(QWidget):
"""Populate the filter options switches. """Populate the filter options switches.
""" """
self.filterOpt.clear() 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.filterOpt.addItem(
self.mainTheme.getIcon("proj_scene"), self.mainTheme.getIcon("proj_scene"),
buildSettings.getLabel("filter.includeNovel"), bSettings.getLabel("filter.includeNovel"),
"doc:filter.includeNovel", "doc:filter.includeNovel",
default=buildSettings.getValue("filter.includeNovel") or False default=bSettings.getValue("filter.includeNovel") or False
) )
self.filterOpt.addItem( self.filterOpt.addItem(
self.mainTheme.getIcon("proj_note"), self.mainTheme.getIcon("proj_note"),
buildSettings.getLabel("filter.includeNotes"), bSettings.getLabel("filter.includeNotes"),
"doc:filter.includeNotes", "doc:filter.includeNotes",
default=buildSettings.getValue("filter.includeNotes") or False default=bSettings.getValue("filter.includeNotes") or False
) )
self.filterOpt.addItem( self.filterOpt.addItem(
self.mainTheme.getIcon("unchecked"), self.mainTheme.getIcon("unchecked"),
buildSettings.getLabel("filter.includeInactive"), bSettings.getLabel("filter.includeInactive"),
"doc:filter.includeInactive", "doc:filter.includeInactive",
default=buildSettings.getValue("filter.includeInactive") or False default=bSettings.getValue("filter.includeInactive") or False
) )
self.filterOpt.addSeparator() self.filterOpt.addSeparator()
@@ -376,6 +370,9 @@ class GuiBuildFilterTab(QWidget):
if key.startswith("doc:"): if key.startswith("doc:"):
self.buildOpts["settings"].setValue(key[4:], state) self.buildOpts["settings"].setValue(key[4:], state)
self._setTreeItemMode() self._setTreeItemMode()
elif key.startswith("root:"):
self.buildOpts["settings"].setSkipRoot(key[5:], state)
self.populateTree()
return return
## ##
@@ -385,7 +382,7 @@ class GuiBuildFilterTab(QWidget):
def _setSelectedMode(self, mode): def _setSelectedMode(self, mode):
"""Set the mode for the selected items. """Set the mode for the selected items.
""" """
buildSettings = self.buildOpts["settings"] bSettings = self.buildOpts["settings"]
for item in self.optTree.selectedItems(): for item in self.optTree.selectedItems():
if not isinstance(item, QTreeWidgetItem): if not isinstance(item, QTreeWidgetItem):
@@ -395,11 +392,11 @@ class GuiBuildFilterTab(QWidget):
isFile = item.data(self.C_DATA, self.D_FILE) isFile = item.data(self.C_DATA, self.D_FILE)
if isFile: if isFile:
if mode == self.F_FILTERED: if mode == self.F_FILTERED:
buildSettings.setFiltered(tHandle) bSettings.setFiltered(tHandle)
elif mode == self.F_INCLUDED: elif mode == self.F_INCLUDED:
buildSettings.setIncluded(tHandle) bSettings.setIncluded(tHandle)
elif mode == self.F_EXCLUDED: elif mode == self.F_EXCLUDED:
buildSettings.setExcluded(tHandle) bSettings.setExcluded(tHandle)
self._setTreeItemMode() self._setTreeItemMode()
@@ -419,7 +416,6 @@ class GuiBuildFilterTab(QWidget):
item.setIcon(self.C_STATUS, self._statusFlags[self.F_FILTERED][1]) item.setIcon(self.C_STATUS, self._statusFlags[self.F_FILTERED][1])
else: else:
item.setIcon(self.C_STATUS, self._statusFlags[self.F_NONE][1]) item.setIcon(self.C_STATUS, self._statusFlags[self.F_NONE][1])
return return
# END Class GuiBuildFilterTab # END Class GuiBuildFilterTab