update pre-create attributes on change

This commit is contained in:
Jakub Trllo 2024-10-01 17:45:48 +02:00
parent cef35485ee
commit 7537cf8ebc
4 changed files with 75 additions and 8 deletions

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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