3
0

help_menu.py 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. # coding:utf-8
  2. #!/usr/bin/python
  3. #
  4. # Copyright (c) Contributors to the Open 3D Engine Project.
  5. # For complete copyright and license terms please see the LICENSE at the root of this distribution.
  6. #
  7. # SPDX-License-Identifier: Apache-2.0 OR MIT
  8. #
  9. #
  10. # -------------------------------------------------------------------------
  11. """! @brief: help_menu.py: Setup a standard Help item in the menubar for PySide2 GUIs"""
  12. # built in's
  13. import os
  14. import logging
  15. from pathlib import Path
  16. import logging as _logging
  17. # 3rd Party
  18. from PySide2 import QtWidgets
  19. from PySide2.QtWidgets import QMenuBar, QMenu, QAction
  20. from PySide2 import QtGui
  21. from PySide2 import QtCore
  22. from PySide2.QtCore import Slot, QObject, QUrl
  23. from shiboken2 import wrapInstance, getCppPointer
  24. # -------------------------------------------------------------------------
  25. # global scope
  26. from DccScriptingInterface.azpy.shared.ui import _PACKAGENAME
  27. _MODULENAME = f'{_PACKAGENAME}.help_menu'
  28. _LOGGER = _logging.getLogger(_MODULENAME)
  29. _LOGGER.info(f'Initializing: {_MODULENAME}')
  30. from DccScriptingInterface.globals import *
  31. # default o3de bug report link, for all tools
  32. O3DE_BUG_REPORT_URL = "https://github.com/o3de/o3de/issues/new?assignees=&labels=needs-triage%2Cneeds-sig%2Ckind%2Fbug&template=bug_template.md&title=Bug+Report"
  33. # default dcc app help page, default is for maya
  34. DCCSI_APP_HELP_URL = "https://github.com/o3de/o3de/tree/development/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/Tools/DCC/Maya/readme.md"
  35. # default generic help url (should be replaced per-tool)
  36. HELP_URL = 'https://github.com/o3de/o3de/tree/development/Gems/AtomLyIntegration/TechnicalArt/DccScriptingInterface/readme.md'
  37. # -------------------------------------------------------------------------
  38. # -------------------------------------------------------------------------
  39. class HelpMenu():
  40. """
  41. Setup a standard Help item in the menubar for PySide2 GUIs
  42. INPUTS:
  43. @param parent_widget: the class instance of the QMainWindow, or QWidget object
  44. note: parent_widget must have it's own menuBar
  45. @param dcc_app_label: Label for the tools parent dcc app help
  46. @param dcc_app_url: URL for the tools parent dcc app help link
  47. 35
  48. @param tool_label: the menu label for the tool specific help item
  49. @param tool_help_page: the http:// url path to the tool specific help page
  50. Example usage:
  51. # self.help_menu = azpy.shared.ui.help_menu.HelpMenu(self, 'Help...', https://some.site.com/azpy')
  52. """
  53. # ----------------------------------------------------------------------
  54. def __init__(self, parent_widget,
  55. tool_label: str = 'Tool Help...',
  56. tool_help_url: str = HELP_URL,
  57. dcc_app_label: str = 'DCC Help...',
  58. dcc_app_url: str = DCCSI_APP_HELP_URL,
  59. bug_label: str = 'Report a Tool Bug...',
  60. bug_url: str = O3DE_BUG_REPORT_URL):
  61. """Constructor"""
  62. # parent widget with a menuBar
  63. self.parent_widget = parent_widget
  64. # retreive and store the parent widget's menuBar
  65. try:
  66. self.menubar = self.parent_widget.menuBar
  67. except AttributeError as e:
  68. _LOGGER.warning(f'parnet: {self.parent_widget}, has no menuBar widget')
  69. _LOGGER.error(f'{e} , traceback =', exc_info=True)
  70. # top level help menu
  71. self.help_menu = QtWidgets.QMenu(self.menubar)
  72. self.menubar.addMenu(self.help_menu)
  73. self.help_menu.setObjectName("help_menu")
  74. self.help_menu.setTitle("Help")
  75. self.tool_label = tool_label
  76. self.tool_help_url = tool_help_url
  77. self.set_specific_tool_help(self.tool_label)
  78. self.dcc_app_label = dcc_app_label
  79. self.dcc_app_url = dcc_app_url
  80. self.set_generic_tool_help(self.dcc_app_label)
  81. self.bug_label = bug_label
  82. self.bug_url = bug_url
  83. self.set_tool_bug_report(self.bug_label)
  84. # --method-set---------------------------------------------------------
  85. def set_specific_tool_help(self, label, obj_name='tool_action_help'):
  86. """"""
  87. self.tool_action_help = QtWidgets.QAction(self.parent_widget)
  88. self.tool_action_help.setObjectName(obj_name)
  89. self.help_menu.addAction(self.tool_action_help)
  90. self.menubar.addAction(self.help_menu.menuAction())
  91. self.tool_action_help.setText(label)
  92. self.parent_widget.connect(self.tool_action_help, QtCore.SIGNAL("triggered()"), self.tool_help_display)
  93. def set_generic_tool_help(self, label, obj_name='azpy_tool_action_help'):
  94. """"""
  95. self.azpy_tool_action_help = QtWidgets.QAction(self.parent_widget)
  96. self.azpy_tool_action_help.setObjectName(obj_name)
  97. self.help_menu.addAction(self.azpy_tool_action_help)
  98. self.menubar.addAction(self.help_menu.menuAction())
  99. self.azpy_tool_action_help.setText(label)
  100. self.parent_widget.connect(self.azpy_tool_action_help, QtCore.SIGNAL("triggered()"), self.dccsi_help_displaydcc_app_help_display)
  101. def set_tool_bug_report(self, label, obj_name='tool_action_bug_report'):
  102. """"""
  103. self.tool_action_bug_report = QtWidgets.QAction(self.parent_widget)
  104. self.tool_action_bug_report.setObjectName(obj_name)
  105. self.help_menu.addAction(self.tool_action_bug_report)
  106. self.menubar.addAction(self.help_menu.menuAction())
  107. self.tool_action_bug_report.setText(label)
  108. self.parent_widget.connect(self.tool_action_bug_report, QtCore.SIGNAL("triggered()"), self.bug_report_display)
  109. def tool_help_display(self):
  110. return QtGui.QDesktopServices.openUrl(QUrl(self.tool_help_url, QUrl.TolerantMode))
  111. def dccsi_help_displaydcc_app_help_display(self):
  112. return QtGui.QDesktopServices.openUrl(QUrl(self.dcc_app_url, QUrl.TolerantMode))
  113. def bug_report_display(self):
  114. return QtGui.QDesktopServices.openUrl(QUrl(self.bug_url, QUrl.TolerantMode))
  115. # -------------------------------------------------------------------------
  116. # -------------------------------------------------------------------------
  117. class TestMainWindow(QtWidgets.QMainWindow):
  118. def __init__(self, parent=None):
  119. super().__init__(parent)
  120. self.setup_ui()
  121. def setup_ui(self):
  122. self.setWindowTitle('PySide2-HelpMenu-Test')
  123. # Setup Help Menu
  124. self.help_menu = HelpMenu(self, 'PySide2-Test Help...', 'http://dccSI.com/NewTool')
  125. # main widget
  126. self.main_widget = QtWidgets.QWidget(self)
  127. self.setCentralWidget(self.main_widget)
  128. # layout initialize
  129. self.global_layout = QtWidgets.QVBoxLayout()
  130. self.main_widget.setLayout(self.global_layout)
  131. # Add Widgets
  132. self.spinbox = QtWidgets.QSpinBox()
  133. self.spinbox.setValue(30)
  134. layout = QtWidgets.QFormLayout()
  135. layout.addRow('Parameter', self.spinbox)
  136. self.button = QtWidgets.QPushButton('Execute')
  137. # global layout setting
  138. self.global_layout.addLayout(layout)
  139. self.global_layout.addWidget(self.button)
  140. # ---------------------------------------------------------------------
  141. def closeEvent(self, event):
  142. """Event which is run when window closes"""
  143. _LOGGER.debug("Exiting: {0}".format(_MODULENAME))
  144. # ---------------------------------------------------------------------
  145. # -------------------------------------------------------------------------
  146. # -------------------------------------------------------------------------
  147. if __name__ == '__main__':
  148. """Run this file as main"""
  149. import sys
  150. _LOGGER.debug("Starting Test: {0} ...".format(_MODULENAME))
  151. app = QtWidgets.QApplication(sys.argv)
  152. mainWin = TestMainWindow()
  153. mainWin.show()
  154. del _LOGGER
  155. sys.exit(app.exec_())