You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
5.9 KiB
Python
166 lines
5.9 KiB
Python
# coding:utf-8
|
|
#!/usr/bin/python
|
|
#
|
|
# Copyright (c) Contributors to the Open 3D Engine Project.
|
|
# For complete copyright and license terms please see the LICENSE at the root of this distribution.
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0 OR MIT
|
|
#
|
|
#
|
|
# -- This line is 75 characters -------------------------------------------
|
|
"""This module creates a DccScriptingInterface menu in Lumberyard.
|
|
This module is designed to only run in Lumberyard and py3.7+"""
|
|
# -- Standard Python modules
|
|
import sys
|
|
import os
|
|
import importlib.util
|
|
|
|
# -- External Python modules
|
|
from pathlib import Path
|
|
|
|
# -- DCCsi Extension Modules
|
|
import azpy
|
|
|
|
# Lumberyard extension modules
|
|
import azlmbr
|
|
import azlmbr.bus
|
|
# -------------------------------------------------------------------------
|
|
|
|
|
|
# -------------------------------------------------------------------------
|
|
# some basic DCCsi module setup, DCCsi bootstrap already performed some
|
|
from dynaconf import settings
|
|
settings.setenv()
|
|
|
|
# -------------------------------------------------------------------------
|
|
_log_level = int(settings.DCCSI_LOGLEVEL)
|
|
if settings.DCCSI_GDEBUG:
|
|
_log_level = int(10) # force debug level
|
|
|
|
_MODULENAME = r'DCCsi.SDK.Lumberyard.Scripts.set_menu'
|
|
|
|
_LOGGER = azpy.initialize_logger(_MODULENAME, default_log_level=_log_level)
|
|
_LOGGER.debug(f'Invoking:: {0}.'.format({_MODULENAME}))
|
|
|
|
# early attach WingIDE debugger (can refactor to include other IDEs later)
|
|
if settings.DCCSI_DEV_MODE:
|
|
from azpy.env_bool import env_bool
|
|
if not env_bool('DCCSI_DEBUGGER_ATTACHED', False):
|
|
# if not already attached lets do it here
|
|
from azpy.test.entry_test import connect_wing
|
|
foo = connect_wing()
|
|
# -------------------------------------------------------------------------
|
|
|
|
|
|
# -------------------------------------------------------------------------
|
|
# validate pyside before continuing
|
|
try:
|
|
azlmbr.qt.QtForPythonRequestBus(azlmbr.bus.Broadcast, 'IsActive')
|
|
params = azlmbr.qt.QtForPythonRequestBus(azlmbr.bus.Broadcast, 'GetQtBootstrapParameters')
|
|
params is not None and params.mainWindowId is not 0
|
|
from PySide2 import QtWidgets
|
|
except Exception as e:
|
|
_LOGGER.error(f'Pyside not available, exception: {e}')
|
|
raise e
|
|
|
|
# keep going, import the other PySide2 bits we will use
|
|
from PySide2 import QtGui
|
|
from PySide2.QtCore import Slot
|
|
from shiboken2 import wrapInstance, getCppPointer
|
|
# -------------------------------------------------------------------------
|
|
|
|
|
|
# -------------------------------------------------------------------------
|
|
def get_ly_mainwindow():
|
|
widget_main_window = QtWidgets.QWidget.find(params.mainWindowId)
|
|
widget_main_window = wrapInstance(int(getCppPointer(widget_main_window)[0]), QtWidgets.QMainWindow)
|
|
return widget_main_window
|
|
# -------------------------------------------------------------------------
|
|
|
|
|
|
# -------------------------------------------------------------------------
|
|
class SampleUI(QtWidgets.QDialog):
|
|
"""Lightweight UI Test Class created a button"""
|
|
def __init__(self, parent, title='Not Set'):
|
|
super(SampleUI, self).__init__(parent)
|
|
self.setWindowTitle(title)
|
|
self.initUI()
|
|
|
|
def initUI(self):
|
|
mainLayout = QtWidgets.QHBoxLayout()
|
|
testBtn = QtWidgets.QPushButton("I am just a Button man!")
|
|
mainLayout.addWidget(testBtn)
|
|
self.setLayout(mainLayout)
|
|
# -------------------------------------------------------------------------
|
|
|
|
|
|
# -------------------------------------------------------------------------
|
|
_tag_str = 'DccScriptingInterface'
|
|
_LOGGER.info(f'Creating {_tag_str} Menu')
|
|
# Lumberyards main window
|
|
widget_main_window = get_ly_mainwindow()
|
|
|
|
# create our own menuBar
|
|
dccsi_menu = widget_main_window.menuBar().addMenu(f"&{_tag_str}")
|
|
|
|
# nest a menu for util/tool launching
|
|
dccsi_launch_menu = dccsi_menu.addMenu("Launch Utility")
|
|
|
|
# (1) add the first utility: Substance Builder
|
|
# to do, make adding this a data-driven dynaconf option configured per-project?
|
|
action_launch_sub_builder = dccsi_launch_menu.addAction("Substance Builder")
|
|
|
|
@Slot()
|
|
def clicked_launch_sub_builder():
|
|
# breadcrumbs
|
|
if settings.DCCSI_GDEBUG:
|
|
debug_msg = "Clicked action_launch_sub_builder"
|
|
print(debug_msg)
|
|
_LOGGER.debug(debug_msg)
|
|
|
|
_SUB_BUILDER_PATH = Path(settings.DCCSIG_PATH,
|
|
'SDK',
|
|
'Substance',
|
|
'builder')
|
|
_SUB_BUILDER_BOOTSTRAP = Path(_SUB_BUILDER_PATH, 'bootstrap.py')
|
|
|
|
# bootstrap is a generic name and we have many of them
|
|
# this ensures we are loading a specific one
|
|
_spec_bootstrap = importlib.util.spec_from_file_location("dccsi.sdk.substance.builder.bootstrap",
|
|
_SUB_BUILDER_BOOTSTRAP)
|
|
_app_bootstrap = importlib.util.module_from_spec(_spec_bootstrap)
|
|
_spec_bootstrap.loader.exec_module(_app_bootstrap)
|
|
|
|
while 1: # simple PySide2 test, set to 0 to disable
|
|
ui = SampleUI(parent=widget_main_window, title='Atom: Substance Builder')
|
|
ui.show()
|
|
break
|
|
return
|
|
|
|
# Add click event to menu bar
|
|
action_launch_sub_builder.triggered.connect(clicked_launch_sub_builder)
|
|
# -----------------------------------------------------------------
|
|
|
|
# add launching the dcc material converter util to the menu
|
|
# to do, make adding this a data-driven dynaconf option?
|
|
action_launch_dcc_mat_converter = dccsi_launch_menu.addAction("DCC Material Converter")
|
|
|
|
@Slot()
|
|
def clicked_launch_dcc_mat_converter():
|
|
if settings.DCCSI_GDEBUG:
|
|
debug_msg = "Clicked action_launch_dcc_mat_converter"
|
|
print(debug_msg)
|
|
_LOGGER.debug(debug_msg)
|
|
|
|
while 1: # simple PySide2 test, set to 0 to disable
|
|
ui = SampleUI(parent=widget_main_window, title='Atom: DCC Material Converter')
|
|
ui.show()
|
|
break
|
|
|
|
return
|
|
|
|
# Add click event to menu bar
|
|
action_launch_dcc_mat_converter.triggered.connect(clicked_launch_dcc_mat_converter)
|
|
|
|
|