3
0

PropertyGridContextMenu.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  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 "PropertyGrid.h"
  9. #include <QAction>
  10. #include <GraphCanvas/Components/Slots/SlotBus.h>
  11. #include <GraphCanvas/Components/Nodes/NodeBus.h>
  12. #include <GraphCanvas/Components/VisualBus.h>
  13. #include <ScriptCanvas/Bus/RequestBus.h>
  14. #include <Editor/View/Widgets/PropertyGridContextMenu.h>
  15. namespace
  16. {
  17. struct SlotInfo
  18. {
  19. AZ::EntityId m_id;
  20. QString m_name;
  21. bool m_isSetter; // false means "is getter".
  22. bool m_isVisible;
  23. };
  24. using SlotInfoList = AZStd::list< SlotInfo >;
  25. bool IsGraphCanvasActive()
  26. {
  27. ScriptCanvas::ScriptCanvasId scriptCanvasId;
  28. ScriptCanvasEditor::GeneralRequestBus::BroadcastResult(scriptCanvasId, &ScriptCanvasEditor::GeneralRequests::GetActiveScriptCanvasId);
  29. AZ::EntityId graphCanvasGraphId;
  30. ScriptCanvasEditor::GeneralRequestBus::BroadcastResult(graphCanvasGraphId, &ScriptCanvasEditor::GeneralRequests::GetActiveGraphCanvasGraphId);
  31. return (scriptCanvasId.IsValid() &&
  32. graphCanvasGraphId.IsValid());
  33. }
  34. AZ::EntityId GetEntityId(AzToolsFramework::InstanceDataNode* node)
  35. {
  36. while (node)
  37. {
  38. if ((node->GetClassMetadata()) && (node->GetClassMetadata()->m_azRtti))
  39. {
  40. if (node->GetClassMetadata()->m_azRtti->IsTypeOf(AZ::Component::RTTI_Type()))
  41. {
  42. return static_cast<AZ::Component*>(node->GetInstance(0))->GetEntityId();
  43. }
  44. }
  45. node = node->GetParent();
  46. }
  47. return AZ::EntityId();
  48. }
  49. SlotInfoList BuildSlotList(const AZ::EntityId& entityId)
  50. {
  51. SlotInfoList slotsList;
  52. AZStd::vector<AZ::EntityId> slotIds;
  53. GraphCanvas::NodeRequestBus::EventResult(slotIds, entityId, &GraphCanvas::NodeRequests::GetSlotIds);
  54. for (AZ::EntityId slotId : slotIds)
  55. {
  56. GraphCanvas::SlotType type(GraphCanvas::SlotTypes::Invalid);
  57. GraphCanvas::SlotRequestBus::EventResult(type, slotId, &GraphCanvas::SlotRequests::GetSlotType);
  58. if (type != GraphCanvas::SlotTypes::DataSlot)
  59. {
  60. // This ISN'T a setter or getter slot.
  61. // Nothing to do.
  62. continue;
  63. }
  64. GraphCanvas::ConnectionType connectionType(GraphCanvas::ConnectionType::CT_None);
  65. GraphCanvas::SlotRequestBus::EventResult(connectionType, slotId, &GraphCanvas::SlotRequests::GetConnectionType);
  66. AZStd::string name;
  67. GraphCanvas::SlotRequestBus::EventResult(name, slotId, &GraphCanvas::SlotRequests::GetName);
  68. bool isVisible = false;
  69. GraphCanvas::VisualRequestBus::EventResult(isVisible, slotId, &GraphCanvas::VisualRequests::IsVisible);
  70. slotsList.push_back({slotId,
  71. name.c_str(),
  72. (connectionType == GraphCanvas::ConnectionType::CT_Output),
  73. isVisible});
  74. }
  75. return slotsList;
  76. }
  77. void AddVisibilityActions(ScriptCanvasEditor::Widget::PropertyGridContextMenu* rootMenu,
  78. const SlotInfoList& slotsList)
  79. {
  80. for (auto& slot : slotsList)
  81. {
  82. QString title(QString("%1 : %2").arg(slot.m_name,
  83. slot.m_isSetter ? "setter" : "getter"));
  84. QAction* action = new QAction(title, rootMenu);
  85. action->setCheckable(true);
  86. action->setChecked(slot.m_isVisible);
  87. QObject::connect(action,
  88. &QAction::triggered,
  89. [slot]([[maybe_unused]] bool checked)
  90. {
  91. // slot.m_isVisible is the current state, and "checked" is the new state.
  92. AZ_Assert(checked != slot.m_isVisible, "Visibility out of synch");
  93. GraphCanvas::VisualRequestBus::Event(slot.m_id, &GraphCanvas::VisualRequests::SetVisible, !slot.m_isVisible);
  94. });
  95. rootMenu->addAction(action);
  96. }
  97. }
  98. } // anonymous namespace.
  99. namespace ScriptCanvasEditor
  100. {
  101. namespace Widget
  102. {
  103. PropertyGridContextMenu::PropertyGridContextMenu(AzToolsFramework::InstanceDataNode* node)
  104. : QMenu()
  105. {
  106. if (!IsGraphCanvasActive())
  107. {
  108. // Nothing active.
  109. return;
  110. }
  111. AZ::EntityId graphCanvasNodeId = GetEntityId(node);
  112. if (!graphCanvasNodeId.IsValid())
  113. {
  114. // Nothing to do.
  115. return;
  116. }
  117. AddVisibilityActions(this, BuildSlotList(graphCanvasNodeId));
  118. }
  119. #include <Editor/View/Widgets/moc_PropertyGridContextMenu.cpp>
  120. }
  121. }