diff --git a/client/ayon_core/tools/utils/host_tools.py b/client/ayon_core/tools/utils/host_tools.py index 96b7615e3cf..05ca6d0da05 100644 --- a/client/ayon_core/tools/utils/host_tools.py +++ b/client/ayon_core/tools/utils/host_tools.py @@ -3,9 +3,12 @@ It is possible to create `HostToolsHelper` in host implementation or use singleton approach with global functions (using helper anyway). """ +from __future__ import annotations + import os import pyblish.api +from typing import TYPE_CHECKING, Literal from ayon_core.host import ILoadHost, IPublishHost from ayon_core.lib import Logger @@ -13,6 +16,20 @@ from .lib import qt_app_context +if TYPE_CHECKING: + from qtpy.QtWidgets import QWidget + from ayon_core.tools.publisher.abstract import AbstractPublisherFrontend + +PublisherTabs = Literal["create", "publish", "report", "details"] +ToolName = Literal[ + "workfiles", + "loader", + "sceneinventory", + "publisher", + "experimental_tools", + "publish" +] + class HostToolsHelper: """Create and cache tool windows in memory. @@ -52,14 +69,21 @@ def get_workfiles_tool(self, parent): return self._workfiles_tool def show_workfiles( - self, parent=None, use_context=None, save=None, on_top=None - ): + self, + parent: QWidget | None = None, + *, + use_context: bool = False, + save: bool | None = None, + on_top: bool | None = None, + ) -> QWidget: """Workfiles tool for changing context and saving workfiles.""" with qt_app_context(): workfiles_tool = self.get_workfiles_tool(parent) workfiles_tool.ensure_visible(use_context, save, on_top) + return workfiles_tool + def get_loader_tool(self, parent): """Create, cache and return loader tool window.""" if self._loader_tool is None: @@ -79,8 +103,18 @@ def get_loader_tool(self, parent): return self._loader_tool - def show_loader(self, parent=None, use_context=None): - """Loader tool for loading representations.""" + def show_loader( + self, parent: QWidget | None = None + ) -> QWidget: + """Loader tool for loading representations. + + Args: + parent (QWidget): parent widget + + Returns: + QWidget of the tool shown. + + """ with qt_app_context(): loader_tool = self.get_loader_tool(parent) @@ -88,11 +122,8 @@ def show_loader(self, parent=None, use_context=None): loader_tool.raise_() loader_tool.activateWindow() loader_tool.showNormal() - - if use_context is None: - use_context = False - loader_tool.refresh() + return loader_tool def get_scene_inventory_tool(self, parent): """Create, cache and return scene inventory tool window.""" @@ -110,7 +141,9 @@ def get_scene_inventory_tool(self, parent): return self._scene_inventory_tool - def show_scene_inventory(self, parent=None): + def show_scene_inventory( + self, parent: QWidget | None = None + ) -> QWidget: """Show tool maintain loaded containers.""" with qt_app_context(): scene_inventory_tool = self.get_scene_inventory_tool(parent) @@ -122,15 +155,27 @@ def show_scene_inventory(self, parent=None): scene_inventory_tool.activateWindow() scene_inventory_tool.showNormal() + return scene_inventory_tool + def get_library_loader_tool(self, parent): """Create, cache and return library loader tool window.""" return self.get_loader_tool(parent) - def show_library_loader(self, parent=None): - """Loader tool for loading representations from library project.""" + def show_library_loader(self, parent: QWidget | None = None) -> QWidget: + """Loader tool for loading representations from library project. + + Args: + parent (QWidget): parent widget + + Returns: + QWidget of the tool shown. + + """ return self.show_loader(parent) - def show_publish(self, parent=None): + def show_publish( + self, parent: QWidget | None = None + ) -> QWidget: """Try showing the most desirable publish GUI This function cycles through the currently registered @@ -174,8 +219,18 @@ def get_experimental_tools_dialog(self, parent=None): self._experimental_tools_dialog = ExperimentalToolsDialog(parent) return self._experimental_tools_dialog - def show_experimental_tools_dialog(self, parent=None): - """Show dialog with experimental tools.""" + def show_experimental_tools_dialog( + self, parent: QWidget | None = None + ) -> QWidget: + """Show dialog with experimental tools. + + Args: + parent (QWidget): parent widget. + + Returns: + QWidget of the tool shown. + + """ with qt_app_context(): dialog = self.get_experimental_tools_dialog(parent) @@ -184,6 +239,8 @@ def show_experimental_tools_dialog(self, parent=None): dialog.activateWindow() dialog.showNormal() + return dialog + def get_publisher_tool(self, parent=None, controller=None): """Create, cache and return publisher window.""" @@ -201,75 +258,116 @@ def get_publisher_tool(self, parent=None, controller=None): return self._publisher_tool - def show_publisher_tool(self, parent=None, controller=None, tab=None): + def show_publisher_tool( + self, + parent: QWidget | None = None, + controller: AbstractPublisherFrontend | None = None, + tab: PublisherTabs | None = None + ) -> QWidget: with qt_app_context(): window = self.get_publisher_tool(parent, controller) if tab: window.set_current_tab(tab) window.make_sure_is_visible() + return window + + def get_tool_by_name( + self, + tool_name: PublisherTabs, + parent: QWidget | None = None, + *args, + **kwargs + ) -> QWidget | None: + """Show tool by its name. + + This is helper for `show_tool_by_name` if you need only get + tool window without showing it. + + Args: + tool_name: name of the tool + parent: tool parent + *args: tool args + **kwargs: tool kwargs + + Returns: + QWidget of the tool shown or None if tool name is unknown + or tool can't be created. - def get_tool_by_name(self, tool_name, parent=None, *args, **kwargs): - """Show tool by it's name. - - This is helper for """ if tool_name == "workfiles": - return self.get_workfiles_tool(parent, *args, **kwargs) + return self.get_workfiles_tool(parent) if tool_name == "loader": - return self.get_loader_tool(parent, *args, **kwargs) + return self.get_loader_tool(parent) if tool_name == "libraryloader": - return self.get_library_loader_tool(parent, *args, **kwargs) + return self.get_library_loader_tool(parent) if tool_name == "sceneinventory": - return self.get_scene_inventory_tool(parent, *args, **kwargs) + return self.get_scene_inventory_tool(parent) if tool_name == "publisher": return self.get_publisher_tool(parent, *args, **kwargs) if tool_name == "experimental_tools": - return self.get_experimental_tools_dialog(parent, *args, **kwargs) + return self.get_experimental_tools_dialog(parent) if tool_name == "publish": self.log.info("Can't return publish tool window.") return None self.log.warning( - "Can't show unknown tool name: \"{}\"".format(tool_name) - ) + 'Cannot show unknown tool name: "%s"', tool_name) return None - def show_tool_by_name(self, tool_name, parent=None, *args, **kwargs): - """Show tool by it's name. + def show_tool_by_name( + self, + tool_name: ToolName, + parent: QWidget | None = None, + *args, + **kwargs + ) -> QWidget | None: + """Show tool by its name. + + This is helper for showing tool window by its name. It is possible + to pass additional args and kwargs. + + Args: + tool_name: name of the tool + parent: tool parent + *args: tool args + **kwargs: tool kwargs + + Returns: + QWidget of the tool shown or None if tool name is unknown + or tool can't be created. - This is helper for """ if tool_name == "workfiles": - self.show_workfiles(parent, *args, **kwargs) + return self.show_workfiles(parent, *args, **kwargs) - elif tool_name == "loader": - self.show_loader(parent, *args, **kwargs) + if tool_name == "loader": + return self.show_loader(parent) - elif tool_name == "libraryloader": - self.show_library_loader(parent, *args, **kwargs) + if tool_name == "libraryloader": + return self.show_library_loader(parent) - elif tool_name == "sceneinventory": - self.show_scene_inventory(parent, *args, **kwargs) + if tool_name == "sceneinventory": + return self.show_scene_inventory(parent) - elif tool_name == "publish": - self.show_publish(parent, *args, **kwargs) + if tool_name == "publish": + return self.show_publish(parent) - elif tool_name == "publisher": - self.show_publisher_tool(parent, *args, **kwargs) + if tool_name == "publisher": + return self.show_publisher_tool(parent, *args, **kwargs) - elif tool_name == "experimental_tools": - self.show_experimental_tools_dialog(parent, *args, **kwargs) + if tool_name == "experimental_tools": + return self.show_experimental_tools_dialog(parent) - else: - self.log.warning( - "Can't show unknown tool name: \"{}\"".format(tool_name) - ) + self.log.warning( + "Can't show unknown tool name: \"%s\"", tool_name + ) + return None class _SingletonPoint: @@ -287,9 +385,17 @@ def _create_helper(cls): cls.helper = HostToolsHelper() @classmethod - def show_tool_by_name(cls, tool_name, parent=None, *args, **kwargs): + def show_tool_by_name( + cls, + tool_name: ToolName, + parent: QWidget | None = None, + *args, + **kwargs + ) -> QWidget | None: cls._create_helper() - cls.helper.show_tool_by_name(tool_name, parent, *args, **kwargs) + return cls.helper.show_tool_by_name( + tool_name, parent, *args, **kwargs + ) @classmethod def get_tool_by_name(cls, tool_name, parent=None, *args, **kwargs): @@ -299,43 +405,133 @@ def get_tool_by_name(cls, tool_name, parent=None, *args, **kwargs): # Function callbacks using singleton access point def get_tool_by_name(tool_name, parent=None, *args, **kwargs): - return _SingletonPoint.get_tool_by_name(tool_name, parent, *args, **kwargs) + return _SingletonPoint.get_tool_by_name( + tool_name, parent, *args, **kwargs + ) + +def show_tool_by_name( + tool_name: ToolName, + parent: QWidget | None = None, + *args, + **kwargs +) -> QWidget | None: + """Show tool by its name. -def show_tool_by_name(tool_name, parent=None, *args, **kwargs): - _SingletonPoint.show_tool_by_name(tool_name, parent, *args, **kwargs) + Args: + tool_name: tool name, + parent: tool parent, + *args: tool args, + **kwargs: tool kwargs, + + Returns: + QWidget of the tool + + """ + return _SingletonPoint.show_tool_by_name( + tool_name, parent, *args, **kwargs + ) -def show_workfiles(*args, **kwargs): - _SingletonPoint.show_tool_by_name( +def show_workfiles(*args, **kwargs) -> QWidget | None: + """Show workfiles tool. + + Args: + *args: tool args, + **kwargs: tool kwargs, + + Returns: + QWidget of the tool + """ + return _SingletonPoint.show_tool_by_name( "workfiles", *args, **kwargs ) -def show_loader(parent=None, use_context=None): - _SingletonPoint.show_tool_by_name( +def show_loader( + parent: QWidget | None = None, + *, + use_context: bool = False +) -> QWidget | None: + """Show loader tool. + + Args: + parent: tool parent, + use_context: use context, + + Returns: + QWidget of the tool + + """ + return _SingletonPoint.show_tool_by_name( "loader", parent, use_context=use_context ) -def show_library_loader(parent=None): - _SingletonPoint.show_tool_by_name("libraryloader", parent) +def show_scene_inventory( + parent: QWidget | None = None +) -> QWidget | None: + """Show scene inventory tool. + Args: + parent: tool parent, -def show_scene_inventory(parent=None): - _SingletonPoint.show_tool_by_name("sceneinventory", parent) + Returns: + QWidget of the tool + + """ + return _SingletonPoint.show_tool_by_name( + "sceneinventory", parent + ) + + +def show_publish(parent: QWidget | None = None) -> QWidget | None: + """Show publish tool. + + Args: + parent: tool parent + + Returns: + QWidget of the tool + + """ + return _SingletonPoint.show_tool_by_name("publish", parent) -def show_publish(parent=None): - _SingletonPoint.show_tool_by_name("publish", parent) +def show_publisher( + parent: QWidget | None = None, + **kwargs +) -> QWidget | None: + """Show publisher tool. + Args: + parent: tool parent, + **kwargs: tool kwargs, -def show_publisher(parent=None, **kwargs): - _SingletonPoint.show_tool_by_name("publisher", parent, **kwargs) + Returns: + QWidget of the tool + """ + return _SingletonPoint.show_tool_by_name( + "publisher", parent, **kwargs + ) + + +def show_experimental_tools_dialog( + parent: QWidget | None = None +) -> QWidget | None: + """Show experimental tools dialog. -def show_experimental_tools_dialog(parent=None): - _SingletonPoint.show_tool_by_name("experimental_tools", parent) + Args: + parent: tool parent + + Returns: + QWidget of the tool + + """ + return _SingletonPoint.show_tool_by_name( + "experimental_tools", parent + ) def get_pyblish_icon():