Add root class filtering
This commit is contained in:
@@ -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
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user