diff --git a/client/ayon_core/pipeline/create/context.py b/client/ayon_core/pipeline/create/context.py index 9cde82db10..3245b68699 100644 --- a/client/ayon_core/pipeline/create/context.py +++ b/client/ayon_core/pipeline/create/context.py @@ -801,6 +801,11 @@ class CreateContext: def listen_to_value_changes(self, callback): self._event_hub.add_callback(VALUE_CHANGED_TOPIC, callback) + def listen_to_pre_create_attr_defs_change(self, callback): + self._event_hub.add_callback( + PRE_CREATE_ATTR_DEFS_CHANGED_TOPIC, callback + ) + def listen_to_create_attr_defs_change(self, callback): self._event_hub.add_callback(CREATE_ATTR_DEFS_CHANGED_TOPIC, callback) diff --git a/client/ayon_core/tools/publisher/abstract.py b/client/ayon_core/tools/publisher/abstract.py index 9a81fa0ac0..bc72947551 100644 --- a/client/ayon_core/tools/publisher/abstract.py +++ b/client/ayon_core/tools/publisher/abstract.py @@ -265,6 +265,11 @@ class AbstractPublisherFrontend(AbstractPublisherCommon): """ pass + @abstractmethod + def get_folder_id_from_path(self, folder_path: str) -> Optional[str]: + """Get folder id from folder path.""" + pass + # --- Create --- @abstractmethod def get_creator_items(self) -> Dict[str, "CreatorItem"]: @@ -276,6 +281,21 @@ class AbstractPublisherFrontend(AbstractPublisherCommon): """ pass + @abstractmethod + def get_creator_item_by_id( + self, identifier: str + ) -> Optional["CreatorItem"]: + """Get creator item by identifier. + + Args: + identifier (str): Create plugin identifier. + + Returns: + Optional[CreatorItem]: Creator item or None. + + """ + pass + @abstractmethod def get_creator_icon( self, identifier: str diff --git a/client/ayon_core/tools/publisher/models/create.py b/client/ayon_core/tools/publisher/models/create.py index a2530cacc6..f6f9789514 100644 --- a/client/ayon_core/tools/publisher/models/create.py +++ b/client/ayon_core/tools/publisher/models/create.py @@ -374,6 +374,9 @@ class CreateModel: self._create_context.listen_to_value_changes( self._cc_value_changed ) + self._create_context.listen_to_pre_create_attr_defs_change( + self._cc_pre_create_attr_changed + ) self._create_context.listen_to_create_attr_defs_change( self._cc_create_attr_changed ) @@ -386,7 +389,7 @@ class CreateModel: def get_creator_items(self) -> Dict[str, CreatorItem]: """Creators that can be shown in create dialog.""" if self._creator_items is None: - self._creator_items = self._collect_creator_items() + self._refresh_creator_items() return self._creator_items def get_creator_item_by_id( @@ -883,6 +886,21 @@ class CreateModel: return output + def _refresh_creator_items(self, identifiers=None): + if identifiers is None: + self._creator_items = self._collect_creator_items() + return + + for identifier in identifiers: + if identifier not in self._creator_items: + continue + creator = self._create_context.creators.get(identifier) + if creator is None: + continue + self._creator_items[identifier] = ( + CreatorItem.from_creator(creator) + ) + def _cc_added_instance(self, event): instance_ids = { instance.id @@ -919,6 +937,14 @@ class CreateModel: {"instance_changes": instance_changes}, ) + def _cc_pre_create_attr_changed(self, event): + identifiers = event["identifiers"] + self._refresh_creator_items(identifiers) + self._emit_event( + "create.context.pre.create.attrs.changed", + {"identifiers": identifiers}, + ) + def _cc_create_attr_changed(self, event): instance_ids = { instance.id diff --git a/client/ayon_core/tools/publisher/widgets/create_widget.py b/client/ayon_core/tools/publisher/widgets/create_widget.py index 4c94c5c9b9..aecea2ec44 100644 --- a/client/ayon_core/tools/publisher/widgets/create_widget.py +++ b/client/ayon_core/tools/publisher/widgets/create_widget.py @@ -111,7 +111,7 @@ class CreateWidget(QtWidgets.QWidget): self._folder_path = None self._product_names = None - self._selected_creator = None + self._selected_creator_identifier = None self._prereq_available = False @@ -262,6 +262,10 @@ class CreateWidget(QtWidgets.QWidget): controller.register_event_callback( "controller.reset.finished", self._on_controler_reset ) + controller.register_event_callback( + "create.context.pre.create.attrs.changed", + self._pre_create_attr_changed + ) self._main_splitter_widget = main_splitter_widget @@ -512,6 +516,15 @@ class CreateWidget(QtWidgets.QWidget): # Trigger refresh only if is visible self.refresh() + def _pre_create_attr_changed(self, event): + if ( + self._selected_creator_identifier is None + or self._selected_creator_identifier not in event["identifiers"] + ): + return + + self._set_creator_by_identifier(self._selected_creator_identifier) + def _on_folder_change(self): self._refresh_product_name() if self._context_change_is_enabled(): @@ -563,12 +576,13 @@ class CreateWidget(QtWidgets.QWidget): self._set_creator_detailed_text(creator_item) self._pre_create_widget.set_creator_item(creator_item) - self._selected_creator = creator_item - if not creator_item: + self._selected_creator_identifier = None self._set_context_enabled(False) return + self._selected_creator_identifier = creator_item.identifier + if ( creator_item.create_allow_context_change != self._context_change_is_enabled() @@ -603,7 +617,7 @@ class CreateWidget(QtWidgets.QWidget): return # This should probably never happen? - if not self._selected_creator: + if not self._selected_creator_identifier: if self.product_name_input.text(): self.product_name_input.setText("") return @@ -625,11 +639,13 @@ class CreateWidget(QtWidgets.QWidget): folder_path = self._get_folder_path() task_name = self._get_task_name() - creator_idenfier = self._selected_creator.identifier # Calculate product name with Creator plugin try: product_name = self._controller.get_product_name( - creator_idenfier, variant_value, task_name, folder_path + self._selected_creator_identifier, + variant_value, + task_name, + folder_path ) except TaskNotSetError: self._create_btn.setEnabled(False) @@ -755,7 +771,7 @@ class CreateWidget(QtWidgets.QWidget): ) if success: - self._set_creator(self._selected_creator) + self._set_creator_by_identifier(self._selected_creator_identifier) self._variant_widget.setText(variant) self._controller.emit_card_message("Creation finished...") self._last_thumbnail_path = None