From f588cfec01575dcea61737a7cf8ec698333abc06 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Tue, 7 Sep 2021 10:19:49 +0200 Subject: [PATCH] fixed how tasks are validated --- .../tools/new_publisher/widgets/widgets.py | 89 ++++++++++++++++--- 1 file changed, 76 insertions(+), 13 deletions(-) diff --git a/openpype/tools/new_publisher/widgets/widgets.py b/openpype/tools/new_publisher/widgets/widgets.py index d616116e45..fca78642c3 100644 --- a/openpype/tools/new_publisher/widgets/widgets.py +++ b/openpype/tools/new_publisher/widgets/widgets.py @@ -353,6 +353,7 @@ class TasksCombobox(QtWidgets.QComboBox): self._delegate = delegate self._model = model self._origin_value = [] + self._origin_selection = [] self._selected_items = [] self._has_value_changed = False self._ignore_index_change = False @@ -369,7 +370,7 @@ class TasksCombobox(QtWidgets.QComboBox): self._set_is_valid(True) self._selected_items = [self.currentText()] self._has_value_changed = ( - self._origin_value != self._selected_items + self._origin_selection != self._selected_items ) self.value_changed.emit() @@ -399,17 +400,62 @@ class TasksCombobox(QtWidgets.QComboBox): return list(self._selected_items) def set_asset_names(self, asset_names): - self._model.set_asset_names(asset_names) - self.set_selected_items(self._origin_value) + self._ignore_index_change = True - def set_selected_items(self, task_names=None): - if task_names is None: - task_names = [] + self._model.set_asset_names(asset_names) + + self._ignore_index_change = False + + # It is a bug if not exactly one asset got here + if len(asset_names) != 1: + self.set_selected_item("") + self._set_is_valid(False) + return + + asset_name = tuple(asset_names)[0] + + is_valid = False + if self._selected_items: + is_valid = True + + for task_name in self._selected_items: + is_valid = self._model.is_task_name_valid(asset_name, task_name) + if not is_valid: + break + + if len(self._selected_items) == 0: + self.set_selected_item("") + + elif len(self._selected_items) == 1: + self.set_selected_item(self._selected_items[0]) + + else: + multiselection_text = self._multiselection_text + if multiselection_text is None: + multiselection_text = "|".join(self._selected_items) + self.set_selected_item(multiselection_text) + self._set_is_valid(is_valid) + + def set_selected_items(self, asset_task_combinations=None): + if asset_task_combinations is None: + asset_task_combinations = [] + + task_names = set() + task_names_by_asset_name = collections.defaultdict(set) + for asset_name, task_name in asset_task_combinations: + task_names.add(task_name) + task_names_by_asset_name[asset_name].add(task_name) + asset_names = set(task_names_by_asset_name.keys()) self._ignore_index_change = True + self._model.set_asset_names(asset_names) + self._has_value_changed = False - self._origin_value = list(task_names) + + self._origin_value = copy.deepcopy(asset_task_combinations) + + self._origin_selection = list(task_names) self._selected_items = list(task_names) # Reset current index self.setCurrentIndex(-1) @@ -421,6 +467,10 @@ class TasksCombobox(QtWidgets.QComboBox): task_name = tuple(task_names)[0] idx = self.findText(task_name) is_valid = not idx < 0 + if not is_valid and len(asset_names) > 1: + is_valid = self._validate_task_names_by_asset_names( + task_names_by_asset_name + ) self.set_selected_item(task_name) else: @@ -430,6 +480,10 @@ class TasksCombobox(QtWidgets.QComboBox): if not is_valid: break + if not is_valid and len(asset_names) > 1: + is_valid = self._validate_task_names_by_asset_names( + task_names_by_asset_name + ) multiselection_text = self._multiselection_text if multiselection_text is None: multiselection_text = "|".join(task_names) @@ -441,6 +495,13 @@ class TasksCombobox(QtWidgets.QComboBox): self.value_changed.emit() + def _validate_task_names_by_asset_names(self, task_names_by_asset_name): + for asset_name, task_names in task_names_by_asset_name.items(): + for task_name in task_names: + if not self._model.is_task_name_valid(asset_name, task_name): + return False + return True + def set_selected_item(self, item_name): idx = self.findText(item_name) if idx < 0: @@ -737,7 +798,8 @@ class GlobalAttrsWidget(QtWidgets.QWidget): or self.task_value_widget.has_value_changed() ) self._set_btns_visible(any_changed or any_invalid) - self._set_btns_enabled(not any_invalid) + self.cancel_btn.setEnabled(any_changed) + self.submit_btn.setEnabled(not any_invalid) def _on_variant_change(self): self._on_value_change() @@ -764,7 +826,6 @@ class GlobalAttrsWidget(QtWidgets.QWidget): self._current_instances = instances asset_names = set() - task_names = set() variants = set() families = set() subset_names = set() @@ -773,14 +834,17 @@ class GlobalAttrsWidget(QtWidgets.QWidget): if len(instances) == 0: editable = False + asset_task_combinations = [] for instance in instances: if instance.creator is None: editable = False variants.add(instance.data.get("variant") or self.unknown_value) families.add(instance.data.get("family") or self.unknown_value) - asset_names.add(instance.data.get("asset") or self.unknown_value) - task_names.add(instance.data.get("task") or self.unknown_value) + asset_name = instance.data.get("asset") or self.unknown_value + task_name = instance.data.get("task") or self.unknown_value + asset_names.add(asset_name) + asset_task_combinations.append((asset_name, task_name)) subset_names.add(instance.data.get("subset") or self.unknown_value) self.variant_input.set_value(variants) @@ -788,8 +852,7 @@ class GlobalAttrsWidget(QtWidgets.QWidget): # Set context of asset widget self.asset_value_widget.set_selected_items(asset_names) # Set context of task widget - self.task_value_widget.set_asset_names(asset_names) - self.task_value_widget.set_selected_items(task_names) + self.task_value_widget.set_selected_items(asset_task_combinations) self.family_value_widget.set_value(families) self.subset_value_widget.set_value(subset_names)