diff --git a/pype/hooks/resolve/prelaunch.py b/pype/hooks/resolve/prelaunch.py index d0b7448a41..ccc5e48dfd 100644 --- a/pype/hooks/resolve/prelaunch.py +++ b/pype/hooks/resolve/prelaunch.py @@ -1,5 +1,6 @@ import os import traceback +import importlib from pype.lib import PypeHook from pypeapp import Logger from pype.resolve import utils @@ -60,6 +61,7 @@ class ResolvePrelaunch(PypeHook): else: # Resolve Setup integration + importlib.reload(utils) utils.setup(env) return True diff --git a/pype/plugins/resolve/publish/collect_host.py b/pype/plugins/resolve/publish/collect_host.py index 9119ba1f4f..7579be487c 100644 --- a/pype/plugins/resolve/publish/collect_host.py +++ b/pype/plugins/resolve/publish/collect_host.py @@ -1,5 +1,5 @@ import pyblish.api -from python_get_resolve import GetResolve +from pype.resolve.utils import get_resolve_module class CollectProject(pyblish.api.ContextPlugin): @@ -10,7 +10,7 @@ class CollectProject(pyblish.api.ContextPlugin): hosts = ["resolve"] def process(self, context): - resolve = GetResolve() + resolve = get_resolve_module() PM = resolve.GetProjectManager() P = PM.GetCurrentProject() diff --git a/pype/resolve/lib.py b/pype/resolve/lib.py index e69de29bb2..a6f10a1533 100644 --- a/pype/resolve/lib.py +++ b/pype/resolve/lib.py @@ -0,0 +1,12 @@ +import sys +from .utils import get_resolve_module + +self = sys.modules[__name__] +self.pm = None + + +def get_project_manager(): + if not self.pm: + resolve = get_resolve_module() + self.pm = resolve.GetProjectManager() + return self.pm diff --git a/pype/resolve/menu.py b/pype/resolve/menu.py index 9f45ec9b70..6edf2e8f0c 100644 --- a/pype/resolve/menu.py +++ b/pype/resolve/menu.py @@ -3,6 +3,18 @@ import sys from Qt import QtWidgets, QtCore +from .pipeline import ( + publish, + launch_workfiles_app, + reload_pipeline + ) + +from avalon.tools import ( + creator, + loader, + sceneinventory, + libraryloader +) def load_stylesheet(): path = os.path.join(os.path.dirname(__file__), "menu_style.qss") @@ -23,10 +35,10 @@ class Spacer(QtWidgets.QWidget): real_spacer = QtWidgets.QWidget(self) real_spacer.setObjectName("Spacer") - real_spacer.setFixedHeight(int(height / 3)) + real_spacer.setFixedHeight(height) layout = QtWidgets.QVBoxLayout(self) - layout.setContentsMargins(0, 0, 0, 0) + layout.setContentsMargins(0, 11, 0, 0) layout.addWidget(real_spacer) self.setLayout(layout) @@ -62,7 +74,7 @@ class PypeMenu(QtWidgets.QWidget): reload_pipeline_btn = QtWidgets.QPushButton("Reload pipeline", self) layout = QtWidgets.QVBoxLayout(self) - layout.setContentsMargins(10, 10, 10, 10) + layout.setContentsMargins(10, 20, 10, 20) layout.addWidget(workfiles_btn) layout.addWidget(create_btn) @@ -70,19 +82,19 @@ class PypeMenu(QtWidgets.QWidget): layout.addWidget(load_btn) layout.addWidget(inventory_btn) - layout.addWidget(Spacer(20, self)) + layout.addWidget(Spacer(11, self)) layout.addWidget(rename_btn) layout.addWidget(set_colorspace_btn) layout.addWidget(reset_resolution_btn) - layout.addWidget(Spacer(20, self)) + layout.addWidget(Spacer(11, self)) layout.addWidget(reload_pipeline_btn) self.setLayout(layout) - workfiles_btn.clicked.connect(self.on_reload_pipeline_clicked) + workfiles_btn.clicked.connect(self.on_workfile_clicked) create_btn.clicked.connect(self.on_create_clicked) publish_btn.clicked.connect(self.on_publish_clicked) load_btn.clicked.connect(self.on_load_clicked) @@ -94,18 +106,23 @@ class PypeMenu(QtWidgets.QWidget): def on_workfile_clicked(self): print("Clicked Workfile") + launch_workfiles_app() def on_create_clicked(self): print("Clicked Create") + creator.show() def on_publish_clicked(self): print("Clicked Publish") + publish(None) def on_load_clicked(self): print("Clicked Load") + loader.show(use_context=True) def on_inventory_clicked(self): print("Clicked Inventory") + sceneinventory.show() def on_rename_clicked(self): print("Clicked Rename") @@ -118,6 +135,7 @@ class PypeMenu(QtWidgets.QWidget): def on_reload_pipeline_clicked(self): print("Clicked Reload Pipeline") + reload_pipeline() def launch_pype_menu(): diff --git a/pype/resolve/menu_style.qss b/pype/resolve/menu_style.qss index 52672364db..b74ed46868 100644 --- a/pype/resolve/menu_style.qss +++ b/pype/resolve/menu_style.qss @@ -1,34 +1,29 @@ QWidget { - background-color: #3a3939; - border-radius: 5; + background-color: #282828; + border-radius: 3; } QPushButton { - border: 1px solid #6d6d6d; + border: 1px solid #090909; background-color: #201f1f; - color: #6d6d6d; + color: #ffffff; padding: 5; } QPushButton:focus { - background-color: "#272525"; -} - -QPushButton:pressed { - background-color: "#686464"; - color: #333333; + background-color: "#171717"; + color: #d0d0d0; } QPushButton:hover { - color: #d0d0d0; - background-color: "#343232"; + background-color: "#171717"; + color: #e64b3d; } #PypeMenu { - border: 1px solid #333333; + border: 1px solid #fef9ef; } #Spacer { - padding: 10; - background-color: #464646; + background-color: #121212; } diff --git a/pype/resolve/pipeline.py b/pype/resolve/pipeline.py index b6cae307b0..377c5ae161 100644 --- a/pype/resolve/pipeline.py +++ b/pype/resolve/pipeline.py @@ -150,8 +150,6 @@ def reload_pipeline(): import importlib import pype.resolve - avalon.uninstall() - # get avalon config name config = os.getenv("AVALON_CONFIG", "pype") @@ -164,7 +162,6 @@ def reload_pipeline(): "{}".format(config), "{}.resolve".format(config), "{}.resolve.lib".format(config), - "{}.resolve.menu".format(config), "{}.resolve.plugin".format(config), "{}.resolve.pipeline".format(config) ): @@ -175,8 +172,6 @@ def reload_pipeline(): except Exception as e: log.warning("Cannot reload module: {}".format(e)) - avalon.install(pype.resolve) - def publish(parent): """Shorthand to publish from within host""" diff --git a/pype/resolve/preload_console.py b/pype/resolve/preload_console.py index 7d602df339..c1b70de11d 100644 --- a/pype/resolve/preload_console.py +++ b/pype/resolve/preload_console.py @@ -26,4 +26,7 @@ while True: log.info(f"Waiting {wait}s for Resolve to be open in project") wait += wait_delay else: + print(f"Preloaded variables: \n\n\tResolve module: " + f"`resolve` > {type(resolve)} \n\tProject manager: " + f"`pm` > {type(pm)} \n\tCurrent project: `p` > {type(p)}") break diff --git a/pype/resolve/resolve_utility_scripts/Pype_menu.py b/pype/resolve/utility_scripts/Pype_menu.py similarity index 94% rename from pype/resolve/resolve_utility_scripts/Pype_menu.py rename to pype/resolve/utility_scripts/Pype_menu.py index e9f5d68d70..10d8d8939d 100644 --- a/pype/resolve/resolve_utility_scripts/Pype_menu.py +++ b/pype/resolve/utility_scripts/Pype_menu.py @@ -27,6 +27,7 @@ def main(env): return False avalon.api.install(host_module) + avalon.api.register_host("resolve") if __name__ == "__main__": diff --git a/pype/resolve/resolve_utility_scripts/README.markdown b/pype/resolve/utility_scripts/README.markdown similarity index 100% rename from pype/resolve/resolve_utility_scripts/README.markdown rename to pype/resolve/utility_scripts/README.markdown diff --git a/pype/resolve/resolve_utility_scripts/__test_gui.py b/pype/resolve/utility_scripts/__test_gui.py similarity index 100% rename from pype/resolve/resolve_utility_scripts/__test_gui.py rename to pype/resolve/utility_scripts/__test_gui.py diff --git a/pype/resolve/resolve_utility_scripts/__test_pyblish.py b/pype/resolve/utility_scripts/__test_pyblish.py similarity index 100% rename from pype/resolve/resolve_utility_scripts/__test_pyblish.py rename to pype/resolve/utility_scripts/__test_pyblish.py diff --git a/pype/resolve/resolve_utility_scripts/__test_subprocess.py b/pype/resolve/utility_scripts/__test_subprocess.py similarity index 100% rename from pype/resolve/resolve_utility_scripts/__test_subprocess.py rename to pype/resolve/utility_scripts/__test_subprocess.py diff --git a/pype/resolve/utils.py b/pype/resolve/utils.py index e421d02de5..252a43da8d 100644 --- a/pype/resolve/utils.py +++ b/pype/resolve/utils.py @@ -12,13 +12,14 @@ from pypeapp import Logger log = Logger().get_logger(__name__, "resolve") -UTILITY_SCRIPTS = os.path.join( - os.path.dirname(__file__), - "resolve_utility_scripts" -) - +self = sys.modules[__name__] +self.bmd = None def get_resolve_module(): + # dont run if already loaded + if self.bmd: + return self.bmd + try: """ The PYTHONPATH needs to be set correctly for this import @@ -52,7 +53,7 @@ def get_resolve_module(): "DaVinciResolveScript.py" ) ) - + try: import imp bmd = imp.load_source('DaVinciResolveScript', module_path) @@ -68,8 +69,9 @@ def get_resolve_module(): f"module is expected to be located in: {expected_path}") ) sys.exit() - - return bmd.scriptapp("Resolve") + # assign global var and return + self.bmd = bmd.scriptapp("Resolve") + return self.bmd def _sync_utility_scripts(env=None): @@ -81,10 +83,26 @@ def _sync_utility_scripts(env=None): if not env: env = os.environ + # initiate inputs + scripts = {} + us_env = env.get("RESOLVE_UTILITY_SCRIPTS_SOURCE_DIR") us_dir = env.get("RESOLVE_UTILITY_SCRIPTS_DIR", "") - scripts = os.listdir(UTILITY_SCRIPTS) + us_paths = [os.path.join( + os.path.dirname(__file__), + "utility_scripts" + )] - log.info(f"Utility Scripts Dir: `{UTILITY_SCRIPTS}`") + # collect script dirs + if us_env: + log.info(f"Utility Scripts Env: `{us_env}`") + us_paths = us_env.split( + os.pathsep) + us_paths + + # collect scripts from dirs + for path in us_paths: + scripts.update({path: os.listdir(path)}) + + log.info(f"Utility Scripts Dir: `{us_paths}`") log.info(f"Utility Scripts: `{scripts}`") # make sure no script file is in folder @@ -95,11 +113,14 @@ def _sync_utility_scripts(env=None): os.remove(path) # copy scripts into Resolve's utility scripts dir - for s in scripts: - src = os.path.join(UTILITY_SCRIPTS, s) - dst = os.path.join(us_dir, s) - log.info(f"Copying `{src}` to `{dst}`...") - shutil.copy2(src, dst) + for d, sl in scripts.items(): + # directory and scripts list + for s in sl: + # script in script list + src = os.path.join(d, s) + dst = os.path.join(us_dir, s) + log.info(f"Copying `{src}` to `{dst}`...") + shutil.copy2(src, dst) def setup(env=None): diff --git a/pype/resolve/workio.py b/pype/resolve/workio.py index 49c027259b..b9562449bf 100644 --- a/pype/resolve/workio.py +++ b/pype/resolve/workio.py @@ -1,24 +1,14 @@ """Host API required Work Files tool""" import os -import sys from pypeapp import Logger -from .utils import get_resolve_module +from .lib import get_project_manager + log = Logger().get_logger(__name__, "nukestudio") exported_projet_ext = ".drp" -self = sys.modules[__name__] -self.pm = None - - -def get_project_manager(): - if not self.pm: - resolve = get_resolve_module() - self.pm = resolve.GetProjectManager() - return self.pm - def file_extensions(): return [exported_projet_ext]