dependencies properly enforced
This commit is contained in:
@@ -282,15 +282,34 @@ class InstallerWizard(QtWidgets.QWizard):
|
||||
|
||||
@QtCore.pyqtSlot("QTreeWidgetItem*","int")
|
||||
def _enforce_dependencies(self, item, column):
|
||||
#if item is checked, look for dependent items and check them too
|
||||
if item.checkState(0) == QtCore.Qt.Checked:
|
||||
if column: #ignore everything not in column 0 (the names)
|
||||
return
|
||||
elif item.childCount(): #recurse through child items til no children
|
||||
for child in [item.child(i) for i in range(item.childCount())]:
|
||||
self._enforce_dependencies(child, column)
|
||||
else:
|
||||
#if item is checked, look for dependent items and check them too
|
||||
tools_by_name = {tool["name"]:tool for tool in self.__tools__}
|
||||
try:
|
||||
dependencies = tools_by_name[item.text(0)]["depends on"].split(",")
|
||||
except KeyError:
|
||||
pass
|
||||
else:
|
||||
for dependency in dependencies:
|
||||
for dependant_item in self.selection_menu.findItems(dependency, QtCore.Qt.MatchFixedString|QtCore.Qt.MatchCaseSensitive|QtCore.Qt.MatchRecursive):
|
||||
dependant_item.setCheckState(0, QtCore.Qt.Checked)
|
||||
if item.checkState(0) == QtCore.Qt.Checked:
|
||||
try:
|
||||
dependencies = tools_by_name[item.text(0)]["depends on"].split(",")
|
||||
except KeyError:
|
||||
pass
|
||||
else:
|
||||
for dependency in dependencies:
|
||||
for dependant_item in self.selection_menu.findItems(dependency, QtCore.Qt.MatchFixedString|QtCore.Qt.MatchCaseSensitive|QtCore.Qt.MatchRecursive):
|
||||
dependant_item.setCheckState(0, QtCore.Qt.Checked)
|
||||
else: #item was unchecked
|
||||
#find all checked items and build a set of their dependencies
|
||||
selected = self._get_selections()
|
||||
dependencies_of_selected = set()
|
||||
for selected_item in selected:
|
||||
try:
|
||||
dependencies_of_selected |= set((tools_by_name[selected_item.text(0)]["depends on"]).split(","))
|
||||
except KeyError:
|
||||
pass
|
||||
#if the item that was just unchecked is a dependency of another selected item
|
||||
if item.text(0) in dependencies_of_selected:
|
||||
self._display_error(f"Selected items depend on {item.text(0)}")
|
||||
item.setCheckState(0, QtCore.Qt.Checked)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user