mirror of
https://github.com/ynput/ayon-core.git
synced 2026-01-02 08:54:53 +01:00
plugin attributes and values are used based on instance
This commit is contained in:
parent
37e43c6edf
commit
f572f2c651
2 changed files with 74 additions and 17 deletions
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue