Skip to content

Commit

Permalink
Merge pull request #17735 from dalthviz/fixes_issue_17726
Browse files Browse the repository at this point in the history
PR: Move deleteLater calls to be done after validating plugin can be closed
  • Loading branch information
ccordoba12 authored Apr 22, 2022
2 parents 7a784b3 + d252611 commit 313a20b
Showing 1 changed file with 26 additions and 48 deletions.
74 changes: 26 additions & 48 deletions spyder/api/plugin_registration/registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -425,6 +425,28 @@ def delete_plugin(self, plugin_name: str, teardown: bool = True) -> bool:
return False

if isinstance(plugin_instance, SpyderPluginV2):
# Cleanly delete plugin widgets. This avoids segfautls with
# PyQt 5.15
if isinstance(plugin_instance, SpyderDockablePlugin):
try:
plugin_instance.get_widget().close()
plugin_instance.get_widget().deleteLater()
except RuntimeError:
pass
else:
container = plugin_instance.get_container()
if container:
try:
container.close()
container.deleteLater()
except RuntimeError:
pass

# Delete plugin
try:
plugin_instance.deleteLater()
except RuntimeError:
pass
if teardown:
# Disconnect plugin from other plugins
self._teardown_plugin(plugin_name)
Expand All @@ -449,6 +471,10 @@ def delete_plugin(self, plugin_name: str, teardown: bool = True) -> bool:
except RuntimeError:
pass
elif isinstance(plugin_instance, SpyderPlugin):
try:
plugin_instance.deleteLater()
except RuntimeError:
pass
if teardown:
# Disconnect depending plugins from the plugin to delete
self._notify_plugin_teardown(plugin_name)
Expand Down Expand Up @@ -535,10 +561,6 @@ def delete_all_plugins(self, excluding: Optional[Set[str]] = None,
if plugin_name not in excluding:
plugin_instance = self.plugin_registry[plugin_name]
if isinstance(plugin_instance, SpyderPlugin):
try:
plugin_instance.deleteLater()
except RuntimeError:
pass
can_close &= self.delete_plugin(
plugin_name, teardown=False)
if not can_close and not close_immediately:
Expand All @@ -552,28 +574,6 @@ def delete_all_plugins(self, excluding: Optional[Set[str]] = None,
if plugin_name not in excluding:
plugin_instance = self.plugin_registry[plugin_name]
if isinstance(plugin_instance, SpyderPluginV2):
# Cleanly delete plugin widgets. This avoids segfautls with
# PyQt 5.15
if isinstance(plugin_instance, SpyderDockablePlugin):
try:
plugin_instance.get_widget().close()
plugin_instance.get_widget().deleteLater()
except RuntimeError:
pass
else:
container = plugin_instance.get_container()
if container:
try:
container.close()
container.deleteLater()
except RuntimeError:
pass

# Delete plugin
try:
plugin_instance.deleteLater()
except RuntimeError:
pass
can_close &= self.delete_plugin(
plugin_name, teardown=False)
if not can_close and not close_immediately:
Expand All @@ -587,28 +587,6 @@ def delete_all_plugins(self, excluding: Optional[Set[str]] = None,
if plugin_name not in excluding:
plugin_instance = self.plugin_registry[plugin_name]
if isinstance(plugin_instance, SpyderPluginV2):
# Cleanly delete plugin widgets. This avoids segfautls with
# PyQt 5.15
if isinstance(plugin_instance, SpyderDockablePlugin):
try:
plugin_instance.get_widget().close()
plugin_instance.get_widget().deleteLater()
except RuntimeError:
pass
else:
container = plugin_instance.get_container()
if container:
try:
container.close()
container.deleteLater()
except RuntimeError:
pass

# Delete plugin
try:
plugin_instance.deleteLater()
except RuntimeError:
pass
can_close &= self.delete_plugin(
plugin_name, teardown=False)
if not can_close and not close_immediately:
Expand Down

0 comments on commit 313a20b

Please sign in to comment.