PythonActionManagerHandler.h 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <EditorPythonBindings/CustomTypeBindingBus.h>
  9. #include <Source/ActionManager/ActionManagerBus.h>
  10. #include <Source/ActionManager/MenuManagerBus.h>
  11. #include <Source/ActionManager/ToolBarManagerBus.h>
  12. namespace AzToolsFramework
  13. {
  14. class ActionManagerInterface;
  15. class MenuManagerInterface;
  16. class ToolBarManagerInterface;
  17. }
  18. namespace EditorPythonBindings
  19. {
  20. //! Handler for the Python integration of the Action Manager system.
  21. //! Provides implementation for the Action Manager buses, and for marshaling Python callable objects as functions
  22. //! for use in C++ with correct reference counting to prevent them from being garbage collected.
  23. class PythonActionManagerHandler final
  24. : public ActionManagerRequestBus::Handler
  25. , public MenuManagerRequestBus::Handler
  26. , public ToolBarManagerRequestBus::Handler
  27. , private EditorPythonBindings::CustomTypeBindingNotificationBus::Handler
  28. {
  29. public:
  30. using Handle = EditorPythonBindings::CustomTypeBindingNotifications::ValueHandle;
  31. using AllocationHandle = EditorPythonBindings::CustomTypeBindingNotifications::AllocationHandle;
  32. constexpr static Handle NoAllocation{ ~0LL };
  33. PythonActionManagerHandler();
  34. ~PythonActionManagerHandler();
  35. static void Reflect(AZ::ReflectContext* context);
  36. // ActionManagerPythonRequestBus overrides ...
  37. AzToolsFramework::ActionManagerOperationResult RegisterAction(
  38. const AZStd::string& contextIdentifier,
  39. const AZStd::string& actionIdentifier,
  40. const AzToolsFramework::ActionProperties& properties,
  41. PythonEditorAction handler) override;
  42. AzToolsFramework::ActionManagerOperationResult RegisterCheckableAction(
  43. const AZStd::string& contextIdentifier,
  44. const AZStd::string& actionIdentifier,
  45. const AzToolsFramework::ActionProperties& properties,
  46. PythonEditorAction handler,
  47. PythonEditorAction updateCallback) override;
  48. AzToolsFramework::ActionManagerOperationResult TriggerAction(const AZStd::string& actionIdentifier) override;
  49. AzToolsFramework::ActionManagerOperationResult UpdateAction(const AZStd::string& actionIdentifier) override;
  50. // MenuManagerPythonRequestBus overrides ...
  51. AzToolsFramework::MenuManagerOperationResult RegisterMenu(
  52. const AZStd::string& identifier, const AzToolsFramework::MenuProperties& properties) override;
  53. AzToolsFramework::MenuManagerOperationResult AddActionToMenu(
  54. const AZStd::string& menuIdentifier, const AZStd::string& actionIdentifier, int sortIndex) override;
  55. AzToolsFramework::MenuManagerOperationResult AddSeparatorToMenu(
  56. const AZStd::string& menuIdentifier, int sortIndex) override;
  57. AzToolsFramework::MenuManagerOperationResult AddSubMenuToMenu(
  58. const AZStd::string& menuIdentifier, const AZStd::string& subMenuIdentifier, int sortIndex) override;
  59. AzToolsFramework::MenuManagerOperationResult AddWidgetToMenu(
  60. const AZStd::string& menuIdentifier, const AZStd::string& widgetActionIdentifier, int sortIndex) override;
  61. AzToolsFramework::MenuManagerOperationResult AddMenuToMenuBar(
  62. const AZStd::string& menuBarIdentifier, const AZStd::string& menuIdentifier, int sortIndex) override;
  63. // ToolBarManagerRequestBus overrides ...
  64. AzToolsFramework::ToolBarManagerOperationResult RegisterToolBar(
  65. const AZStd::string& toolBarIdentifier, const AzToolsFramework::ToolBarProperties& properties) override;
  66. AzToolsFramework::ToolBarManagerOperationResult RegisterToolBarArea(
  67. const AZStd::string& toolBarAreaIdentifier, QMainWindow* mainWindow, Qt::ToolBarArea toolBarArea) override;
  68. AzToolsFramework::ToolBarManagerOperationResult AddActionToToolBar(
  69. const AZStd::string& toolBarIdentifier, const AZStd::string& actionIdentifier, int sortIndex) override;
  70. AzToolsFramework::ToolBarManagerOperationResult AddActionWithSubMenuToToolBar(
  71. const AZStd::string& toolBarIdentifier,
  72. const AZStd::string& actionIdentifier,
  73. const AZStd::string& subMenuIdentifier,
  74. int sortIndex) override;
  75. AzToolsFramework::ToolBarManagerOperationResult AddActionsToToolBar(
  76. const AZStd::string& toolBarIdentifier, const AZStd::vector<AZStd::pair<AZStd::string, int>>& actions) override;
  77. AzToolsFramework::ToolBarManagerOperationResult RemoveActionFromToolBar(
  78. const AZStd::string& toolBarIdentifier, const AZStd::string& actionIdentifier) override;
  79. AzToolsFramework::ToolBarManagerOperationResult RemoveActionsFromToolBar(
  80. const AZStd::string& toolBarIdentifier, const AZStd::vector<AZStd::string>& actionIdentifiers) override;
  81. AzToolsFramework::ToolBarManagerOperationResult AddSeparatorToToolBar(
  82. const AZStd::string& toolBarIdentifier, int sortIndex) override;
  83. AzToolsFramework::ToolBarManagerOperationResult AddWidgetToToolBar(
  84. const AZStd::string& toolBarIdentifier, const AZStd::string& widgetActionIdentifier, int sortIndex) override;
  85. AzToolsFramework::ToolBarManagerOperationResult AddToolBarToToolBarArea(
  86. const AZStd::string& toolBarAreaIdentifier, const AZStd::string& toolBarIdentifier, int sortIndex) override;
  87. QToolBar* GenerateToolBar(const AZStd::string& toolBarIdentifier) override;
  88. AzToolsFramework::ToolBarManagerIntegerResult GetSortKeyOfActionInToolBar(
  89. const AZStd::string& toolBarIdentifier, const AZStd::string& actionIdentifier) const override;
  90. AzToolsFramework::ToolBarManagerIntegerResult GetSortKeyOfWidgetInToolBar(
  91. const AZStd::string& toolBarIdentifier, const AZStd::string& widgetActionIdentifier) const override;
  92. private:
  93. AZStd::unordered_map<void*, AZ::TypeId> m_allocationMap;
  94. AllocationHandle AllocateDefault() override;
  95. AZStd::optional<ValueHandle> PythonToBehavior(
  96. PyObject* pyObj, AZ::BehaviorParameter::Traits traits, AZ::BehaviorArgument& outValue) override;
  97. AZStd::optional<ValueHandle> BehaviorToPython(const AZ::BehaviorArgument& behaviorValue, PyObject*& outPyObj) override;
  98. bool CanConvertPythonToBehavior(AZ::BehaviorParameter::Traits traits, PyObject* pyObj) const override;
  99. void CleanUpValue(ValueHandle handle) override;
  100. class PythonFunctionObject
  101. {
  102. public:
  103. explicit PythonFunctionObject(PyObject* handler);
  104. PythonFunctionObject(const PythonFunctionObject& obj);
  105. PythonFunctionObject(PythonFunctionObject&& obj);
  106. PythonFunctionObject& operator=(const PythonFunctionObject& obj);
  107. PythonFunctionObject& operator=(PythonFunctionObject&&) = delete;
  108. virtual ~PythonFunctionObject();
  109. private:
  110. PyObject* m_functionObject = nullptr;
  111. };
  112. AZStd::unordered_map<AZStd::string, PythonFunctionObject> m_actionHandlerMap;
  113. AZStd::unordered_map<AZStd::string, PythonFunctionObject> m_actionUpdateCallbackMap;
  114. AzToolsFramework::ActionManagerInterface* m_actionManagerInterface = nullptr;
  115. AzToolsFramework::MenuManagerInterface* m_menuManagerInterface = nullptr;
  116. AzToolsFramework::ToolBarManagerInterface* m_toolBarManagerInterface = nullptr;
  117. };
  118. } // namespace EditorPythonBindings