From 39c9df52b818938bf02f38c35277cf4dec92ab34 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Sep 2021 12:28:52 +0000 Subject: [PATCH 01/34] Bump axios from 0.21.1 to 0.21.4 in /website Bumps [axios](https://github.com/axios/axios) from 0.21.1 to 0.21.4. - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/master/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v0.21.1...v0.21.4) --- updated-dependencies: - dependency-name: axios dependency-type: indirect ... Signed-off-by: dependabot[bot] --- website/yarn.lock | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/website/yarn.lock b/website/yarn.lock index 066d156d97..ae40005384 100644 --- a/website/yarn.lock +++ b/website/yarn.lock @@ -2175,11 +2175,11 @@ autoprefixer@^10.0.2, autoprefixer@^10.2.5: postcss-value-parser "^4.1.0" axios@^0.21.1: - version "0.21.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" - integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== + version "0.21.4" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" + integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== dependencies: - follow-redirects "^1.10.0" + follow-redirects "^1.14.0" babel-loader@^8.2.2: version "8.2.2" @@ -3982,10 +3982,10 @@ flux@^4.0.1: fbemitter "^3.0.0" fbjs "^3.0.0" -follow-redirects@^1.0.0, follow-redirects@^1.10.0: - version "1.13.3" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.3.tgz#e5598ad50174c1bc4e872301e82ac2cd97f90267" - integrity sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA== +follow-redirects@^1.0.0, follow-redirects@^1.14.0: + version "1.14.4" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.4.tgz#838fdf48a8bbdd79e52ee51fb1c94e3ed98b9379" + integrity sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g== for-in@^1.0.2: version "1.0.2" From 3ae3ec1185e3fd0c5c1020adedf94348f0bc8f78 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 14 Oct 2021 19:00:32 +0200 Subject: [PATCH 02/34] tools are always on top if don't have set parent --- openpype/tools/libraryloader/app.py | 5 ++++- openpype/tools/loader/app.py | 5 ++++- openpype/tools/workfiles/app.py | 5 ++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/openpype/tools/libraryloader/app.py b/openpype/tools/libraryloader/app.py index 8080c547c9..3f11157418 100644 --- a/openpype/tools/libraryloader/app.py +++ b/openpype/tools/libraryloader/app.py @@ -38,7 +38,10 @@ class LibraryLoaderWindow(QtWidgets.QDialog): # Enable minimize and maximize for app self.setWindowTitle(self.tool_title) - self.setWindowFlags(QtCore.Qt.Window) + window_flags = QtCore.Qt.Window + if not parent: + window_flags |= QtCore.Qt.WindowStaysOnTopHint + self.setWindowFlags(window_flags) self.setFocusPolicy(QtCore.Qt.StrongFocus) if icon is not None: self.setWindowIcon(icon) diff --git a/openpype/tools/loader/app.py b/openpype/tools/loader/app.py index c18b6e798a..bc0eef3bca 100644 --- a/openpype/tools/loader/app.py +++ b/openpype/tools/loader/app.py @@ -51,7 +51,10 @@ class LoaderWindow(QtWidgets.QDialog): self.family_config_cache = lib.FamilyConfigCache(io) # Enable minimize and maximize for app - self.setWindowFlags(QtCore.Qt.Window) + window_flags = QtCore.Qt.Window + if not parent: + window_flags |= QtCore.Qt.WindowStaysOnTopHint + self.setWindowFlags(window_flags) self.setFocusPolicy(QtCore.Qt.StrongFocus) body = QtWidgets.QWidget() diff --git a/openpype/tools/workfiles/app.py b/openpype/tools/workfiles/app.py index 6fff0d0278..18e8cfc6d3 100644 --- a/openpype/tools/workfiles/app.py +++ b/openpype/tools/workfiles/app.py @@ -944,7 +944,10 @@ class Window(QtWidgets.QMainWindow): def __init__(self, parent=None): super(Window, self).__init__(parent=parent) self.setWindowTitle(self.title) - self.setWindowFlags(QtCore.Qt.Window | QtCore.Qt.WindowCloseButtonHint) + window_flags = QtCore.Qt.Window | QtCore.Qt.WindowCloseButtonHint + if not parent: + window_flags |= QtCore.Qt.WindowStaysOnTopHint + self.setWindowFlags(window_flags) # Create pages widget and set it as central widget pages_widget = QtWidgets.QStackedWidget(self) From 5d426741d5553b93840912a86a991e70f3513658 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 14 Oct 2021 19:06:43 +0200 Subject: [PATCH 03/34] initial idea of caching host tools at single place --- openpype/tools/utils/host_tools.py | 205 +++++++++++++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 openpype/tools/utils/host_tools.py diff --git a/openpype/tools/utils/host_tools.py b/openpype/tools/utils/host_tools.py new file mode 100644 index 0000000000..203db36949 --- /dev/null +++ b/openpype/tools/utils/host_tools.py @@ -0,0 +1,205 @@ +"""Single access point to all tools usable in hosts. + +It is possible to create `HostToolsHelper` in host implementaion or +use singleton approach with global functions (using helper anyway). +""" + +from Qt import QtCore +import avalon.api + + +class HostToolsHelper: + """Create and cache tool windows in memory. + + Almost all methods expect parent widget but the parent is used only on + first tool creation. + + Class may also contain tools that are available only for one or few hosts. + """ + def __init__(self, parent=None): + self._parent = parent + self._workfiles_tool = None + self._loader_tool = None + self._creator_tool = None + self._subset_manager_tool = None + self._scene_inventory_tool = None + self._library_loader_tool = None + + def _get_workfiles_tool(self, parent): + if self._workfiles_tool is None: + from openpype.tools.workfiles.app import ( + Window, validate_host_requirements + ) + # Host validation + host = avalon.api.registered_host() + validate_host_requirements(host) + + window = Window(parent=parent) + + context = { + "asset": avalon.api.Session["AVALON_ASSET"], + "silo": avalon.api.Session["AVALON_SILO"], + "task": avalon.api.Session["AVALON_TASK"] + } + window.set_context(context) + + self._workfiles_tool = window + + return self._workfiles_tool + + def show_workfiles_tool(self, parent=None): + workfiles_tool = self._get_workfiles_tool(parent) + + workfiles_tool.refresh() + workfiles_tool.show() + # Pull window to the front. + workfiles_tool.raise_() + workfiles_tool.activateWindow() + + def _get_loader_tool(self, parent): + if self._loader_tool is None: + from openpype.tools.loader import LoaderWindow + + self._loader_tool = LoaderWindow(parent=parent or self._parent) + + return self._loader_tool + + def show_loader_tool(self, parent=None): + loader_tool = self._get_loader_tool(parent) + + context = {"asset": avalon.api.Session["AVALON_ASSET"]} + loader_tool.set_context(context, refresh=True) + + loader_tool.show() + loader_tool.raise_() + loader_tool.activateWindow() + loader_tool.refresh() + + def _get_creator_tool(self, parent): + if self._creator_tool is None: + from avalon.tools.creator.app import Window + + self._creator_tool = Window(parent=parent or self._parent) + + return self._creator_tool + + def show_creator_tool(self, parent=None): + creator_tool = self._get_creator_tool(parent) + creator_tool.refresh() + creator_tool.show() + + # Pull window to the front. + creator_tool.raise_() + creator_tool.activateWindow() + + def _get_subset_manager_tool(self, parent): + if self._subset_manager_tool is None: + from avalon.tools.subsetmanager import Window + + self._subset_manager_tool = Window(parent=parent or self._parent) + + return self._subset_manager_tool + + def show_subset_manager_tool(self, parent=None): + subset_manager_tool = self._get_subset_manager_tool(parent) + subset_manager_tool.show() + + # Pull window to the front. + subset_manager_tool.raise_() + subset_manager_tool.activateWindow() + + def _get_scene_inventory_tool(self, parent): + if self._scene_inventory_tool is None: + from avalon.tools.sceneinventory.app import Window + + self._scene_inventory_tool = Window(parent=parent or self._parent) + + return self._scene_inventory_tool + + def show_scene_inventory_tool(self, parent=None): + scene_inventory_tool = self._get_scene_inventory_tool(parent) + scene_inventory_tool.show() + scene_inventory_tool.refresh() + + # Pull window to the front. + scene_inventory_tool.raise_() + scene_inventory_tool.activateWindow() + + def _get_library_loader_tool(self, parent): + if self._library_loader_tool is None: + from openpype.tools.libraryloader import LibraryLoaderWindow + + self._library_loader_tool = LibraryLoaderWindow( + parent=parent or self._parent + ) + + return self._library_loader_tool + + def show_library_loader_tool(self, parent=None): + library_loader_tool = self._get_library_loader_tool(parent) + library_loader_tool.show() + library_loader_tool.raise_() + library_loader_tool.activateWindow() + library_loader_tool.refresh() + + def show_publish_tool(self, parent=None): + from avalon.tools import publish + + publish.show(parent) + + def show_tool_by_name(self, tool_name, parent=None): + if tool_name == "workfiles": + self.show_workfiles_tool(parent) + + elif tool_name == "loader": + self.show_loader_tool(parent) + + elif tool_name == "libraryloader": + self.show_library_loader_tool(parent) + + elif tool_name == "creator": + self.show_creator_tool(parent) + + elif tool_name == "subset_manager": + self.show_subset_manager_tool(parent) + + elif tool_name == "scene_inventory": + self.show_scene_inventory_tool(parent) + + +class _SingletonPoint: + helper = None + + @classmethod + def _create_helper(cls): + if cls.helper is None: + cls.helper = HostToolsHelper() + + @classmethod + def show_tool_by_name(cls, tool_name, parent=None): + cls._create_helper() + cls.helper.show_tool_by_name(tool_name, parent) + + +def show_workfiles_tool(parent=None): + _SingletonPoint.show_tool_by_name("workfiles", parent) + + +def show_loader_tool(parent=None): + _SingletonPoint.show_tool_by_name("loader", parent) + + +def show_library_loader_tool(parent=None): + _SingletonPoint.show_tool_by_name("libraryloader", parent) + + +def show_creator_tool(parent=None): + _SingletonPoint.show_tool_by_name("creator", parent) + + +def show_subset_manager_tool(parent=None): + _SingletonPoint.show_tool_by_name("subset_manager", parent) + + +def show_scene_inventory_tool(parent=None): + _SingletonPoint.show_tool_by_name("scene_inventory", parent) From 54c8988ce916c70634def2903fff665126b10eeb Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Thu, 14 Oct 2021 19:16:55 +0200 Subject: [PATCH 04/34] enhanced passing args and kwargs --- openpype/tools/utils/host_tools.py | 42 ++++++++++++++++-------------- openpype/tools/workfiles/app.py | 5 +++- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/openpype/tools/utils/host_tools.py b/openpype/tools/utils/host_tools.py index 203db36949..aa3d1ccc94 100644 --- a/openpype/tools/utils/host_tools.py +++ b/openpype/tools/utils/host_tools.py @@ -34,21 +34,23 @@ class HostToolsHelper: host = avalon.api.registered_host() validate_host_requirements(host) - window = Window(parent=parent) + self._workfiles_tool = Window(parent=parent) + return self._workfiles_tool + + def show_workfiles_tool(self, parent=None, use_context=True, save=True): + workfiles_tool = self._get_workfiles_tool(parent) + + if use_context: context = { "asset": avalon.api.Session["AVALON_ASSET"], "silo": avalon.api.Session["AVALON_SILO"], "task": avalon.api.Session["AVALON_TASK"] } - window.set_context(context) + workfiles_tool.set_context(context) - self._workfiles_tool = window - - return self._workfiles_tool - - def show_workfiles_tool(self, parent=None): - workfiles_tool = self._get_workfiles_tool(parent) + if save: + workfiles_tool.set_save_enabled(save) workfiles_tool.refresh() workfiles_tool.show() @@ -147,24 +149,24 @@ class HostToolsHelper: publish.show(parent) - def show_tool_by_name(self, tool_name, parent=None): + def show_tool_by_name(self, tool_name, parent=None, *args, **kwargs): if tool_name == "workfiles": - self.show_workfiles_tool(parent) + self.show_workfiles_tool(parent, *args, **kwargs) elif tool_name == "loader": - self.show_loader_tool(parent) + self.show_loader_tool(parent, *args, **kwargs) elif tool_name == "libraryloader": - self.show_library_loader_tool(parent) + self.show_library_loader_tool(parent, *args, **kwargs) elif tool_name == "creator": - self.show_creator_tool(parent) + self.show_creator_tool(parent, *args, **kwargs) elif tool_name == "subset_manager": - self.show_subset_manager_tool(parent) + self.show_subset_manager_tool(parent, *args, **kwargs) elif tool_name == "scene_inventory": - self.show_scene_inventory_tool(parent) + self.show_scene_inventory_tool(parent, *args, **kwargs) class _SingletonPoint: @@ -176,13 +178,15 @@ class _SingletonPoint: cls.helper = HostToolsHelper() @classmethod - def show_tool_by_name(cls, tool_name, parent=None): + def show_tool_by_name(cls, tool_name, parent=None, *args, **kwargs): cls._create_helper() - cls.helper.show_tool_by_name(tool_name, parent) + cls.helper.show_tool_by_name(tool_name, parent, *args, **kwargs) -def show_workfiles_tool(parent=None): - _SingletonPoint.show_tool_by_name("workfiles", parent) +def show_workfiles_tool(parent=None, use_context=True, save=True): + _SingletonPoint.show_tool_by_name( + "workfiles", parent, use_context=use_context, save=save + ) def show_loader_tool(parent=None): diff --git a/openpype/tools/workfiles/app.py b/openpype/tools/workfiles/app.py index 18e8cfc6d3..1679a18241 100644 --- a/openpype/tools/workfiles/app.py +++ b/openpype/tools/workfiles/app.py @@ -1018,6 +1018,9 @@ class Window(QtWidgets.QMainWindow): """ + def set_save_enabled(self, enabled): + self.files_widget.btn_save.setEnabled(enabled) + def on_task_changed(self): # Since we query the disk give it slightly more delay tools_lib.schedule(self._on_task_changed, 100, channel="mongo") @@ -1190,7 +1193,7 @@ def show(root=None, debug=False, parent=None, use_context=True, save=True): } window.set_context(context) - window.files_widget.btn_save.setEnabled(save) + window.set_save_enabled(save) window.show() window.setStyleSheet(style.load_stylesheet()) From 0bac8ff6de8b04ef9a8eb35d65db8a3811148dee Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 15 Oct 2021 10:07:20 +0200 Subject: [PATCH 05/34] removed underscores from tool names --- openpype/tools/utils/host_tools.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openpype/tools/utils/host_tools.py b/openpype/tools/utils/host_tools.py index aa3d1ccc94..979341375e 100644 --- a/openpype/tools/utils/host_tools.py +++ b/openpype/tools/utils/host_tools.py @@ -162,10 +162,10 @@ class HostToolsHelper: elif tool_name == "creator": self.show_creator_tool(parent, *args, **kwargs) - elif tool_name == "subset_manager": + elif tool_name == "subsetmanager": self.show_subset_manager_tool(parent, *args, **kwargs) - elif tool_name == "scene_inventory": + elif tool_name == "sceneinventory": self.show_scene_inventory_tool(parent, *args, **kwargs) From 08ad338cb5d3c14fbbd781ec12873bbffda89e92 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 15 Oct 2021 10:07:43 +0200 Subject: [PATCH 06/34] use_context and save don't have defaults in args definition --- openpype/tools/utils/host_tools.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/openpype/tools/utils/host_tools.py b/openpype/tools/utils/host_tools.py index 979341375e..8c9da2b4f9 100644 --- a/openpype/tools/utils/host_tools.py +++ b/openpype/tools/utils/host_tools.py @@ -38,9 +38,14 @@ class HostToolsHelper: return self._workfiles_tool - def show_workfiles_tool(self, parent=None, use_context=True, save=True): - workfiles_tool = self._get_workfiles_tool(parent) + def show_workfiles_tool(self, parent=None, use_context=None, save=None): + if use_context is None: + use_context = True + if save is None: + save = True + + workfiles_tool = self._get_workfiles_tool(parent) if use_context: context = { "asset": avalon.api.Session["AVALON_ASSET"], @@ -183,7 +188,7 @@ class _SingletonPoint: cls.helper.show_tool_by_name(tool_name, parent, *args, **kwargs) -def show_workfiles_tool(parent=None, use_context=True, save=True): +def show_workfiles_tool(parent=None, use_context=None, save=None): _SingletonPoint.show_tool_by_name( "workfiles", parent, use_context=use_context, save=save ) From a8e1d5164c8ca979e58f7dd8bc1f570905833539 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 15 Oct 2021 10:17:20 +0200 Subject: [PATCH 07/34] loader has use_context argument --- openpype/tools/utils/host_tools.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/openpype/tools/utils/host_tools.py b/openpype/tools/utils/host_tools.py index 8c9da2b4f9..daf9356bae 100644 --- a/openpype/tools/utils/host_tools.py +++ b/openpype/tools/utils/host_tools.py @@ -71,11 +71,16 @@ class HostToolsHelper: return self._loader_tool - def show_loader_tool(self, parent=None): + def show_loader_tool(self, parent=None, use_context=None): + if use_context is None: + use_context = False loader_tool = self._get_loader_tool(parent) - context = {"asset": avalon.api.Session["AVALON_ASSET"]} - loader_tool.set_context(context, refresh=True) + if use_context: + context = {"asset": avalon.api.Session["AVALON_ASSET"]} + loader_tool.set_context(context, refresh=True) + else: + loader_tool.refresh() loader_tool.show() loader_tool.raise_() @@ -194,8 +199,10 @@ def show_workfiles_tool(parent=None, use_context=None, save=None): ) -def show_loader_tool(parent=None): - _SingletonPoint.show_tool_by_name("loader", parent) +def show_loader_tool(parent=None, use_context=None): + _SingletonPoint.show_tool_by_name( + "loader", parent, use_context=use_context + ) def show_library_loader_tool(parent=None): From b1cf928c3b51de5ba1b14f67a2fa92ea33e1d440 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 15 Oct 2021 10:17:41 +0200 Subject: [PATCH 08/34] fixed tool names in global functions --- openpype/tools/utils/host_tools.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openpype/tools/utils/host_tools.py b/openpype/tools/utils/host_tools.py index daf9356bae..492f21486d 100644 --- a/openpype/tools/utils/host_tools.py +++ b/openpype/tools/utils/host_tools.py @@ -214,8 +214,8 @@ def show_creator_tool(parent=None): def show_subset_manager_tool(parent=None): - _SingletonPoint.show_tool_by_name("subset_manager", parent) + _SingletonPoint.show_tool_by_name("subsetmanager", parent) def show_scene_inventory_tool(parent=None): - _SingletonPoint.show_tool_by_name("scene_inventory", parent) + _SingletonPoint.show_tool_by_name("sceneinventory", parent) From ca168580ba68c94103113a799248ddea4f1a4329 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 15 Oct 2021 10:36:06 +0200 Subject: [PATCH 09/34] added few docstrings --- openpype/tools/utils/host_tools.py | 34 ++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/openpype/tools/utils/host_tools.py b/openpype/tools/utils/host_tools.py index 492f21486d..7c7a566aae 100644 --- a/openpype/tools/utils/host_tools.py +++ b/openpype/tools/utils/host_tools.py @@ -17,7 +17,11 @@ class HostToolsHelper: Class may also contain tools that are available only for one or few hosts. """ def __init__(self, parent=None): + self._log = None + # Global parent for all tools (may and may not be set) self._parent = parent + + # Prepare attributes for all tools self._workfiles_tool = None self._loader_tool = None self._creator_tool = None @@ -25,6 +29,14 @@ class HostToolsHelper: self._scene_inventory_tool = None self._library_loader_tool = None + @property + def log(self): + if self._log is None: + from openpype.api import Logger + + self._log = Logger.get_logger(self.__class__.__name__) + return self._log + def _get_workfiles_tool(self, parent): if self._workfiles_tool is None: from openpype.tools.workfiles.app import ( @@ -39,6 +51,7 @@ class HostToolsHelper: return self._workfiles_tool def show_workfiles_tool(self, parent=None, use_context=None, save=None): + """Workfiles tool for changing context and saving workfiles.""" if use_context is None: use_context = True @@ -72,6 +85,7 @@ class HostToolsHelper: return self._loader_tool def show_loader_tool(self, parent=None, use_context=None): + """Loader tool for loading representations.""" if use_context is None: use_context = False loader_tool = self._get_loader_tool(parent) @@ -96,6 +110,7 @@ class HostToolsHelper: return self._creator_tool def show_creator_tool(self, parent=None): + """Show tool to create new instantes for publishing.""" creator_tool = self._get_creator_tool(parent) creator_tool.refresh() creator_tool.show() @@ -113,6 +128,7 @@ class HostToolsHelper: return self._subset_manager_tool def show_subset_manager_tool(self, parent=None): + """Show tool display/remove existing created instances.""" subset_manager_tool = self._get_subset_manager_tool(parent) subset_manager_tool.show() @@ -129,6 +145,7 @@ class HostToolsHelper: return self._scene_inventory_tool def show_scene_inventory_tool(self, parent=None): + """Show tool maintain loaded containers.""" scene_inventory_tool = self._get_scene_inventory_tool(parent) scene_inventory_tool.show() scene_inventory_tool.refresh() @@ -148,6 +165,7 @@ class HostToolsHelper: return self._library_loader_tool def show_library_loader_tool(self, parent=None): + """Loader tool for loading representations from library project.""" library_loader_tool = self._get_library_loader_tool(parent) library_loader_tool.show() library_loader_tool.raise_() @@ -155,11 +173,16 @@ class HostToolsHelper: library_loader_tool.refresh() def show_publish_tool(self, parent=None): + """Publish UI.""" from avalon.tools import publish publish.show(parent) def show_tool_by_name(self, tool_name, parent=None, *args, **kwargs): + """Show tool by it's name. + + This is helper for + """ if tool_name == "workfiles": self.show_workfiles_tool(parent, *args, **kwargs) @@ -178,8 +201,18 @@ class HostToolsHelper: elif tool_name == "sceneinventory": self.show_scene_inventory_tool(parent, *args, **kwargs) + self.log.warning( + "Can't show unknown tool name: \"{}\"".format(tool_name) + ) + class _SingletonPoint: + """Singleton access to host tools. + + Some hosts don't have ability to create 'HostToolsHelper' object anc can + only register function callbacks. For those cases is created this singleton + point where 'HostToolsHelper' is created "in shared memory". + """ helper = None @classmethod @@ -193,6 +226,7 @@ class _SingletonPoint: cls.helper.show_tool_by_name(tool_name, parent, *args, **kwargs) +# Function callbacks using singleton acces point def show_workfiles_tool(parent=None, use_context=None, save=None): _SingletonPoint.show_tool_by_name( "workfiles", parent, use_context=use_context, save=save From e1281231bab2ba3db102e3d3d3aea659bef0cf0c Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 15 Oct 2021 10:54:06 +0200 Subject: [PATCH 10/34] added look manager --- openpype/tools/utils/host_tools.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/openpype/tools/utils/host_tools.py b/openpype/tools/utils/host_tools.py index 7c7a566aae..0cd9578f0f 100644 --- a/openpype/tools/utils/host_tools.py +++ b/openpype/tools/utils/host_tools.py @@ -28,6 +28,7 @@ class HostToolsHelper: self._subset_manager_tool = None self._scene_inventory_tool = None self._library_loader_tool = None + self._look_manager_tool = None @property def log(self): @@ -178,6 +179,18 @@ class HostToolsHelper: publish.show(parent) + def _get_look_manager_tool(self, parent): + if self._look_manager_tool is None: + import mayalookassigner + + self._look_manager_tool = mayalookassigner.App(parent) + return self._look_manager_tool + + def show_look_manager(self, parent=None): + """Look manager is Maya specific tool for look management.""" + look_manager_tool = self._get_look_manager_tool(parent) + look_manager_tool.show() + def show_tool_by_name(self, tool_name, parent=None, *args, **kwargs): """Show tool by it's name. @@ -201,6 +214,9 @@ class HostToolsHelper: elif tool_name == "sceneinventory": self.show_scene_inventory_tool(parent, *args, **kwargs) + elif tool_name == "lookmanager": + self.show_look_manager(parent, *args, **kwargs) + self.log.warning( "Can't show unknown tool name: \"{}\"".format(tool_name) ) @@ -253,3 +269,6 @@ def show_subset_manager_tool(parent=None): def show_scene_inventory_tool(parent=None): _SingletonPoint.show_tool_by_name("sceneinventory", parent) + +def show_look_manager(self, parent=None): + _SingletonPoint.show_tool_by_name("lookmanager", parent) From 5446ac65406e4dcb7d859b6e32facfbaefb937e5 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 15 Oct 2021 11:03:01 +0200 Subject: [PATCH 11/34] removed _tool suffix from show methods --- openpype/tools/utils/host_tools.py | 43 +++++++++++++++++------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/openpype/tools/utils/host_tools.py b/openpype/tools/utils/host_tools.py index 0cd9578f0f..ce2a66fd4b 100644 --- a/openpype/tools/utils/host_tools.py +++ b/openpype/tools/utils/host_tools.py @@ -51,7 +51,7 @@ class HostToolsHelper: return self._workfiles_tool - def show_workfiles_tool(self, parent=None, use_context=None, save=None): + def show_workfiles(self, parent=None, use_context=None, save=None): """Workfiles tool for changing context and saving workfiles.""" if use_context is None: use_context = True @@ -85,7 +85,7 @@ class HostToolsHelper: return self._loader_tool - def show_loader_tool(self, parent=None, use_context=None): + def show_loader(self, parent=None, use_context=None): """Loader tool for loading representations.""" if use_context is None: use_context = False @@ -110,7 +110,7 @@ class HostToolsHelper: return self._creator_tool - def show_creator_tool(self, parent=None): + def show_creator(self, parent=None): """Show tool to create new instantes for publishing.""" creator_tool = self._get_creator_tool(parent) creator_tool.refresh() @@ -128,7 +128,7 @@ class HostToolsHelper: return self._subset_manager_tool - def show_subset_manager_tool(self, parent=None): + def show_subset_manager(self, parent=None): """Show tool display/remove existing created instances.""" subset_manager_tool = self._get_subset_manager_tool(parent) subset_manager_tool.show() @@ -145,7 +145,7 @@ class HostToolsHelper: return self._scene_inventory_tool - def show_scene_inventory_tool(self, parent=None): + def show_scene_inventory(self, parent=None): """Show tool maintain loaded containers.""" scene_inventory_tool = self._get_scene_inventory_tool(parent) scene_inventory_tool.show() @@ -165,7 +165,7 @@ class HostToolsHelper: return self._library_loader_tool - def show_library_loader_tool(self, parent=None): + def show_library_loader(self, parent=None): """Loader tool for loading representations from library project.""" library_loader_tool = self._get_library_loader_tool(parent) library_loader_tool.show() @@ -173,7 +173,7 @@ class HostToolsHelper: library_loader_tool.activateWindow() library_loader_tool.refresh() - def show_publish_tool(self, parent=None): + def show_publish(self, parent=None): """Publish UI.""" from avalon.tools import publish @@ -197,22 +197,22 @@ class HostToolsHelper: This is helper for """ if tool_name == "workfiles": - self.show_workfiles_tool(parent, *args, **kwargs) + self.show_workfiles(parent, *args, **kwargs) elif tool_name == "loader": - self.show_loader_tool(parent, *args, **kwargs) + self.show_loader(parent, *args, **kwargs) elif tool_name == "libraryloader": - self.show_library_loader_tool(parent, *args, **kwargs) + self.show_library_loader(parent, *args, **kwargs) elif tool_name == "creator": - self.show_creator_tool(parent, *args, **kwargs) + self.show_creator(parent, *args, **kwargs) elif tool_name == "subsetmanager": - self.show_subset_manager_tool(parent, *args, **kwargs) + self.show_subset_manager(parent, *args, **kwargs) elif tool_name == "sceneinventory": - self.show_scene_inventory_tool(parent, *args, **kwargs) + self.show_scene_inventory(parent, *args, **kwargs) elif tool_name == "lookmanager": self.show_look_manager(parent, *args, **kwargs) @@ -243,32 +243,37 @@ class _SingletonPoint: # Function callbacks using singleton acces point -def show_workfiles_tool(parent=None, use_context=None, save=None): +def show_tool_by_name(tool_name, parent=None, *args, **kwargs): + _SingletonPoint.show_tool_by_name(tool_name, parent, *args, **kwargs) + + +def show_workfiles(parent=None, use_context=None, save=None): _SingletonPoint.show_tool_by_name( "workfiles", parent, use_context=use_context, save=save ) -def show_loader_tool(parent=None, use_context=None): +def show_loader(parent=None, use_context=None): _SingletonPoint.show_tool_by_name( "loader", parent, use_context=use_context ) -def show_library_loader_tool(parent=None): +def show_library_loader(parent=None): _SingletonPoint.show_tool_by_name("libraryloader", parent) -def show_creator_tool(parent=None): +def show_creator(parent=None): _SingletonPoint.show_tool_by_name("creator", parent) -def show_subset_manager_tool(parent=None): +def show_subset_manager(parent=None): _SingletonPoint.show_tool_by_name("subsetmanager", parent) -def show_scene_inventory_tool(parent=None): +def show_scene_inventory(parent=None): _SingletonPoint.show_tool_by_name("sceneinventory", parent) + def show_look_manager(self, parent=None): _SingletonPoint.show_tool_by_name("lookmanager", parent) From d8064571a24e5eeb6610adfdbf964e3c5ac88cec Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 15 Oct 2021 11:09:10 +0200 Subject: [PATCH 12/34] fixed look manager to look assigner --- openpype/tools/utils/host_tools.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/openpype/tools/utils/host_tools.py b/openpype/tools/utils/host_tools.py index ce2a66fd4b..96c05e4135 100644 --- a/openpype/tools/utils/host_tools.py +++ b/openpype/tools/utils/host_tools.py @@ -28,7 +28,7 @@ class HostToolsHelper: self._subset_manager_tool = None self._scene_inventory_tool = None self._library_loader_tool = None - self._look_manager_tool = None + self._look_assigner_tool = None @property def log(self): @@ -179,17 +179,17 @@ class HostToolsHelper: publish.show(parent) - def _get_look_manager_tool(self, parent): - if self._look_manager_tool is None: + def _get_look_assigner_tool(self, parent): + if self._look_assigner_tool is None: import mayalookassigner - self._look_manager_tool = mayalookassigner.App(parent) - return self._look_manager_tool + self._look_assigner_tool = mayalookassigner.App(parent) + return self._look_assigner_tool - def show_look_manager(self, parent=None): + def show_look_assigner(self, parent=None): """Look manager is Maya specific tool for look management.""" - look_manager_tool = self._get_look_manager_tool(parent) - look_manager_tool.show() + look_assigner_tool = self._get_look_assigner_tool(parent) + look_assigner_tool.show() def show_tool_by_name(self, tool_name, parent=None, *args, **kwargs): """Show tool by it's name. @@ -214,8 +214,8 @@ class HostToolsHelper: elif tool_name == "sceneinventory": self.show_scene_inventory(parent, *args, **kwargs) - elif tool_name == "lookmanager": - self.show_look_manager(parent, *args, **kwargs) + elif tool_name == "lookassigner": + self.show_look_assigner(parent, *args, **kwargs) self.log.warning( "Can't show unknown tool name: \"{}\"".format(tool_name) @@ -275,5 +275,5 @@ def show_scene_inventory(parent=None): _SingletonPoint.show_tool_by_name("sceneinventory", parent) -def show_look_manager(self, parent=None): - _SingletonPoint.show_tool_by_name("lookmanager", parent) +def show_look_assigner(parent=None): + _SingletonPoint.show_tool_by_name("lookassigner", parent) From 06212357a633fa575abb51be4abbf78d84b6b73c Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 15 Oct 2021 11:14:19 +0200 Subject: [PATCH 13/34] added publish to known tools --- openpype/tools/utils/host_tools.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/openpype/tools/utils/host_tools.py b/openpype/tools/utils/host_tools.py index 96c05e4135..09d3c808c2 100644 --- a/openpype/tools/utils/host_tools.py +++ b/openpype/tools/utils/host_tools.py @@ -217,9 +217,13 @@ class HostToolsHelper: elif tool_name == "lookassigner": self.show_look_assigner(parent, *args, **kwargs) - self.log.warning( - "Can't show unknown tool name: \"{}\"".format(tool_name) - ) + elif tool_name == "publish": + self.show_publish(parent, *args, **kwargs) + + else: + self.log.warning( + "Can't show unknown tool name: \"{}\"".format(tool_name) + ) class _SingletonPoint: @@ -277,3 +281,7 @@ def show_scene_inventory(parent=None): def show_look_assigner(parent=None): _SingletonPoint.show_tool_by_name("lookassigner", parent) + + +def show_publish(parent=None): + _SingletonPoint.show_tool_by_name("publish", parent) From 235bc68573417654399a5efbb9137de35daf29be Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 15 Oct 2021 11:14:38 +0200 Subject: [PATCH 14/34] use host_tools in maya --- openpype/hosts/maya/api/menu.py | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/openpype/hosts/maya/api/menu.py b/openpype/hosts/maya/api/menu.py index ad225dcd28..42cb76dca6 100644 --- a/openpype/hosts/maya/api/menu.py +++ b/openpype/hosts/maya/api/menu.py @@ -2,13 +2,15 @@ import sys import os import logging -from avalon.vendor.Qt import QtWidgets, QtGui -from avalon.maya import pipeline -from openpype.api import BuildWorkfile -import maya.cmds as cmds -from openpype.settings import get_project_settings +from Qt import QtWidgets, QtGui -self = sys.modules[__name__] +import maya.cmds as cmds + +from avalon.maya import pipeline + +from openpype.api import BuildWorkfile +from openpype.settings import get_project_settings +from openpype.tools.utils import host_tools log = logging.getLogger(__name__) @@ -26,6 +28,7 @@ def _get_menu(menu_name=None): def deferred(): + def add_build_workfiles_item(): # Add build first workfile cmds.menuItem(divider=True, parent=pipeline._menu) @@ -36,24 +39,17 @@ def deferred(): ) def add_look_assigner_item(): - import mayalookassigner cmds.menuItem( "Look assigner", parent=pipeline._menu, - command=lambda *args: mayalookassigner.show() + command=lambda *args: host_tools.show_look_assigner( + pipeline._parent + ) ) def modify_workfiles(): - from openpype.tools import workfiles - def launch_workfiles_app(*_args, **_kwargs): - workfiles.show( - os.path.join( - cmds.workspace(query=True, rootDirectory=True), - cmds.workspace(fileRuleEntry="scene") - ), - parent=pipeline._parent - ) + host_tools.show_workfiles(pipeline._parent) # Find the pipeline menu top_menu = _get_menu() From 73bb38696895bcdac33d5a85e2baac8808d665b0 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 15 Oct 2021 11:19:43 +0200 Subject: [PATCH 15/34] added style loading --- openpype/tools/utils/host_tools.py | 35 ++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/openpype/tools/utils/host_tools.py b/openpype/tools/utils/host_tools.py index 09d3c808c2..f8a30cf8f6 100644 --- a/openpype/tools/utils/host_tools.py +++ b/openpype/tools/utils/host_tools.py @@ -40,6 +40,7 @@ class HostToolsHelper: def _get_workfiles_tool(self, parent): if self._workfiles_tool is None: + from avalon import style from openpype.tools.workfiles.app import ( Window, validate_host_requirements ) @@ -47,7 +48,9 @@ class HostToolsHelper: host = avalon.api.registered_host() validate_host_requirements(host) - self._workfiles_tool = Window(parent=parent) + workfiles_window = Window(parent=parent) + workfiles_window.setStyleSheet(style.load_stylesheet()) + self._workfiles_tool = workfiles_window return self._workfiles_tool @@ -79,9 +82,12 @@ class HostToolsHelper: def _get_loader_tool(self, parent): if self._loader_tool is None: + from avalon import style from openpype.tools.loader import LoaderWindow - self._loader_tool = LoaderWindow(parent=parent or self._parent) + loader_window = LoaderWindow(parent=parent or self._parent) + loader_window.setStyleSheet(style.load_stylesheet()) + self._loader_tool = loader_window return self._loader_tool @@ -104,9 +110,12 @@ class HostToolsHelper: def _get_creator_tool(self, parent): if self._creator_tool is None: + from avalon import style from avalon.tools.creator.app import Window - self._creator_tool = Window(parent=parent or self._parent) + creator_window = Window(parent=parent or self._parent) + creator_window.setStyleSheet(style.load_stylesheet()) + self._creator_tool = creator_window return self._creator_tool @@ -122,9 +131,12 @@ class HostToolsHelper: def _get_subset_manager_tool(self, parent): if self._subset_manager_tool is None: + from avalon import style from avalon.tools.subsetmanager import Window - self._subset_manager_tool = Window(parent=parent or self._parent) + subset_manager_window = Window(parent=parent or self._parent) + subset_manager_window.setStyleSheet(style.load_stylesheet()) + self._subset_manager_tool = subset_manager_window return self._subset_manager_tool @@ -139,9 +151,12 @@ class HostToolsHelper: def _get_scene_inventory_tool(self, parent): if self._scene_inventory_tool is None: + from avalon import style from avalon.tools.sceneinventory.app import Window - self._scene_inventory_tool = Window(parent=parent or self._parent) + scene_inventory_window = Window(parent=parent or self._parent) + scene_inventory_window.setStyleSheet(style.load_stylesheet()) + self._scene_inventory_tool = scene_inventory_window return self._scene_inventory_tool @@ -157,11 +172,14 @@ class HostToolsHelper: def _get_library_loader_tool(self, parent): if self._library_loader_tool is None: + from avalon import style from openpype.tools.libraryloader import LibraryLoaderWindow - self._library_loader_tool = LibraryLoaderWindow( + library_window = LibraryLoaderWindow( parent=parent or self._parent ) + library_window.setStyleSheet(style.load_stylesheet()) + self._library_loader_tool = library_window return self._library_loader_tool @@ -181,9 +199,12 @@ class HostToolsHelper: def _get_look_assigner_tool(self, parent): if self._look_assigner_tool is None: + from avalon import style import mayalookassigner - self._look_assigner_tool = mayalookassigner.App(parent) + mayalookassigner_window = mayalookassigner.App(parent) + mayalookassigner_window.setStyleSheet(style.load_stylesheet()) + self._look_assigner_tool = mayalookassigner_window return self._look_assigner_tool def show_look_assigner(self, parent=None): From ad0d1b03feca27b88e0a436f1f543207a5adab07 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 15 Oct 2021 11:23:01 +0200 Subject: [PATCH 16/34] changed getters to public methods --- openpype/tools/utils/host_tools.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/openpype/tools/utils/host_tools.py b/openpype/tools/utils/host_tools.py index f8a30cf8f6..31e305c70e 100644 --- a/openpype/tools/utils/host_tools.py +++ b/openpype/tools/utils/host_tools.py @@ -38,7 +38,7 @@ class HostToolsHelper: self._log = Logger.get_logger(self.__class__.__name__) return self._log - def _get_workfiles_tool(self, parent): + def get_workfiles_tool(self, parent): if self._workfiles_tool is None: from avalon import style from openpype.tools.workfiles.app import ( @@ -62,7 +62,7 @@ class HostToolsHelper: if save is None: save = True - workfiles_tool = self._get_workfiles_tool(parent) + workfiles_tool = self.get_workfiles_tool(parent) if use_context: context = { "asset": avalon.api.Session["AVALON_ASSET"], @@ -80,7 +80,7 @@ class HostToolsHelper: workfiles_tool.raise_() workfiles_tool.activateWindow() - def _get_loader_tool(self, parent): + def get_loader_tool(self, parent): if self._loader_tool is None: from avalon import style from openpype.tools.loader import LoaderWindow @@ -95,7 +95,7 @@ class HostToolsHelper: """Loader tool for loading representations.""" if use_context is None: use_context = False - loader_tool = self._get_loader_tool(parent) + loader_tool = self.get_loader_tool(parent) if use_context: context = {"asset": avalon.api.Session["AVALON_ASSET"]} @@ -108,7 +108,7 @@ class HostToolsHelper: loader_tool.activateWindow() loader_tool.refresh() - def _get_creator_tool(self, parent): + def get_creator_tool(self, parent): if self._creator_tool is None: from avalon import style from avalon.tools.creator.app import Window @@ -121,7 +121,7 @@ class HostToolsHelper: def show_creator(self, parent=None): """Show tool to create new instantes for publishing.""" - creator_tool = self._get_creator_tool(parent) + creator_tool = self.get_creator_tool(parent) creator_tool.refresh() creator_tool.show() @@ -129,7 +129,7 @@ class HostToolsHelper: creator_tool.raise_() creator_tool.activateWindow() - def _get_subset_manager_tool(self, parent): + def get_subset_manager_tool(self, parent): if self._subset_manager_tool is None: from avalon import style from avalon.tools.subsetmanager import Window @@ -142,14 +142,14 @@ class HostToolsHelper: def show_subset_manager(self, parent=None): """Show tool display/remove existing created instances.""" - subset_manager_tool = self._get_subset_manager_tool(parent) + subset_manager_tool = self.get_subset_manager_tool(parent) subset_manager_tool.show() # Pull window to the front. subset_manager_tool.raise_() subset_manager_tool.activateWindow() - def _get_scene_inventory_tool(self, parent): + def get_scene_inventory_tool(self, parent): if self._scene_inventory_tool is None: from avalon import style from avalon.tools.sceneinventory.app import Window @@ -162,7 +162,7 @@ class HostToolsHelper: def show_scene_inventory(self, parent=None): """Show tool maintain loaded containers.""" - scene_inventory_tool = self._get_scene_inventory_tool(parent) + scene_inventory_tool = self.get_scene_inventory_tool(parent) scene_inventory_tool.show() scene_inventory_tool.refresh() @@ -170,7 +170,7 @@ class HostToolsHelper: scene_inventory_tool.raise_() scene_inventory_tool.activateWindow() - def _get_library_loader_tool(self, parent): + def get_library_loader_tool(self, parent): if self._library_loader_tool is None: from avalon import style from openpype.tools.libraryloader import LibraryLoaderWindow @@ -185,7 +185,7 @@ class HostToolsHelper: def show_library_loader(self, parent=None): """Loader tool for loading representations from library project.""" - library_loader_tool = self._get_library_loader_tool(parent) + library_loader_tool = self.get_library_loader_tool(parent) library_loader_tool.show() library_loader_tool.raise_() library_loader_tool.activateWindow() @@ -197,7 +197,7 @@ class HostToolsHelper: publish.show(parent) - def _get_look_assigner_tool(self, parent): + def get_look_assigner_tool(self, parent): if self._look_assigner_tool is None: from avalon import style import mayalookassigner @@ -209,7 +209,7 @@ class HostToolsHelper: def show_look_assigner(self, parent=None): """Look manager is Maya specific tool for look management.""" - look_assigner_tool = self._get_look_assigner_tool(parent) + look_assigner_tool = self.get_look_assigner_tool(parent) look_assigner_tool.show() def show_tool_by_name(self, tool_name, parent=None, *args, **kwargs): From b2cdb17ed5efe28218b233a46df0df1d491964b7 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 15 Oct 2021 11:26:31 +0200 Subject: [PATCH 17/34] adde simplified docstrings to get tool methods --- openpype/tools/utils/host_tools.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/openpype/tools/utils/host_tools.py b/openpype/tools/utils/host_tools.py index 31e305c70e..6b137213f8 100644 --- a/openpype/tools/utils/host_tools.py +++ b/openpype/tools/utils/host_tools.py @@ -39,6 +39,7 @@ class HostToolsHelper: return self._log def get_workfiles_tool(self, parent): + """Create, cache and return workfiles tool window.""" if self._workfiles_tool is None: from avalon import style from openpype.tools.workfiles.app import ( @@ -81,6 +82,7 @@ class HostToolsHelper: workfiles_tool.activateWindow() def get_loader_tool(self, parent): + """Create, cache and return loader tool window.""" if self._loader_tool is None: from avalon import style from openpype.tools.loader import LoaderWindow @@ -109,6 +111,7 @@ class HostToolsHelper: loader_tool.refresh() def get_creator_tool(self, parent): + """Create, cache and return creator tool window.""" if self._creator_tool is None: from avalon import style from avalon.tools.creator.app import Window @@ -130,6 +133,7 @@ class HostToolsHelper: creator_tool.activateWindow() def get_subset_manager_tool(self, parent): + """Create, cache and return subset manager tool window.""" if self._subset_manager_tool is None: from avalon import style from avalon.tools.subsetmanager import Window @@ -150,6 +154,7 @@ class HostToolsHelper: subset_manager_tool.activateWindow() def get_scene_inventory_tool(self, parent): + """Create, cache and return scene inventory tool window.""" if self._scene_inventory_tool is None: from avalon import style from avalon.tools.sceneinventory.app import Window @@ -171,6 +176,7 @@ class HostToolsHelper: scene_inventory_tool.activateWindow() def get_library_loader_tool(self, parent): + """Create, cache and return library loader tool window.""" if self._library_loader_tool is None: from avalon import style from openpype.tools.libraryloader import LibraryLoaderWindow @@ -198,6 +204,7 @@ class HostToolsHelper: publish.show(parent) def get_look_assigner_tool(self, parent): + """Create, cache and return look assigner tool window.""" if self._look_assigner_tool is None: from avalon import style import mayalookassigner From 1517966a5a987803dcaf59d0ad6f8960d5c96063 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 15 Oct 2021 11:42:44 +0200 Subject: [PATCH 18/34] added ability to get window by name --- openpype/tools/utils/host_tools.py | 43 ++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/openpype/tools/utils/host_tools.py b/openpype/tools/utils/host_tools.py index 6b137213f8..431009ac27 100644 --- a/openpype/tools/utils/host_tools.py +++ b/openpype/tools/utils/host_tools.py @@ -219,6 +219,40 @@ class HostToolsHelper: look_assigner_tool = self.get_look_assigner_tool(parent) look_assigner_tool.show() + 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) + + elif tool_name == "loader": + return self.get_loader_tool(parent, *args, **kwargs) + + elif tool_name == "libraryloader": + return self.get_library_loader_tool(parent, *args, **kwargs) + + elif tool_name == "creator": + return self.get_creator_tool(parent, *args, **kwargs) + + elif tool_name == "subsetmanager": + return self.get_subset_manager_tool(parent, *args, **kwargs) + + elif tool_name == "sceneinventory": + return self.get_scene_inventory_tool(parent, *args, **kwargs) + + elif tool_name == "lookassigner": + return self.get_look_assigner_tool(parent, *args, **kwargs) + + elif tool_name == "publish": + self.log.info("Can't return publish tool window.") + + else: + self.log.warning( + "Can't show unknown tool name: \"{}\"".format(tool_name) + ) + def show_tool_by_name(self, tool_name, parent=None, *args, **kwargs): """Show tool by it's name. @@ -273,8 +307,17 @@ class _SingletonPoint: cls._create_helper() cls.helper.show_tool_by_name(tool_name, parent, *args, **kwargs) + @classmethod + def get_tool_by_name(cls, tool_name, parent=None, *args, **kwargs): + cls._create_helper() + return cls.helper.get_tool_by_name(tool_name, parent, *args, **kwargs) + # Function callbacks using singleton acces point +def get_tool_by_name(tool_name, parent=None, *args, **kwargs): + return _SingletonPoint.get_tool_by_name(tool_name, parent, *args, **kwargs) + + def show_tool_by_name(tool_name, parent=None, *args, **kwargs): _SingletonPoint.show_tool_by_name(tool_name, parent, *args, **kwargs) From 7f22b4fc5c75cd5a237bf7aaa66b1ad4bd315b5d Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 15 Oct 2021 12:09:39 +0200 Subject: [PATCH 19/34] houdini use host_tools --- .../hosts/houdini/startup/MainMenuCommon.xml | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/openpype/hosts/houdini/startup/MainMenuCommon.xml b/openpype/hosts/houdini/startup/MainMenuCommon.xml index 76585085e2..2923cb9ef5 100644 --- a/openpype/hosts/houdini/startup/MainMenuCommon.xml +++ b/openpype/hosts/houdini/startup/MainMenuCommon.xml @@ -7,24 +7,30 @@ @@ -32,7 +38,7 @@ cbsceneinventory.show() @@ -43,9 +49,10 @@ publish.show(parent) From 3810a2f8a83073959e4876c7077ab48f143d4065 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 15 Oct 2021 14:36:43 +0200 Subject: [PATCH 20/34] celaction is using host_tools --- openpype/hosts/celaction/api/cli.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openpype/hosts/celaction/api/cli.py b/openpype/hosts/celaction/api/cli.py index acd9da8229..bc1e3eaf89 100644 --- a/openpype/hosts/celaction/api/cli.py +++ b/openpype/hosts/celaction/api/cli.py @@ -4,7 +4,6 @@ import copy import argparse from avalon import io -from avalon.tools import publish import pyblish.api import pyblish.util @@ -13,6 +12,7 @@ from openpype.api import Logger import openpype import openpype.hosts.celaction from openpype.hosts.celaction import api as celaction +from openpype.tools.utils import host_tools log = Logger().get_logger("Celaction_cli_publisher") @@ -82,7 +82,7 @@ def main(): pyblish.api.register_host(publish_host) - return publish.show() + return host_tools.show_publish() if __name__ == "__main__": From cca7b4c13d0d810f14c7c094867a95e1e5cb7909 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 15 Oct 2021 14:54:54 +0200 Subject: [PATCH 21/34] use host_tools in fusion --- openpype/hosts/fusion/api/__init__.py | 7 +------ openpype/hosts/fusion/api/menu.py | 30 ++++++++------------------- openpype/hosts/fusion/api/pipeline.py | 12 ----------- 3 files changed, 10 insertions(+), 39 deletions(-) diff --git a/openpype/hosts/fusion/api/__init__.py b/openpype/hosts/fusion/api/__init__.py index 5581a0a9cb..5aee978c15 100644 --- a/openpype/hosts/fusion/api/__init__.py +++ b/openpype/hosts/fusion/api/__init__.py @@ -1,8 +1,6 @@ from .pipeline import ( install, - uninstall, - publish, - launch_workfiles_app + uninstall ) from .utils import ( @@ -22,12 +20,9 @@ __all__ = [ # pipeline "install", "uninstall", - "publish", - "launch_workfiles_app", # utils "setup", - "get_resolve_module", # lib "get_additional_data", diff --git a/openpype/hosts/fusion/api/menu.py b/openpype/hosts/fusion/api/menu.py index 9093aa9e5e..5d2efb4911 100644 --- a/openpype/hosts/fusion/api/menu.py +++ b/openpype/hosts/fusion/api/menu.py @@ -3,19 +3,7 @@ import sys from Qt import QtWidgets, QtCore -from .pipeline import ( - publish, - launch_workfiles_app -) - -from avalon.tools import ( - creator, - sceneinventory, -) -from openpype.tools import ( - loader, - libraryloader -) +from openpype.tools.utils import host_tools from openpype.hosts.fusion.scripts import ( set_rendermode, @@ -36,7 +24,7 @@ def load_stylesheet(): class Spacer(QtWidgets.QWidget): def __init__(self, height, *args, **kwargs): - super(self.__class__, self).__init__(*args, **kwargs) + super(Spacer, self).__init__(*args, **kwargs) self.setFixedHeight(height) @@ -53,7 +41,7 @@ class Spacer(QtWidgets.QWidget): class OpenPypeMenu(QtWidgets.QWidget): def __init__(self, *args, **kwargs): - super(self.__class__, self).__init__(*args, **kwargs) + super(OpenPypeMenu, self).__init__(*args, **kwargs) self.setObjectName("OpenPypeMenu") @@ -117,27 +105,27 @@ class OpenPypeMenu(QtWidgets.QWidget): def on_workfile_clicked(self): print("Clicked Workfile") - launch_workfiles_app() + host_tools.show_workfiles() def on_create_clicked(self): print("Clicked Create") - creator.show() + host_tools.show_creator() def on_publish_clicked(self): print("Clicked Publish") - publish(None) + host_tools.show_publish() def on_load_clicked(self): print("Clicked Load") - loader.show(use_context=True) + host_tools.show_loader(use_context=True) def on_inventory_clicked(self): print("Clicked Inventory") - sceneinventory.show() + host_tools.show_scene_inventory() def on_libload_clicked(self): print("Clicked Library") - libraryloader.show() + host_tools.show_library_loader() def on_rendernode_clicked(self): from avalon import style diff --git a/openpype/hosts/fusion/api/pipeline.py b/openpype/hosts/fusion/api/pipeline.py index 688e75f6fe..c721146830 100644 --- a/openpype/hosts/fusion/api/pipeline.py +++ b/openpype/hosts/fusion/api/pipeline.py @@ -3,7 +3,6 @@ Basic avalon integration """ import os -from openpype.tools import workfiles from avalon import api as avalon from pyblish import api as pyblish from openpype.api import Logger @@ -98,14 +97,3 @@ def on_pyblish_instance_toggled(instance, new_value, old_value): current = attrs["TOOLB_PassThrough"] if current != passthrough: tool.SetAttrs({"TOOLB_PassThrough": passthrough}) - - -def launch_workfiles_app(*args): - workdir = os.environ["AVALON_WORKDIR"] - workfiles.show(workdir) - - -def publish(parent): - """Shorthand to publish from within host""" - from avalon.tools import publish - return publish.show(parent) From ad1af83d5385a362f77c84eef6c84c4facee1b50 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 15 Oct 2021 15:03:40 +0200 Subject: [PATCH 22/34] maya is using host_tools --- openpype/hosts/maya/api/__init__.py | 8 +- openpype/hosts/maya/api/customize.py | 151 ++++++++++++--------------- openpype/hosts/maya/api/menu.py | 6 +- 3 files changed, 68 insertions(+), 97 deletions(-) diff --git a/openpype/hosts/maya/api/__init__.py b/openpype/hosts/maya/api/__init__.py index 725a075417..e4eb44fc27 100644 --- a/openpype/hosts/maya/api/__init__.py +++ b/openpype/hosts/maya/api/__init__.py @@ -8,7 +8,7 @@ from avalon import api as avalon from avalon import pipeline from avalon.maya import suspended_refresh from avalon.maya.pipeline import IS_HEADLESS -from openpype.tools import workfiles +from openpype.tools.utils import host_tools from pyblish import api as pyblish from openpype.lib import any_outdated import openpype.hosts.maya @@ -208,16 +208,12 @@ def on_init(_): launch_workfiles = os.environ.get("WORKFILES_STARTUP") if launch_workfiles: - safe_deferred(launch_workfiles_app) + safe_deferred(host_tools.show_workfiles) if not IS_HEADLESS: safe_deferred(override_toolbox_ui) -def launch_workfiles_app(): - workfiles.show(os.environ["AVALON_WORKDIR"]) - - def on_before_save(return_code, _): """Run validation for scene's FPS prior to saving""" return lib.validate_fps() diff --git a/openpype/hosts/maya/api/customize.py b/openpype/hosts/maya/api/customize.py index a84412963b..54c058aa75 100644 --- a/openpype/hosts/maya/api/customize.py +++ b/openpype/hosts/maya/api/customize.py @@ -1,10 +1,16 @@ """A set of commands that install overrides to Maya's UI""" +import os +import logging + +from functools import partial + import maya.cmds as mc import maya.mel as mel -from functools import partial -import os -import logging + +from avalon.maya import pipeline +from openpype.api import resources +from openpype.tools.utils import host_tools log = logging.getLogger(__name__) @@ -69,39 +75,8 @@ def override_component_mask_commands(): def override_toolbox_ui(): """Add custom buttons in Toolbox as replacement for Maya web help icon.""" - inventory = None - loader = None - launch_workfiles_app = None - mayalookassigner = None - try: - import avalon.tools.sceneinventory as inventory - except Exception: - log.warning("Could not import SceneInventory tool") - - try: - import openpype.tools.loader as loader - except Exception: - log.warning("Could not import Loader tool") - - try: - from avalon.maya.pipeline import launch_workfiles_app - except Exception: - log.warning("Could not import Workfiles tool") - - try: - from openpype.tools import mayalookassigner - except Exception: - log.warning("Could not import Maya Look assigner tool") - - from openpype.api import resources - icons = resources.get_resource("icons") - if not any(( - mayalookassigner, launch_workfiles_app, loader, inventory - )): - return - # Ensure the maya web icon on toolbox exists web_button = "ToolBox|MainToolboxLayout|mayaWebButton" if not mc.iconTextButton(web_button, query=True, exists=True): @@ -120,65 +95,69 @@ def override_toolbox_ui(): # Create our controls background_color = (0.267, 0.267, 0.267) controls = [] - if mayalookassigner: - controls.append( - mc.iconTextButton( - "pype_toolbox_lookmanager", - annotation="Look Manager", - label="Look Manager", - image=os.path.join(icons, "lookmanager.png"), - command=lambda: mayalookassigner.show(), - bgc=background_color, - width=icon_size, - height=icon_size, - parent=parent - ) + controls.append( + mc.iconTextButton( + "pype_toolbox_lookmanager", + annotation="Look Manager", + label="Look Manager", + image=os.path.join(icons, "lookmanager.png"), + command=lambda: host_tools.show_look_assigner( + parent=pipeline._parent + ), + bgc=background_color, + width=icon_size, + height=icon_size, + parent=parent ) + ) - if launch_workfiles_app: - controls.append( - mc.iconTextButton( - "pype_toolbox_workfiles", - annotation="Work Files", - label="Work Files", - image=os.path.join(icons, "workfiles.png"), - command=lambda: launch_workfiles_app(), - bgc=background_color, - width=icon_size, - height=icon_size, - parent=parent - ) + controls.append( + mc.iconTextButton( + "pype_toolbox_workfiles", + annotation="Work Files", + label="Work Files", + image=os.path.join(icons, "workfiles.png"), + command=lambda: host_tools.show_workfiles( + parent=pipeline._parent + ), + bgc=background_color, + width=icon_size, + height=icon_size, + parent=parent ) + ) - if loader: - controls.append( - mc.iconTextButton( - "pype_toolbox_loader", - annotation="Loader", - label="Loader", - image=os.path.join(icons, "loader.png"), - command=lambda: loader.show(use_context=True), - bgc=background_color, - width=icon_size, - height=icon_size, - parent=parent - ) + controls.append( + mc.iconTextButton( + "pype_toolbox_loader", + annotation="Loader", + label="Loader", + image=os.path.join(icons, "loader.png"), + command=lambda: host_tools.show_loader( + parent=pipeline._parent, use_context=True + ), + bgc=background_color, + width=icon_size, + height=icon_size, + parent=parent ) + ) - if inventory: - controls.append( - mc.iconTextButton( - "pype_toolbox_manager", - annotation="Inventory", - label="Inventory", - image=os.path.join(icons, "inventory.png"), - command=lambda: inventory.show(), - bgc=background_color, - width=icon_size, - height=icon_size, - parent=parent - ) + controls.append( + mc.iconTextButton( + "pype_toolbox_manager", + annotation="Inventory", + label="Inventory", + image=os.path.join(icons, "inventory.png"), + command=lambda: host_tools.show_scene_inventory( + parent=pipeline._parent + ), + bgc=background_color, + width=icon_size, + height=icon_size, + parent=parent ) + ) # Add the buttons on the bottom and stack # them above each other with side padding diff --git a/openpype/hosts/maya/api/menu.py b/openpype/hosts/maya/api/menu.py index 42cb76dca6..4f0966abfd 100644 --- a/openpype/hosts/maya/api/menu.py +++ b/openpype/hosts/maya/api/menu.py @@ -28,7 +28,6 @@ def _get_menu(menu_name=None): def deferred(): - def add_build_workfiles_item(): # Add build first workfile cmds.menuItem(divider=True, parent=pipeline._menu) @@ -48,9 +47,6 @@ def deferred(): ) def modify_workfiles(): - def launch_workfiles_app(*_args, **_kwargs): - host_tools.show_workfiles(pipeline._parent) - # Find the pipeline menu top_menu = _get_menu() @@ -71,7 +67,7 @@ def deferred(): cmds.menuItem( "Work Files", parent=pipeline._menu, - command=launch_workfiles_app, + command=lambda *args: host_tools.show_workfiles(pipeline._parent), insertAfter=after_action ) From 3356c21db245a14bd52af50825f32f75428bba4e Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 15 Oct 2021 15:06:00 +0200 Subject: [PATCH 23/34] cleanup harmony imports --- openpype/hosts/harmony/api/__init__.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/openpype/hosts/harmony/api/__init__.py b/openpype/hosts/harmony/api/__init__.py index fd21725bd5..bcf7dffbe7 100644 --- a/openpype/hosts/harmony/api/__init__.py +++ b/openpype/hosts/harmony/api/__init__.py @@ -3,17 +3,14 @@ import os from pathlib import Path import logging -import re from openpype import lib -from openpype.api import (get_current_project_settings) import openpype.hosts.harmony import pyblish.api from avalon import io, harmony import avalon.api -import avalon.tools.sceneinventory log = logging.getLogger("openpype.hosts.harmony") From 7615d2c7af4eb1ec150f60ba6bf571ad5c3c8f06 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 15 Oct 2021 16:29:49 +0200 Subject: [PATCH 24/34] hiero is using host_tools --- openpype/hosts/hiero/api/menu.py | 9 ++++----- openpype/hosts/hiero/api/pipeline.py | 9 +++------ 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/openpype/hosts/hiero/api/menu.py b/openpype/hosts/hiero/api/menu.py index bcd78aa5bb..e3de220777 100644 --- a/openpype/hosts/hiero/api/menu.py +++ b/openpype/hosts/hiero/api/menu.py @@ -2,6 +2,7 @@ import os import sys import hiero.core from openpype.api import Logger +from openpype.tools.utils import host_tools from avalon.api import Session from hiero.ui import findMenuAction @@ -41,8 +42,6 @@ def menu_install(): apply_colorspace_project, apply_colorspace_clips ) # here is the best place to add menu - from avalon.tools import creator, sceneinventory - from openpype.tools import loader from avalon.vendor.Qt import QtGui menu_name = os.environ['AVALON_LABEL'] @@ -87,15 +86,15 @@ def menu_install(): creator_action = menu.addAction("Create ...") creator_action.setIcon(QtGui.QIcon("icons:CopyRectangle.png")) - creator_action.triggered.connect(creator.show) + creator_action.triggered.connect(host_tools.show_creator) loader_action = menu.addAction("Load ...") loader_action.setIcon(QtGui.QIcon("icons:CopyRectangle.png")) - loader_action.triggered.connect(loader.show) + loader_action.triggered.connect(host_tools.show_loader) sceneinventory_action = menu.addAction("Manage ...") sceneinventory_action.setIcon(QtGui.QIcon("icons:CopyRectangle.png")) - sceneinventory_action.triggered.connect(sceneinventory.show) + sceneinventory_action.triggered.connect(host_tools.show_scene_inventory) menu.addSeparator() if os.getenv("OPENPYPE_DEVELOP"): diff --git a/openpype/hosts/hiero/api/pipeline.py b/openpype/hosts/hiero/api/pipeline.py index 12f6923de7..6f6588e1be 100644 --- a/openpype/hosts/hiero/api/pipeline.py +++ b/openpype/hosts/hiero/api/pipeline.py @@ -4,13 +4,12 @@ Basic avalon integration import os import contextlib from collections import OrderedDict -from avalon.tools import publish as _publish -from openpype.tools import workfiles from avalon.pipeline import AVALON_CONTAINER_ID from avalon import api as avalon from avalon import schema from pyblish import api as pyblish from openpype.api import Logger +from openpype.tools.utils import host_tools from . import lib, menu, events log = Logger().get_logger(__name__) @@ -211,15 +210,13 @@ def update_container(track_item, data=None): def launch_workfiles_app(*args): ''' Wrapping function for workfiles launcher ''' - workdir = os.environ["AVALON_WORKDIR"] - # show workfile gui - workfiles.show(workdir) + host_tools.show_workfiles() def publish(parent): """Shorthand to publish from within host""" - return _publish.show(parent) + return host_tools.show_publish(parent) @contextlib.contextmanager From 72a645bd74efd26b2f7ce78ef51e50d46bd73831 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 15 Oct 2021 16:47:55 +0200 Subject: [PATCH 25/34] nuke is using host_tools --- openpype/hosts/nuke/api/lib.py | 5 ++--- openpype/hosts/nuke/api/menu.py | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/openpype/hosts/nuke/api/lib.py b/openpype/hosts/nuke/api/lib.py index 6fe9af744b..00ed4c6e78 100644 --- a/openpype/hosts/nuke/api/lib.py +++ b/openpype/hosts/nuke/api/lib.py @@ -7,7 +7,6 @@ from collections import OrderedDict from avalon import api, io, lib -from openpype.tools import workfiles import avalon.nuke from avalon.nuke import lib as anlib from avalon.nuke import ( @@ -24,7 +23,7 @@ from openpype.api import ( get_current_project_settings, ApplicationManager ) - +from openpype.tools.utils import host_tools import nuke from .utils import set_context_favorites @@ -1689,7 +1688,7 @@ def launch_workfiles_app(): if not opnl.workfiles_launched: opnl.workfiles_launched = True - workfiles.show(os.environ["AVALON_WORKDIR"]) + host_tools.show_workfiles() def process_workfile_builder(): diff --git a/openpype/hosts/nuke/api/menu.py b/openpype/hosts/nuke/api/menu.py index 021ea04159..87990c5e92 100644 --- a/openpype/hosts/nuke/api/menu.py +++ b/openpype/hosts/nuke/api/menu.py @@ -4,7 +4,7 @@ from avalon.api import Session from .lib import WorkfileSettings from openpype.api import Logger, BuildWorkfile, get_current_project_settings -from openpype.tools import workfiles +from openpype.tools.utils import host_tools log = Logger().get_logger(__name__) @@ -25,7 +25,7 @@ def install(): menu.removeItem(rm_item[1].name()) menu.addCommand( name, - workfiles.show, + host_tools.show_workfiles, index=2 ) menu.addSeparator(index=3) From 60f1c3cecd0f26758d69ccfa84e6601c0000b0a3 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 15 Oct 2021 16:51:45 +0200 Subject: [PATCH 26/34] resolve is using host_tools --- openpype/hosts/resolve/api/menu.py | 24 ++++++++---------------- openpype/hosts/resolve/api/pipeline.py | 8 +++----- 2 files changed, 11 insertions(+), 21 deletions(-) diff --git a/openpype/hosts/resolve/api/menu.py b/openpype/hosts/resolve/api/menu.py index c639fd2db8..262ce739dd 100644 --- a/openpype/hosts/resolve/api/menu.py +++ b/openpype/hosts/resolve/api/menu.py @@ -8,15 +8,7 @@ from .pipeline import ( launch_workfiles_app ) -from avalon.tools import ( - creator, - sceneinventory, - subsetmanager -) -from openpype.tools import ( - loader, - libraryloader, -) +from openpype.tools.utils import host_tools def load_stylesheet(): @@ -32,7 +24,7 @@ def load_stylesheet(): class Spacer(QtWidgets.QWidget): def __init__(self, height, *args, **kwargs): - super(self.__class__, self).__init__(*args, **kwargs) + super(Spacer, self).__init__(*args, **kwargs) self.setFixedHeight(height) @@ -49,7 +41,7 @@ class Spacer(QtWidgets.QWidget): class OpenPypeMenu(QtWidgets.QWidget): def __init__(self, *args, **kwargs): - super(self.__class__, self).__init__(*args, **kwargs) + super(OpenPypeMenu, self).__init__(*args, **kwargs) self.setObjectName("OpenPypeMenu") @@ -119,7 +111,7 @@ class OpenPypeMenu(QtWidgets.QWidget): def on_create_clicked(self): print("Clicked Create") - creator.show() + host_tools.show_creator() def on_publish_clicked(self): print("Clicked Publish") @@ -127,19 +119,19 @@ class OpenPypeMenu(QtWidgets.QWidget): def on_load_clicked(self): print("Clicked Load") - loader.show(use_context=True) + host_tools.show_loader(use_context=True) def on_inventory_clicked(self): print("Clicked Inventory") - sceneinventory.show() + host_tools.show_scene_inventory() def on_subsetm_clicked(self): print("Clicked Subset Manager") - subsetmanager.show() + host_tools.show_subset_manager() def on_libload_clicked(self): print("Clicked Library") - libraryloader.show() + host_tools.show_library_loader() def on_rename_clicked(self): print("Clicked Rename") diff --git a/openpype/hosts/resolve/api/pipeline.py b/openpype/hosts/resolve/api/pipeline.py index 80249310e8..ce95cfe02a 100644 --- a/openpype/hosts/resolve/api/pipeline.py +++ b/openpype/hosts/resolve/api/pipeline.py @@ -4,7 +4,6 @@ Basic avalon integration import os import contextlib from collections import OrderedDict -from openpype.tools import workfiles from avalon import api as avalon from avalon import schema from avalon.pipeline import AVALON_CONTAINER_ID @@ -12,6 +11,7 @@ from pyblish import api as pyblish from openpype.api import Logger from . import lib from . import PLUGINS_DIR +from openpype.tools.utils import host_tools log = Logger().get_logger(__name__) PUBLISH_PATH = os.path.join(PLUGINS_DIR, "publish") @@ -212,14 +212,12 @@ def update_container(timeline_item, data=None): def launch_workfiles_app(*args): - workdir = os.environ["AVALON_WORKDIR"] - workfiles.show(workdir) + host_tools.show_workfiles() def publish(parent): """Shorthand to publish from within host""" - from avalon.tools import publish - return publish.show(parent) + return host_tools.show_publish() @contextlib.contextmanager From 9d67911bd2f2d08ab3fb1e22221dc9bc07920b85 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 15 Oct 2021 17:30:14 +0200 Subject: [PATCH 27/34] removed unused import --- openpype/tools/utils/host_tools.py | 1 - 1 file changed, 1 deletion(-) diff --git a/openpype/tools/utils/host_tools.py b/openpype/tools/utils/host_tools.py index 431009ac27..ee184ccf2d 100644 --- a/openpype/tools/utils/host_tools.py +++ b/openpype/tools/utils/host_tools.py @@ -4,7 +4,6 @@ It is possible to create `HostToolsHelper` in host implementaion or use singleton approach with global functions (using helper anyway). """ -from Qt import QtCore import avalon.api From 97ed09c059bc269c6f4a5fd0c2e6e3b8cf5d3e99 Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 15 Oct 2021 18:12:17 +0200 Subject: [PATCH 28/34] maya look assigner is not added if can't be initialized --- openpype/hosts/maya/api/customize.py | 36 +++++++++++++++++----------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/openpype/hosts/maya/api/customize.py b/openpype/hosts/maya/api/customize.py index 54c058aa75..2e10de1351 100644 --- a/openpype/hosts/maya/api/customize.py +++ b/openpype/hosts/maya/api/customize.py @@ -95,21 +95,29 @@ def override_toolbox_ui(): # Create our controls background_color = (0.267, 0.267, 0.267) controls = [] - controls.append( - mc.iconTextButton( - "pype_toolbox_lookmanager", - annotation="Look Manager", - label="Look Manager", - image=os.path.join(icons, "lookmanager.png"), - command=lambda: host_tools.show_look_assigner( - parent=pipeline._parent - ), - bgc=background_color, - width=icon_size, - height=icon_size, - parent=parent + look_assigner = None + try: + look_assigner = host_tools.get_tool_by_name( + "lookassigner", + parent=pipeline._parent + ) + except Exception as exc: + log.warning("Couldn't create Look assigner window.") + + if look_assigner is not None: + controls.append( + mc.iconTextButton( + "pype_toolbox_lookmanager", + annotation="Look Manager", + label="Look Manager", + image=os.path.join(icons, "lookmanager.png"), + command=host_tools.show_look_assigner, + bgc=background_color, + width=icon_size, + height=icon_size, + parent=parent + ) ) - ) controls.append( mc.iconTextButton( From 447add6b4a74273e17355856778ddae6a15346dd Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Fri, 15 Oct 2021 18:16:19 +0200 Subject: [PATCH 29/34] log traceback of lookassigner creation --- openpype/hosts/maya/api/customize.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openpype/hosts/maya/api/customize.py b/openpype/hosts/maya/api/customize.py index 2e10de1351..8474262626 100644 --- a/openpype/hosts/maya/api/customize.py +++ b/openpype/hosts/maya/api/customize.py @@ -101,8 +101,8 @@ def override_toolbox_ui(): "lookassigner", parent=pipeline._parent ) - except Exception as exc: - log.warning("Couldn't create Look assigner window.") + except Exception: + log.warning("Couldn't create Look assigner window.", exc_info=True) if look_assigner is not None: controls.append( From ec6210a826e6e390a8349d1dda885e8008b0edac Mon Sep 17 00:00:00 2001 From: iLLiCiTiT Date: Mon, 18 Oct 2021 17:42:57 +0200 Subject: [PATCH 30/34] fix publish callback code in houdini --- openpype/hosts/houdini/startup/MainMenuCommon.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpype/hosts/houdini/startup/MainMenuCommon.xml b/openpype/hosts/houdini/startup/MainMenuCommon.xml index 2923cb9ef5..2b556a2e75 100644 --- a/openpype/hosts/houdini/startup/MainMenuCommon.xml +++ b/openpype/hosts/houdini/startup/MainMenuCommon.xml @@ -40,7 +40,7 @@ host_tools.show_scene_inventory(parent) import hou from openpype.tools.utils import host_tools parent = hou.qt.mainWindow() -publish.show(parent) +host_tools.show_publish(parent) ]]> From 5b60f07f1373a416168dfbc9ccb3bafbb2e27f79 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Tue, 19 Oct 2021 12:35:37 +0200 Subject: [PATCH 31/34] add smooth transformation to loader thumbnail widget --- openpype/tools/loader/widgets.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/openpype/tools/loader/widgets.py b/openpype/tools/loader/widgets.py index 6b94fc6e44..1ccbb5796d 100644 --- a/openpype/tools/loader/widgets.py +++ b/openpype/tools/loader/widgets.py @@ -786,7 +786,10 @@ class ThumbnailWidget(QtWidgets.QLabel): def scale_pixmap(self, pixmap): return pixmap.scaled( - self.width(), self.height(), QtCore.Qt.KeepAspectRatio + self.width(), + self.height(), + QtCore.Qt.KeepAspectRatio, + QtCore.Qt.SmoothTransformation ) def set_thumbnail(self, entity=None): From 6d0f9069e8f326bc8c40159e83117c5aabb42a1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Samohel?= Date: Wed, 20 Oct 2021 12:24:20 +0200 Subject: [PATCH 32/34] fix UNC path support --- openpype/hosts/maya/plugins/publish/collect_render.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openpype/hosts/maya/plugins/publish/collect_render.py b/openpype/hosts/maya/plugins/publish/collect_render.py index 575cc2456b..d2f277329a 100644 --- a/openpype/hosts/maya/plugins/publish/collect_render.py +++ b/openpype/hosts/maya/plugins/publish/collect_render.py @@ -244,17 +244,17 @@ class CollectMayaRender(pyblish.api.ContextPlugin): # metadata file will be located in top-most common # directory. # TODO: use `os.path.commonpath()` after switch to Python 3 + publish_meta_path = os.path.normpath(publish_meta_path) common_publish_meta_path = os.path.splitdrive( publish_meta_path)[0] if common_publish_meta_path: common_publish_meta_path += os.path.sep - for part in publish_meta_path.split("/"): + for part in publish_meta_path.replace( + common_publish_meta_path, "").split(os.path.sep): common_publish_meta_path = os.path.join( common_publish_meta_path, part) if part == expected_layer_name: break - common_publish_meta_path = common_publish_meta_path.replace( - "\\", "/") self.log.info( "Publish meta path: {}".format(common_publish_meta_path)) From 8d441da917e6601cb6a249937e3693e436a7c6b4 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Thu, 21 Oct 2021 09:59:43 +0200 Subject: [PATCH 33/34] update google analytics --- website/docusaurus.config.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index 3ce1cde060..ddbcfd9ce7 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -116,8 +116,8 @@ module.exports = { // Optional: Algolia search parameters searchParameters: {}, }, - googleAnalytics: { - trackingID: 'G-HHJZ9VF0FG', + gtag: { + trackingID: 'G-DTKXMFENFY', // Optional fields. anonymizeIP: false, // Should IPs be anonymized? }, From 62c411f585ee59c5fc53c22f7a38bde825b56e52 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Thu, 21 Oct 2021 10:06:32 +0200 Subject: [PATCH 34/34] fix typo in ci --- tools/ci_tools.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/ci_tools.py b/tools/ci_tools.py index 337b19a346..e5ca0c2c28 100644 --- a/tools/ci_tools.py +++ b/tools/ci_tools.py @@ -27,7 +27,7 @@ def get_release_type_github(Log, github_token): return "minor" if any(label in labels for label in patch_labels): - return "path" + return "patch" return None