Script Canvas, replace the text replacement system to a JSON file based one (#5228)

It is now possible to right click on nodes on the node palette to navigate to the file that holds the text data for any given node, this way it is easy to update and improve the naming of titles, subtitles, categories, tool tips and slots.
This commit is contained in:
Luis Sempé
2021-11-11 11:53:51 -08:00
committed by GitHub
parent 9d93282e42
commit 9e2a3226fd
1382 changed files with 209123 additions and 1515 deletions
+3
View File
@@ -137,6 +137,7 @@ if(PAL_TRAIT_BUILD_HOST_TOOLS)
.
Editor/Include
Editor/Static/Include
Editor/Assets
BUILD_DEPENDENCIES
PRIVATE
AZ::AzCore
@@ -155,6 +156,7 @@ if(PAL_TRAIT_BUILD_HOST_TOOLS)
scriptcanvasgem_editor_files.cmake
scriptcanvasgem_editor_asset_files.cmake
scriptcanvasgem_editor_builder_files.cmake
scriptcanvasgem_editor_tools_files.cmake
COMPILE_DEFINITIONS
PUBLIC
SCRIPTCANVAS_ERRORS_ENABLED
@@ -165,6 +167,7 @@ if(PAL_TRAIT_BUILD_HOST_TOOLS)
PRIVATE
.
Editor
Tools
Editor/Include
${SCRIPT_CANVAS_AUTOGEN_BUILD_DIR}
BUILD_DEPENDENCIES
@@ -252,6 +252,17 @@ namespace ScriptCanvasEditor
m_assetsInUse.erase(assetId);
}
void AssetTracker::RefreshAll()
{
for (const auto& asset : m_assetsInUse)
{
auto id = asset.second->GetScriptCanvasId();
ScriptCanvasEditor::EditorGraphRequestBus::Event(id, &ScriptCanvasEditor::EditorGraphRequests::ClearGraphCanvasScene);
ScriptCanvasEditor::EditorGraphRequestBus::Event(id, &ScriptCanvasEditor::EditorGraphRequests::CreateGraphCanvasScene);
ScriptCanvasEditor::EditorGraphRequestBus::Event(id, &ScriptCanvasEditor::EditorGraphRequests::DisplayGraphCanvasScene);
}
}
void AssetTracker::CreateView(AZ::Data::AssetId assetId, QWidget* parent)
{
assetId = CheckAssetId(assetId);
@@ -61,6 +61,7 @@ namespace ScriptCanvasEditor
void CreateView(AZ::Data::AssetId assetId, QWidget* parent) override;
void ClearView(AZ::Data::AssetId assetId) override;
void UntrackAsset(AZ::Data::AssetId assetId) override;
void RefreshAll() override;
// Getters
@@ -79,6 +79,9 @@ namespace ScriptCanvasEditor
//! Used to make sure assets that are unloaded also get removed from tracking
virtual void UntrackAsset([[maybe_unused]] AZ::Data::AssetId assetId) {}
//! Recreates the view for all tracked assets
virtual void RefreshAll() {}
using AssetList = AZStd::vector<ScriptCanvasMemoryAsset::pointer>;
// Accessors
@@ -1932,7 +1932,7 @@ namespace ScriptCanvasEditor
}
OnSaveDataDirtied(graphCanvasNodeId);
Nodes::CopySlotTranslationKeyedNamesToDatums(graphCanvasNodeId);
Nodes::UpdateSlotDatumLabels(graphCanvasNodeId);
}
m_wrappedNodeGroupings.clear();
@@ -1950,7 +1950,7 @@ namespace ScriptCanvasEditor
for (AZ::EntityId graphCanvasNodeId : graphCanvasNodeIds)
{
Nodes::CopySlotTranslationKeyedNamesToDatums(graphCanvasNodeId);
Nodes::UpdateSlotDatumLabels(graphCanvasNodeId);
}
GraphCanvas::ViewId viewId;
@@ -148,8 +148,6 @@ namespace ScriptCanvasEditor
AZ::Entity* entity = nullptr;
AZ::ComponentApplicationBus::BroadcastResult(entity, &AZ::ComponentApplicationBus::Events::FindEntity, scriptCanvasId);
AZStd::string ebusContextName = TranslationHelper::GetEbusHandlerContext(m_busName);
if (entity)
{
ScriptCanvas::Nodes::Core::EBusEventHandler* eventHandler = AZ::EntityUtils::FindFirstDerivedComponent<ScriptCanvas::Nodes::Core::EBusEventHandler>(entity);
@@ -190,52 +188,63 @@ namespace ScriptCanvasEditor
if (scriptCanvasSlot && scriptCanvasSlot->IsVisible())
{
AZ::EntityId slotId = Nodes::DisplayScriptCanvasSlot(GetEntityId(), (*scriptCanvasSlot));
auto graphCanvasSlotId = Nodes::DisplayScriptCanvasSlot(GetEntityId(), (*scriptCanvasSlot));
GraphCanvas::SlotRequestBus::Event(slotId, &GraphCanvas::SlotRequests::SetTranslationKeyedName, TranslationHelper::GetEBusHandlerOnEventTriggeredNameKey());
GraphCanvas::SlotRequestBus::Event(slotId, &GraphCanvas::SlotRequests::SetTranslationKeyedTooltip, TranslationHelper::GetEBusHandlerOnEventTriggeredTooltipKey());
GraphCanvas::TranslationKey key;
key << "EBusHandler" << eventHandler->GetEBusName() << "methods" << m_eventName;
if (scriptCanvasSlot->IsExecution() && scriptCanvasSlot->IsOutput())
{
key << "exit";
}
else
{
key << "details";
}
GraphCanvas::TranslationRequests::Details details;
GraphCanvas::TranslationRequestBus::BroadcastResult(details, &GraphCanvas::TranslationRequests::GetDetails, key, details);
GraphCanvas::SlotRequestBus::Event(graphCanvasSlotId, &GraphCanvas::SlotRequests::SetName, details.m_name);
GraphCanvas::SlotRequestBus::Event(graphCanvasSlotId, &GraphCanvas::SlotRequests::SetTooltip, details.m_tooltip);
}
//
// inputCount and outputCount work because the order of the slots is maintained from the BehaviorContext, if this changes
// in the future then we should consider storing the actual offset or key name at that time.
//
int inputCount = 0;
int outputCount = 0;
int paramIndex = 0;
int outputIndex = 0;
for (const auto& slotId : myEvent.m_parameterSlotIds)
{
scriptCanvasSlot = eventHandler->GetSlot(slotId);
if (scriptCanvasSlot && scriptCanvasSlot->IsVisible())
{
AZ::EntityId graphCanvasSlotId = Nodes::DisplayScriptCanvasSlot(GetEntityId(), (*scriptCanvasSlot));
auto graphCanvasSlotId = Nodes::DisplayScriptCanvasSlot(GetEntityId(), (*scriptCanvasSlot));
int& index = (scriptCanvasSlot->IsData() && scriptCanvasSlot->IsOutput()) ? paramIndex : outputIndex;
TranslationItemType itemType = TranslationHelper::GetItemType(scriptCanvasSlot->GetDescriptor());
GraphCanvas::TranslationRequests::Details details;
GraphCanvas::TranslationKeyedString slotNameKeyedString(scriptCanvasSlot->GetName());
slotNameKeyedString.m_context = ebusContextName;
if (scriptCanvasSlot->IsData())
{
GraphCanvas::TranslationKey key;
key = "EBusHandler";
key << eventHandler->GetEBusName() << "methods" << m_eventName << "params" << index << "details";
GraphCanvas::TranslationKeyedString slotTooltipKeyedString(scriptCanvasSlot->GetToolTip());
slotTooltipKeyedString.m_context = ebusContextName;
details.m_name = scriptCanvasSlot->GetName();
slotNameKeyedString.SetFallback(scriptCanvasSlot->GetName());
slotTooltipKeyedString.SetFallback(scriptCanvasSlot->GetToolTip());
GraphCanvas::TranslationRequestBus::BroadcastResult(details, &GraphCanvas::TranslationRequests::GetDetails, key, details);
GraphCanvas::SlotRequestBus::Event(graphCanvasSlotId, &GraphCanvas::SlotRequests::SetName, details.m_name);
GraphCanvas::SlotRequestBus::Event(graphCanvasSlotId, &GraphCanvas::SlotRequests::SetTooltip, details.m_tooltip);
}
if (scriptCanvasSlot->GetDescriptor() == ScriptCanvas::SlotDescriptors::DataOut())
{
slotNameKeyedString.m_key = TranslationHelper::GetEBusHandlerSlotKey(m_busName, m_eventName, itemType, TranslationKeyId::Name, outputCount);
slotTooltipKeyedString.m_key = TranslationHelper::GetEBusHandlerSlotKey(m_busName, m_eventName, itemType, TranslationKeyId::Tooltip, outputCount);
++outputCount;
++outputIndex;
}
else
{
slotNameKeyedString.m_key = TranslationHelper::GetEBusHandlerSlotKey(m_busName, m_eventName, itemType, TranslationKeyId::Name, inputCount);
slotTooltipKeyedString.m_key = TranslationHelper::GetEBusHandlerSlotKey(m_busName, m_eventName, itemType, TranslationKeyId::Tooltip, inputCount);
++inputCount;
++paramIndex;
}
GraphCanvas::SlotRequestBus::Event(graphCanvasSlotId, &GraphCanvas::SlotRequests::SetTranslationKeyedName, slotNameKeyedString);
GraphCanvas::SlotRequestBus::Event(graphCanvasSlotId, &GraphCanvas::SlotRequests::SetTranslationKeyedTooltip, slotTooltipKeyedString);
}
}
@@ -245,18 +254,7 @@ namespace ScriptCanvasEditor
if (scriptCanvasSlot && scriptCanvasSlot->IsVisible())
{
AZ::EntityId graphCanvasSlotId = Nodes::DisplayScriptCanvasSlot(GetEntityId(), (*scriptCanvasSlot));
TranslationItemType itemType = TranslationHelper::GetItemType(scriptCanvasSlot->GetDescriptor());
GraphCanvas::TranslationKeyedString slotNameKeyedString(scriptCanvasSlot->GetName(), ebusContextName);
slotNameKeyedString.m_key = slotNameKeyedString.m_key = TranslationHelper::GetKey(TranslationContextGroup::EbusHandler, m_busName, m_eventName, itemType, TranslationKeyId::Name);
GraphCanvas::TranslationKeyedString slotTooltipKeyedString(TranslationHelper::GetSafeTypeName(scriptCanvasSlot->GetDataType()), ebusContextName);
slotTooltipKeyedString.m_key = TranslationHelper::GetKey(TranslationContextGroup::EbusHandler, m_busName, m_eventName, itemType, TranslationKeyId::Tooltip);
GraphCanvas::SlotRequestBus::Event(graphCanvasSlotId, &GraphCanvas::SlotRequests::SetTranslationKeyedName, slotNameKeyedString);
GraphCanvas::SlotRequestBus::Event(graphCanvasSlotId, &GraphCanvas::SlotRequests::SetTranslationKeyedTooltip, slotTooltipKeyedString);
Nodes::DisplayScriptCanvasSlot(GetEntityId(), (*scriptCanvasSlot));
}
}
@@ -345,9 +343,6 @@ namespace ScriptCanvasEditor
if (connectionType == GraphCanvas::ConnectionType::CT_Output)
{
GraphCanvas::SlotRequestBus::Event(slotId, &GraphCanvas::SlotRequests::SetTranslationKeyedName, TranslationHelper::GetEBusHandlerOnEventTriggeredNameKey());
GraphCanvas::SlotRequestBus::Event(slotId, &GraphCanvas::SlotRequests::SetTranslationKeyedTooltip, TranslationHelper::GetEBusHandlerOnEventTriggeredTooltipKey());
break;
}
}
@@ -210,10 +210,10 @@ namespace ScriptCanvasEditor
{
if (m_eventTypeToId.find(eventId) == m_eventTypeToId.end())
{
AZStd::string eventName;
AZStd::string eventName;
for (const HandlerEventConfiguration& testEventConfiguration : eventConfigurations)
{
{
if (testEventConfiguration.m_eventId == eventId)
{
eventName = testEventConfiguration.m_eventName;
@@ -540,8 +540,11 @@ namespace ScriptCanvasEditor
if (slotType == GraphCanvas::SlotTypes::DataSlot)
{
GraphCanvas::SlotRequestBus::Event(testSlotId, &GraphCanvas::SlotRequests::SetTranslationKeyedName, TranslationHelper::GetEBusHandlerBusIdNameKey());
GraphCanvas::SlotRequestBus::Event(testSlotId, &GraphCanvas::SlotRequests::SetTranslationKeyedTooltip, TranslationHelper::GetEBusHandlerBusIdTooltipKey());
GraphCanvas::TranslationKey key;
key << Translation::GlobalKeys::EBusHandlerIDKey << ".details";
GraphCanvas::TranslationRequests::Details details;
GraphCanvas::TranslationRequestBus::BroadcastResult(details, &GraphCanvas::TranslationRequests::GetDetails, key, details);
GraphCanvas::SlotRequestBus::Event(testSlotId, &GraphCanvas::SlotRequests::SetDetails, details.m_name, details.m_tooltip);
break;
}
}
@@ -68,9 +68,6 @@ namespace ScriptCanvasEditor
if (currentSlotId == slotId)
{
GraphCanvas::SlotRequestBus::Event(graphCanvasId, &GraphCanvas::SlotRequests::SetTranslationKeyedName, TranslationHelper::GetEBusSenderBusIdNameKey());
GraphCanvas::SlotRequestBus::Event(graphCanvasId, &GraphCanvas::SlotRequests::SetTranslationKeyedTooltip, TranslationHelper::GetEBusSenderBusIdTooltipKey());
break;
}
}
@@ -142,8 +142,6 @@ namespace ScriptCanvasEditor
m_ebusWrapper.m_graphCanvasId = wrappingNode;
m_ebusWrapper.m_scriptCanvasId = scriptCanvasId;
AZStd::string ebusContextName = TranslationHelper::GetEbusHandlerContext(m_busName);
ScriptCanvas::Nodes::Core::ReceiveScriptEvent* eventHandler = AZ::EntityUtils::FindFirstDerivedComponent<ScriptCanvas::Nodes::Core::ReceiveScriptEvent>(scriptCanvasId);
if (eventHandler)
{
@@ -179,49 +177,20 @@ namespace ScriptCanvasEditor
if (scriptCanvasSlot && scriptCanvasSlot->IsVisible())
{
AZ::EntityId slotId = Nodes::DisplayScriptCanvasSlot(GetEntityId(), (*scriptCanvasSlot));
GraphCanvas::SlotRequestBus::Event(slotId, &GraphCanvas::SlotRequests::SetTranslationKeyedName, TranslationHelper::GetEBusHandlerOnEventTriggeredNameKey());
GraphCanvas::SlotRequestBus::Event(slotId, &GraphCanvas::SlotRequests::SetTranslationKeyedTooltip, TranslationHelper::GetEBusHandlerOnEventTriggeredTooltipKey());
Nodes::DisplayScriptCanvasSlot(GetEntityId(), (*scriptCanvasSlot));
}
//
// inputCount and outputCount work because the order of the slots is maintained from the BehaviorContext, if this changes
// in the future then we should consider storing the actual offset or key name at that time.
//
int inputCount = 0;
int outputCount = 0;
for (const auto& slotId : myEvent.m_parameterSlotIds)
{
scriptCanvasSlot = eventHandler->GetSlot(slotId);
if (scriptCanvasSlot && scriptCanvasSlot->IsVisible())
{
AZ::EntityId graphCanvasSlotId = Nodes::DisplayScriptCanvasSlot(GetEntityId(), (*scriptCanvasSlot));
TranslationItemType itemType = TranslationHelper::GetItemType(scriptCanvasSlot->GetDescriptor());
GraphCanvas::TranslationKeyedString slotNameKeyedString(scriptCanvasSlot->GetName());
slotNameKeyedString.m_context = ebusContextName;
GraphCanvas::TranslationKeyedString slotTooltipKeyedString(scriptCanvasSlot->GetToolTip());
slotTooltipKeyedString.m_context = ebusContextName;
if (scriptCanvasSlot->GetDescriptor() == ScriptCanvas::SlotDescriptors::DataOut())
{
slotNameKeyedString.m_key = TranslationHelper::GetEBusHandlerSlotKey(m_busName, m_eventName, itemType, TranslationKeyId::Name, outputCount);
slotTooltipKeyedString.m_key = TranslationHelper::GetEBusHandlerSlotKey(m_busName, m_eventName, itemType, TranslationKeyId::Tooltip, outputCount);
++outputCount;
}
else
{
slotNameKeyedString.m_key = TranslationHelper::GetEBusHandlerSlotKey(m_busName, m_eventName, itemType, TranslationKeyId::Name, inputCount);
slotTooltipKeyedString.m_key = TranslationHelper::GetEBusHandlerSlotKey(m_busName, m_eventName, itemType, TranslationKeyId::Tooltip, inputCount);
++inputCount;
}
GraphCanvas::SlotRequestBus::Event(graphCanvasSlotId, &GraphCanvas::SlotRequests::SetTranslationKeyedName, slotNameKeyedString);
GraphCanvas::SlotRequestBus::Event(graphCanvasSlotId, &GraphCanvas::SlotRequests::SetTranslationKeyedTooltip, slotTooltipKeyedString);
Nodes::DisplayScriptCanvasSlot(GetEntityId(), (*scriptCanvasSlot));
}
}
@@ -231,18 +200,7 @@ namespace ScriptCanvasEditor
if (scriptCanvasSlot && scriptCanvasSlot->IsVisible())
{
AZ::EntityId graphCanvasSlotId = Nodes::DisplayScriptCanvasSlot(GetEntityId(), (*scriptCanvasSlot));
TranslationItemType itemType = TranslationHelper::GetItemType(scriptCanvasSlot->GetDescriptor());
GraphCanvas::TranslationKeyedString slotNameKeyedString(scriptCanvasSlot->GetName(), ebusContextName);
slotNameKeyedString.m_key = slotNameKeyedString.m_key = TranslationHelper::GetKey(TranslationContextGroup::EbusHandler, m_busName, m_eventName, itemType, TranslationKeyId::Name);
GraphCanvas::TranslationKeyedString slotTooltipKeyedString(TranslationHelper::GetSafeTypeName(scriptCanvasSlot->GetDataType()), ebusContextName);
slotTooltipKeyedString.m_key = TranslationHelper::GetKey(TranslationContextGroup::EbusHandler, m_busName, m_eventName, itemType, TranslationKeyId::Tooltip);
GraphCanvas::SlotRequestBus::Event(graphCanvasSlotId, &GraphCanvas::SlotRequests::SetTranslationKeyedName, slotNameKeyedString);
GraphCanvas::SlotRequestBus::Event(graphCanvasSlotId, &GraphCanvas::SlotRequests::SetTranslationKeyedTooltip, slotTooltipKeyedString);
Nodes::DisplayScriptCanvasSlot(GetEntityId(), (*scriptCanvasSlot));
}
}
@@ -367,9 +325,6 @@ namespace ScriptCanvasEditor
if (connectionType == GraphCanvas::ConnectionType::CT_Output)
{
GraphCanvas::SlotRequestBus::Event(slotId, &GraphCanvas::SlotRequests::SetTranslationKeyedName, TranslationHelper::GetEBusHandlerOnEventTriggeredNameKey());
GraphCanvas::SlotRequestBus::Event(slotId, &GraphCanvas::SlotRequests::SetTranslationKeyedTooltip, TranslationHelper::GetEBusHandlerOnEventTriggeredTooltipKey());
break;
}
}
@@ -560,8 +560,11 @@ namespace ScriptCanvasEditor
if (slotType == GraphCanvas::SlotTypes::DataSlot)
{
GraphCanvas::SlotRequestBus::Event(testSlotId, &GraphCanvas::SlotRequests::SetTranslationKeyedName, TranslationHelper::GetEBusHandlerBusIdNameKey());
GraphCanvas::SlotRequestBus::Event(testSlotId, &GraphCanvas::SlotRequests::SetTranslationKeyedTooltip, TranslationHelper::GetEBusHandlerBusIdTooltipKey());
GraphCanvas::TranslationKey key;
key << Translation::GlobalKeys::EBusHandlerIDKey << "details";
GraphCanvas::TranslationRequests::Details details;
GraphCanvas::TranslationRequestBus::BroadcastResult(details, &GraphCanvas::TranslationRequests::GetDetails, key, details);
GraphCanvas::SlotRequestBus::Event(testSlotId, &GraphCanvas::SlotRequests::SetDetails, details.m_name, details.m_tooltip);
break;
}
}
@@ -118,9 +118,6 @@ namespace ScriptCanvasEditor
if (currentSlotId == slotId)
{
GraphCanvas::SlotRequestBus::Event(graphCanvasId, &GraphCanvas::SlotRequests::SetTranslationKeyedName, TranslationHelper::GetEBusSenderBusIdNameKey());
GraphCanvas::SlotRequestBus::Event(graphCanvasId, &GraphCanvas::SlotRequests::SetTranslationKeyedTooltip, TranslationHelper::GetEBusSenderBusIdTooltipKey());
break;
}
}
@@ -28,6 +28,7 @@
#include <GraphCanvas/Components/NodeDescriptors/ScriptEventSenderNodeDescriptorComponent.h>
#include <GraphCanvas/Components/NodeDescriptors/UserDefinedNodeDescriptorComponent.h>
#include <GraphCanvas/Components/NodeDescriptors/FunctionDefinitionNodeDescriptorComponent.h>
#include <GraphCanvas/Components/Slots/SlotBus.h>
#include <GraphCanvas/Components/Nodes/NodeTitleBus.h>
#include <GraphCanvas/GraphCanvasBus.h>
@@ -45,6 +46,8 @@
#include <ScriptCanvas/Libraries/Core/SendScriptEvent.h>
#include <ScriptCanvas/Libraries/Core/SetVariable.h>
#include <Source/Translation/TranslationBus.h>
namespace ScriptCanvasEditor::Nodes::SlotDisplayHelper
{
AZ::EntityId DisplayPropertySlot(AZ::EntityId graphCanvasNodeId, const ScriptCanvas::VisualExtensionSlotConfiguration& propertyConfiguration);
@@ -101,37 +104,56 @@ namespace ScriptCanvasEditor::Nodes
*graphCanvasUserData = node->GetEntityId();
}
GraphCanvas::TranslationKeyedString nodeKeyedString(nodeConfiguration.m_titleFallback, nodeConfiguration.m_translationContext);
nodeKeyedString.m_key = TranslationHelper::GetKey(nodeConfiguration.m_translationGroup, nodeConfiguration.m_translationKeyContext, nodeConfiguration.m_translationKeyName, TranslationItemType::Node, TranslationKeyId::Name);
GraphCanvas::TranslationKey key;
key << "ScriptCanvas::Node" << azrtti_typeid(node).ToString<AZStd::string>() << "details";
AZStd::string nodeName = nodeKeyedString.GetDisplayString();
int paramIndex = 0;
int outputIndex = 0;
GraphCanvas::TranslationRequests::Details details;
GraphCanvas::TranslationRequestBus::BroadcastResult(details, &GraphCanvas::TranslationRequests::GetDetails, key, details);
// Create the GraphCanvas slots
for (const auto& slot : node->GetSlots())
{
GraphCanvas::TranslationKey slotKey;
slotKey << "ScriptCanvas::Node" << azrtti_typeid(node).ToString<AZStd::string>() << "slots";
if (slot.IsVisible())
{
AZ::EntityId graphCanvasSlotId = DisplayScriptCanvasSlot(graphCanvasEntity->GetId(), slot);
GraphCanvas::TranslationKeyedString slotNameKeyedString(slot.GetName(), nodeKeyedString.m_context);
GraphCanvas::TranslationKeyedString slotTooltipKeyedString(slot.GetToolTip(), nodeKeyedString.m_context);
TranslationItemType itemType = TranslationHelper::GetItemType(slot.GetDescriptor());
if (itemType == TranslationItemType::ParamDataSlot || itemType == TranslationItemType::ReturnDataSlot)
AZStd::string slotKeyStr;
if (slot.IsData())
{
int& index = (itemType == TranslationItemType::ParamDataSlot) ? paramIndex : outputIndex;
slotNameKeyedString.m_key = TranslationHelper::GetKey(nodeConfiguration.m_translationGroup, nodeConfiguration.m_translationKeyContext, nodeConfiguration.m_translationKeyName, itemType, TranslationKeyId::Name, index);
slotTooltipKeyedString.m_key = TranslationHelper::GetKey(nodeConfiguration.m_translationGroup, nodeConfiguration.m_translationKeyContext, nodeConfiguration.m_translationKeyName, itemType, TranslationKeyId::Tooltip, index);
index++;
slotKeyStr.append("Data");
}
GraphCanvas::SlotRequestBus::Event(graphCanvasSlotId, &GraphCanvas::SlotRequests::SetTranslationKeyedName, slotNameKeyedString);
GraphCanvas::SlotRequestBus::Event(graphCanvasSlotId, &GraphCanvas::SlotRequests::SetTranslationKeyedTooltip, slotTooltipKeyedString);
if (slot.GetConnectionType() == ScriptCanvas::ConnectionType::Input)
{
slotKeyStr.append("Input_");
}
else
{
slotKeyStr.append("Output_");
}
slotKeyStr.append(slot.GetName());
slotKey << slotKeyStr << "details";
GraphCanvas::TranslationRequests::Details slotDetails;
GraphCanvas::TranslationRequestBus::BroadcastResult(slotDetails, &GraphCanvas::TranslationRequests::GetDetails, slotKey, slotDetails);
if (slotDetails.m_name.empty())
{
slotDetails.m_name = slot.GetName();
}
if (slotDetails.m_tooltip.empty())
{
slotDetails.m_tooltip = slot.GetToolTip();
}
AZ::EntityId graphCanvasSlotId = DisplayScriptCanvasSlot(graphCanvasEntity->GetId(), slot);
GraphCanvas::SlotRequestBus::Event(graphCanvasSlotId, &GraphCanvas::SlotRequests::SetName, slotDetails.m_name);
GraphCanvas::SlotRequestBus::Event(graphCanvasSlotId, &GraphCanvas::SlotRequests::SetTooltip, slotDetails.m_tooltip);
}
}
@@ -142,25 +164,17 @@ namespace ScriptCanvasEditor::Nodes
SlotDisplayHelper::DisplayVisualExtensionSlot(graphCanvasEntity->GetId(), extensionConfiguration);
}
GraphCanvas::TranslationKeyedString subtitleKeyedString(nodeConfiguration.m_subtitleFallback, nodeConfiguration.m_translationContext);
subtitleKeyedString.m_key = TranslationHelper::GetKey(nodeConfiguration.m_translationGroup, nodeConfiguration.m_translationKeyContext, nodeConfiguration.m_translationKeyName, TranslationItemType::Node, TranslationKeyId::Category);
graphCanvasEntity->SetName(AZStd::string::format("GC-Node(%s)", details.m_name.c_str()));
graphCanvasEntity->SetName(AZStd::string::format("GC-Node(%s)", nodeKeyedString.GetDisplayString().c_str()));
GraphCanvas::NodeTitleRequestBus::Event(graphCanvasEntity->GetId(), &GraphCanvas::NodeTitleRequests::SetTranslationKeyedTitle, nodeKeyedString);
GraphCanvas::NodeTitleRequestBus::Event(graphCanvasEntity->GetId(), &GraphCanvas::NodeTitleRequests::SetTranslationKeyedSubTitle, subtitleKeyedString);
GraphCanvas::NodeTitleRequestBus::Event(graphCanvasEntity->GetId(), &GraphCanvas::NodeTitleRequests::SetTitle, details.m_name);
GraphCanvas::NodeTitleRequestBus::Event(graphCanvasEntity->GetId(), &GraphCanvas::NodeTitleRequests::SetSubTitle, details.m_category);
GraphCanvas::NodeRequestBus::Event(graphCanvasEntity->GetId(), &GraphCanvas::NodeRequests::SetTooltip, details.m_tooltip);
if (!nodeConfiguration.m_titlePalette.empty())
{
GraphCanvas::NodeTitleRequestBus::Event(graphCanvasEntity->GetId(), &GraphCanvas::NodeTitleRequests::SetPaletteOverride, nodeConfiguration.m_titlePalette);
}
// Set the name
GraphCanvas::TranslationKeyedString tooltipKeyedString(nodeConfiguration.m_tooltipFallback, nodeConfiguration.m_translationContext);
tooltipKeyedString.m_key = TranslationHelper::GetKey(TranslationContextGroup::ClassMethod, nodeConfiguration.m_translationKeyContext, nodeConfiguration.m_translationKeyName, TranslationItemType::Node, TranslationKeyId::Tooltip);
GraphCanvas::NodeRequestBus::Event(graphCanvasEntity->GetId(), &GraphCanvas::NodeRequests::SetTranslationKeyedTooltip, tooltipKeyedString);
EditorNodeNotificationBus::Event(node->GetEntityId(), &EditorNodeNotifications::OnGraphCanvasNodeDisplayed, graphCanvasEntity->GetId());
return graphCanvasEntity->GetId();
@@ -193,22 +207,6 @@ namespace ScriptCanvasEditor::Nodes
if (classData)
{
AZStd::string nodeContext = GetContextName(*classData);
nodeConfiguration.m_translationContext = TranslationHelper::GetUserDefinedContext(nodeContext);
nodeConfiguration.m_titleFallback = (classData->m_editData && classData->m_editData->m_name) ? classData->m_editData->m_name : classData->m_name;
nodeConfiguration.m_tooltipFallback = (classData->m_editData && classData->m_editData->m_description) ? classData->m_editData->m_description : "";
GraphCanvas::TranslationKeyedString subtitleKeyedString(nodeContext, nodeConfiguration.m_translationContext);
subtitleKeyedString.m_key = TranslationHelper::GetUserDefinedNodeKey(nodeContext, nodeConfiguration.m_titleFallback, ScriptCanvasEditor::TranslationKeyId::Category);
nodeConfiguration.m_subtitleFallback = subtitleKeyedString.GetDisplayString();
nodeConfiguration.m_translationKeyName = nodeConfiguration.m_titleFallback;
nodeConfiguration.m_translationKeyContext = nodeContext;
nodeConfiguration.m_translationGroup = TranslationContextGroup::ClassMethod;
if (classData->m_editData)
{
const AZ::Edit::ElementData* elementData = classData->m_editData->FindElementData(AZ::Edit::ClassElements::EditorData);
@@ -260,20 +258,16 @@ namespace ScriptCanvasEditor::Nodes
graphCanvasEntity->CreateComponent<SlotMappingComponent>(methodNode->GetEntityId());
graphCanvasEntity->CreateComponent<SceneMemberMappingComponent>(methodNode->GetEntityId());
TranslationContextGroup contextGroup = TranslationContextGroup::Invalid;
switch (methodNode->GetMethodType())
{
case ScriptCanvas::MethodType::Event:
graphCanvasEntity->CreateComponent<EBusSenderNodeDescriptorComponent>();
contextGroup = TranslationContextGroup::EbusSender;
break;
case ScriptCanvas::MethodType::Member:
case ScriptCanvas::MethodType::Getter:
case ScriptCanvas::MethodType::Setter:
case ScriptCanvas::MethodType::Free:
graphCanvasEntity->CreateComponent<ClassMethodNodeDescriptorComponent>();
contextGroup = TranslationContextGroup::ClassMethod;
break;
default:
AZ_Error("ScriptCanvas", false, "Invalid method node type, node creation failed. This node needs to be deleted.");
@@ -292,19 +286,22 @@ namespace ScriptCanvasEditor::Nodes
*graphCanvasUserData = methodNode->GetEntityId();
}
const bool isEBusSender = (methodNode->GetMethodType() == ScriptCanvas::MethodType::Event);
const AZStd::string& className = methodNode->GetMethodClassName();
const AZStd::string& methodName = methodNode->GetName();
AZStd::string translationContext = TranslationHelper::GetContextName(contextGroup, className);
GraphCanvas::TranslationKey key;
key = isEBusSender ? "EBusSender" : "BehaviorClass";
key << className;
key << "methods" << methodName;
GraphCanvas::TranslationKeyedString nodeKeyedString(methodName, translationContext);
nodeKeyedString.m_key = TranslationHelper::GetKey(contextGroup, className, methodName, TranslationItemType::Node, TranslationKeyId::Name);
GraphCanvas::TranslationRequests::Details details;
details.m_name = methodName;
GraphCanvas::TranslationKeyedString classKeyedString(className, translationContext);
classKeyedString.m_key = TranslationHelper::GetClassKey(contextGroup, className, TranslationKeyId::Name);
GraphCanvas::TranslationRequestBus::BroadcastResult(details, &GraphCanvas::TranslationRequests::GetDetails, key + ".details", details);
GraphCanvas::TranslationKeyedString tooltipKeyedString(AZStd::string(), translationContext);
tooltipKeyedString.m_key = TranslationHelper::GetKey(contextGroup, className, methodName, TranslationItemType::Node, TranslationKeyId::Tooltip);
GraphCanvas::NodeTitleRequestBus::Event(graphCanvasNodeId, &GraphCanvas::NodeTitleRequests::SetDetails, details.m_name, details.m_subtitle);
GraphCanvas::NodeRequestBus::Event(graphCanvasNodeId, &GraphCanvas::NodeRequests::SetTooltip, details.m_tooltip);
int paramIndex = 0;
int outputIndex = 0;
@@ -312,37 +309,51 @@ namespace ScriptCanvasEditor::Nodes
auto busId = methodNode->GetBusSlotId();
for (const auto& slot : methodNode->GetSlots())
{
GraphCanvas::TranslationKey slotKey = key;
if (slot.IsVisible())
{
AZ::EntityId graphCanvasSlotId = DisplayScriptCanvasSlot(graphCanvasNodeId, slot);
GraphCanvas::TranslationKeyedString slotNameKeyedString(slot.GetName(), translationContext);
GraphCanvas::TranslationKeyedString slotTooltipKeyedString(slot.GetToolTip(), translationContext);
details.m_name = slot.GetName();
details.m_tooltip = slot.GetToolTip();
if (methodNode->HasBusID() && busId == slot.GetId() && slot.GetDescriptor() == ScriptCanvas::SlotDescriptors::DataIn())
{
slotNameKeyedString = TranslationHelper::GetEBusSenderBusIdNameKey();
slotTooltipKeyedString = TranslationHelper::GetEBusSenderBusIdTooltipKey();
key = Translation::GlobalKeys::EBusSenderIDKey;
GraphCanvas::TranslationRequestBus::BroadcastResult(details, &GraphCanvas::TranslationRequests::GetDetails, key + ".details", details);
}
else
{
TranslationItemType itemType = TranslationHelper::GetItemType(slot.GetDescriptor());
int& index = (slot.IsData() && slot.IsInput()) ? paramIndex : outputIndex;
int& index = (itemType == TranslationItemType::ParamDataSlot) ? paramIndex : outputIndex;
if (slot.IsData())
{
key = isEBusSender ? "EBusSender" : "BehaviorClass";
key << className << "methods" << methodName;
if (slot.IsData() && slot.IsInput())
{
key << "params";
}
else
{
key << "results";
}
key << index;
slotNameKeyedString.m_key = TranslationHelper::GetKey(contextGroup, className, methodName, itemType, TranslationKeyId::Name, index);
slotTooltipKeyedString.m_key = TranslationHelper::GetKey(contextGroup, className, methodName, itemType, TranslationKeyId::Tooltip, index);
GraphCanvas::TranslationRequestBus::BroadcastResult(details, &GraphCanvas::TranslationRequests::GetDetails, key + ".details", details);
}
if ((itemType == TranslationItemType::ParamDataSlot) || (itemType == TranslationItemType::ReturnDataSlot))
if (slot.IsData())
{
index++;
}
}
GraphCanvas::SlotRequestBus::Event(graphCanvasSlotId, &GraphCanvas::SlotRequests::SetTranslationKeyedName, slotNameKeyedString);
GraphCanvas::SlotRequestBus::Event(graphCanvasSlotId, &GraphCanvas::SlotRequests::SetTranslationKeyedTooltip, slotTooltipKeyedString);
GraphCanvas::SlotRequestBus::Event(graphCanvasSlotId, &GraphCanvas::SlotRequests::SetDetails, details.m_name, details.m_tooltip);
UpdateSlotDatumLabel(graphCanvasNodeId, slot.GetId(), details.m_name);
CopyTranslationKeyedNameToDatumLabel(graphCanvasNodeId, slot.GetId(), graphCanvasSlotId);
}
}
@@ -350,10 +361,6 @@ namespace ScriptCanvasEditor::Nodes
AZStd::string displayName = methodNode->GetName();
graphCanvasEntity->SetName(AZStd::string::format("GC-Node(%s)", displayName.c_str()));
GraphCanvas::NodeRequestBus::Event(graphCanvasNodeId, &GraphCanvas::NodeRequests::SetTranslationKeyedTooltip, tooltipKeyedString);
GraphCanvas::NodeTitleRequestBus::Event(graphCanvasNodeId, &GraphCanvas::NodeTitleRequests::SetTranslationKeyedTitle, nodeKeyedString);
GraphCanvas::NodeTitleRequestBus::Event(graphCanvasNodeId, &GraphCanvas::NodeTitleRequests::SetTranslationKeyedSubTitle, classKeyedString);
GraphCanvas::NodeTitleRequestBus::Event(graphCanvasNodeId, &GraphCanvas::NodeTitleRequests::SetPaletteOverride, "MethodNodeTitlePalette");
// Override the title if it has the Setter or Getter suffixes
@@ -420,24 +427,30 @@ namespace ScriptCanvasEditor::Nodes
if (busNode->IsIDRequired() && slot->GetDescriptor() == ScriptCanvas::SlotDescriptors::DataIn())
{
GraphCanvas::SlotRequestBus::Event(gcSlotId, &GraphCanvas::SlotRequests::SetTranslationKeyedName, TranslationHelper::GetEBusHandlerBusIdNameKey());
GraphCanvas::SlotRequestBus::Event(gcSlotId, &GraphCanvas::SlotRequests::SetTranslationKeyedTooltip, TranslationHelper::GetEBusHandlerBusIdTooltipKey());
GraphCanvas::TranslationKey key;
key << Translation::GlobalKeys::EBusHandlerIDKey << "details";
GraphCanvas::TranslationRequests::Details details;
details.m_name = slot->GetName();
details.m_tooltip = slot->GetToolTip();
GraphCanvas::TranslationRequestBus::BroadcastResult(details, &GraphCanvas::TranslationRequests::GetDetails, key, details);
GraphCanvas::SlotRequestBus::Event(gcSlotId, &GraphCanvas::SlotRequests::SetDetails, details.m_name, details.m_tooltip);
}
}
}
GraphCanvas::TranslationKeyedString nodeKeyedString(busName);
nodeKeyedString.m_context = TranslationHelper::GetEbusHandlerContext(busName);
nodeKeyedString.m_key = TranslationHelper::GetEbusHandlerKey(busName, TranslationKeyId::Name);
GraphCanvas::TranslationKeyedString tooltipKeyedString(AZStd::string(), nodeKeyedString.m_context);
tooltipKeyedString.m_key = TranslationHelper::GetEbusHandlerKey(busName, TranslationKeyId::Tooltip);
// Set the name
graphCanvasEntity->SetName(AZStd::string::format("GC-BusNode: %s", busName.data()));
GraphCanvas::NodeRequestBus::Event(graphCanvasNodeId, &GraphCanvas::NodeRequests::SetTranslationKeyedTooltip, tooltipKeyedString);
GraphCanvas::NodeTitleRequestBus::Event(graphCanvasNodeId, &GraphCanvas::NodeTitleRequests::SetTranslationKeyedTitle, nodeKeyedString);
GraphCanvas::TranslationKey key;
key << "EBusHandler" << busName << "details";
GraphCanvas::TranslationRequests::Details details;
details.m_name = busName;
GraphCanvas::TranslationRequestBus::BroadcastResult(details, &GraphCanvas::TranslationRequests::GetDetails, key, details);
GraphCanvas::NodeRequestBus::Event(graphCanvasNodeId, &GraphCanvas::NodeRequests::SetTooltip, details.m_tooltip);
GraphCanvas::NodeTitleRequestBus::Event(graphCanvasNodeId, &GraphCanvas::NodeTitleRequests::SetTitle, details.m_name);
GraphCanvas::NodeTitleRequestBus::Event(graphCanvasNodeId, &GraphCanvas::NodeTitleRequests::SetDefaultPalette, "HandlerWrapperNodeTitlePalette");
return graphCanvasNodeId;
@@ -462,19 +475,20 @@ namespace ScriptCanvasEditor::Nodes
AZStd::string decoratedName = AZStd::string::format("%s::%s", busName.c_str(), eventName.c_str());
GraphCanvas::TranslationKeyedString nodeKeyedString(eventName);
nodeKeyedString.m_context = TranslationHelper::GetEbusHandlerContext(busName);
nodeKeyedString.m_key = TranslationHelper::GetEbusHandlerEventKey(busName, eventName, TranslationKeyId::Name);
GraphCanvas::TranslationKey key;
key << "EBusHandler" << busName << "methods" << eventName << "details";
GraphCanvas::TranslationKeyedString tooltipKeyedString(AZStd::string(), nodeKeyedString.m_context);
tooltipKeyedString.m_key = TranslationHelper::GetEbusHandlerEventKey(busName, eventName, TranslationKeyId::Tooltip);
GraphCanvas::TranslationRequests::Details details;
details.m_name = eventName;
details.m_subtitle = busName;
GraphCanvas::TranslationRequestBus::BroadcastResult(details, &GraphCanvas::TranslationRequests::GetDetails, key, details);
// Set the name
graphCanvasEntity->SetName(AZStd::string::format("GC-Node(%s)", decoratedName.c_str()));
GraphCanvas::NodeRequestBus::Event(graphCanvasNodeId, &GraphCanvas::NodeRequests::SetTranslationKeyedTooltip, tooltipKeyedString);
GraphCanvas::NodeRequestBus::Event(graphCanvasNodeId, &GraphCanvas::NodeRequests::SetTooltip, details.m_tooltip);
GraphCanvas::NodeTitleRequestBus::Event(graphCanvasNodeId, &GraphCanvas::NodeTitleRequests::SetTranslationKeyedTitle, nodeKeyedString);
GraphCanvas::NodeTitleRequestBus::Event(graphCanvasNodeId, &GraphCanvas::NodeTitleRequests::SetTitle, details.m_name);
GraphCanvas::NodeTitleRequestBus::Event(graphCanvasNodeId, &GraphCanvas::NodeTitleRequests::SetPaletteOverride, "HandlerNodeTitlePalette");
return graphCanvasNodeId;
@@ -512,76 +526,27 @@ namespace ScriptCanvasEditor::Nodes
if (slot.IsVisible())
{
AZ::EntityId gcSlotId = DisplayScriptCanvasSlot(graphCanvasNodeId, slot, group);
if (slot.GetId() == azEventEntry.m_azEventInputSlotId)
{
GraphCanvas::TranslationKeyedString slotTranslationEntry(azEventEntry.m_eventName);
slotTranslationEntry.m_context = TranslationHelper::GetAzEventHandlerContextKey();
// The translation key in this case acts like a json pointer referencing a particular
// json string within a hypothetical json document
AZ::StackedString azEventHandlerNodeKey = TranslationHelper::GetAzEventHandlerRootPointer(azEventEntry.m_eventName);
azEventHandlerNodeKey.Push("Name");
slotTranslationEntry.m_key = AZStd::string_view{ azEventHandlerNodeKey };
GraphCanvas::SlotRequestBus::Event(gcSlotId, &GraphCanvas::SlotRequests::SetTranslationKeyedName, slotTranslationEntry);
azEventHandlerNodeKey.Pop();
azEventHandlerNodeKey.Push("Tooltip");
slotTranslationEntry.m_key = AZStd::string_view{ azEventHandlerNodeKey };
GraphCanvas::SlotRequestBus::Event(gcSlotId, &GraphCanvas::SlotRequests::SetTranslationKeyedTooltip, slotTranslationEntry);
}
else
{
GraphCanvas::TranslationKeyedString slotTranslationEntry(slot.GetName());
slotTranslationEntry.m_context = TranslationHelper::GetAzEventHandlerContextKey();
// The translation key in this case acts like a json pointer referencing a particular
// json string within a hypothetical json document
// translation key is rooted at /AzEventHandler/${EventName}/Slots/${SlotName}/{In,Out,Param,Return}
AZ::StackedString azEventHandlerNodeKey = TranslationHelper::GetAzEventHandlerRootPointer(azEventEntry.m_eventName);
azEventHandlerNodeKey.Push("Slots");
azEventHandlerNodeKey.Push(slot.GetName());
switch(TranslationHelper::GetItemType(slot.GetDescriptor()))
{
case TranslationItemType::ExecutionInSlot:
azEventHandlerNodeKey.Push("In");
break;
case TranslationItemType::ExecutionOutSlot:
azEventHandlerNodeKey.Push("Out");
break;
case TranslationItemType::ParamDataSlot:
azEventHandlerNodeKey.Push("Param");
break;
case TranslationItemType::ReturnDataSlot:
azEventHandlerNodeKey.Push("Return");
break;
default:
// Slot is not an execution or data slot, do nothing
break;
}
GraphCanvas::TranslationKey key;
key << "AZEventHandler" << azEventNode->GetNodeName() << "slots" << slot.GetName() << "details";
azEventHandlerNodeKey.Push("Name");
slotTranslationEntry.m_key = AZStd::string_view{ azEventHandlerNodeKey };
GraphCanvas::SlotRequestBus::Event(gcSlotId, &GraphCanvas::SlotRequests::SetTranslationKeyedName, slotTranslationEntry);
azEventHandlerNodeKey.Pop();
azEventHandlerNodeKey.Push("Tooltip");
slotTranslationEntry.m_key = AZStd::string_view{ azEventHandlerNodeKey };
GraphCanvas::SlotRequestBus::Event(gcSlotId, &GraphCanvas::SlotRequests::SetTranslationKeyedTooltip, slotTranslationEntry);
}
GraphCanvas::TranslationRequests::Details details;
GraphCanvas::TranslationRequestBus::BroadcastResult(details, &GraphCanvas::TranslationRequests::GetDetails, key, details);
GraphCanvas::SlotRequestBus::Event(gcSlotId, &GraphCanvas::SlotRequests::SetName, details.m_name);
GraphCanvas::SlotRequestBus::Event(gcSlotId, &GraphCanvas::SlotRequests::SetTooltip, details.m_tooltip);;
}
}
GraphCanvas::TranslationKeyedString nodeTranslationEntry(azEventEntry.m_eventName);
nodeTranslationEntry.m_context = TranslationHelper::GetAzEventHandlerContextKey();
// The translation key in this case acts like a json pointer referencing a particular
// json string within a hypothetical json document
AZ::StackedString azEventHandlerNodeKey = TranslationHelper::GetAzEventHandlerRootPointer(azEventEntry.m_eventName);
azEventHandlerNodeKey.Push("Name");
nodeTranslationEntry.m_key = AZStd::string_view{ azEventHandlerNodeKey };
GraphCanvas::NodeTitleRequestBus::Event(graphCanvasNodeId, &GraphCanvas::NodeTitleRequests::SetTranslationKeyedTitle, nodeTranslationEntry);
azEventHandlerNodeKey.Pop();
azEventHandlerNodeKey.Push("Tooltip");
nodeTranslationEntry.m_key = AZStd::string_view{ azEventHandlerNodeKey };
GraphCanvas::NodeRequestBus::Event(graphCanvasNodeId, &GraphCanvas::NodeRequests::SetTranslationKeyedTooltip, nodeTranslationEntry);
GraphCanvas::TranslationKey key;
key << "AZEventHandler" << azEventEntry.m_eventName << "details";
GraphCanvas::TranslationRequests::Details details;
GraphCanvas::TranslationRequestBus::BroadcastResult(details, &GraphCanvas::TranslationRequests::GetDetails, key, details);
GraphCanvas::NodeTitleRequestBus::Event(graphCanvasNodeId, &GraphCanvas::NodeTitleRequests::SetTitle, details.m_name);
GraphCanvas::NodeRequestBus::Event(graphCanvasNodeId, &GraphCanvas::NodeRequests::SetTooltip, details.m_tooltip);
// Set the name
graphCanvasEntity->SetName(AZStd::string::format("GC-EventNode: %s", azEventEntry.m_eventName.c_str()));
GraphCanvas::NodeTitleRequestBus::Event(graphCanvasNodeId, &GraphCanvas::NodeTitleRequests::SetPaletteOverride, "HandlerNodeTitlePalette");
@@ -652,8 +617,11 @@ namespace ScriptCanvasEditor::Nodes
if (busNode->IsIDRequired() && slot->GetDescriptor() == ScriptCanvas::SlotDescriptors::DataIn())
{
GraphCanvas::SlotRequestBus::Event(gcSlotId, &GraphCanvas::SlotRequests::SetTranslationKeyedName, TranslationHelper::GetEBusHandlerBusIdNameKey());
GraphCanvas::SlotRequestBus::Event(gcSlotId, &GraphCanvas::SlotRequests::SetTranslationKeyedTooltip, TranslationHelper::GetEBusHandlerBusIdTooltipKey());
GraphCanvas::TranslationKey key;
key << Translation::GlobalKeys::EBusHandlerIDKey << "details";
GraphCanvas::TranslationRequests::Details details;
GraphCanvas::TranslationRequestBus::BroadcastResult(details, &GraphCanvas::TranslationRequests::GetDetails, key, details);
GraphCanvas::SlotRequestBus::Event(gcSlotId, &GraphCanvas::SlotRequests::SetDetails, details.m_name, details.m_tooltip);
}
}
}
@@ -718,11 +686,7 @@ namespace ScriptCanvasEditor::Nodes
graphCanvasEntity->CreateComponent<IconComponent>(ScriptCanvas::Nodes::Core::Method::RTTI_Type());
graphCanvasEntity->CreateComponent<SlotMappingComponent>(senderNode->GetEntityId());
graphCanvasEntity->CreateComponent<SceneMemberMappingComponent>(senderNode->GetEntityId());
TranslationContextGroup contextGroup = TranslationContextGroup::Invalid;
graphCanvasEntity->CreateComponent<ScriptEventSenderNodeDescriptorComponent>(senderNode->GetAssetId(), senderNode->GetEventId());
contextGroup = TranslationContextGroup::EbusSender;
graphCanvasEntity->Init();
graphCanvasEntity->Activate();
@@ -753,7 +717,7 @@ namespace ScriptCanvasEditor::Nodes
GraphCanvas::SlotRequestBus::Event(graphCanvasSlotId, &GraphCanvas::SlotRequests::SetName, slot.GetName());
GraphCanvas::SlotRequestBus::Event(graphCanvasSlotId, &GraphCanvas::SlotRequests::SetTooltip, slot.GetToolTip());
CopyTranslationKeyedNameToDatumLabel(graphCanvasNodeId, slot.GetId(), graphCanvasSlotId);
UpdateSlotDatumLabel(graphCanvasNodeId, slot.GetId(), slot.GetName());
}
}
@@ -811,11 +775,23 @@ namespace ScriptCanvasEditor::Nodes
{
AZ_Error("Script Canvas", false, "Script Canvas Function asset (%s) is not loaded, unable to display the node.", functionNode->GetAssetId().ToString<AZStd::string>().c_str());
GraphCanvas::TranslationKeyedString errorTitle("ERROR!");
GraphCanvas::TranslationKeyedString errorSubstring("Missing Script Canvas Function Asset!");
GraphCanvas::TranslationKey key;
key = "Globals.MissingFunctionAsset.Title.details.m_name";
GraphCanvas::NodeTitleRequestBus::Event(graphCanvasNodeId, &GraphCanvas::NodeTitleRequests::SetTranslationKeyedTitle, errorTitle);
GraphCanvas::NodeTitleRequestBus::Event(graphCanvasNodeId, &GraphCanvas::NodeTitleRequests::SetTranslationKeyedSubTitle, errorSubstring);
bool success = false;
AZStd::string result = "Error!";
GraphCanvas::TranslationRequestBus::BroadcastResult(success, &GraphCanvas::TranslationRequests::Get, key = "Globals.MissingFunctionAsset.Title.details.m_name", result);
if (success)
{
GraphCanvas::NodeTitleRequestBus::Event(graphCanvasNodeId, &GraphCanvas::NodeTitleRequests::SetTitle, result);
}
result = "Missing Script Canvas Function Asset";
GraphCanvas::TranslationRequestBus::BroadcastResult(success, &GraphCanvas::TranslationRequests::Get, key = "Globals.MissingFunctionAsset.Title.details.tooltip", result);
if (success)
{
GraphCanvas::NodeTitleRequestBus::Event(graphCanvasNodeId, &GraphCanvas::NodeTitleRequests::SetSubTitle, result);
}
return graphCanvasNodeId;
}
@@ -827,7 +803,7 @@ namespace ScriptCanvasEditor::Nodes
GraphCanvas::SlotRequestBus::Event(graphCanvasSlotId, &GraphCanvas::SlotRequests::SetName, slot.GetName());
GraphCanvas::SlotRequestBus::Event(graphCanvasSlotId, &GraphCanvas::SlotRequests::SetTooltip, slot.GetToolTip());
CopyTranslationKeyedNameToDatumLabel(graphCanvasNodeId, slot.GetId(), graphCanvasSlotId);
UpdateSlotDatumLabel(graphCanvasNodeId, slot.GetId(), slot.GetName());
}
if (asset)
@@ -866,31 +842,11 @@ namespace ScriptCanvasEditor::Nodes
if (const AZ::SerializeContext::ClassData* classData = serializeContext->FindClassData(azrtti_typeid(functionDefinitionNode)))
{
AZStd::string nodeContext = GetContextName(*classData);
nodeConfiguration.m_translationContext = TranslationHelper::GetUserDefinedContext(nodeContext);
nodeConfiguration.m_titleFallback = (classData->m_editData && classData->m_editData->m_name) ? classData->m_editData->m_name : classData->m_name;
nodeConfiguration.m_tooltipFallback = (classData->m_editData && classData->m_editData->m_description) ? classData->m_editData->m_description : "";
GraphCanvas::TranslationKeyedString subtitleKeyedString(nodeContext, nodeConfiguration.m_translationContext);
subtitleKeyedString.m_key = TranslationHelper::GetUserDefinedNodeKey(nodeContext, nodeConfiguration.m_titleFallback, ScriptCanvasEditor::TranslationKeyId::Category);
nodeConfiguration.m_subtitleFallback = subtitleKeyedString.GetDisplayString();
nodeConfiguration.m_translationKeyName = nodeConfiguration.m_titleFallback;
nodeConfiguration.m_translationKeyContext = nodeContext;
nodeConfiguration.m_translationGroup = TranslationContextGroup::ClassMethod;
ScriptCanvas::GraphScopedNodeId nodelingId;
nodelingId.m_identifier = nodeConfiguration.m_scriptCanvasId;
nodelingId.m_scriptCanvasId = functionDefinitionNode->GetOwningScriptCanvasId();
AZStd::string nodelingName;
ScriptCanvas::NodelingRequestBus::EventResult(nodelingName, nodelingId, &ScriptCanvas::NodelingRequests::GetDisplayName);
if (classData->m_editData)
{
const AZ::Edit::ElementData* elementData = classData->m_editData->FindElementData(AZ::Edit::ClassElements::EditorData);
@@ -908,15 +864,12 @@ namespace ScriptCanvasEditor::Nodes
}
}
nodeConfiguration.m_subtitleFallback = "";
// Because of how the extender slots are registered, there isn't an easy way to only create one or the other based on
// the type of nodeling, so instead they both get created and we need to remove the inapplicable one
GraphCanvas::ConnectionType typeToRemove = (functionDefinitionNode->IsExecutionEntry()) ? GraphCanvas::CT_Input : GraphCanvas::CT_Output;
AZ::EntityId graphCanvasNodeId = DisplayGeneralScriptCanvasNode(graphCanvasGraphId, functionDefinitionNode, nodeConfiguration);
AZStd::vector<GraphCanvas::SlotId> extenderSlotIds, executionSlotIds;
GraphCanvas::NodeRequestBus::EventResult(extenderSlotIds, graphCanvasNodeId, &GraphCanvas::NodeRequests::FindVisibleSlotIdsByType, typeToRemove, GraphCanvas::SlotTypes::ExtenderSlot);
if (!extenderSlotIds.empty())
@@ -960,22 +913,6 @@ namespace ScriptCanvasEditor::Nodes
if (classData)
{
AZStd::string nodeContext = GetContextName(*classData);
nodeConfiguration.m_translationContext = TranslationHelper::GetUserDefinedContext(nodeContext);
nodeConfiguration.m_titleFallback = (classData->m_editData && classData->m_editData->m_name) ? classData->m_editData->m_name : classData->m_name;
nodeConfiguration.m_tooltipFallback = (classData->m_editData && classData->m_editData->m_description) ? classData->m_editData->m_description : "";
GraphCanvas::TranslationKeyedString subtitleKeyedString(nodeContext, nodeConfiguration.m_translationContext);
subtitleKeyedString.m_key = TranslationHelper::GetUserDefinedNodeKey(nodeContext, nodeConfiguration.m_titleFallback, ScriptCanvasEditor::TranslationKeyId::Category);
nodeConfiguration.m_subtitleFallback = subtitleKeyedString.GetDisplayString();
nodeConfiguration.m_translationKeyName = nodeConfiguration.m_titleFallback;
nodeConfiguration.m_translationKeyContext = nodeContext;
nodeConfiguration.m_translationGroup = TranslationContextGroup::ClassMethod;
if (classData->m_editData)
{
const AZ::Edit::ElementData* elementData = classData->m_editData->FindElementData(AZ::Edit::ClassElements::EditorData);
@@ -993,8 +930,6 @@ namespace ScriptCanvasEditor::Nodes
}
}
nodeConfiguration.m_subtitleFallback = "";
return DisplayGeneralScriptCanvasNode(graphCanvasGraphId, nodeling, nodeConfiguration);
}
@@ -1008,19 +943,6 @@ namespace ScriptCanvasEditor::Nodes
nodeConfiguration.m_titlePalette = "GetVariableNodeTitlePalette";
nodeConfiguration.m_scriptCanvasId = variableNode->GetEntityId();
// <Translation>
nodeConfiguration.m_translationContext = TranslationHelper::GetContextName(TranslationContextGroup::ClassMethod, "CORE");
nodeConfiguration.m_translationKeyContext = "CORE";
nodeConfiguration.m_translationKeyName = "GETVARIABLE";
nodeConfiguration.m_titleFallback = "Get Variable";
nodeConfiguration.m_subtitleFallback = "";
nodeConfiguration.m_tooltipFallback = "Gets the specified Variable or one of it's properties.";
nodeConfiguration.m_translationGroup = TranslationContextGroup::ClassMethod;
// </Translation>
AZ::EntityId graphCanvasNodeId = DisplayGeneralScriptCanvasNode(graphCanvasGraphId, variableNode, nodeConfiguration);
GraphCanvas::SlotLayoutRequestBus::Event(graphCanvasNodeId, &GraphCanvas::SlotLayoutRequests::ConfigureSlotGroup, GraphCanvas::SlotGroups::ExecutionGroup, GraphCanvas::SlotGroupConfiguration(0));
@@ -1040,20 +962,6 @@ namespace ScriptCanvasEditor::Nodes
nodeConfiguration.m_titlePalette = "SetVariableNodeTitlePalette";
nodeConfiguration.m_scriptCanvasId = variableNode->GetEntityId();
// <Translation>
nodeConfiguration.m_translationContext = TranslationHelper::GetContextName(TranslationContextGroup::ClassMethod, "CORE");
nodeConfiguration.m_translationKeyContext = "CORE";
nodeConfiguration.m_translationKeyName = "SETVARIABLE";
nodeConfiguration.m_titleFallback = "Set Variable";
nodeConfiguration.m_subtitleFallback = "";
nodeConfiguration.m_tooltipFallback = "Sets the specified Variable.";
nodeConfiguration.m_translationGroup = TranslationContextGroup::ClassMethod;
// </Translation>
AZ::EntityId graphCanvasId = DisplayGeneralScriptCanvasNode(graphCanvasGraphId, variableNode, nodeConfiguration);
GraphCanvas::SlotLayoutRequestBus::Event(graphCanvasId, &GraphCanvas::SlotLayoutRequests::ConfigureSlotGroup, GraphCanvas::SlotGroups::ExecutionGroup, GraphCanvas::SlotGroupConfiguration(0));
@@ -1242,8 +1150,45 @@ namespace ScriptCanvasEditor::Nodes
if (slotEntity)
{
GraphCanvas::TranslationKey slotKey;
slotKey << "ScriptCanvas::Node" << azrtti_typeid(slot.GetNode()).ToString<AZStd::string>() << "slots";
AZStd::string slotKeyStr;
if (slot.IsData())
{
slotKeyStr.append("Data");
}
if (slot.GetConnectionType() == ScriptCanvas::ConnectionType::Input)
{
slotKeyStr.append("Input_");
}
else
{
slotKeyStr.append("Output_");
}
slotKeyStr.append(slot.GetName());
slotKey << slotKeyStr << "details";
GraphCanvas::TranslationRequests::Details slotDetails;
GraphCanvas::TranslationRequestBus::BroadcastResult(slotDetails, &GraphCanvas::TranslationRequests::GetDetails, slotKey, slotDetails);
if (slotDetails.m_name.empty())
{
slotDetails.m_name = slot.GetName();
}
if (slotDetails.m_tooltip.empty())
{
slotDetails.m_tooltip = slot.GetToolTip();
}
GraphCanvas::SlotRequestBus::Event(slotEntity->GetId(), &GraphCanvas::SlotRequests::SetName, slotDetails.m_name);
GraphCanvas::SlotRequestBus::Event(slotEntity->GetId(), &GraphCanvas::SlotRequests::SetTooltip, slotDetails.m_tooltip);
RegisterAndActivateGraphCanvasSlot(graphCanvasNodeId, slot.GetId(), slotEntity);
CopyTranslationKeyedNameToDatumLabel(graphCanvasNodeId, slot.GetId(), slotEntity->GetId());
UpdateSlotDatumLabel(graphCanvasNodeId, slot.GetId(), slot.GetName());
return slotEntity->GetId();
}
else
@@ -16,18 +16,8 @@
namespace ScriptCanvasEditor::Nodes
{
void CopyTranslationKeyedNameToDatumLabel(const AZ::EntityId& graphCanvasNodeId,
ScriptCanvas::SlotId scSlotId,
const AZ::EntityId& graphCanvasSlotId)
void UpdateSlotDatumLabel(const AZ::EntityId& graphCanvasNodeId, ScriptCanvas::SlotId scSlotId, const AZStd::string& name)
{
GraphCanvas::TranslationKeyedString name;
GraphCanvas::SlotRequestBus::EventResult(name, graphCanvasSlotId, &GraphCanvas::SlotRequests::GetTranslationKeyedName);
if (name.GetDisplayString().empty())
{
return;
}
// GC node -> SC node.
AZStd::any* userData = nullptr;
GraphCanvas::NodeRequestBus::EventResult(userData, graphCanvasNodeId, &GraphCanvas::NodeRequests::GetUserData);
AZ::EntityId scNodeEntityId = userData && userData->is<AZ::EntityId>() ? *AZStd::any_cast<AZ::EntityId>(userData) : AZ::EntityId();
@@ -36,11 +26,11 @@ namespace ScriptCanvasEditor::Nodes
ScriptCanvas::ModifiableDatumView datumView;
ScriptCanvas::NodeRequestBus::Event(scNodeEntityId, &ScriptCanvas::NodeRequests::FindModifiableDatumView, scSlotId, datumView);
datumView.RelabelDatum(name.GetDisplayString());
datumView.RelabelDatum(name);
}
}
void CopySlotTranslationKeyedNamesToDatums(AZ::EntityId graphCanvasNodeId)
void UpdateSlotDatumLabels(AZ::EntityId graphCanvasNodeId)
{
AZStd::vector<AZ::EntityId> graphCanvasSlotIds;
GraphCanvas::NodeRequestBus::EventResult(graphCanvasSlotIds, graphCanvasNodeId, &GraphCanvas::NodeRequests::GetSlotIds);
@@ -51,47 +41,10 @@ namespace ScriptCanvasEditor::Nodes
if (auto scriptCanvasSlotId = AZStd::any_cast<ScriptCanvas::SlotId>(slotUserData))
{
CopyTranslationKeyedNameToDatumLabel(graphCanvasNodeId, *scriptCanvasSlotId, graphCanvasSlotId);
AZStd::string slotName;
GraphCanvas::SlotRequestBus::EventResult(slotName, graphCanvasSlotId, &GraphCanvas::SlotRequests::GetName);
UpdateSlotDatumLabel(graphCanvasNodeId, *scriptCanvasSlotId, slotName);
}
}
}
//////////////////////
// NodeConfiguration
//////////////////////
AZStd::string GetCategoryName(const AZ::SerializeContext::ClassData& classData)
{
if (auto editorDataElement = classData.m_editData->FindElementData(AZ::Edit::ClassElements::EditorData))
{
if (auto attribute = editorDataElement->FindAttribute(AZ::Edit::Attributes::Category))
{
if (auto data = azrtti_cast<AZ::Edit::AttributeData<const char*>*>(attribute))
{
return data->Get(nullptr);
}
}
}
return {};
}
AZStd::string GetContextName(const AZ::SerializeContext::ClassData& classData)
{
if (auto editorDataElement = classData.m_editData ? classData.m_editData->FindElementData(AZ::Edit::ClassElements::EditorData) : nullptr)
{
if (auto attribute = editorDataElement->FindAttribute(AZ::Edit::Attributes::Category))
{
if (auto data = azrtti_cast<AZ::Edit::AttributeData<const char*>*>(attribute))
{
AZStd::string fullCategoryName = data->Get(nullptr);
AZStd::string delimiter = "/";
AZStd::vector<AZStd::string> results;
AZStd::tokenize(fullCategoryName, delimiter, results);
return results.back();
}
}
}
return {};
}
}
@@ -71,18 +71,6 @@ namespace ScriptCanvasEditor
AZStd::string m_titlePalette;
AZStd::vector< AZ::Uuid > m_customComponents;
// Translation Information for the Node
AZStd::string m_translationContext;
AZStd::string m_translationKeyName;
AZStd::string m_translationKeyContext;
TranslationContextGroup m_translationGroup;
AZStd::string m_titleFallback;
AZStd::string m_subtitleFallback;
AZStd::string m_tooltipFallback;
AZ::EntityId m_scriptCanvasId;
};
@@ -92,16 +80,9 @@ namespace ScriptCanvasEditor
AZStd::string m_titlePalette;
};
AZStd::string GetContextName(const AZ::SerializeContext::ClassData& classData);
AZStd::string GetCategoryName(const AZ::SerializeContext::ClassData& classData);
void CopySlotTranslationKeyedNamesToDatums(AZ::EntityId graphCanvasNodeId);
// Copies the the translated key name to the ScriptCanvas Data Slot which matches
// the scSlotId
void CopyTranslationKeyedNameToDatumLabel(const AZ::EntityId& graphCanvasNodeId,
ScriptCanvas::SlotId scSlotId,
const AZ::EntityId& graphCanvasSlotId);
// Copies the slot name to the underlying ScriptCanvas Data Slot which matches the slot Id
void UpdateSlotDatumLabels(AZ::EntityId graphCanvasNodeId);
void UpdateSlotDatumLabel(const AZ::EntityId& graphCanvasNodeId, ScriptCanvas::SlotId scSlotId, const AZStd::string& name);
template <typename NodeType>
NodeType* GetNode(AZ::EntityId scriptCanvasGraphId, NodeIdPair nodeIdPair)
@@ -15,6 +15,63 @@
#include <ScriptCanvas/Core/Slot.h>
#include <GraphCanvas/Types/TranslationTypes.h>
#include <Source/Translation/TranslationBus.h>
#include <AzFramework/Gem/GemInfo.h>
#include <AzCore/Settings/SettingsRegistry.h>
namespace Translation
{
namespace GlobalKeys
{
static constexpr const char* EBusSenderIDKey = "Globals.EBusSenderBusId";
static constexpr const char* EBusHandlerIDKey = "Globals.EBusHandlerBusId";
static constexpr const char* MissingFunctionKey = "Globals.MissingFunction";
static constexpr const char* EBusHandlerOutSlot = "Globals.EBusHandler.OutSlot";
}
static inline bool GetValue(const AZStd::string key, AZStd::string& value)
{
GraphCanvas::TranslationKey tkey;
tkey = key;
bool result = false;
GraphCanvas::TranslationRequestBus::BroadcastResult(result, &GraphCanvas::TranslationRequests::Get, key, value);
return result;
}
}
namespace GraphCanvasAttributeHelper
{
template <typename T>
AZStd::string GetStringAttribute(const T* source, const AZ::Crc32& attribute)
{
AZStd::string attributeValue = "";
if (auto attributeItem = azrtti_cast<AZ::AttributeData<AZStd::string>*>(AZ::FindAttribute(attribute, source->m_attributes)))
{
attributeValue = attributeItem->Get(nullptr);
}
return attributeValue;
}
inline AZStd::string ReadStringAttribute(const AZ::AttributeArray& attributes, const AZ::Crc32& attribute)
{
AZStd::string attributeValue = "";
if (auto attributeItem = azrtti_cast<AZ::AttributeData<AZStd::string>*>(AZ::FindAttribute(attribute, attributes)))
{
attributeValue = attributeItem->Get(nullptr);
return attributeValue;
}
if (auto attributeItem = azrtti_cast<AZ::AttributeData<const char*>*>(AZ::FindAttribute(attribute, attributes)))
{
attributeValue = attributeItem->Get(nullptr);
return attributeValue;
}
return {};
}
}
namespace ScriptCanvasEditor
{
@@ -47,6 +104,20 @@ namespace ScriptCanvasEditor
Invalid
};
namespace TranslationKeyParts
{
const char* const handler = "HANDLER_";
const char* const name = "NAME";
const char* const tooltip = "TOOLTIP";
const char* const category = "CATEGORY";
const char* const in = "IN";
const char* const out = "OUT";
const char* const param = "PARAM";
const char* const output = "OUTPUT";
const char* const busid = "BUSID";
}
namespace TranslationContextGroupParts
{
const char* const ebusSender = "EBus";
@@ -55,19 +126,6 @@ namespace ScriptCanvasEditor
constexpr const char* const globalMethod = "GlobalMethod";
};
namespace TranslationKeyParts
{
const char* const handler = "HANDLER_";
const char* const name = "NAME";
const char* const tooltip = "TOOLTIP";
const char* const category = "CATEGORY";
const char* const in = "IN";
const char* const out = "OUT";
const char* const param = "PARAM";
const char* const output = "OUTPUT";
const char* const busid = "BUSID";
}
// The context name and keys generated by TranslationHelper should match the keys
// being exported by the TSGenerateAction.cpp in the ScriptCanvasDeveloper Gem.
class TranslationHelper
@@ -109,47 +167,10 @@ namespace ScriptCanvasEditor
}
// UserDefined
static AZStd::string GetUserDefinedContext(AZStd::string_view contextName)
{
return GetContextName(TranslationContextGroup::ClassMethod, contextName);
}
static AZStd::string GetUserDefinedKey(AZStd::string_view contextName, TranslationKeyId keyId)
{
return GetClassKey(TranslationContextGroup::ClassMethod, contextName, keyId);
}
static AZStd::string GetUserDefinedNodeKey(AZStd::string_view contextName, AZStd::string_view nodeName, TranslationKeyId keyId)
{
return GetKey(TranslationContextGroup::ClassMethod, contextName, nodeName, TranslationItemType::Node, keyId);
}
static AZStd::string GetUserDefinedNodeSlotKey(AZStd::string_view contextName, AZStd::string_view nodeName, TranslationItemType itemType, TranslationKeyId keyId, int slotIndex)
{
return GetKey(TranslationContextGroup::ClassMethod, contextName, nodeName, itemType, keyId, slotIndex);
}
////
// EBusEvent
static AZStd::string GetEbusHandlerContext(AZStd::string_view busName)
{
return GetContextName(TranslationContextGroup::EbusHandler, busName);
}
static AZStd::string GetEbusHandlerKey(AZStd::string_view busName, TranslationKeyId keyId)
{
return GetClassKey(TranslationContextGroup::EbusHandler, busName, keyId);
}
static AZStd::string GetEbusHandlerEventKey(AZStd::string_view busName, AZStd::string_view eventName, TranslationKeyId keyId)
{
return GetKey(TranslationContextGroup::EbusHandler, busName, eventName, TranslationItemType::Node, keyId);
}
static AZStd::string GetEBusHandlerSlotKey(AZStd::string_view busName, AZStd::string_view eventName, TranslationItemType type, TranslationKeyId keyId, int paramIndex)
{
return GetKey(TranslationContextGroup::EbusHandler, busName, eventName, type, keyId, paramIndex);
}
////
static AZStd::string GetKey(TranslationContextGroup group, AZStd::string_view keyBase, AZStd::string_view keyName, TranslationItemType type, TranslationKeyId keyId, int paramIndex = 0)
@@ -436,72 +457,6 @@ namespace ScriptCanvasEditor
return translated;
}
static GraphCanvas::TranslationKeyedString GetEBusHandlerBusIdNameKey()
{
GraphCanvas::TranslationKeyedString keyedString;
keyedString.m_context = "Globals";
keyedString.m_key = "DEFAULTS_EBUSHANDLER_BUSID_NAME";
keyedString.SetFallback("BusId");
return keyedString;
}
static GraphCanvas::TranslationKeyedString GetEBusHandlerBusIdTooltipKey()
{
GraphCanvas::TranslationKeyedString keyedString;
keyedString.m_context = "Globals";
keyedString.m_key = "DEFAULTS_EBUSHANDLER_BUSID_TOOLTIP";
keyedString.SetFallback("BusId");
return keyedString;
}
static GraphCanvas::TranslationKeyedString GetEBusHandlerOnEventTriggeredNameKey()
{
GraphCanvas::TranslationKeyedString keyedString;
keyedString.m_context = "Globals";
keyedString.m_key = "DEFAULTS_EBUSHANDLER_ONTRIGGERED_NAME";
keyedString.SetFallback("Out");
return keyedString;
}
static GraphCanvas::TranslationKeyedString GetEBusHandlerOnEventTriggeredTooltipKey()
{
GraphCanvas::TranslationKeyedString keyedString;
keyedString.m_context = "Globals";
keyedString.m_key = "DEFAULTS_EBUSHANDLER_ONTRIGGERED_TOOLTIP";
keyedString.SetFallback("Out");
return keyedString;
}
static GraphCanvas::TranslationKeyedString GetEBusSenderBusIdNameKey()
{
GraphCanvas::TranslationKeyedString keyedString;
keyedString.m_context = "Globals";
keyedString.m_key = "DEFAULTS_EBUSSENDER_BUSID_NAME";
keyedString.SetFallback("BusId");
return keyedString;
}
static GraphCanvas::TranslationKeyedString GetEBusSenderBusIdTooltipKey()
{
GraphCanvas::TranslationKeyedString keyedString;
keyedString.m_context = "Globals";
keyedString.m_key = "DEFAULTS_EBUSSENDER_BUSID_TOOLTIP";
keyedString.SetFallback("BusId");
return keyedString;
}
// Use the StackedString to index the translation keys as a Json Pointer
static constexpr AZStd::string_view GetAzEventHandlerContextKey()
{
return { "AzEventHandler" };
}
// Use the StackedString to index the translation keys as a Json Pointer
static AZ::StackedString GetAzEventHandlerRootPointer(AZStd::string_view eventName)
{
@@ -510,5 +465,10 @@ namespace ScriptCanvasEditor
return path;
}
};
}
@@ -97,23 +97,17 @@ namespace ScriptCanvasEditor
, m_isOverload(isOverload)
, m_propertyStatus(propertyStatus)
{
AZStd::string displayEventName = TranslationHelper::GetKeyTranslation(TranslationContextGroup::EbusSender, m_busName.toUtf8().data(), m_eventName.toUtf8().data(), TranslationItemType::Node, TranslationKeyId::Name);
GraphCanvas::TranslationKey key;
key << "EBusSender" << busName << "methods" << eventName << "details";
if (displayEventName.empty())
{
SetName(m_eventName);
}
else
{
SetName(displayEventName.c_str());
}
GraphCanvas::TranslationRequests::Details details;
details.m_name = eventName;
details.m_subtitle = busName;
AZStd::string displayEventTooltip = TranslationHelper::GetKeyTranslation(TranslationContextGroup::EbusSender, m_busName.toUtf8().data(), m_eventName.toUtf8().data(), TranslationItemType::Node, TranslationKeyId::Tooltip);
GraphCanvas::TranslationRequestBus::BroadcastResult(details, &GraphCanvas::TranslationRequests::GetDetails, key, details);
if (!displayEventTooltip.empty())
{
SetToolTip(displayEventTooltip.c_str());
}
SetName(details.m_name.c_str());
SetToolTip(details.m_tooltip.c_str());
SetTitlePalette("MethodNodeTitlePalette");
}
@@ -302,23 +296,19 @@ namespace ScriptCanvasEditor
, m_busId(busId)
, m_eventId(eventId)
{
AZStd::string displayEventName = TranslationHelper::GetKeyTranslation(TranslationContextGroup::EbusHandler, m_busName.c_str(), m_eventName.c_str(), TranslationItemType::Node, TranslationKeyId::Name);
GraphCanvas::TranslationKey key;
key << "EBusHandler" << busName << "methods" << eventName << "details";
if (displayEventName.empty())
GraphCanvas::TranslationRequests::Details details;
details.m_name = m_eventName;
GraphCanvas::TranslationRequestBus::BroadcastResult(details, &GraphCanvas::TranslationRequests::GetDetails, key, details);
if (details.m_name.empty())
{
SetName(m_eventName.c_str());
}
else
{
SetName(displayEventName.c_str());
details.m_name = m_eventName;
}
AZStd::string displayEventTooltip = TranslationHelper::GetKeyTranslation(TranslationContextGroup::EbusHandler, m_busName.c_str(), m_eventName.c_str(), TranslationItemType::Node, TranslationKeyId::Tooltip);
if (!displayEventTooltip.empty())
{
SetToolTip(displayEventTooltip.c_str());
}
SetName(details.m_name.c_str());
SetToolTip(details.m_tooltip.c_str());
SetTitlePalette("HandlerNodeTitlePalette");
}
@@ -11,6 +11,7 @@
#include "CreateNodeMimeEvent.h"
#include <ScriptCanvas/GraphCanvas/NodeDescriptorBus.h>
#include "TranslationGeneration.h"
namespace ScriptCanvasEditor
{
@@ -62,6 +63,24 @@ namespace ScriptCanvasEditor
ScriptCanvas::PropertyStatus GetPropertyStatus() const;
AZ::IO::Path GetTranslationDataPath() const override
{
return AZ::IO::Path("EBus\\Senders") / GetBusName();
}
void GenerateTranslationData() override
{
AZ::BehaviorContext* behaviorContext{};
AZ::ComponentApplicationBus::BroadcastResult(behaviorContext, &AZ::ComponentApplicationRequests::GetBehaviorContext);
const char* ebusName = m_busName.toUtf8().data();
auto behaviorEbus = behaviorContext->m_ebuses.find(ebusName);
ScriptCanvasEditorTools::TranslationGeneration translation;
translation.TranslateEBus(behaviorEbus->second);
}
private:
bool m_isOverload;
QString m_busName;
@@ -154,6 +173,22 @@ namespace ScriptCanvasEditor
ScriptCanvas::EBusBusId GetBusId() const;
ScriptCanvas::EBusEventId GetEventId() const;
AZ::IO::Path GetTranslationDataPath() const override
{
return AZ::IO::Path("EBus\\Handlers") / GetBusName();
}
void GenerateTranslationData() override
{
AZ::BehaviorContext* behaviorContext{};
AZ::ComponentApplicationBus::BroadcastResult(behaviorContext, &AZ::ComponentApplicationRequests::GetBehaviorContext);
auto behaviorEbus = behaviorContext->m_ebuses.find(m_busName.c_str());
ScriptCanvasEditorTools::TranslationGeneration translation;
translation.TranslateEBus(behaviorEbus->second);
}
private:
AZStd::string m_busName;
AZStd::string m_eventName;
@@ -82,16 +82,17 @@ namespace ScriptCanvasEditor
, m_isOverload(isOverload)
, m_propertyStatus(propertyStatus)
{
AZStd::string displayMethodName = TranslationHelper::GetKeyTranslation(TranslationContextGroup::ClassMethod, m_className.toUtf8().data(), m_methodName.toUtf8().data(), TranslationItemType::Node, TranslationKeyId::Name);
GraphCanvas::TranslationKey key;
key << "BehaviorClass" << className << "methods" << methodName << "details";
if (displayMethodName.empty())
{
SetName(m_methodName);
}
else
{
SetName(displayMethodName.c_str());
}
GraphCanvas::TranslationRequests::Details details;
details.m_name = methodName;
details.m_subtitle = className;
GraphCanvas::TranslationRequestBus::BroadcastResult(details, &GraphCanvas::TranslationRequests::GetDetails, key, details);
SetName(details.m_name.c_str());
SetToolTip(details.m_tooltip.c_str());
if (propertyStatus == ScriptCanvas::PropertyStatus::Getter)
{
@@ -102,13 +103,6 @@ namespace ScriptCanvasEditor
SetName(AZStd::string::format("Set %s", GetName().toUtf8().data()).data());
}
AZStd::string displayEventTooltip = TranslationHelper::GetKeyTranslation(TranslationContextGroup::ClassMethod, m_className.toUtf8().data(), m_methodName.toUtf8().data(), TranslationItemType::Node, TranslationKeyId::Tooltip);
if (!displayEventTooltip.empty())
{
SetToolTip(displayEventTooltip.c_str());
}
SetTitlePalette("MethodNodeTitlePalette");
}
@@ -230,9 +224,10 @@ namespace ScriptCanvasEditor
// CustomNodePaletteTreeItem
//////////////////////////////
CustomNodePaletteTreeItem::CustomNodePaletteTreeItem(const AZ::Uuid& typeId, AZStd::string_view nodeName)
: DraggableNodePaletteTreeItem(nodeName, ScriptCanvasEditor::AssetEditorId)
, m_typeId(typeId)
CustomNodePaletteTreeItem::CustomNodePaletteTreeItem(const ScriptCanvasEditor::CustomNodeModelInformation& info)
: DraggableNodePaletteTreeItem(info.m_displayName, ScriptCanvasEditor::AssetEditorId)
, m_info(info)
, m_typeId(info.m_typeId)
{
}
@@ -10,6 +10,9 @@
#include <GraphCanvas/Widgets/NodePalette/TreeItems/DraggableNodePaletteTreeItem.h>
#include "CreateNodeMimeEvent.h"
#include "NodePaletteModel.h"
#include <Source/Translation/TranslationBus.h>
#include "TranslationGeneration.h"
namespace ScriptCanvasEditor
{
@@ -56,6 +59,23 @@ namespace ScriptCanvasEditor
bool IsOverload() const;
ScriptCanvas::PropertyStatus GetPropertyStatus() const;
AZ::IO::Path GetTranslationDataPath() const override
{
return AZ::IO::Path("Classes") / GetClassMethodName();
}
void GenerateTranslationData() override
{
AZ::BehaviorContext* behaviorContext{};
AZ::ComponentApplicationBus::BroadcastResult(behaviorContext, &AZ::ComponentApplicationRequests::GetBehaviorContext);
const char* className = m_className.toUtf8().data();
auto behaviorClass = behaviorContext->m_classes.find(className);
ScriptCanvasEditorTools::TranslationGeneration translation;
translation.TranslateBehaviorClass(behaviorClass->second);
}
private:
bool m_isOverload = false;
QString m_className;
@@ -137,15 +157,31 @@ namespace ScriptCanvasEditor
AZ_CLASS_ALLOCATOR(CustomNodePaletteTreeItem, AZ::SystemAllocator, 0);
AZ_RTTI(CustomNodePaletteTreeItem, "{50E75C4D-F59C-4AF6-A6A3-5BAD557E335C}", GraphCanvas::DraggableNodePaletteTreeItem);
CustomNodePaletteTreeItem(const AZ::Uuid& typeId, AZStd::string_view nodeName);
explicit CustomNodePaletteTreeItem(const ScriptCanvasEditor::CustomNodeModelInformation&);
~CustomNodePaletteTreeItem() = default;
GraphCanvas::GraphCanvasMimeEvent* CreateMimeEvent() const override;
AZ::Uuid GetTypeId() const;
const ScriptCanvasEditor::CustomNodeModelInformation& GetInfo() const { return m_info; }
AZ::IO::Path GetTranslationDataPath() const override
{
AZStd::string filename = AZStd::string::format("%s_%s", GetInfo().m_categoryPath.c_str(), GetName().toUtf8().data());
filename = GraphCanvas::TranslationKey::Sanitize(filename);
return AZ::IO::Path("Nodes") / filename;
}
void GenerateTranslationData() override
{
ScriptCanvasEditorTools::TranslationGeneration translation;
translation.TranslateNode(m_typeId);
}
private:
AZ::Uuid m_typeId;
ScriptCanvasEditor::CustomNodeModelInformation m_info;
};
// </CustomNode>
@@ -32,6 +32,8 @@
#include <ScriptCanvas/Data/Traits.h>
AZ_DEFINE_BUDGET(NodePaletteModel);
namespace
{
// Various Helper Methods
@@ -82,11 +84,6 @@ namespace
return false;
}
bool MethodHasAttribute(const AZ::BehaviorMethod* method, AZ::Crc32 attribute)
{
return AZ::FindAttribute(attribute, method->m_attributes) != nullptr; // warning C4800: 'AZ::Attribute *': forcing value to bool 'true' or 'false' (performance warning)
}
// Checks for and returns the Category attribute from an AZ::AttributeArray
AZStd::string GetCategoryPath(const AZ::AttributeArray& attributes, const AZ::BehaviorContext& behaviorContext)
{
@@ -116,6 +113,9 @@ namespace
, ScriptCanvas::PropertyStatus propertyStatus
, bool isOverloaded)
{
AZ_PROFILE_SCOPE(NodePaletteModel, "RegisterMethod");
if (IsDeprecated(method.m_attributes))
{
return;
@@ -150,6 +150,9 @@ namespace
void RegisterGlobalMethod(ScriptCanvasEditor::NodePaletteModel& nodePaletteModel, const AZ::BehaviorContext& behaviorContext,
const AZ::BehaviorMethod& behaviorMethod)
{
AZ_PROFILE_SCOPE(NodePaletteModel, "RegisterGlobalMethod");
const auto isExposableOutcome = ScriptCanvas::IsExposable(behaviorMethod);
if (!isExposableOutcome.IsSuccess())
{
@@ -176,6 +179,8 @@ namespace
//! Retrieve the list of EBuses t hat should not be exposed in the ScriptCanvasEditor Node Palette
AZStd::unordered_set<AZ::Crc32> GetEBusExcludeSet(const AZ::BehaviorContext& behaviorContext)
{
AZ_PROFILE_SCOPE(NodePaletteModel, "GetEBusExcludeSet");
// We will skip buses that are ONLY registered on classes that derive from EditorComponentBase,
// because they don't have a runtime implementation. Buses such as the TransformComponent which
// is implemented by both an EditorComponentBase derived class and a Component derived class
@@ -252,6 +257,8 @@ namespace
void PopulateScriptCanvasDerivedNodes(ScriptCanvasEditor::NodePaletteModel& nodePaletteModel,
const AZ::SerializeContext& serializeContext)
{
AZ_PROFILE_SCOPE(NodePaletteModel, "PopulateScriptCanvasDerivedNodes");
// Get all the types.
auto EnumerateLibraryDefintionNodes = [&nodePaletteModel, &serializeContext](
const AZ::SerializeContext::ClassData* classData, const AZ::Uuid&) -> bool
@@ -333,6 +340,8 @@ namespace
void PopulateVariablePalette()
{
AZ_PROFILE_SCOPE(NodePaletteModel, "PopulateVariablePalette");
auto dataRegistry = ScriptCanvas::GetDataRegistry();
for (auto& type : dataRegistry->m_creatableTypes)
@@ -347,6 +356,8 @@ namespace
void PopulateBehaviorContextGlobalMethods(ScriptCanvasEditor::NodePaletteModel& nodePaletteModel,
const AZ::BehaviorContext& behaviorContext)
{
AZ_PROFILE_SCOPE(NodePaletteModel, "PopulateBehaviorContextGlobalMethods");
// BehaviorMethods are not associated with a class
// therefore the Uuid is set to Null
const AZ::Uuid behaviorMethodUuid = AZ::Uuid::CreateNull();
@@ -377,6 +388,8 @@ namespace
void PopulateBehaviorContextGlobalProperties(ScriptCanvasEditor::NodePaletteModel& nodePaletteModel,
const AZ::BehaviorContext& behaviorContext)
{
AZ_PROFILE_SCOPE(NodePaletteModel, "PopulateBehaviorContextGlobalProperties");
const AZ::Uuid behaviorMethodUuid = AZ::Uuid::CreateNull();
for (const auto& [propertyName, behaviorProperty] : behaviorContext.m_properties)
{
@@ -398,7 +411,7 @@ namespace
if (behaviorProperty->m_getter && !behaviorProperty->m_setter)
{
nodePaletteModel.RegisterGlobalConstant(behaviorContext, *behaviorProperty->m_getter);
nodePaletteModel.RegisterGlobalConstant(behaviorContext, behaviorProperty , *behaviorProperty->m_getter);
}
else
{
@@ -419,6 +432,8 @@ namespace
void PopulateBehaviorContextClassMethods(ScriptCanvasEditor::NodePaletteModel& nodePaletteModel,
const AZ::BehaviorContext& behaviorContext)
{
AZ_PROFILE_SCOPE(NodePaletteModel, "PopulateBehaviorContextClassMethods");
AZ::SerializeContext* serializeContext{};
AZ::ComponentApplicationBus::BroadcastResult(serializeContext, &AZ::ComponentApplicationRequests::GetSerializeContext);
@@ -456,21 +471,17 @@ namespace
{
AZStd::string categoryPath;
AZStd::string translationContext = ScriptCanvasEditor::TranslationHelper::GetContextName(ScriptCanvasEditor::TranslationContextGroup::ClassMethod, behaviorClass->m_name);
AZStd::string translationKey = ScriptCanvasEditor::TranslationHelper::GetClassKey(ScriptCanvasEditor::TranslationContextGroup::ClassMethod, behaviorClass->m_name, ScriptCanvasEditor::TranslationKeyId::Category);
AZStd::string translatedCategory = QCoreApplication::translate(translationContext.c_str(), translationKey.c_str()).toUtf8().data();
GraphCanvas::TranslationKey key;
key << "BehaviorClass" << behaviorClass->m_name.c_str() << "details";
if (translatedCategory != translationKey)
GraphCanvas::TranslationRequests::Details details;
GraphCanvas::TranslationRequestBus::BroadcastResult(details, &GraphCanvas::TranslationRequests::GetDetails, key, details);
categoryPath = details.m_category;
if (categoryPath.empty())
{
categoryPath = translatedCategory;
}
else
{
AZStd::string behaviorContextCategory = GetCategoryPath(behaviorClass->m_attributes, behaviorContext);
if (!behaviorContextCategory.empty())
{
categoryPath = behaviorContextCategory;
}
categoryPath = GetCategoryPath(behaviorClass->m_attributes, behaviorContext);
}
auto dataRegistry = ScriptCanvas::GetDataRegistry();
@@ -507,15 +518,13 @@ namespace
categoryPath.append("/");
AZStd::string displayName = ScriptCanvasEditor::TranslationHelper::GetClassKeyTranslation(ScriptCanvasEditor::TranslationContextGroup::ClassMethod, classIter.first, ScriptCanvasEditor::TranslationKeyId::Name);
if (displayName.empty())
if (details.m_name.empty())
{
categoryPath.append(classNamePretty.c_str());
}
else
{
categoryPath.append(displayName.c_str());
categoryPath.append(details.m_name.c_str());
}
for (auto property : behaviorClass->m_properties)
@@ -552,6 +561,9 @@ namespace
void PopulateBehaviorContextOverloadedMethods(ScriptCanvasEditor::NodePaletteModel& nodePaletteModel,
const AZ::BehaviorContext& behaviorContext)
{
AZ_PROFILE_SCOPE(NodePaletteModel, "PopulateBehaviorContextOverloadedMethods");
for (const AZ::ExplicitOverloadInfo& explicitOverload : behaviorContext.m_explicitOverloads)
{
RegisterMethod(nodePaletteModel, behaviorContext, explicitOverload.m_categoryPath, nullptr, explicitOverload.m_name, *explicitOverload.m_overloads.begin()->first, ScriptCanvas::PropertyStatus::None, true);
@@ -561,6 +573,8 @@ namespace
void PopulateBehaviorContextEBusHandler(ScriptCanvasEditor::NodePaletteModel& nodePaletteModel,
const AZ::BehaviorContext& behaviorContext, const AZ::BehaviorEBus& behaviorEbus)
{
AZ_PROFILE_SCOPE(NodePaletteModel, "PopulateBehaviorContextEBusHandler");
if (AZ::ScopedBehaviorEBusHandler handler{ behaviorEbus }; handler)
{
auto excludeEbusAttributeData = azdynamic_cast<const AZ::Edit::AttributeData<AZ::Script::Attributes::ExcludeFlags>*>(
@@ -573,32 +587,17 @@ namespace
const AZ::BehaviorEBusHandler::EventArray& events(handler->GetEvents());
if (!events.empty())
{
AZStd::string translationContext = ScriptCanvasEditor::TranslationHelper::GetContextName(ScriptCanvasEditor::TranslationContextGroup::EbusHandler, behaviorEbus.m_name);
AZStd::string categoryPath;
GraphCanvas::TranslationKey key;
key << "EBusHandler" << behaviorEbus.m_name.c_str() << "details";
GraphCanvas::TranslationRequests::Details details;
GraphCanvas::TranslationRequestBus::BroadcastResult(details, &GraphCanvas::TranslationRequests::GetDetails, key, details);
AZStd::string categoryPath = details.m_category.empty() ? GetCategoryPath(behaviorEbus.m_attributes, behaviorContext) : details.m_category;
// Treat the EBusHandler name as a Category key in order to allow multiple buses to be merged into a single Category.
{
AZStd::string translationKey = ScriptCanvasEditor::TranslationHelper::GetClassKey(ScriptCanvasEditor::TranslationContextGroup::EbusHandler, behaviorEbus.m_name, ScriptCanvasEditor::TranslationKeyId::Category);
AZStd::string translatedCategory = QCoreApplication::translate(translationContext.c_str(), translationKey.c_str()).toUtf8().data();
if (translatedCategory != translationKey)
{
categoryPath = translatedCategory;
}
else
{
AZStd::string behaviourContextCategory = GetCategoryPath(behaviorEbus.m_attributes, behaviorContext);
if (!behaviourContextCategory.empty())
{
categoryPath = behaviourContextCategory;
}
}
}
// Treat the EBusHandler name as a Category key in order to allow multiple busses to be merged into a single Category.
{
AZStd::string translationKey = ScriptCanvasEditor::TranslationHelper::GetClassKey(ScriptCanvasEditor::TranslationContextGroup::EbusHandler, behaviorEbus.m_name, ScriptCanvasEditor::TranslationKeyId::Name);
AZStd::string translatedName = QCoreApplication::translate(translationContext.c_str(), translationKey.c_str()).toUtf8().data();
if (!categoryPath.empty())
{
categoryPath.append("/");
@@ -608,9 +607,9 @@ namespace
categoryPath = "Other/";
}
if (translatedName != translationKey)
if (!details.m_name.empty())
{
categoryPath.append(translatedName.c_str());
categoryPath.append(details.m_name.c_str());
}
else
{
@@ -629,31 +628,22 @@ namespace
void PopulateBehaviorContextEBusEventMethods(ScriptCanvasEditor::NodePaletteModel& nodePaletteModel,
const AZ::BehaviorContext& behaviorContext, const AZ::BehaviorEBus& behaviorEbus)
{
AZ_PROFILE_SCOPE(NodePaletteModel, "PopulateBehaviorContextEBusEventMethods");
if (!behaviorEbus.m_events.empty())
{
AZStd::string categoryPath;
GraphCanvas::TranslationKey key;
key << "EBusSender" << behaviorEbus.m_name.c_str() << "details";
AZStd::string translationContext = ScriptCanvasEditor::TranslationHelper::GetContextName(ScriptCanvasEditor::TranslationContextGroup::EbusSender, behaviorEbus.m_name);
AZStd::string translationKey = ScriptCanvasEditor::TranslationHelper::GetClassKey(ScriptCanvasEditor::TranslationContextGroup::EbusSender, behaviorEbus.m_name, ScriptCanvasEditor::TranslationKeyId::Category);
AZStd::string translatedCategory = QCoreApplication::translate(translationContext.c_str(), translationKey.c_str()).toUtf8().data();
GraphCanvas::TranslationRequests::Details details;
GraphCanvas::TranslationRequestBus::BroadcastResult(details, &GraphCanvas::TranslationRequests::GetDetails, key, details);
if (translatedCategory != translationKey)
{
categoryPath = translatedCategory;
}
else
{
AZStd::string behaviourContextCategory = GetCategoryPath(behaviorEbus.m_attributes, behaviorContext);
if (!behaviourContextCategory.empty())
{
categoryPath = behaviourContextCategory;
}
}
AZStd::string categoryPath = details.m_category.empty() ? GetCategoryPath(behaviorEbus.m_attributes, behaviorContext) : details.m_category;
// Parent
AZStd::string displayName = ScriptCanvasEditor::TranslationHelper::GetClassKeyTranslation(ScriptCanvasEditor::TranslationContextGroup::EbusSender, behaviorEbus.m_name, ScriptCanvasEditor::TranslationKeyId::Name);
AZStd::string displayName = details.m_name;
// Treat the EBus name as a Category key in order to allow multiple busses to be merged into a single Category.
// Treat the EBus name as a Category key in order to allow multiple buses to be merged into a single Category.
if (!categoryPath.empty())
{
categoryPath.append("/");
@@ -663,18 +653,18 @@ namespace
categoryPath = "Other/";
}
if (displayName.empty())
if (!details.m_name.empty())
{
categoryPath.append(behaviorEbus.m_name.c_str());
categoryPath.append(details.m_name.c_str());
}
else
{
categoryPath.append(displayName.c_str());
categoryPath.append(behaviorEbus.m_name.c_str());
}
ScriptCanvasEditor::CategoryInformation ebusCategoryInformation;
ebusCategoryInformation.m_tooltip = ScriptCanvasEditor::TranslationHelper::GetClassKeyTranslation(ScriptCanvasEditor::TranslationContextGroup::EbusSender, behaviorEbus.m_name, ScriptCanvasEditor::TranslationKeyId::Tooltip);
ebusCategoryInformation.m_tooltip = details.m_tooltip;
nodePaletteModel.RegisterCategoryInformation(categoryPath, ebusCategoryInformation);
@@ -700,6 +690,7 @@ namespace
void PopulateBehaviorContextEBuses(ScriptCanvasEditor::NodePaletteModel& nodePaletteModel,
const AZ::BehaviorContext& behaviorContext)
{
AZ_PROFILE_SCOPE(NodePaletteModel, "PopulateBehaviorContextEBuses");
AZStd::unordered_set<AZ::Crc32> skipBuses = GetEBusExcludeSet(behaviorContext);
for (const auto& [ebusName, behaviorEbus] : behaviorContext.m_ebuses)
@@ -758,10 +749,13 @@ namespace
}
}
// Helper function for populating the node palette model.
// Pulled out just to make the tabbing a bit nicer, since it's a huge method.
void PopulateNodePaletteModel(ScriptCanvasEditor::NodePaletteModel& nodePaletteModel)
{
AZ_PROFILE_SCOPE(NodePaletteModel, "PopulateNodePaletteModel");
AZ::SerializeContext* serializeContext = nullptr;
AZ::ComponentApplicationBus::BroadcastResult(serializeContext, &AZ::ComponentApplicationRequests::GetSerializeContext);
@@ -791,8 +785,10 @@ namespace
// Populates the NodePalette with EBus Event method nodes and EBus Event handler nodes
PopulateBehaviorContextEBuses(nodePaletteModel, *behaviorContext);
// Populates the NodePalette with Methods reflected directly on the BehaviorContext
PopulateBehaviorContextGlobalMethods(nodePaletteModel, *behaviorContext);
// Populates the NodePalette with Properties reflected directly on the BehaviorContext
PopulateBehaviorContextGlobalProperties(nodePaletteModel, *behaviorContext);
}
@@ -895,6 +891,8 @@ namespace ScriptCanvasEditor
void NodePaletteModel::RegisterCustomNode(AZStd::string_view categoryPath, const AZ::Uuid& uuid, AZStd::string_view name, const AZ::SerializeContext::ClassData* classData)
{
AZ_PROFILE_SCOPE(NodePaletteModel, "NodePaletteModel::RegisterCustomNode");
ScriptCanvas::NodeTypeIdentifier nodeIdentifier = ScriptCanvas::NodeUtils::ConstructCustomNodeIdentifier(uuid);
auto mapIter = m_registeredNodes.find(nodeIdentifier);
@@ -905,47 +903,38 @@ namespace ScriptCanvasEditor
customNodeInformation->m_nodeIdentifier = nodeIdentifier;
customNodeInformation->m_typeId = uuid;
customNodeInformation->m_displayName = name;
customNodeInformation->m_categoryPath = categoryPath;
bool isDeprecated(false);
if (classData && classData->m_editData && classData->m_editData->m_name)
{
auto nodeContextName = ScriptCanvasEditor::Nodes::GetContextName(*classData);
auto contextName = ScriptCanvasEditor::TranslationHelper::GetContextName(ScriptCanvasEditor::TranslationContextGroup::ClassMethod, nodeContextName);
GraphCanvas::TranslationKey key;
key << "ScriptCanvas::Node" << classData->m_typeId.ToString<AZStd::string>().c_str() << "details";
GraphCanvas::TranslationKeyedString nodeKeyedString({}, contextName);
nodeKeyedString.m_key = ScriptCanvasEditor::TranslationHelper::GetKey(ScriptCanvasEditor::TranslationContextGroup::ClassMethod, nodeContextName, classData->m_editData->m_name, ScriptCanvasEditor::TranslationItemType::Node, ScriptCanvasEditor::TranslationKeyId::Name);
customNodeInformation->m_displayName = nodeKeyedString.GetDisplayString();
GraphCanvas::TranslationRequests::Details details;
GraphCanvas::TranslationRequestBus::BroadcastResult(details, &GraphCanvas::TranslationRequests::GetDetails, key, details);
GraphCanvas::TranslationKeyedString tooltipKeyedString(AZStd::string(), nodeKeyedString.m_context);
tooltipKeyedString.m_key = ScriptCanvasEditor::TranslationHelper::GetKey(ScriptCanvasEditor::TranslationContextGroup::ClassMethod, nodeContextName, classData->m_editData->m_name, ScriptCanvasEditor::TranslationItemType::Node, ScriptCanvasEditor::TranslationKeyId::Tooltip);
if (details.m_name.empty())
{
details.m_name = classData->m_editData->m_name;
details.m_tooltip = classData->m_editData->m_description;
}
customNodeInformation->m_toolTip = tooltipKeyedString.GetDisplayString();
customNodeInformation->m_displayName = details.m_name;
customNodeInformation->m_toolTip = details.m_tooltip;
if (!details.m_category.empty())
{
customNodeInformation->m_categoryPath = details.m_category;
}
if (customNodeInformation->m_displayName.empty())
{
customNodeInformation->m_displayName = classData->m_editData->m_name;
}
GraphCanvas::TranslationKeyedString categoryKeyedString(ScriptCanvasEditor::Nodes::GetCategoryName(*classData), nodeKeyedString.m_context);
categoryKeyedString.m_key = ScriptCanvasEditor::TranslationHelper::GetKey(ScriptCanvasEditor::TranslationContextGroup::ClassMethod, nodeContextName, classData->m_editData->m_name, ScriptCanvasEditor::TranslationItemType::Node, ScriptCanvasEditor::TranslationKeyId::Category);
customNodeInformation->m_categoryPath = categoryKeyedString.GetDisplayString();
if (customNodeInformation->m_categoryPath.empty())
{
if (contextName.empty())
{
customNodeInformation->m_categoryPath = categoryPath;
}
else
{
customNodeInformation->m_categoryPath = contextName;
}
}
auto editorDataElement = classData->m_editData->FindElementData(AZ::Edit::ClassElements::EditorData);
if (editorDataElement)
@@ -1003,11 +992,13 @@ namespace ScriptCanvasEditor
( const AZStd::string& categoryPath
, const AZStd::string& methodClass
, const AZStd::string& methodName
, const AZ::BehaviorMethod* behaviorMethod
, const AZ::BehaviorContext* behaviorContext
, const AZ::BehaviorMethod*
, const AZ::BehaviorContext*
, ScriptCanvas::PropertyStatus propertyStatus
, bool isOverload)
{
AZ_PROFILE_SCOPE(NodePaletteModel, "NodePaletteModel::RegisterClassNode");
ScriptCanvas::NodeTypeIdentifier nodeIdentifier = isOverload ? ScriptCanvas::NodeUtils::ConstructMethodOverloadedNodeIdentifier(methodName) : ScriptCanvas::NodeUtils::ConstructMethodNodeIdentifier(methodClass, methodName, propertyStatus);
auto registerIter = m_registeredNodes.find(nodeIdentifier);
@@ -1022,44 +1013,34 @@ namespace ScriptCanvasEditor
methodModelInformation->m_propertyStatus = propertyStatus;
methodModelInformation->m_titlePaletteOverride = "MethodNodeTitlePalette";
methodModelInformation->m_displayName = TranslationHelper::GetKeyTranslation(TranslationContextGroup::ClassMethod, methodClass.c_str(), methodName.c_str(), TranslationItemType::Node, TranslationKeyId::Name);
GraphCanvas::TranslationKey catkey;
catkey << "BehaviorClass" << methodClass.c_str() << "details";
GraphCanvas::TranslationRequests::Details catdetails;
GraphCanvas::TranslationRequestBus::BroadcastResult(catdetails, &GraphCanvas::TranslationRequests::GetDetails, catkey, catdetails);
if (methodModelInformation->m_displayName.empty())
{
methodModelInformation->m_displayName = methodName;
}
GraphCanvas::TranslationKey key;
key << "BehaviorClass" << methodClass.c_str() << "methods" << methodName.c_str() << "details";
methodModelInformation->m_toolTip = TranslationHelper::GetKeyTranslation(TranslationContextGroup::ClassMethod, methodClass.c_str(), methodName.c_str(), TranslationItemType::Node, TranslationKeyId::Tooltip);
GraphCanvas::TranslationRequests::Details details;
GraphCanvas::TranslationRequestBus::BroadcastResult(details, &GraphCanvas::TranslationRequests::GetDetails, key, details);
GraphCanvas::TranslationKeyedString methodCategoryString;
methodCategoryString.m_context = ScriptCanvasEditor::TranslationHelper::GetContextName(ScriptCanvasEditor::TranslationContextGroup::ClassMethod, methodClass.c_str());
methodCategoryString.m_key = ScriptCanvasEditor::TranslationHelper::GetKey(ScriptCanvasEditor::TranslationContextGroup::ClassMethod, methodClass.c_str(), methodName.c_str(), ScriptCanvasEditor::TranslationItemType::Node, ScriptCanvasEditor::TranslationKeyId::Category);
methodModelInformation->m_categoryPath = methodCategoryString.GetDisplayString();
methodModelInformation->m_displayName = details.m_name.empty() ? methodName : details.m_name;
methodModelInformation->m_toolTip = details.m_tooltip;
methodModelInformation->m_categoryPath = categoryPath;
if (methodModelInformation->m_categoryPath.empty())
{
if (!MethodHasAttribute(behaviorMethod, AZ::ScriptCanvasAttributes::FloatingFunction))
{
methodModelInformation->m_categoryPath = categoryPath;
}
else if (MethodHasAttribute(behaviorMethod, AZ::Script::Attributes::Category))
{
methodModelInformation->m_categoryPath = GetCategoryPath(behaviorMethod->m_attributes, (*behaviorContext));
}
if (methodModelInformation->m_categoryPath.empty())
{
methodModelInformation->m_categoryPath = "Other";
}
methodModelInformation->m_categoryPath = "Other";
}
m_registeredNodes.emplace(AZStd::make_pair(nodeIdentifier, methodModelInformation));
}
}
void NodePaletteModel::RegisterGlobalConstant(const AZ::BehaviorContext& behaviorContext, const AZ::BehaviorMethod& behaviorMethod)
void NodePaletteModel::RegisterGlobalConstant(const AZ::BehaviorContext&, const AZ::BehaviorProperty* behaviorProperty, const AZ::BehaviorMethod& behaviorMethod)
{
AZ_PROFILE_SCOPE(NodePaletteModel, "NodePaletteModel::RegisterGlobalConstant");
// Construct Node Identifier using the BehaviorMethod name and the ScriptCanvas Method typeid
ScriptCanvas::NodeTypeIdentifier nodeIdentifier =
ScriptCanvas::NodeUtils::ConstructGlobalMethodNodeIdentifier(behaviorMethod.m_name);
@@ -1073,35 +1054,29 @@ namespace ScriptCanvasEditor
methodModelInformation->m_titlePaletteOverride = "MethodNodeTitlePalette";
methodModelInformation->m_displayName = TranslationHelper::GetGlobalMethodKeyTranslation(methodModelInformation->m_methodName,
TranslationItemType::Node, TranslationKeyId::Name);
methodModelInformation->m_toolTip = TranslationHelper::GetGlobalMethodKeyTranslation(methodModelInformation->m_methodName,
TranslationItemType::Node, TranslationKeyId::Tooltip);
methodModelInformation->m_categoryPath = TranslationHelper::GetGlobalMethodKeyTranslation(methodModelInformation->m_methodName,
TranslationItemType::Node, TranslationKeyId::Category);
GraphCanvas::TranslationKey key;
key << "Constant" << behaviorProperty->m_name.c_str() << "details";
if (methodModelInformation->m_displayName.empty())
{
methodModelInformation->m_displayName = methodModelInformation->m_methodName;
}
GraphCanvas::TranslationRequests::Details details;
GraphCanvas::TranslationRequestBus::BroadcastResult(details, &GraphCanvas::TranslationRequests::GetDetails, key, details);
methodModelInformation->m_displayName = details.m_name;
methodModelInformation->m_toolTip = details.m_tooltip;
methodModelInformation->m_categoryPath = details.m_category;
if (methodModelInformation->m_categoryPath.empty())
{
methodModelInformation->m_categoryPath = GetCategoryPath(behaviorMethod.m_attributes, behaviorContext);
// Default to making the Category for Global Methods to be informative that the method
// is registered with the Behavior Context
if (methodModelInformation->m_categoryPath.empty())
{
methodModelInformation->m_categoryPath = "Constants";
}
methodModelInformation->m_categoryPath = "Constants";
}
m_registeredNodes.emplace(nodeIdentifier, methodModelInformation.release());
}
}
void NodePaletteModel::RegisterMethodNode(const AZ::BehaviorContext& behaviorContext, const AZ::BehaviorMethod& behaviorMethod)
void NodePaletteModel::RegisterMethodNode(const AZ::BehaviorContext&, const AZ::BehaviorMethod& behaviorMethod)
{
AZ_PROFILE_SCOPE(NodePaletteModel, "NodePaletteModel::RegisterMethodNode");
// Construct Node Identifier using the BehaviorMethod name and the ScriptCanvas Method typeid
ScriptCanvas::NodeTypeIdentifier nodeIdentifier =
ScriptCanvas::NodeUtils::ConstructGlobalMethodNodeIdentifier(behaviorMethod.m_name);
@@ -1112,31 +1087,17 @@ namespace ScriptCanvasEditor
auto methodModelInformation = AZStd::make_unique<GlobalMethodNodeModelInformation>();
methodModelInformation->m_methodName = behaviorMethod.m_name;
methodModelInformation->m_nodeIdentifier = nodeIdentifier;
methodModelInformation->m_titlePaletteOverride = "MethodNodeTitlePalette";
methodModelInformation->m_displayName = TranslationHelper::GetGlobalMethodKeyTranslation(methodModelInformation->m_methodName,
TranslationItemType::Node, TranslationKeyId::Name);
methodModelInformation->m_toolTip = TranslationHelper::GetGlobalMethodKeyTranslation(methodModelInformation->m_methodName,
TranslationItemType::Node, TranslationKeyId::Tooltip);
methodModelInformation->m_categoryPath = TranslationHelper::GetGlobalMethodKeyTranslation(methodModelInformation->m_methodName,
TranslationItemType::Node, TranslationKeyId::Category);
GraphCanvas::TranslationKey key;
key << "BehaviorMethod" << behaviorMethod.m_name.c_str() << "details";
if (methodModelInformation->m_displayName.empty())
{
methodModelInformation->m_displayName = methodModelInformation->m_methodName;
}
GraphCanvas::TranslationRequests::Details details;
GraphCanvas::TranslationRequestBus::BroadcastResult(details, &GraphCanvas::TranslationRequests::GetDetails, key, details);
if (methodModelInformation->m_categoryPath.empty())
{
methodModelInformation->m_categoryPath = GetCategoryPath(behaviorMethod.m_attributes, behaviorContext);
// Default to making the Category for Global Methods to be informative that the method
// is registered with the Behavior Context
if (methodModelInformation->m_categoryPath.empty())
{
methodModelInformation->m_categoryPath = "Behavior Context: Global Methods";
}
}
methodModelInformation->m_displayName = details.m_name.empty() ? behaviorMethod.m_name : details.m_name;
methodModelInformation->m_toolTip = details.m_tooltip.empty() ? "" : details.m_tooltip;
methodModelInformation->m_categoryPath = details.m_category.empty() ? "Behavior Context: Global Methods" : details.m_category;
m_registeredNodes.emplace(nodeIdentifier, methodModelInformation.release());
}
@@ -1144,6 +1105,8 @@ namespace ScriptCanvasEditor
void NodePaletteModel::RegisterEBusHandlerNodeModelInformation(AZStd::string_view categoryPath, AZStd::string_view busName, AZStd::string_view eventName, const ScriptCanvas::EBusBusId& busId, const AZ::BehaviorEBusHandler::BusForwarderEvent& forwardEvent)
{
AZ_PROFILE_SCOPE(NodePaletteModel, "NodePaletteModel::RegisterEBusHandlerNodeModelInformation");
ScriptCanvas::NodeTypeIdentifier nodeIdentifier = ScriptCanvas::NodeUtils::ConstructEBusEventReceiverIdentifier(busId, forwardEvent.m_eventId);
auto nodeIter = m_registeredNodes.find(nodeIdentifier);
@@ -1161,18 +1124,14 @@ namespace ScriptCanvasEditor
handlerInformation->m_busId = busId;
handlerInformation->m_eventId = forwardEvent.m_eventId;
AZStd::string displayEventName = TranslationHelper::GetKeyTranslation(TranslationContextGroup::EbusHandler, busName.data(), eventName.data(), TranslationItemType::Node, TranslationKeyId::Name);
GraphCanvas::TranslationKey key;
key << "EBusHandler" << busName << "methods" << eventName << "details";
if (displayEventName.empty())
{
handlerInformation->m_displayName = eventName;
}
else
{
handlerInformation->m_displayName = displayEventName;
}
GraphCanvas::TranslationRequests::Details details;
GraphCanvas::TranslationRequestBus::BroadcastResult(details, &GraphCanvas::TranslationRequests::GetDetails, key, details);
handlerInformation->m_toolTip = TranslationHelper::GetKeyTranslation(TranslationContextGroup::EbusHandler, busName.data(), eventName.data(), TranslationItemType::Node, TranslationKeyId::Tooltip);
handlerInformation->m_displayName = details.m_name.empty() ? eventName : details.m_name.c_str();
handlerInformation->m_toolTip = details.m_tooltip.empty() ? "" : details.m_tooltip;
m_registeredNodes.emplace(AZStd::make_pair(nodeIdentifier, handlerInformation));
}
@@ -1188,6 +1147,8 @@ namespace ScriptCanvasEditor
, ScriptCanvas::PropertyStatus propertyStatus
, bool isOverload)
{
AZ_PROFILE_SCOPE(NodePaletteModel, "NodePaletteModel::RegisterEBusSenderNodeModelInformation");
ScriptCanvas::NodeTypeIdentifier nodeIdentifier = isOverload ? ScriptCanvas::NodeUtils::ConstructEBusEventSenderOverloadedIdentifier(busId, eventId) : ScriptCanvas::NodeUtils::ConstructEBusEventSenderIdentifier(busId, eventId);
auto nodeIter = m_registeredNodes.find(nodeIdentifier);
@@ -1207,18 +1168,14 @@ namespace ScriptCanvasEditor
senderInformation->m_busId = busId;
senderInformation->m_eventId = eventId;
AZStd::string displayEventName = TranslationHelper::GetKeyTranslation(TranslationContextGroup::EbusSender, busName.data(), eventName.data(), TranslationItemType::Node, TranslationKeyId::Name);
GraphCanvas::TranslationKey key;
key << "EBusSender" << busName << "methods" << eventName << "details";
if (displayEventName.empty())
{
senderInformation->m_displayName = eventName;
}
else
{
senderInformation->m_displayName = displayEventName;
}
GraphCanvas::TranslationRequests::Details details;
GraphCanvas::TranslationRequestBus::BroadcastResult(details, &GraphCanvas::TranslationRequests::GetDetails, key, details);
senderInformation->m_toolTip = TranslationHelper::GetKeyTranslation(TranslationContextGroup::EbusSender, busName.data(), eventName.data(), TranslationItemType::Node, TranslationKeyId::Tooltip);
senderInformation->m_displayName = details.m_name.empty() ? eventName : details.m_name.c_str();
senderInformation->m_toolTip = details.m_tooltip.empty() ? "" : details.m_tooltip;
m_registeredNodes.emplace(AZStd::make_pair(nodeIdentifier, senderInformation));
}
@@ -1226,6 +1183,8 @@ namespace ScriptCanvasEditor
AZStd::vector<ScriptCanvas::NodeTypeIdentifier> NodePaletteModel::RegisterScriptEvent(ScriptEvents::ScriptEventsAsset* scriptEventAsset)
{
AZ_PROFILE_SCOPE(NodePaletteModel, "NodePaletteModel::RegisterScriptEvent");
const ScriptEvents::ScriptEvent& scriptEvent = scriptEventAsset->m_definition;
ScriptCanvas::EBusBusId busId = scriptEventAsset->GetBusId();
@@ -1236,7 +1195,7 @@ namespace ScriptCanvasEditor
AZStd::vector<ScriptCanvas::NodeTypeIdentifier> identifiers;
// Each event has a handler and a reciever
// Each event has a handler and a receiver
identifiers.reserve(methods.size() * 2);
for (const auto& method : methods)
@@ -1444,6 +1403,8 @@ namespace ScriptCanvasEditor
AZStd::vector<ScriptCanvas::NodeTypeIdentifier> NodePaletteModel::ProcessAsset(AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry)
{
AZ_PROFILE_SCOPE(NodePaletteModel, "NodePaletteModel::RegisterScriptEvent");
AZStd::lock_guard<AZStd::recursive_mutex> myLocker(m_mutex);
if (entry)
@@ -80,7 +80,8 @@ namespace ScriptCanvasEditor
void RegisterCustomNode(AZStd::string_view categoryPath, const AZ::Uuid& uuid, AZStd::string_view name, const AZ::SerializeContext::ClassData* classData);
void RegisterClassNode(const AZStd::string& categoryPath, const AZStd::string& methodClass, const AZStd::string& methodName, const AZ::BehaviorMethod* behaviorMethod, const AZ::BehaviorContext* behaviorContext, ScriptCanvas::PropertyStatus propertyStatus, bool isOverload);
void RegisterMethodNode(const AZ::BehaviorContext& behaviorContext, const AZ::BehaviorMethod& behaviorMethod);
void RegisterGlobalConstant(const AZ::BehaviorContext& behaviorContext, const AZ::BehaviorMethod& behaviorMethod);
void RegisterGlobalConstant(const AZ::BehaviorContext& behaviorContext, const AZ::BehaviorProperty* behaviorProperty, const AZ::BehaviorMethod& behaviorMethod);
void RegisterEBusHandlerNodeModelInformation(AZStd::string_view categoryPath, AZStd::string_view busName, AZStd::string_view eventName, const ScriptCanvas::EBusBusId& busId, const AZ::BehaviorEBusHandler::BusForwarderEvent& forwardEvent);
void RegisterEBusSenderNodeModelInformation(AZStd::string_view categoryPath, AZStd::string_view busName, AZStd::string_view eventName, const ScriptCanvas::EBusBusId& busId, const ScriptCanvas::EBusEventId& eventId, const AZ::BehaviorEBusEventSender& eventSender, ScriptCanvas::PropertyStatus propertyStatus, bool isOverload);
@@ -63,6 +63,7 @@
#include <ScriptCanvas/Libraries/Libraries.h>
#include <ScriptCanvas/Utils/NodeUtils.h>
#include <ScriptEvents/ScriptEventsAsset.h>
#include "AzQtComponents/Utilities/DesktopUtilities.h"
namespace ScriptCanvasEditor
{
@@ -99,7 +100,7 @@ namespace ScriptCanvasEditor
if (auto customModelInformation = azrtti_cast<const CustomNodeModelInformation*>(modelInformation))
{
createdItem = parentItem->CreateChildNode<CustomNodePaletteTreeItem>(customModelInformation->m_typeId, customModelInformation->m_displayName);
createdItem = parentItem->CreateChildNode<CustomNodePaletteTreeItem>(*customModelInformation);
createdItem->SetToolTip(QString(customModelInformation->m_toolTip.c_str()));
}
else if (auto methodNodeModelInformation = azrtti_cast<const MethodNodeModelInformation*>(modelInformation))
@@ -660,6 +661,11 @@ namespace ScriptCanvasEditor
, m_previousCycleAction(nullptr)
, m_ignoreSelectionChanged(false)
{
GraphCanvas::NodePaletteTreeView* treeView = GetTreeView();
treeView->setContextMenuPolicy(Qt::ContextMenuPolicy::ActionsContextMenu);
if (!paletteConfig.m_isInContextMenu)
{
QMenu* creationMenu = new QMenu();
@@ -677,10 +683,11 @@ namespace ScriptCanvasEditor
AddSearchCustomizationWidget(m_newCustomEvent);
GraphCanvas::NodePaletteTreeView* treeView = GetTreeView();
{
m_nextCycleAction = new QAction(treeView);
m_nextCycleAction->setText(tr("Next Instance in Graph"));
m_nextCycleAction->setShortcut(QKeySequence(Qt::Key_F8));
treeView->addAction(m_nextCycleAction);
@@ -690,6 +697,7 @@ namespace ScriptCanvasEditor
{
m_previousCycleAction = new QAction(treeView);
m_previousCycleAction->setText(tr("Previous Instance in Graph"));
m_previousCycleAction->setShortcut(QKeySequence(Qt::Key_F7));
treeView->addAction(m_previousCycleAction);
@@ -699,6 +707,23 @@ namespace ScriptCanvasEditor
QObject::connect(treeView->selectionModel(), &QItemSelectionModel::selectionChanged, this, &NodePaletteDockWidget::OnTreeSelectionChanged);
QObject::connect(treeView, &GraphCanvas::NodePaletteTreeView::OnTreeItemDoubleClicked, this, &NodePaletteDockWidget::HandleTreeItemDoubleClicked);
{
m_openTranslationData = new QAction(treeView);
m_openTranslationData->setText("Open Translation Data");
treeView->addAction(m_openTranslationData);
QObject::connect(m_openTranslationData, &QAction::triggered, this, &NodePaletteDockWidget::OpenTranslationData);
}
{
m_generateTranslation = new QAction(treeView);
m_generateTranslation->setText("Generate Translation");
treeView->addAction(m_generateTranslation);
QObject::connect(m_generateTranslation, &QAction::triggered, this, &NodePaletteDockWidget::GenerateTranslation);
}
}
ConfigureSearchCustomizationMargins(QMargins(0, 0, 0, 0), 0);
@@ -781,6 +806,7 @@ namespace ScriptCanvasEditor
{
m_nextCycleAction->setEnabled(true);
m_previousCycleAction->setEnabled(true);
m_openTranslationData->setEnabled(true);
}
}
@@ -793,6 +819,7 @@ namespace ScriptCanvasEditor
{
m_nextCycleAction->setEnabled(false);
m_previousCycleAction->setEnabled(false);
m_openTranslationData->setEnabled(false);
}
}
@@ -816,6 +843,84 @@ namespace ScriptCanvasEditor
CycleToNextNode();
}
static AZStd::string GetGemPath(const AZStd::string& gemName)
{
if (auto settingsRegistry = AZ::Interface<AZ::SettingsRegistryInterface>::Get(); settingsRegistry != nullptr)
{
AZ::IO::Path gemSourceAssetDirectories;
AZStd::vector<AzFramework::GemInfo> gemInfos;
if (AzFramework::GetGemsInfo(gemInfos, *settingsRegistry))
{
auto FindGemByName = [gemName](const AzFramework::GemInfo& gemInfo)
{
return gemInfo.m_gemName == gemName;
};
// Gather unique list of Gem Paths from the Settings Registry
auto foundIt = AZStd::find_if(gemInfos.begin(), gemInfos.end(), FindGemByName);
if (foundIt != gemInfos.end())
{
const AzFramework::GemInfo& gemInfo = *foundIt;
for (const AZ::IO::Path& absoluteSourcePath : gemInfo.m_absoluteSourcePaths)
{
gemSourceAssetDirectories = (absoluteSourcePath / gemInfo.GetGemAssetFolder());
}
return gemSourceAssetDirectories.c_str();
}
}
}
return "";
}
void NodePaletteDockWidget::GenerateTranslation()
{
QModelIndexList indexList = GetTreeView()->selectionModel()->selectedRows();
if (indexList.size() == 1)
{
QSortFilterProxyModel* filterModel = static_cast<QSortFilterProxyModel*>(GetTreeView()->model());
for (const QModelIndex& index : indexList)
{
QModelIndex sourceIndex = filterModel->mapToSource(index);
GraphCanvas::NodePaletteTreeItem* nodePaletteItem = static_cast<GraphCanvas::NodePaletteTreeItem*>(sourceIndex.internalPointer());
nodePaletteItem->GenerateTranslationData();
}
}
}
void NodePaletteDockWidget::OpenTranslationData()
{
QModelIndexList indexList = GetTreeView()->selectionModel()->selectedRows();
if (indexList.size() == 1)
{
QSortFilterProxyModel* filterModel = static_cast<QSortFilterProxyModel*>(GetTreeView()->model());
for (const QModelIndex& index : indexList)
{
QModelIndex sourceIndex = filterModel->mapToSource(index);
GraphCanvas::NodePaletteTreeItem* nodePaletteItem = static_cast<GraphCanvas::NodePaletteTreeItem*>(sourceIndex.internalPointer());
if (nodePaletteItem)
{
AZ::IO::Path gemPath = GetGemPath("ScriptCanvas.Editor");
gemPath = gemPath / AZ::IO::Path("TranslationAssets");
gemPath = gemPath / nodePaletteItem->GetTranslationDataPath();
gemPath.ReplaceExtension(".names");
AZ::IO::FileIOBase* fileIO = AZ::IO::FileIOBase::GetInstance();
if (fileIO->Exists(gemPath.c_str()))
{
AzQtComponents::ShowFileOnDesktop(gemPath.c_str());
}
}
}
}
}
void NodePaletteDockWidget::ConfigureHelper()
{
if (!m_cyclingHelper.IsConfigured() && !m_cyclingIdentifiers.empty())
@@ -193,8 +193,6 @@ namespace ScriptCanvasEditor
void OnSelectionChanged() override;
////
protected:
GraphCanvas::GraphCanvasTreeItem* CreatePaletteRoot() const override;
@@ -209,6 +207,8 @@ namespace ScriptCanvasEditor
private:
void HandleTreeItemDoubleClicked(GraphCanvas::GraphCanvasTreeItem* treeItem);
void OpenTranslationData();
void GenerateTranslation();
void ConfigureHelper();
void ParseCycleTargets(GraphCanvas::GraphCanvasTreeItem* treeItem);
@@ -225,6 +225,10 @@ namespace ScriptCanvasEditor
QAction* m_previousCycleAction;
bool m_ignoreSelectionChanged;
QMenu* m_contextMenu;
QAction* m_openTranslationData;
QAction* m_generateTranslation;
};
}
}
@@ -52,6 +52,7 @@
#include <ScriptCanvas/Data/DataRegistry.h>
#include <ScriptCanvas/GraphCanvas/NodeDescriptorBus.h>
#include <ScriptCanvas/Asset/RuntimeAsset.h>
#include "GraphCanvas/Components/Slots/Data/DataSlotBus.h"
namespace ScriptCanvasEditor
{
@@ -886,6 +887,7 @@ namespace ScriptCanvasEditor
ScriptCanvas::NodeRequestBus::EventResult(removedReferences, memberPair.m_scriptCanvasId, &ScriptCanvas::NodeRequests::RemoveVariableReferences, variableIds);
// If we didn't remove the references. Just delete the node.
if (!removedReferences)
{
@@ -113,16 +113,14 @@ namespace ScriptCanvasEditor
actionItem.m_name = QString(eventConfigurations[i].m_eventName.c_str());
actionItem.m_eventId = eventConfigurations[i].m_eventId;
AZStd::string translatedName = TranslationHelper::GetKeyTranslation(TranslationContextGroup::EbusHandler, m_busName, eventConfigurations[i].m_eventName, TranslationItemType::Node, TranslationKeyId::Name);
GraphCanvas::TranslationKey key;
key << "EBusHandler" << m_busName.c_str() << "methods" << eventConfigurations[i].m_eventName << "details";
if (translatedName.empty())
{
actionItem.m_displayName = actionItem.m_name;
}
else
{
actionItem.m_displayName = QString(translatedName.c_str());
}
GraphCanvas::TranslationRequests::Details details;
details.m_name = actionItem.m_name.toUtf8().data();
GraphCanvas::TranslationRequestBus::BroadcastResult(details, &GraphCanvas::TranslationRequests::GetDetails, key, details);
actionItem.m_displayName = QString(details.m_name.c_str());
actionItem.m_index = i;
@@ -13,6 +13,7 @@
#include <ScriptCanvas/Core/Contracts/MethodOverloadContract.h>
#include <ScriptCanvas/Libraries/Core/Method.h>
#include "../../GraphCanvas/Code/Source/Translation/TranslationBus.h"
namespace ScriptCanvas
{
@@ -55,7 +56,19 @@ namespace ScriptCanvas
{
const Data::Type outputType = (unpackedTypes.size() == 1 && AZ::BehaviorContextHelper::IsStringParameter(*result)) ? Data::Type::String() : Data::FromAZType(unpackedTypes[resultIndex]);
const AZStd::string resultSlotName(AZStd::string::format("Result: %s", Data::GetName(outputType).data()));
AZStd::string resultSlotName(AZStd::string::format("Result: %s", Data::GetName(outputType).data()));
GraphCanvas::TranslationKey key;
key << "BehaviorClass" << *outputConfig.config.m_className << "methods" << *outputConfig.config.m_lookupName << "results" << resultIndex << "details";
GraphCanvas::TranslationRequests::Details details;
GraphCanvas::TranslationRequestBus::BroadcastResult(details, &GraphCanvas::TranslationRequests::GetDetails, key, details);
if (!details.m_name.empty())
{
resultSlotName = details.m_name;
}
SlotId addedSlotId;
if (outputConfig.isReturnValueOverloaded)
@@ -1160,8 +1160,8 @@ namespace ScriptCanvas
if (!slot->IsDynamicSlot() || slot->HasDisplayType())
{
InitializeVariableReference((*slot), {});
}
}
}
}
else
{
ModifiableDatumView datumView;
@@ -2391,7 +2391,8 @@ namespace ScriptCanvas
if (variableIds.count(variableId) > 0)
{
InitializeVariableReference(slot, variableIds);
slot.ClearVariableReference();
NodeNotificationsBus::Event(GetEntityId(), &NodeNotifications::OnSlotInputChanged, slot.GetId());
}
}
@@ -886,6 +886,8 @@ protected:
// The SlotIterator& parameter is populated with an iterator to the inserted or found slot within the slot list
AZ::Outcome<SlotIdIteratorMap::iterator, AZStd::string> FindOrInsertSlot(AZ::s64 index, const SlotConfiguration& slotConfig, SlotIterator& iterOut);
public:
// This function is only called once, when the node is added to a graph, as opposed to Init(), which will be called
// soon after construction, or after deserialization. So the functionality in configure does not need to be idempotent.
void Configure();
@@ -94,7 +94,7 @@ namespace ScriptCanvas
}\
\
static const char* GetDependency() { return CATEGORY; }\
static const char* GetCategory() { if (ISDEPRECATED) return AZ_STRINGIZE(CATEGORY /Deprecated); else return CATEGORY; };\
static const char* GetCategory() { if (IsDeprecated()) return "Deprecated"; else return CATEGORY; };\
static const char* GetDescription() { return DESCRIPTION; };\
static const char* GetNodeName() { return #NODE_NAME; };\
static bool IsDeprecated() { return ISDEPRECATED; };\
@@ -25,6 +25,7 @@ namespace ScriptCanvas
GetterFunction m_getterFunction;
Data::Type m_propertyType;
AZStd::string m_propertyName;
AZStd::string m_displayName;
};
using GetterContainer = AZStd::unordered_map<AZStd::string, GetterWrapper>;
@@ -35,6 +36,7 @@ namespace ScriptCanvas
SetterFunction m_setterFunction;
Data::Type m_propertyType;
AZStd::string m_propertyName;
AZStd::string m_displayName;
};
using SetterContainer = AZStd::unordered_map<AZStd::string, SetterWrapper>;
@@ -84,7 +86,7 @@ namespace ScriptCanvas
using PropertyType = AZStd::decay_t<AZStd::invoke_result_t<FunctionType, GetterType>>;
static_assert(!AZStd::is_void<PropertyType>::value, "Getter function must return a non-void type");
static GetterWrapper Callback(AZStd::string_view propertyName, const FunctionType& propertyGetter)
static GetterWrapper Callback(AZStd::string_view propertyName, const FunctionType& propertyGetter, AZStd::string_view displayName)
{
GetterFunction getterWrapper = [propertyGetter](const Datum& thisDatum) -> AZ::Outcome<Datum, AZStd::string>
{
@@ -97,7 +99,7 @@ namespace ScriptCanvas
return AZ::Success(Datum(AZStd::invoke(propertyGetter, thisObject)));
};
return { getterWrapper, Data::FromAZType<PropertyType>(), propertyName };
return { getterWrapper, Data::FromAZType<PropertyType>(), propertyName, displayName };
}
};
@@ -107,7 +109,7 @@ namespace ScriptCanvas
static_assert(!AZStd::is_void<SetterType>::value, "Setter function must be either a member function pointer that accepts 1 arguments or an invokable object that accepts 2 argument");
static_assert(!AZStd::is_void<PropertyType>::value, "Property being set must be a non-void type");
static SetterWrapper Callback(AZStd::string_view propertyName, const FunctionType& propertySetter)
static SetterWrapper Callback(AZStd::string_view propertyName, const FunctionType& propertySetter, AZStd::string_view displayName)
{
SetterFunction setterWrapper = [propertySetter](Datum& thisDatum, const Datum& propertyDatum) -> AZ::Outcome<void, AZStd::string>
{
@@ -128,7 +130,7 @@ namespace ScriptCanvas
return AZ::Success();
};
return { setterWrapper, Data::FromAZType<PropertyType>(), propertyName };
return { setterWrapper, Data::FromAZType<PropertyType>(), propertyName, displayName };
}
};
}
@@ -178,20 +180,20 @@ namespace ScriptCanvas
static GetterContainer GetGetterWrappers(const Data::Type&)
{
GetterContainer getterFunctions;
getterFunctions.emplace("x", WrapGetter<decltype(&Data::QuaternionType::GetX)>::Callback("x", &Data::QuaternionType::GetX));
getterFunctions.emplace("y", WrapGetter<decltype(&Data::QuaternionType::GetY)>::Callback("y", &Data::QuaternionType::GetY));
getterFunctions.emplace("z", WrapGetter<decltype(&Data::QuaternionType::GetZ)>::Callback("z", &Data::QuaternionType::GetZ));
getterFunctions.emplace("w", WrapGetter<decltype(&Data::QuaternionType::GetW)>::Callback("w", &Data::QuaternionType::GetW));
getterFunctions.emplace("x", WrapGetter<decltype(&Data::QuaternionType::GetX)>::Callback("x", &Data::QuaternionType::GetX, "X"));
getterFunctions.emplace("y", WrapGetter<decltype(&Data::QuaternionType::GetY)>::Callback("y", &Data::QuaternionType::GetY, "Y"));
getterFunctions.emplace("z", WrapGetter<decltype(&Data::QuaternionType::GetZ)>::Callback("z", &Data::QuaternionType::GetZ, "Z"));
getterFunctions.emplace("w", WrapGetter<decltype(&Data::QuaternionType::GetW)>::Callback("w", &Data::QuaternionType::GetW, "W"));
return getterFunctions;
}
static SetterContainer GetSetterWrappers(const Data::Type&)
{
SetterContainer setterFunctions;
setterFunctions.emplace("x", WrapSetter<decltype(&Data::QuaternionType::SetX)>::Callback("x", &Data::QuaternionType::SetX));
setterFunctions.emplace("y", WrapSetter<decltype(&Data::QuaternionType::SetY)>::Callback("y", &Data::QuaternionType::SetY));
setterFunctions.emplace("z", WrapSetter<decltype(&Data::QuaternionType::SetZ)>::Callback("z", &Data::QuaternionType::SetZ));
setterFunctions.emplace("w", WrapSetter<decltype(&Data::QuaternionType::SetW)>::Callback("w", &Data::QuaternionType::SetW));
setterFunctions.emplace("x", WrapSetter<decltype(&Data::QuaternionType::SetX)>::Callback("x", &Data::QuaternionType::SetX, "X"));
setterFunctions.emplace("y", WrapSetter<decltype(&Data::QuaternionType::SetY)>::Callback("y", &Data::QuaternionType::SetY, "Y"));
setterFunctions.emplace("z", WrapSetter<decltype(&Data::QuaternionType::SetZ)>::Callback("z", &Data::QuaternionType::SetZ, "Z"));
setterFunctions.emplace("w", WrapSetter<decltype(&Data::QuaternionType::SetW)>::Callback("w", &Data::QuaternionType::SetW, "W"));
return setterFunctions;
}
};
@@ -202,16 +204,16 @@ namespace ScriptCanvas
static GetterContainer GetGetterWrappers(const Data::Type&)
{
GetterContainer getterFunctions;
getterFunctions.emplace("x", WrapGetter<decltype(&Data::Vector2Type::GetX)>::Callback("x", &Data::Vector2Type::GetX));
getterFunctions.emplace("y", WrapGetter<decltype(&Data::Vector2Type::GetY)>::Callback("y", &Data::Vector2Type::GetY));
getterFunctions.emplace("x", WrapGetter<decltype(&Data::Vector2Type::GetX)>::Callback("x", &Data::Vector2Type::GetX, "X"));
getterFunctions.emplace("y", WrapGetter<decltype(&Data::Vector2Type::GetY)>::Callback("y", &Data::Vector2Type::GetY, "Y"));
return getterFunctions;
}
static SetterContainer GetSetterWrappers(const Data::Type&)
{
SetterContainer setterFunctions;
setterFunctions.emplace("x", WrapSetter<decltype(&Data::Vector2Type::SetX)>::Callback("x", &Data::Vector2Type::SetX));
setterFunctions.emplace("y", WrapSetter<decltype(&Data::Vector2Type::SetY)>::Callback("y", &Data::Vector2Type::SetY));
setterFunctions.emplace("x", WrapSetter<decltype(&Data::Vector2Type::SetX)>::Callback("x", &Data::Vector2Type::SetX, "X"));
setterFunctions.emplace("y", WrapSetter<decltype(&Data::Vector2Type::SetY)>::Callback("y", &Data::Vector2Type::SetY, "Y"));
return setterFunctions;
}
};
@@ -222,18 +224,18 @@ namespace ScriptCanvas
static GetterContainer GetGetterWrappers(const Data::Type&)
{
GetterContainer getterFunctions;
getterFunctions.emplace("x", WrapGetter<decltype(&Data::Vector3Type::GetX)>::Callback("x", &Data::Vector3Type::GetX));
getterFunctions.emplace("y", WrapGetter<decltype(&Data::Vector3Type::GetY)>::Callback("y", &Data::Vector3Type::GetY));
getterFunctions.emplace("z", WrapGetter<decltype(&Data::Vector3Type::GetZ)>::Callback("z", &Data::Vector3Type::GetZ));
getterFunctions.emplace("x", WrapGetter<decltype(&Data::Vector3Type::GetX)>::Callback("x", &Data::Vector3Type::GetX, "X"));
getterFunctions.emplace("y", WrapGetter<decltype(&Data::Vector3Type::GetY)>::Callback("y", &Data::Vector3Type::GetY, "Y"));
getterFunctions.emplace("z", WrapGetter<decltype(&Data::Vector3Type::GetZ)>::Callback("z", &Data::Vector3Type::GetZ, "Z"));
return getterFunctions;
}
static SetterContainer GetSetterWrappers(const Data::Type&)
{
SetterContainer setterFunctions;
setterFunctions.emplace("x", WrapSetter<decltype(&Data::Vector3Type::SetX)>::Callback("x", &Data::Vector3Type::SetX));
setterFunctions.emplace("y", WrapSetter<decltype(&Data::Vector3Type::SetY)>::Callback("y", &Data::Vector3Type::SetY));
setterFunctions.emplace("z", WrapSetter<decltype(&Data::Vector3Type::SetZ)>::Callback("z", &Data::Vector3Type::SetZ));
setterFunctions.emplace("x", WrapSetter<decltype(&Data::Vector3Type::SetX)>::Callback("x", &Data::Vector3Type::SetX, "X"));
setterFunctions.emplace("y", WrapSetter<decltype(&Data::Vector3Type::SetY)>::Callback("y", &Data::Vector3Type::SetY, "Y"));
setterFunctions.emplace("z", WrapSetter<decltype(&Data::Vector3Type::SetZ)>::Callback("z", &Data::Vector3Type::SetZ, "Z"));
return setterFunctions;
}
};
@@ -244,20 +246,20 @@ namespace ScriptCanvas
static GetterContainer GetGetterWrappers(const Data::Type&)
{
GetterContainer getterFunctions;
getterFunctions.emplace("x", WrapGetter<decltype(&Data::Vector4Type::GetX)>::Callback("x", &Data::Vector4Type::GetX));
getterFunctions.emplace("y", WrapGetter<decltype(&Data::Vector4Type::GetY)>::Callback("y", &Data::Vector4Type::GetY));
getterFunctions.emplace("z", WrapGetter<decltype(&Data::Vector4Type::GetZ)>::Callback("z", &Data::Vector4Type::GetZ));
getterFunctions.emplace("w", WrapGetter<decltype(&Data::Vector4Type::GetW)>::Callback("w", &Data::Vector4Type::GetW));
getterFunctions.emplace("x", WrapGetter<decltype(&Data::Vector4Type::GetX)>::Callback("x", &Data::Vector4Type::GetX, "X"));
getterFunctions.emplace("y", WrapGetter<decltype(&Data::Vector4Type::GetY)>::Callback("y", &Data::Vector4Type::GetY, "Y"));
getterFunctions.emplace("z", WrapGetter<decltype(&Data::Vector4Type::GetZ)>::Callback("z", &Data::Vector4Type::GetZ, "Z"));
getterFunctions.emplace("w", WrapGetter<decltype(&Data::Vector4Type::GetW)>::Callback("w", &Data::Vector4Type::GetW, "W"));
return getterFunctions;
}
static SetterContainer GetSetterWrappers(const Data::Type&)
{
SetterContainer setterFunctions;
setterFunctions.emplace("x", WrapSetter<decltype(&Data::Vector4Type::SetX)>::Callback("x", &Data::Vector4Type::SetX));
setterFunctions.emplace("y", WrapSetter<decltype(&Data::Vector4Type::SetY)>::Callback("y", &Data::Vector4Type::SetY));
setterFunctions.emplace("z", WrapSetter<decltype(&Data::Vector4Type::SetZ)>::Callback("z", &Data::Vector4Type::SetZ));
setterFunctions.emplace("w", WrapSetter<decltype(&Data::Vector4Type::SetW)>::Callback("w", &Data::Vector4Type::SetW));
setterFunctions.emplace("x", WrapSetter<decltype(&Data::Vector4Type::SetX)>::Callback("x", &Data::Vector4Type::SetX, "X"));
setterFunctions.emplace("y", WrapSetter<decltype(&Data::Vector4Type::SetY)>::Callback("y", &Data::Vector4Type::SetY, "Y"));
setterFunctions.emplace("z", WrapSetter<decltype(&Data::Vector4Type::SetZ)>::Callback("z", &Data::Vector4Type::SetZ, "Z"));
setterFunctions.emplace("w", WrapSetter<decltype(&Data::Vector4Type::SetW)>::Callback("w", &Data::Vector4Type::SetW, "W"));
return setterFunctions;
}
};
@@ -268,20 +270,20 @@ namespace ScriptCanvas
static GetterContainer GetGetterWrappers(const Data::Type&)
{
GetterContainer getterFunctions;
getterFunctions.emplace("r", WrapGetter<decltype(&Data::ColorType::GetR)>::Callback("r", &Data::ColorType::GetR));
getterFunctions.emplace("g", WrapGetter<decltype(&Data::ColorType::GetG)>::Callback("g", &Data::ColorType::GetG));
getterFunctions.emplace("b", WrapGetter<decltype(&Data::ColorType::GetB)>::Callback("b", &Data::ColorType::GetB));
getterFunctions.emplace("a", WrapGetter<decltype(&Data::ColorType::GetA)>::Callback("a", &Data::ColorType::GetA));
getterFunctions.emplace("r", WrapGetter<decltype(&Data::ColorType::GetR)>::Callback("r", &Data::ColorType::GetR, "Red"));
getterFunctions.emplace("g", WrapGetter<decltype(&Data::ColorType::GetG)>::Callback("g", &Data::ColorType::GetG, "Green"));
getterFunctions.emplace("b", WrapGetter<decltype(&Data::ColorType::GetB)>::Callback("b", &Data::ColorType::GetB, "Blue"));
getterFunctions.emplace("a", WrapGetter<decltype(&Data::ColorType::GetA)>::Callback("a", &Data::ColorType::GetA, "Alpha"));
return getterFunctions;
}
static SetterContainer GetSetterWrappers(const Data::Type&)
{
SetterContainer setterFunctions;
setterFunctions.emplace("r", WrapSetter<decltype(&Data::ColorType::SetR)>::Callback("r", &Data::ColorType::SetR));
setterFunctions.emplace("g", WrapSetter<decltype(&Data::ColorType::SetG)>::Callback("g", &Data::ColorType::SetG));
setterFunctions.emplace("b", WrapSetter<decltype(&Data::ColorType::SetB)>::Callback("b", &Data::ColorType::SetB));
setterFunctions.emplace("a", WrapSetter<decltype(&Data::ColorType::SetA)>::Callback("a", &Data::ColorType::SetA));
setterFunctions.emplace("r", WrapSetter<decltype(&Data::ColorType::SetR)>::Callback("r", &Data::ColorType::SetR, "Red"));
setterFunctions.emplace("g", WrapSetter<decltype(&Data::ColorType::SetG)>::Callback("g", &Data::ColorType::SetG, "Green"));
setterFunctions.emplace("b", WrapSetter<decltype(&Data::ColorType::SetB)>::Callback("b", &Data::ColorType::SetB, "Blue"));
setterFunctions.emplace("a", WrapSetter<decltype(&Data::ColorType::SetA)>::Callback("a", &Data::ColorType::SetA, "Alpha"));
return setterFunctions;
}
};
@@ -292,16 +294,16 @@ namespace ScriptCanvas
static GetterContainer GetGetterWrappers(const Data::Type&)
{
GetterContainer getterFunctions;
getterFunctions.emplace("normal", WrapGetter<decltype(&Data::PlaneType::GetNormal)>::Callback("normal", &Data::PlaneType::GetNormal));
getterFunctions.emplace("distance", WrapGetter<decltype(&Data::PlaneType::GetDistance)>::Callback("distance", &Data::PlaneType::GetDistance));
getterFunctions.emplace("mormal", WrapGetter<decltype(&Data::PlaneType::GetNormal)>::Callback("normal", &Data::PlaneType::GetNormal, "Normal"));
getterFunctions.emplace("distance", WrapGetter<decltype(&Data::PlaneType::GetDistance)>::Callback("distance", &Data::PlaneType::GetDistance, "Distance"));
return getterFunctions;
}
static SetterContainer GetSetterWrappers(const Data::Type&)
{
SetterContainer setterFunctions;
setterFunctions.emplace("normal", WrapSetter<decltype(&Data::PlaneType::SetNormal)>::Callback("normal", &Data::PlaneType::SetNormal));
setterFunctions.emplace("distance", WrapSetter<decltype(&Data::PlaneType::SetDistance)>::Callback("distance", &Data::PlaneType::SetDistance));
setterFunctions.emplace("normal", WrapSetter<decltype(&Data::PlaneType::SetNormal)>::Callback("normal", &Data::PlaneType::SetNormal, "Normal"));
setterFunctions.emplace("distance", WrapSetter<decltype(&Data::PlaneType::SetDistance)>::Callback("distance", &Data::PlaneType::SetDistance, "Distance"));
return setterFunctions;
}
};
@@ -312,17 +314,17 @@ namespace ScriptCanvas
static GetterContainer GetGetterWrappers(const Data::Type&)
{
GetterContainer getterFunctions;
getterFunctions.emplace("basisX", WrapGetter<decltype(&Data::TransformType::GetBasisX)>::Callback("basisX", &Data::TransformType::GetBasisX));
getterFunctions.emplace("basisY", WrapGetter<decltype(&Data::TransformType::GetBasisY)>::Callback("basisY", &Data::TransformType::GetBasisY));
getterFunctions.emplace("basisZ", WrapGetter<decltype(&Data::TransformType::GetBasisZ)>::Callback("basisZ", &Data::TransformType::GetBasisZ));
getterFunctions.emplace("translation", WrapGetter<decltype(&Data::TransformType::GetTranslation)>::Callback("translation", &Data::TransformType::GetTranslation));
getterFunctions.emplace("basisX", WrapGetter<decltype(&Data::TransformType::GetBasisX)>::Callback("basisX", &Data::TransformType::GetBasisX, "X Axis"));
getterFunctions.emplace("basisY", WrapGetter<decltype(&Data::TransformType::GetBasisY)>::Callback("basisY", &Data::TransformType::GetBasisY, "Y Axis"));
getterFunctions.emplace("basisZ", WrapGetter<decltype(&Data::TransformType::GetBasisZ)>::Callback("basisZ", &Data::TransformType::GetBasisZ, "Z Axis"));
getterFunctions.emplace("translation", WrapGetter<decltype(&Data::TransformType::GetTranslation)>::Callback("translation", &Data::TransformType::GetTranslation, "Translation"));
return getterFunctions;
}
static SetterContainer GetSetterWrappers(const Data::Type&)
{
SetterContainer setterFunctions;
setterFunctions.emplace("translation", WrapSetter<void(AZ::Transform::*)(const AZ::Vector3&)>::Callback("translation", &Data::TransformType::SetTranslation));
setterFunctions.emplace("translation", WrapSetter<void(AZ::Transform::*)(const AZ::Vector3&)>::Callback("translation", &Data::TransformType::SetTranslation, "Translation"));
return setterFunctions;
}
};
@@ -333,16 +335,16 @@ namespace ScriptCanvas
static GetterContainer GetGetterWrappers(const Data::Type&)
{
GetterContainer getterFunctions;
getterFunctions.emplace("min", WrapGetter<decltype(&Data::AABBType::GetMin)>::Callback("min", &Data::AABBType::GetMin));
getterFunctions.emplace("max", WrapGetter<decltype(&Data::AABBType::GetMax)>::Callback("max", &Data::AABBType::GetMax));
getterFunctions.emplace("min", WrapGetter<decltype(&Data::AABBType::GetMin)>::Callback("min", &Data::AABBType::GetMin, "Minimum"));
getterFunctions.emplace("max", WrapGetter<decltype(&Data::AABBType::GetMax)>::Callback("max", &Data::AABBType::GetMax, "Maximum"));
return getterFunctions;
}
static SetterContainer GetSetterWrappers(const Data::Type&)
{
SetterContainer setterFunctions;
setterFunctions.emplace("min", WrapSetter<decltype(&Data::AABBType::SetMin)>::Callback("min", &Data::AABBType::SetMin));
setterFunctions.emplace("max", WrapSetter<decltype(&Data::AABBType::SetMax)>::Callback("max", &Data::AABBType::SetMax));
setterFunctions.emplace("min", WrapSetter<decltype(&Data::AABBType::SetMin)>::Callback("min", &Data::AABBType::SetMin, "Minimum"));
setterFunctions.emplace("max", WrapSetter<decltype(&Data::AABBType::SetMax)>::Callback("max", &Data::AABBType::SetMax, "Maximum"));
return setterFunctions;
}
};
@@ -353,23 +355,23 @@ namespace ScriptCanvas
static GetterContainer GetGetterWrappers(const Data::Type&)
{
GetterContainer getterFunctions;
getterFunctions.emplace("axisX", WrapGetter<decltype(&Data::OBBType::GetAxisX)>::Callback("axisX", &Data::OBBType::GetAxisX));
getterFunctions.emplace("axisY", WrapGetter<decltype(&Data::OBBType::GetAxisY)>::Callback("axisY", &Data::OBBType::GetAxisY));
getterFunctions.emplace("axisZ", WrapGetter<decltype(&Data::OBBType::GetAxisZ)>::Callback("axisZ", &Data::OBBType::GetAxisZ));
getterFunctions.emplace("halfLengthX", WrapGetter<decltype(&Data::OBBType::GetHalfLengthX)>::Callback("halfLengthX", &Data::OBBType::GetHalfLengthX));
getterFunctions.emplace("halfLengthY", WrapGetter<decltype(&Data::OBBType::GetHalfLengthY)>::Callback("halfLengthY", &Data::OBBType::GetHalfLengthY));
getterFunctions.emplace("halfLengthZ", WrapGetter<decltype(&Data::OBBType::GetHalfLengthZ)>::Callback("halfLengthZ", &Data::OBBType::GetHalfLengthZ));
getterFunctions.emplace("position", WrapGetter<decltype(&Data::OBBType::GetPosition)>::Callback("position", &Data::OBBType::GetPosition));
getterFunctions.emplace("axisX", WrapGetter<decltype(&Data::OBBType::GetAxisX)>::Callback("axisX", &Data::OBBType::GetAxisX, "X Axis"));
getterFunctions.emplace("axisY", WrapGetter<decltype(&Data::OBBType::GetAxisY)>::Callback("axisY", &Data::OBBType::GetAxisY, "Y Axis"));
getterFunctions.emplace("Z Axis", WrapGetter<decltype(&Data::OBBType::GetAxisZ)>::Callback("axisZ", &Data::OBBType::GetAxisZ, "Z Axis"));
getterFunctions.emplace("halfLengthX", WrapGetter<decltype(&Data::OBBType::GetHalfLengthX)>::Callback("halfLengthX", &Data::OBBType::GetHalfLengthX, "Half Length X"));
getterFunctions.emplace("halfLengthY", WrapGetter<decltype(&Data::OBBType::GetHalfLengthY)>::Callback("halfLengthY", &Data::OBBType::GetHalfLengthY, "Half Length Y"));
getterFunctions.emplace("halfLengthZ", WrapGetter<decltype(&Data::OBBType::GetHalfLengthZ)>::Callback("halfLengthZ", &Data::OBBType::GetHalfLengthZ, "Half Length Z"));
getterFunctions.emplace("position", WrapGetter<decltype(&Data::OBBType::GetPosition)>::Callback("position", &Data::OBBType::GetPosition, "Position"));
return getterFunctions;
}
static SetterContainer GetSetterWrappers(const Data::Type&)
{
SetterContainer setterFunctions;
setterFunctions.emplace("halfLengthX", WrapSetter<decltype(&Data::OBBType::SetHalfLengthX)>::Callback("halfLengthX", &Data::OBBType::SetHalfLengthX));
setterFunctions.emplace("halfLengthY", WrapSetter<decltype(&Data::OBBType::SetHalfLengthY)>::Callback("halfLengthY", &Data::OBBType::SetHalfLengthY));
setterFunctions.emplace("halfLengthZ", WrapSetter<decltype(&Data::OBBType::SetHalfLengthZ)>::Callback("halfLengthZ", &Data::OBBType::SetHalfLengthZ));
setterFunctions.emplace("position", WrapSetter<decltype(&Data::OBBType::SetPosition)>::Callback("position", &Data::OBBType::SetPosition));
setterFunctions.emplace("halfLengthX", WrapSetter<decltype(&Data::OBBType::SetHalfLengthX)>::Callback("halfLengthX", &Data::OBBType::SetHalfLengthX, "Half Length X"));
setterFunctions.emplace("halfLengthY", WrapSetter<decltype(&Data::OBBType::SetHalfLengthY)>::Callback("halfLengthY", &Data::OBBType::SetHalfLengthY, "Half Length Y"));
setterFunctions.emplace("halfLengthZ", WrapSetter<decltype(&Data::OBBType::SetHalfLengthZ)>::Callback("halfLengthZ", &Data::OBBType::SetHalfLengthZ, "Half Length Z"));
setterFunctions.emplace("position", WrapSetter<decltype(&Data::OBBType::SetPosition)>::Callback("position", &Data::OBBType::SetPosition, "Position"));
return setterFunctions;
}
};
@@ -380,18 +382,18 @@ namespace ScriptCanvas
static GetterContainer GetGetterWrappers(const Data::Type&)
{
GetterContainer getterFunctions;
getterFunctions.emplace("basisX", WrapGetter<decltype(&Data::Matrix3x3Type::GetBasisX)>::Callback("basisX", &Data::Matrix3x3Type::GetBasisX));
getterFunctions.emplace("basisY", WrapGetter<decltype(&Data::Matrix3x3Type::GetBasisY)>::Callback("basisY", &Data::Matrix3x3Type::GetBasisY));
getterFunctions.emplace("basisZ", WrapGetter<decltype(&Data::Matrix3x3Type::GetBasisZ)>::Callback("basisZ", &Data::Matrix3x3Type::GetBasisZ));
getterFunctions.emplace("basisX", WrapGetter<decltype(&Data::Matrix3x3Type::GetBasisX)>::Callback("basisX", &Data::Matrix3x3Type::GetBasisX, "Position"));
getterFunctions.emplace("basisY", WrapGetter<decltype(&Data::Matrix3x3Type::GetBasisY)>::Callback("basisY", &Data::Matrix3x3Type::GetBasisY, "Position"));
getterFunctions.emplace("basisZ", WrapGetter<decltype(&Data::Matrix3x3Type::GetBasisZ)>::Callback("basisZ", &Data::Matrix3x3Type::GetBasisZ, "Position"));
return getterFunctions;
}
static SetterContainer GetSetterWrappers(const Data::Type&)
{
SetterContainer setterFunctions;
setterFunctions.emplace("basisX", WrapSetter<void(AZ::Matrix3x3::*)(const AZ::Vector3&)>::Callback("basisX", &Data::Matrix3x3Type::SetBasisX));
setterFunctions.emplace("basisY", WrapSetter<void(AZ::Matrix3x3::*)(const AZ::Vector3&)>::Callback("basisY", &Data::Matrix3x3Type::SetBasisY));
setterFunctions.emplace("basisZ", WrapSetter<void(AZ::Matrix3x3::*)(const AZ::Vector3&)>::Callback("basisZ", &Data::Matrix3x3Type::SetBasisZ));
setterFunctions.emplace("basisX", WrapSetter<void(AZ::Matrix3x3::*)(const AZ::Vector3&)>::Callback("basisX", &Data::Matrix3x3Type::SetBasisX, "X Axis"));
setterFunctions.emplace("basisY", WrapSetter<void(AZ::Matrix3x3::*)(const AZ::Vector3&)>::Callback("basisY", &Data::Matrix3x3Type::SetBasisY, "Y Axis"));
setterFunctions.emplace("basisZ", WrapSetter<void(AZ::Matrix3x3::*)(const AZ::Vector3&)>::Callback("basisZ", &Data::Matrix3x3Type::SetBasisZ, "Z Axis"));
return setterFunctions;
}
};
@@ -402,20 +404,20 @@ namespace ScriptCanvas
static GetterContainer GetGetterWrappers(const Data::Type&)
{
GetterContainer getterFunctions;
getterFunctions.emplace("basisX", WrapGetter<decltype(&Data::Matrix4x4Type::GetBasisX)>::Callback("basisX", &Data::Matrix4x4Type::GetBasisX));
getterFunctions.emplace("basisY", WrapGetter<decltype(&Data::Matrix4x4Type::GetBasisY)>::Callback("basisY", &Data::Matrix4x4Type::GetBasisY));
getterFunctions.emplace("basisZ", WrapGetter<decltype(&Data::Matrix4x4Type::GetBasisZ)>::Callback("basisZ", &Data::Matrix4x4Type::GetBasisZ));
getterFunctions.emplace("translation", WrapGetter<decltype(&Data::Matrix4x4Type::GetTranslation)>::Callback("translation", &Data::Matrix4x4Type::GetTranslation));
getterFunctions.emplace("basisX", WrapGetter<decltype(&Data::Matrix4x4Type::GetBasisX)>::Callback("basisX", &Data::Matrix4x4Type::GetBasisX, "X Axis"));
getterFunctions.emplace("basisY", WrapGetter<decltype(&Data::Matrix4x4Type::GetBasisY)>::Callback("basisY", &Data::Matrix4x4Type::GetBasisY, "Y Axis"));
getterFunctions.emplace("basisZ", WrapGetter<decltype(&Data::Matrix4x4Type::GetBasisZ)>::Callback("basisZ", &Data::Matrix4x4Type::GetBasisZ, "Z Axis"));
getterFunctions.emplace("Translation", WrapGetter<decltype(&Data::Matrix4x4Type::GetTranslation)>::Callback("translation", &Data::Matrix4x4Type::GetTranslation, "Translation"));
return getterFunctions;
}
static SetterContainer GetSetterWrappers(const Data::Type&)
{
SetterContainer setterFunctions;
setterFunctions.emplace("basisX", WrapSetter<void(AZ::Matrix4x4::*)(const AZ::Vector4&)>::Callback("basisX", &Data::Matrix4x4Type::SetBasisX));
setterFunctions.emplace("basisY", WrapSetter<void(AZ::Matrix4x4::*)(const AZ::Vector4&)>::Callback("basisY", &Data::Matrix4x4Type::SetBasisY));
setterFunctions.emplace("basisZ", WrapSetter<void(AZ::Matrix4x4::*)(const AZ::Vector4&)>::Callback("basisZ", &Data::Matrix4x4Type::SetBasisZ));
setterFunctions.emplace("translation", WrapSetter<void(AZ::Matrix4x4::*)(const AZ::Vector3&)>::Callback("translation", &Data::Matrix4x4Type::SetTranslation));
setterFunctions.emplace("basisX", WrapSetter<void(AZ::Matrix4x4::*)(const AZ::Vector4&)>::Callback("basisX", &Data::Matrix4x4Type::SetBasisX, "X Axis"));
setterFunctions.emplace("basisY", WrapSetter<void(AZ::Matrix4x4::*)(const AZ::Vector4&)>::Callback("basisY", &Data::Matrix4x4Type::SetBasisY, "Y Axis"));
setterFunctions.emplace("basisZ", WrapSetter<void(AZ::Matrix4x4::*)(const AZ::Vector4&)>::Callback("basisZ", &Data::Matrix4x4Type::SetBasisZ, "Z Axis"));
setterFunctions.emplace("translation", WrapSetter<void(AZ::Matrix4x4::*)(const AZ::Vector3&)>::Callback("translation", &Data::Matrix4x4Type::SetTranslation, "Translation"));
return setterFunctions;
}
};
@@ -132,7 +132,7 @@ namespace ScriptCanvas
void BooleanExpression::InitializeBooleanExpression()
{
AZ_Assert(false, "InitializeBooleanExpression must be overridden");
AZ_Error("Script Canvas", false, "InitializeBooleanExpression implementation should be provided");
}
void BooleanExpression::OnInit()
@@ -5,6 +5,7 @@
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#include <ScriptCanvas/Libraries/Core/ExtractProperty.h>
#include <Libraries/Core/MethodUtility.h>
@@ -183,6 +184,10 @@ namespace ScriptCanvas
DataSlotConfiguration config;
AZStd::string slotName = AZStd::string::format("%s: %s", propertyName.data(), Data::GetName(getterWrapper.m_propertyType).data());
if (!getterWrapper.m_displayName.empty())
{
slotName = getterWrapper.m_displayName;
}
if (existingSlots.find(slotName) == existingSlots.end())
{
@@ -193,7 +193,7 @@ namespace ScriptCanvas
{
DataSlotConfiguration slotConfiguration;
slotConfiguration.m_name = AZStd::string::format("%s: %s", propertyName.data(), Data::GetName(getterWrapper.m_propertyType).data());
slotConfiguration.m_name = (getterWrapper.m_displayName.empty()) ? propertyName.data() : getterWrapper.m_displayName;
slotConfiguration.SetType(getterWrapper.m_propertyType);
slotConfiguration.SetConnectionType(ConnectionType::Output);
@@ -294,7 +294,7 @@ namespace ScriptCanvas
{
DataSlotConfiguration slotConfiguration;
slotConfiguration.m_name = AZStd::string::format("%s: %s", propertyName.data(), Data::GetName(getterWrapper.m_propertyType).data());
slotConfiguration.m_name = (getterWrapper.m_displayName.empty()) ? propertyName.data() : getterWrapper.m_displayName;
slotConfiguration.SetType(getterWrapper.m_propertyType);
slotConfiguration.SetConnectionType(ConnectionType::Output);
@@ -21,7 +21,7 @@ namespace ScriptCanvas
namespace EntityNodes
{
using namespace Data;
static const char* k_categoryName = "Entity/Entity";
static constexpr const char* k_categoryName = "Entity/Entity";
template<int t_Index>
AZ_INLINE void DefaultScale(Node& node) { SetDefaultValuesByIndex<t_Index>::_(node, Data::One()); }
@@ -19,7 +19,7 @@ namespace ScriptCanvas
{
using namespace Data;
using namespace MathNodeUtilities;
static const char* k_categoryName = "Math/AABB";
static constexpr const char* k_categoryName = "Math/AABB";
AZ_INLINE AABBType AddAABB(AABBType a, const AABBType& b)
{
@@ -15,7 +15,7 @@ namespace ScriptCanvas
{
namespace CRCNodes
{
static const char* k_categoryName = "Math/Crc32";
static constexpr const char* k_categoryName = "Math/Crc32";
AZ_INLINE Data::CRCType FromString(Data::StringType value)
{
@@ -19,7 +19,7 @@ namespace ScriptCanvas
{
using namespace Data;
using namespace MathNodeUtilities;
static const char* k_categoryName = "Math/Color";
static constexpr const char* k_categoryName = "Math/Color";
AZ_INLINE ColorType Add(ColorType a, ColorType b)
{
@@ -14,7 +14,7 @@ namespace ScriptCanvas
{
namespace MathNodes
{
static const char* k_categoryName = "Math";
static constexpr const char* k_categoryName = "Math";
AZ_INLINE Data::NumberType MultiplyAndAdd(Data::NumberType multiplicand, Data::NumberType multiplier, Data::NumberType addend)
{
@@ -15,7 +15,7 @@ namespace ScriptCanvas
{
namespace RandomNodes
{
static const char* k_categoryName = "Math/Random";
static constexpr const char* k_categoryName = "Math/Random";
// RandomColor
AZ_INLINE void SetRandomColorDefaults(Node& node)
@@ -15,7 +15,7 @@ namespace ScriptCanvas
{
namespace Matrix3x3Nodes
{
static const char* k_categoryName = "Math/Matrix3x3";
static constexpr const char* k_categoryName = "Math/Matrix3x3";
AZ_INLINE Data::Matrix3x3Type Add(const Data::Matrix3x3Type& lhs, const Data::Matrix3x3Type& rhs)
{
@@ -14,7 +14,7 @@ namespace ScriptCanvas
{
namespace Matrix4x4Nodes
{
static const char* k_categoryName = "Math/Matrix4x4";
static constexpr const char* k_categoryName = "Math/Matrix4x4";
AZ_INLINE Data::Matrix4x4Type FromColumns(const Data::Vector4Type& col0, const Data::Vector4Type& col1, const Data::Vector4Type& col2, const Data::Vector4Type& col3)
{
@@ -19,7 +19,7 @@ namespace ScriptCanvas
{
using namespace Data;
using namespace MathNodeUtilities;
static const char* k_categoryName = "Math/OBB";
static constexpr const char* k_categoryName = "Math/OBB";
AZ_INLINE OBBType FromAabb(const AABBType& source)
{
@@ -19,7 +19,7 @@ namespace ScriptCanvas
{
using namespace Data;
using namespace MathNodeUtilities;
static const char* k_categoryName = "Math/Plane";
static constexpr const char* k_categoryName = "Math/Plane";
AZ_INLINE NumberType DistanceToPoint(PlaneType source, Vector3Type point)
{
@@ -20,7 +20,7 @@ namespace ScriptCanvas
{
using namespace Data;
using namespace MathNodeUtilities;
static const char* k_categoryName = "Math/Quaternion";
static constexpr const char* k_categoryName = "Math/Quaternion";
AZ_INLINE QuaternionType Add(QuaternionType a, QuaternionType b)
{
@@ -20,7 +20,7 @@ namespace ScriptCanvas
{
using namespace Data;
using namespace MathNodeUtilities;
static const char* k_categoryName = "Math/Transform";
static constexpr const char* k_categoryName = "Math/Transform";
AZ_INLINE std::tuple<NumberType, TransformType> ExtractUniformScale(TransformType source)
{
@@ -19,7 +19,7 @@ namespace ScriptCanvas
{
using namespace MathNodeUtilities;
using namespace Data;
static const char* k_categoryName = "Math/Vector2";
static constexpr const char* k_categoryName = "Math/Vector2";
AZ_INLINE Vector2Type Absolute(const Vector2Type source)
{
@@ -21,7 +21,7 @@ namespace ScriptCanvas
{
using namespace MathNodeUtilities;
using namespace Data;
static const char* k_categoryName = "Math/Vector3";
static constexpr const char* k_categoryName = "Math/Vector3";
AZ_INLINE Vector3Type Absolute(const Vector3Type source)
{
@@ -19,7 +19,7 @@ namespace ScriptCanvas
{
using namespace MathNodeUtilities;
using namespace Data;
static const char* k_categoryName = "Math/Vector4";
static constexpr const char* k_categoryName = "Math/Vector4";
AZ_INLINE Vector4Type Absolute(const Vector4Type source)
{
@@ -14,7 +14,7 @@ namespace ScriptCanvas
{
namespace StringNodes
{
static const char* k_categoryName = "String";
static constexpr const char* k_categoryName = "String";
AZ_INLINE Data::StringType ToLower(Data::StringType sourceString)
{
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,187 @@
/*
* 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
*
*/
#pragma once
#include <AzCore/std/string/string.h>
#include <AzCore/std/containers/vector.h>
#include <AzCore/Math/Crc.h>
#include <AzCore/RTTI/ReflectContext.h>
#include <AzCore/Serialization/EditContext.h>
#include <AzCore/Script/ScriptContextAttributes.h>
namespace AZ
{
class BehaviorClass;
class BehaviorContext;
class BehaviorEBus;
class BehaviorMethod;
class Entity;
class SerializeContext;
}
namespace ScriptCanvasEditorTools
{
//! Utility structures for generating the JSON files used for names of elements in Script Canvas
struct EntryDetails
{
AZStd::string m_name;
AZStd::string m_tooltip;
AZStd::string m_category;
AZStd::string m_subtitle;
};
using EntryDetailsList = AZStd::vector<EntryDetails>;
//! Utility structure that represents a method's argument
struct Argument
{
AZStd::string m_typeId;
EntryDetails m_details;
};
//! Utility structure that represents a method
struct Method
{
AZStd::string m_key;
AZStd::string m_context;
EntryDetails m_details;
EntryDetails m_entry;
EntryDetails m_exit;
AZStd::vector<Argument> m_arguments;
AZStd::vector<Argument> m_results;
};
//! Utility structure that represents a Script Canvas slot
struct Slot
{
AZStd::string m_key;
EntryDetails m_details;
Argument m_data;
};
//! Utility structure that represents an reflected element
struct Entry
{
AZStd::string m_key;
AZStd::string m_context;
AZStd::string m_variant;
EntryDetails m_details;
AZStd::vector<Method> m_methods;
AZStd::vector<Slot> m_slots;
};
// The root level JSON object
struct TranslationFormat
{
AZStd::vector<Entry> m_entries;
};
//! Class the wraps all the generation of translation data for all scripting types.
class TranslationGeneration
{
public:
TranslationGeneration();
//! Generate the translation data for a given BehaviorClass
bool TranslateBehaviorClass(const AZ::BehaviorClass* behaviorClass);
//! Generate the translation data for all Behavior Context classes
void TranslateBehaviorClasses();
//! Generate the translation data for Behavior Ebus, handles both Handlers and Senders
void TranslateEBus(const AZ::BehaviorEBus* behaviorEBus);
//! Generate the translation data for a specific AZ::Event
AZ::Entity* TranslateAZEvent(const AZ::BehaviorMethod& method);
//! Generate the translation data for AZ::Events
void TranslateAZEvents();
//! Generate the translation data for all ScriptCanvas::Node types
void TranslateNodes();
//! Generate the translation data for the specified TypeId (must inherit from ScriptCanvas::Node)
void TranslateNode(const AZ::TypeId& nodeTypeId);
//! Generate the translation data for on-demand reflected types
void TranslateOnDemandReflectedTypes(TranslationFormat& translationRoot);
private:
//! Generates the translation data for a BehaviorEBus that has an BehaviorEBusHandler
bool TranslateEBusHandler(const AZ::BehaviorEBus* behaviorEbus, TranslationFormat& translationRoot);
//! Utility function that saves a TranslationFormat object in the desired JSON format
void SaveJSONData(const AZStd::string& filename, TranslationFormat& translationRoot);
//! Evaluates if the specified object has exclusion flags and should be skipped from generation
template <typename T>
bool ShouldSkip(const T* object) const
{
using namespace AZ::Script::Attributes;
// Check for "ignore" attribute for ScriptCanvas
const auto& excludeClassAttributeData = azdynamic_cast<AZ::Edit::AttributeData<ExcludeFlags>*>(AZ::FindAttribute(ExcludeFrom, object->m_attributes));
const bool excludeClass = excludeClassAttributeData && (static_cast<AZ::u64>(excludeClassAttributeData->Get(nullptr)) & static_cast<AZ::u64>(ExcludeFlags::List | ExcludeFlags::Documentation));
if (excludeClass)
{
return true; // skip this class
}
return false;
}
AZ::SerializeContext* m_serializeContext;
AZ::BehaviorContext* m_behaviorContext;
};
namespace Helpers
{
//! Generic function that fetches from a valid type that has attributes a string attribute
template <typename T>
AZStd::string GetStringAttribute(const T* source, const AZ::Crc32& attribute)
{
AZStd::string attributeValue = "";
if (auto attributeItem = azrtti_cast<AZ::AttributeData<AZStd::string>*>(AZ::FindAttribute(attribute, source->m_attributes)))
{
attributeValue = attributeItem->Get(nullptr);
}
return attributeValue;
}
//! Utility function that fetches from an AttributeArray a string attribute whether it's an AZStd::string or a const char*
AZStd::string ReadStringAttribute(const AZ::AttributeArray& attributes, const AZ::Crc32& attribute);
//! Utility function to verify if a BehaviorMethod has the specified attribute
bool MethodHasAttribute(const AZ::BehaviorMethod* method, AZ::Crc32 attribute);
//! Utility function to find a valid name from the ClassData/EditContext
void GetTypeNameAndDescription(AZ::TypeId typeId, AZStd::string& outName, AZStd::string& outDescription);
//! Utility function to get the path to the specified gem
AZStd::string GetGemPath(const AZStd::string& gemName);
//! Get the category attribute for a given ClassData
AZStd::string GetCategory(const AZ::SerializeContext::ClassData* classData);
//! Get the category for a ScriptCanvas node library
AZStd::string GetLibraryCategory(const AZ::SerializeContext& serializeContext, const AZStd::string& nodeName);
}
}
@@ -0,0 +1,12 @@
#
# 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
#
#
set(FILES
Tools/TranslationGeneration.h
Tools/TranslationGeneration.cpp
)