From 25518a1c42ff9958f9bb9763b0792dd28e8cc691 Mon Sep 17 00:00:00 2001 From: Thomas Fricard Date: Wed, 4 May 2022 17:01:32 +0200 Subject: [PATCH] generate toolbar menu from openpype project settings --- openpype/hosts/nuke/api/lib.py | 48 +++++++++++++++ openpype/hosts/nuke/startup/menu.py | 59 ++++++++++++++++++- .../defaults/project_settings/nuke.json | 9 ++- 3 files changed, 110 insertions(+), 6 deletions(-) diff --git a/openpype/hosts/nuke/api/lib.py b/openpype/hosts/nuke/api/lib.py index f40425eefc..a1ac50ae1a 100644 --- a/openpype/hosts/nuke/api/lib.py +++ b/openpype/hosts/nuke/api/lib.py @@ -30,6 +30,8 @@ from openpype.pipeline import ( legacy_io, ) +from . import gizmo_menu + from .workio import ( save_file, open_file @@ -2498,6 +2500,52 @@ def recreate_instance(origin_node, avalon_data=None): return new_node +def find_scripts_gizmo(title, parent): + """ + Check if the menu exists with the given title in the parent + + Args: + title (str): the title name of the scripts menu + + parent (QtWidgets.QMenuBar): the menubar to check + + Returns: + QtWidgets.QMenu or None + + """ + + menu = None + search = [i for i in parent.items() if + isinstance(i, gizmo_menu.GizmoMenu) + and i.title() == title] + + if search: + assert len(search) < 2, ("Multiple instances of menu '{}' " + "in toolbar".format(title)) + menu = search[0] + + return menu + + +def gizmo_creation(title="Gizmos", parent=None, objectName=None, icon=None): + try: + toolbar = find_scripts_gizmo(title, parent) + if not toolbar: + log.info("Attempting to build toolbar...") + object_name = objectName or title.lower() + toolbar = gizmo_menu.GizmoMenu( + title=title, + parent=parent, + objectName=object_name, + icon=icon + ) + except Exception as e: + log.error(e) + return + + return toolbar + + class NukeDirmap(HostDirmap): def __init__(self, host_name, project_settings, sync_module, file_name): """ diff --git a/openpype/hosts/nuke/startup/menu.py b/openpype/hosts/nuke/startup/menu.py index eea2d940f8..0f587fc62a 100644 --- a/openpype/hosts/nuke/startup/menu.py +++ b/openpype/hosts/nuke/startup/menu.py @@ -2,7 +2,7 @@ import nuke import os from openpype.api import Logger -from openpype.pipeline import install_host +from openpype.settings import get_project_settings from openpype.hosts.nuke import api from openpype.hosts.nuke.api.lib import ( on_script_load, @@ -31,6 +31,7 @@ nuke.addFilenameFilter(dirmap_file_name_filter) log.info('Automatic syncing of write file knob to script version') + def add_scripts_menu(): try: from scriptsmenu import launchfornuke @@ -58,3 +59,59 @@ def add_scripts_menu(): add_scripts_menu() + + +def add_scripts_gizmo(): + try: + from openpype.hosts.nuke.api import lib + except ImportError: + log.warning( + "Skipping studio.gizmo install, because " + "'scriptsgizmo' module seems unavailable." + ) + return + + for gizmo in project_settings["nuke"]["gizmo"]: + config = gizmo["gizmo_definition"] + toolbar_name = gizmo["toolbar_menu_name"] + gizmo_path = gizmo["gizmo_path"] + icon = gizmo['toolbar_icon_path'] + + if not any(gizmo_path): + log.warning("Skipping studio gizmo, no gizmo path found.") + return + + if not config: + log.warning("Skipping studio gizmo, no definition found.") + return + + try: + icon = icon.format(**os.environ) + except KeyError as e: + log.warning(f"This environment variable doesn't exist: {e}") + + for gizmo in gizmo_path: + try: + gizmo = gizmo.format(**os.environ) + gizmo_path.append(gizmo) + gizmo_path.pop(0) + except KeyError as e: + log.warning(f"This environment variable doesn't exist: {e}") + + nuke_toolbar = nuke.menu("Nodes") + toolbar = nuke_toolbar.addMenu(toolbar_name, icon=icon) + + # run the launcher for Nuke toolbar + studio_menu = lib.gizmo_creation( + title=toolbar_name, + parent=toolbar, + objectName=toolbar_name.lower().replace(" ", "_"), + icon=icon + ) + + # apply configuration + studio_menu.add_gizmo_path(gizmo_path) + studio_menu.build_from_configuration(toolbar, config) + + +add_scripts_gizmo() diff --git a/openpype/settings/defaults/project_settings/nuke.json b/openpype/settings/defaults/project_settings/nuke.json index a10b88464c..48bbbf0dcc 100644 --- a/openpype/settings/defaults/project_settings/nuke.json +++ b/openpype/settings/defaults/project_settings/nuke.json @@ -293,8 +293,8 @@ "gizmo": [ { "toolbar_menu_name": "FixStudio", - "toolbar_icon_path": "{QUAD_PLUGIN_PATH}/nuke/icons/fixstudio.png", - "gizmo_path": ["{QUAD_PLUGIN_PATH}/nuke/gizmos"], + "toolbar_icon_path": "openpype/modules/quad/nuke/icons/fixstudio.png", + "gizmo_path": ["openpype/modules/quad/nuke/gizmos/3D"], "gizmo_definition": [ { "type": "menu", @@ -302,11 +302,10 @@ "items": [ { "type": "action", - "command": "nuke.createNode('Camera_Smoother')", "sourcetype": "python", - "title": "Camera_Smoother" + "title": "Camera Smoother", + "command": "nuke.createNodes('Camera_Smoother)" } - ] } ]