From 30c36283ac7aba05b98a59a950ecac6dff27394d Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 15 Jul 2021 11:27:11 +0200 Subject: [PATCH] changed how reseting of plugins and instances work --- openpype/tools/new_publisher/control.py | 63 ++++++++++++++----------- openpype/tools/new_publisher/widgets.py | 4 +- openpype/tools/new_publisher/window.py | 8 +--- 3 files changed, 39 insertions(+), 36 deletions(-) diff --git a/openpype/tools/new_publisher/control.py b/openpype/tools/new_publisher/control.py index f183f662d2..fb44951083 100644 --- a/openpype/tools/new_publisher/control.py +++ b/openpype/tools/new_publisher/control.py @@ -26,8 +26,8 @@ class PublisherController: dbcon.install() self.dbcon = dbcon - self._reset_callback_refs = set() - self._on_create_callback_refs = set() + self._instances_refresh_callback_refs = set() + self._plugins_refresh_callback_refs = set() self.creators = {} @@ -37,15 +37,16 @@ class PublisherController: self.instances = [] - self._in_reset = False + self._resetting_plugins = False + self._resetting_instances = False - def add_on_reset_callback(self, callback): + def add_instances_refresh_callback(self, callback): ref = weakref.WeakMethod(callback) - self._reset_callback_refs.add(ref) + self._instances_refresh_callback_refs.add(ref) - def add_on_create_callback(self, callback): + def add_plugins_refresh_callback(self, callback): ref = weakref.WeakMethod(callback) - self._on_create_callback_refs.add(ref) + self._plugins_refresh_callback_refs.add(ref) def _trigger_callbacks(self, callbacks, *args, **kwargs): # Trigger reset callbacks @@ -61,16 +62,8 @@ class PublisherController: callbacks.remove(ref) def reset(self): - if self._in_reset: - return - - self._in_reset = True - self._reset() - - # Trigger reset callbacks - self._trigger_callbacks(self._reset_callback_refs) - - self._in_reset = False + self._reset_plugin() + self._reset_instances() def _get_publish_plugins_with_attr_for_family(self, family): if family not in self._attr_plugins_by_family: @@ -81,8 +74,13 @@ class PublisherController: return self._attr_plugins_by_family[family] - def _reset(self): + def _reset_plugin(self): """Reset to initial state.""" + if self._resetting_plugins: + return + + self._resetting_plugins = True + # Reset publish plugins self._attr_plugins_by_family = {} @@ -117,6 +115,16 @@ class PublisherController: self.creators = creators + self._resetting_plugins = False + + self._trigger_callbacks(self._plugins_refresh_callback_refs) + + def _reset_instances(self): + if self._resetting_instances: + return + + self._resetting_instances = True + # Collect instances host_instances = self.host.list_instances() instances = [] @@ -124,7 +132,7 @@ class PublisherController: family = instance_data["family"] # Prepare publish plugins with attribute definitions - creator = creators.get(family) + creator = self.creators.get(family) attr_plugins = self._get_publish_plugins_with_attr_for_family( family ) @@ -135,6 +143,10 @@ class PublisherController: self.instances = instances + self._resetting_instances = False + + self._trigger_callbacks(self._instances_refresh_callback_refs) + def get_family_attribute_definitions(self, instances): output = [] _attr_defs = {} @@ -198,16 +210,9 @@ class PublisherController: # QUESTION Force to return instances or call `list_instances` on each # creation? (`list_instances` may slow down...) creator = self.creators[family] - result = creator.create(subset_name, instance_data, options) - if result and not isinstance(result, (list, tuple)): - result = [result] + creator.create(subset_name, instance_data, options) - for instance in result: - self.instances.append(instance) - - self._trigger_callbacks(self._on_create_callback_refs) - - return result + self._reset_instances() def save_instance_changes(self): update_list = [] @@ -221,3 +226,5 @@ class PublisherController: def remove_instances(self, instances): self.host.remove_instances(instances) + + self._reset_instances() diff --git a/openpype/tools/new_publisher/widgets.py b/openpype/tools/new_publisher/widgets.py index 513040d024..b8a56619ac 100644 --- a/openpype/tools/new_publisher/widgets.py +++ b/openpype/tools/new_publisher/widgets.py @@ -476,7 +476,7 @@ class CreateDialog(QtWidgets.QDialog): ) variant_hints_menu.triggered.connect(self._on_variant_action) - controller.add_on_reset_callback(self._on_control_reset) + controller.add_plugins_refresh_callback(self._on_plugins_refresh) self.asset_name_input = asset_name_input self.subset_name_input = subset_name_input @@ -580,7 +580,7 @@ class CreateDialog(QtWidgets.QDialog): index = self.family_model.index(0, 0) self.family_view.setCurrentIndex(index) - def _on_control_reset(self): + def _on_plugins_refresh(self): # Trigger refresh only if is visible if self.isVisible(): self.refresh() diff --git a/openpype/tools/new_publisher/window.py b/openpype/tools/new_publisher/window.py index 7a6aff79bd..505efa4771 100644 --- a/openpype/tools/new_publisher/window.py +++ b/openpype/tools/new_publisher/window.py @@ -135,8 +135,7 @@ class PublisherWindow(QtWidgets.QWidget): creator_window = CreateDialog(controller, self) - controller.add_on_reset_callback(self._on_control_reset) - controller.add_on_create_callback(self._on_control_create) + controller.add_instances_refresh_callback(self._on_instances_refresh) reset_btn.clicked.connect(self._on_reset_clicked) @@ -289,10 +288,7 @@ class PublisherWindow(QtWidgets.QWidget): # Force to change instance and refresh details self._on_subset_change() - def _on_control_create(self): - self._refresh_instances() - - def _on_control_reset(self): + def _on_instances_refresh(self): self._refresh_instances() def _on_subset_change(self, *_args):