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):
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)
+20 -24
View File
@@ -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