diff --git a/openpype/tools/new_publisher/widgets.py b/openpype/tools/new_publisher/widgets.py index 772a55dbb5..f19acd947b 100644 --- a/openpype/tools/new_publisher/widgets.py +++ b/openpype/tools/new_publisher/widgets.py @@ -199,7 +199,7 @@ class TreeComboBox(QtWidgets.QComboBox): class AssetsTreeComboBox(TreeComboBox): - selection_changed = QtCore.Signal() + value_changed = QtCore.Signal() def __init__(self, controller, parent): model = AssetsHierarchyModel(controller) @@ -210,21 +210,26 @@ class AssetsTreeComboBox(TreeComboBox): self._ignore_index_change = False self._selected_items = [] - self._origin_selection = [] + self._origin_value = [] self._has_value_changed = False self._model = model + self._multiselection_text = None + model.reset() + def set_multiselection_text(self, text): + self._multiselection_text = text + def _on_index_change(self): if self._ignore_index_change: return self._selected_items = [self.currentText()] self._has_value_changed = ( - self._origin_selection != self._selected_items + self._origin_value != self._selected_items ) - self.selection_changed.emit() + self.value_changed.emit() def has_value_changed(self): return self._has_value_changed @@ -232,14 +237,14 @@ class AssetsTreeComboBox(TreeComboBox): def get_selected_items(self): return list(self._selected_items) - def set_selected_items(self, asset_names=None, multiselection_text=None): + def set_selected_items(self, asset_names=None): if asset_names is None: asset_names = [] self._ignore_index_change = True self._has_value_changed = False - self._origin_selection = list(asset_names) + self._origin_value = list(asset_names) self._selected_items = list(asset_names) if not asset_names: self.set_selected_item("") @@ -247,15 +252,19 @@ class AssetsTreeComboBox(TreeComboBox): elif len(asset_names) == 1: self.set_selected_item(tuple(asset_names)[0]) else: + multiselection_text = self._multiselection_text if multiselection_text is None: multiselection_text = "|".join(asset_names) self.set_selected_item(multiselection_text) self._ignore_index_change = False + def reset_to_origin(self): + self.set_selected_items(self._origin_value) + class TasksCombobox(QtWidgets.QComboBox): - selection_changed = QtCore.Signal() + value_changed = QtCore.Signal() def __init__(self, controller, parent): super(TasksCombobox, self).__init__(parent) @@ -269,11 +278,14 @@ class TasksCombobox(QtWidgets.QComboBox): self.currentIndexChanged.connect(self._on_index_change) self._model = model - self._origin_selection = [] + self._origin_value = [] self._selected_items = [] self._has_value_changed = False self._ignore_index_change = False - self._value_is_valid = True + self._multiselection_text = None + + def set_multiselection_text(self, text): + self._multiselection_text = text def _on_index_change(self): if self._ignore_index_change: @@ -281,11 +293,10 @@ class TasksCombobox(QtWidgets.QComboBox): self._selected_items = [self.currentText()] self._has_value_changed = ( - self._origin_selection != self._selected_items + self._origin_value != self._selected_items ) - self._value_is_valid = True - self.selection_changed.emit() + self.value_changed.emit() def has_value_changed(self): return self._has_value_changed @@ -296,25 +307,23 @@ class TasksCombobox(QtWidgets.QComboBox): def set_asset_names(self, asset_names): self._model.set_asset_names(asset_names) - def set_selected_items(self, task_names=None, multiselection_text=None): + def set_selected_items(self, task_names=None): if task_names is None: task_names = [] self._ignore_index_change = True self._has_value_changed = False - self._origin_selection = list(task_names) + self._origin_value = list(task_names) self._selected_items = list(task_names) # Reset current index self.setCurrentIndex(-1) if not task_names: - self._value_is_valid = False self.set_selected_item("") elif len(task_names) == 1: task_name = tuple(task_names)[0] idx = self.findText(task_name) - self._value_is_valid = not idx < 0 self.set_selected_item(task_name) else: @@ -325,13 +334,15 @@ class TasksCombobox(QtWidgets.QComboBox): if not valid_value: break - self._value_is_valid = valid_value + multiselection_text = self._multiselection_text if multiselection_text is None: multiselection_text = "|".join(task_names) self.set_selected_item(multiselection_text) self._ignore_index_change = False + self.value_changed.emit() + def set_selected_item(self, item_name): idx = self.findText(item_name) if idx < 0: @@ -339,6 +350,9 @@ class TasksCombobox(QtWidgets.QComboBox): else: self.setCurrentIndex(idx) + def reset_to_origin(self): + self.set_selected_items(self._origin_value) + class VariantInputWidget(QtWidgets.QLineEdit): value_changed = QtCore.Signal() @@ -351,9 +365,13 @@ class VariantInputWidget(QtWidgets.QLineEdit): self._ignore_value_change = False self._has_value_changed = False + self._multiselection_text = None self.textChanged.connect(self._on_text_change) + def set_multiselection_text(self, text): + self._multiselection_text = text + def has_value_changed(self): return self._has_value_changed @@ -364,7 +382,10 @@ class VariantInputWidget(QtWidgets.QLineEdit): self._current_value = [self.text()] self._has_value_changed = self._current_value != self._origin_value - def set_value(self, variants=None, multiselection_text=None): + def reset_to_origin(self): + self.set_value(self._origin_value) + + def set_value(self, variants=None): if variants is None: variants = [] @@ -373,6 +394,7 @@ class VariantInputWidget(QtWidgets.QLineEdit): self._origin_value = list(variants) self._current_value = list(variants) + self.setPlaceholderText("") if not variants: self.setText("") @@ -380,6 +402,7 @@ class VariantInputWidget(QtWidgets.QLineEdit): self.setText(self._current_value[0]) else: + multiselection_text = self._multiselection_text if multiselection_text is None: multiselection_text = "|".join(variants) self.setText("") @@ -444,6 +467,9 @@ class MultipleItemWidget(QtWidgets.QWidget): class GlobalAttrsWidget(QtWidgets.QWidget): + multiselection_text = "< Multiselection >" + unknown_value = "N/A" + def __init__(self, controller, parent): super(GlobalAttrsWidget, self).__init__(parent) @@ -455,78 +481,120 @@ class GlobalAttrsWidget(QtWidgets.QWidget): family_value_widget = MultipleItemWidget(self) subset_value_widget = MultipleItemWidget(self) + variant_input.set_multiselection_text(self.multiselection_text) + asset_value_widget.set_multiselection_text(self.multiselection_text) + task_value_widget.set_multiselection_text(self.multiselection_text) + variant_input.set_value() asset_value_widget.set_selected_items() task_value_widget.set_selected_items() family_value_widget.set_value() subset_value_widget.set_value() + submit_btn = QtWidgets.QPushButton("Submit", self) + cancel_btn = QtWidgets.QPushButton("Cancel", self) + submit_btn.setEnabled(False) + cancel_btn.setEnabled(False) + + btns_layout = QtWidgets.QHBoxLayout() + btns_layout.setContentsMargins(0, 0, 0, 0) + btns_layout.addStretch(1) + btns_layout.addWidget(submit_btn) + btns_layout.addWidget(cancel_btn) + main_layout = QtWidgets.QFormLayout(self) main_layout.addRow("Name", variant_input) main_layout.addRow("Asset", asset_value_widget) main_layout.addRow("Task", task_value_widget) main_layout.addRow("Family", family_value_widget) main_layout.addRow("Subset", subset_value_widget) + main_layout.addRow(btns_layout) - asset_value_widget.selection_changed.connect(self._on_asset_change) + variant_input.value_changed.connect(self._on_variant_change) + asset_value_widget.value_changed.connect(self._on_asset_change) + task_value_widget.value_changed.connect(self._on_task_change) + submit_btn.clicked.connect(self._on_submit) + cancel_btn.clicked.connect(self._on_cancel) self.variant_input = variant_input self.asset_value_widget = asset_value_widget self.task_value_widget = task_value_widget self.family_value_widget = family_value_widget self.subset_value_widget = subset_value_widget + self.submit_btn = submit_btn + self.cancel_btn = cancel_btn + + def _on_submit(self): + print("submit") + self.cancel_btn.setEnabled(False) + self.submit_btn.setEnabled(False) + + def _on_cancel(self): + self.variant_input.reset_to_origin() + self.asset_value_widget.reset_to_origin() + self.task_value_widget.reset_to_origin() + self.cancel_btn.setEnabled(False) + self.submit_btn.setEnabled(False) + + def _on_value_change(self): + any_changed = ( + self.variant_input.has_value_changed() + or self.asset_value_widget.has_value_changed() + or self.task_value_widget.has_value_changed() + ) + + self.cancel_btn.setEnabled(any_changed) + self.submit_btn.setEnabled(any_changed) + + def _on_variant_change(self): + self._on_value_change() def _on_asset_change(self): asset_names = self.asset_value_widget.get_selected_items() self.task_value_widget.set_asset_names(asset_names) + self._on_value_change() + + def _on_task_change(self): + self._on_value_change() def set_current_instances(self, instances): - editable = False - multiselection_text = "< Multiselection >" - unknown = "N/A" + self.cancel_btn.setEnabled(False) + self.submit_btn.setEnabled(False) + asset_names = set() task_names = set() variants = set() families = set() subset_names = set() + + editable = True if len(instances) == 0: - pass + editable = False - elif len(instances) == 1: - instance = instances[0] - if instance.creator is not None: - editable = True + for instance in instances: + if instance.creator is None: + editable = False - variants.add(instance.data.get("variant") or unknown) - families.add(instance.data.get("family") or unknown) - asset_names.add(instance.data.get("asset") or unknown) - task_names.add(instance.data.get("task") or unknown) - subset_names.add(instance.data.get("subset") or unknown) + 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) + subset_names.add(instance.data.get("subset") or self.unknown_value) - else: + self.variant_input.set_value(variants) - for instance in instances: - variants.add(instance.data.get("variant") or unknown) - families.add(instance.data.get("family") or unknown) - asset_names.add(instance.data.get("asset") or unknown) - task_names.add(instance.data.get("task") or unknown) - subset_names.add(instance.data.get("subset") or unknown) - - self.variant_input.set_value( - variants, multiselection_text - ) # Set context of asset widget - self.asset_value_widget.set_selected_items( - asset_names, multiselection_text - ) + 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, multiselection_text - ) + self.task_value_widget.set_selected_items(task_names) self.family_value_widget.set_value(families) self.subset_value_widget.set_value(subset_names) + self.variant_input.setEnabled(editable) + self.asset_value_widget.setEnabled(editable) + self.task_value_widget.setEnabled(editable) + class FamilyAttrsWidget(QtWidgets.QWidget): def __init__(self, controller, parent):