dependencies properly enforced

This commit is contained in:
Brennen Raimer
2019-04-30 14:41:55 -04:00
parent 2571e097e2
commit e1237985b8

View File

@@ -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)