From f572f2c6518bd44a9637624f1caaae32cb009bd2 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Wed, 14 Jul 2021 12:07:09 +0200 Subject: [PATCH] plugin attributes and values are used based on instance --- openpype/tools/new_publisher/control.py | 44 +++++++++++++++-------- openpype/tools/new_publisher/widgets.py | 47 +++++++++++++++++++++++-- 2 files changed, 74 insertions(+), 17 deletions(-) diff --git a/openpype/tools/new_publisher/control.py b/openpype/tools/new_publisher/control.py index 2ce47f61d7..75356bb5a7 100644 --- a/openpype/tools/new_publisher/control.py +++ b/openpype/tools/new_publisher/control.py @@ -158,24 +158,40 @@ class PublisherController: return ([], [], []) def get_publish_attribute_definitions(self, instances): - families = set() + all_defs_by_plugin_name = {} + all_plugin_values = {} for instance in instances: - family = instance.data["family"] - families.add(family) + for plugin_name, attr_val in instance.publish_attributes.items(): + attr_defs = attr_val.attr_defs + if not attr_defs: + continue - plugins_with_defs = [] - for plugin in self.publish_plugins: - if OpenPypePyblishPluginMixin in inspect.getmro(plugin): - plugins_with_defs.append(plugin) + if plugin_name not in all_defs_by_plugin_name: + all_defs_by_plugin_name[plugin_name] = attr_val.attr_defs + + if plugin_name not in all_plugin_values: + all_plugin_values[plugin_name] = {} + + plugin_values = all_plugin_values[plugin_name] + + for attr_def in attr_defs: + if attr_def.key not in plugin_values: + plugin_values[attr_def.key] = [] + attr_values = plugin_values[attr_def.key] + + value = attr_val[attr_def.key] + attr_values.append((instance, value)) - filtered_plugins = pyblish.logic.plugins_by_families( - plugins_with_defs, families - ) output = [] - for plugin in filtered_plugins: - attr_defs = plugin.get_attribute_defs() - if attr_defs: - output.append((plugin.__name__, attr_defs)) + for plugin in self.plugins_with_defs: + plugin_name = plugin.__name__ + if plugin_name not in all_defs_by_plugin_name: + continue + output.append(( + plugin_name, + all_defs_by_plugin_name[plugin_name], + all_plugin_values + )) return output def create(self, family, subset_name, instance_data, options): diff --git a/openpype/tools/new_publisher/widgets.py b/openpype/tools/new_publisher/widgets.py index cace227ee8..6b3580bf0a 100644 --- a/openpype/tools/new_publisher/widgets.py +++ b/openpype/tools/new_publisher/widgets.py @@ -80,6 +80,7 @@ class FamilyAttrsWidget(QtWidgets.QWidget): self._attr_def_id_to_instances = {} self._attr_def_id_to_attr_def = {} + # To store content of scroll area to prevend garbage collection self._content_widget = None @@ -148,6 +149,11 @@ class PublishPluginAttrsWidget(QtWidgets.QWidget): self.controller = controller self._scroll_area = scroll_area + + self._attr_def_id_to_instances = {} + self._attr_def_id_to_attr_def = {} + self._attr_def_id_to_plugin_name = {} + # Store content of scroll area to prevend garbage collection self._content_widget = None @@ -160,23 +166,58 @@ class PublishPluginAttrsWidget(QtWidgets.QWidget): self._content_widget = None - attr_defs = self.controller.get_publish_attribute_definitions( + self._attr_def_id_to_instances = {} + self._attr_def_id_to_attr_def = {} + self._attr_def_id_to_plugin_name = {} + + result = self.controller.get_publish_attribute_definitions( instances ) content_widget = QtWidgets.QWidget(self._scroll_area) content_layout = QtWidgets.QFormLayout(content_widget) - for plugin_name, plugin_attr_defs in attr_defs: - for attr_def in plugin_attr_defs: + for plugin_name, attr_defs, all_plugin_values in result: + plugin_values = all_plugin_values[plugin_name] + + for attr_def in attr_defs: widget = create_widget_for_attr_def( attr_def, content_widget ) label = attr_def.label or attr_def.key content_layout.addRow(label, widget) + widget.value_changed.connect(self._input_value_changed) + + attr_values = plugin_values[attr_def.key] + mutlivalue = len(attr_values) > 1 + values = set() + instances = [] + for instance, value in attr_values: + values.add(value) + instances.append(instance) + + values = list(values) + + self._attr_def_id_to_attr_def[attr_def.id] = attr_def + self._attr_def_id_to_instances[attr_def.id] = instances + self._attr_def_id_to_plugin_name[attr_def.id] = plugin_name + + widget.set_value(values[0]) + self._scroll_area.setWidget(content_widget) self._content_widget = content_widget + def _input_value_changed(self, value, attr_id): + instances = self._attr_def_id_to_instances.get(attr_id) + attr_def = self._attr_def_id_to_attr_def.get(attr_id) + plugin_name = self._attr_def_id_to_plugin_name.get(attr_id) + if not instances or not attr_def or not plugin_name: + return + + for instance in instances: + plugin_val = instance.publish_attributes[plugin_name] + plugin_val[attr_def.key] = value + class SubsetAttributesWidget(QtWidgets.QWidget): """Widget where attributes of instance/s are modified.