Merge remote-tracking branch 'origin/development' into sc-editor-asset-redux

Signed-off-by: carlitosan <82187351+carlitosan@users.noreply.github.com>
This commit is contained in:
carlitosan
2021-12-02 14:17:35 -08:00
3323 changed files with 90625 additions and 60443 deletions
@@ -1111,9 +1111,11 @@ namespace ScriptCanvasEditor
return CanCreateConnectionBetween(scSourceEndpoint, scTargetEndpoint).IsSuccess();
}
AZStd::string Graph::GetDataTypeString(const AZ::Uuid& typeId)
AZStd::string Graph::GetDataTypeString(const AZ::Uuid&)
{
return TranslationHelper::GetSafeTypeName(ScriptCanvas::Data::FromAZType(typeId));
// This is used by the default tooltip setting in GraphCanvas, returning an empty string
// in order for tooltips to be fully controlled by ScriptCanvas
return {};
}
void Graph::OnRemoveUnusedNodes()
@@ -11,6 +11,7 @@
#include <GraphCanvas/Components/Nodes/NodeBus.h>
#include <ScriptCanvas/Core/Slot.h>
#include <ScriptCanvas/GraphCanvas/NodeDescriptorBus.h>
#include <Editor/GraphCanvas/Components/DynamicSlotComponent.h>
@@ -168,6 +168,14 @@ namespace ScriptCanvasEditor::Nodes
GraphCanvas::NodeTitleRequestBus::Event(graphCanvasEntity->GetId(), &GraphCanvas::NodeTitleRequests::SetTitle, details.m_name);
GraphCanvas::NodeTitleRequestBus::Event(graphCanvasEntity->GetId(), &GraphCanvas::NodeTitleRequests::SetSubTitle, details.m_category);
// Add to the tooltip the C++ class for reference
if (!details.m_tooltip.empty())
{
details.m_tooltip.append("\n");
}
details.m_tooltip.append(AZStd::string::format("[C++] %s", node->GetNodeTypeName().c_str()));
GraphCanvas::NodeRequestBus::Event(graphCanvasEntity->GetId(), &GraphCanvas::NodeRequests::SetTooltip, details.m_tooltip);
if (!nodeConfiguration.m_titlePalette.empty())
@@ -258,17 +266,20 @@ namespace ScriptCanvasEditor::Nodes
graphCanvasEntity->CreateComponent<SlotMappingComponent>(methodNode->GetEntityId());
graphCanvasEntity->CreateComponent<SceneMemberMappingComponent>(methodNode->GetEntityId());
bool isAccessor = false;
switch (methodNode->GetMethodType())
{
case ScriptCanvas::MethodType::Event:
graphCanvasEntity->CreateComponent<EBusSenderNodeDescriptorComponent>();
break;
case ScriptCanvas::MethodType::Member:
case ScriptCanvas::MethodType::Getter:
case ScriptCanvas::MethodType::Setter:
case ScriptCanvas::MethodType::Free:
isAccessor = true;
case ScriptCanvas::MethodType::Member:
graphCanvasEntity->CreateComponent<ClassMethodNodeDescriptorComponent>();
break;
break;
default:
AZ_Error("ScriptCanvas", false, "Invalid method node type, node creation failed. This node needs to be deleted.");
break;
@@ -288,20 +299,70 @@ namespace ScriptCanvasEditor::Nodes
const bool isEBusSender = (methodNode->GetMethodType() == ScriptCanvas::MethodType::Event);
const AZStd::string& className = methodNode->GetMethodClassName();
const AZStd::string& methodName = methodNode->GetName();
AZStd::string methodName = methodNode->GetName();
GraphCanvas::TranslationKey key;
key = isEBusSender ? "EBusSender" : "BehaviorClass";
key << className;
key << "methods" << methodName;
if (isAccessor)
{
AZ::StringFunc::Replace(methodName, "::Getter", "");
AZ::StringFunc::Replace(methodName, "::Setter", "");
}
GraphCanvas::TranslationRequests::Details details;
details.m_name = methodName;
AZStd::string context;
if (methodNode->GetMethodType() == ScriptCanvas::MethodType::Free)
{
context = "Constant";
}
else
{
context = isEBusSender ? "EBusSender" : "BehaviorClass";
}
key << context << className;
GraphCanvas::TranslationRequestBus::BroadcastResult(details, &GraphCanvas::TranslationRequests::GetDetails, key + ".details", details);
GraphCanvas::NodeTitleRequestBus::Event(graphCanvasNodeId, &GraphCanvas::NodeTitleRequests::SetDetails, details.m_name, details.m_subtitle);
GraphCanvas::NodeRequestBus::Event(graphCanvasNodeId, &GraphCanvas::NodeRequests::SetTooltip, details.m_tooltip);
// Set the class' name as the subtitle fallback
details.m_subtitle = details.m_name;
// Get the method's text data
GraphCanvas::TranslationRequests::Details methodDetails;
methodDetails.m_name = details.m_name; // fallback
key << "methods";
AZStd::string updatedMethodName = methodName;
if (isAccessor)
{
if (methodNode->GetMethodType() == ScriptCanvas::MethodType::Getter || methodNode->GetMethodType() == ScriptCanvas::MethodType::Free)
{
updatedMethodName = "Get";
}
else
{
updatedMethodName = "Set";
}
updatedMethodName.append(methodName);
}
key << updatedMethodName;
GraphCanvas::TranslationRequestBus::BroadcastResult(methodDetails, &GraphCanvas::TranslationRequests::GetDetails, key + ".details", methodDetails);
if (methodDetails.m_subtitle.empty())
{
methodDetails.m_subtitle = details.m_category;
}
// Add to the tooltip the C++ class for reference
if (!methodDetails.m_tooltip.empty())
{
methodDetails.m_tooltip.append("\n");
}
methodDetails.m_tooltip.append(AZStd::string::format("[C++] %s", className.c_str()));
GraphCanvas::NodeTitleRequestBus::Event(graphCanvasNodeId, &GraphCanvas::NodeTitleRequests::SetDetails, methodDetails.m_name, methodDetails.m_subtitle);
GraphCanvas::NodeRequestBus::Event(graphCanvasNodeId, &GraphCanvas::NodeRequests::SetTooltip, methodDetails.m_tooltip);
int paramIndex = 0;
int outputIndex = 0;
@@ -329,8 +390,8 @@ namespace ScriptCanvasEditor::Nodes
if (slot.IsData())
{
key = isEBusSender ? "EBusSender" : "BehaviorClass";
key << className << "methods" << methodName;
key.clear();
key << context << className << "methods" << updatedMethodName;
if (slot.IsData() && slot.IsInput())
{
key << "params";
@@ -345,7 +406,7 @@ namespace ScriptCanvasEditor::Nodes
}
if (slot.IsData())
{
{
index++;
}
}
@@ -449,6 +510,13 @@ namespace ScriptCanvasEditor::Nodes
details.m_name = busName;
GraphCanvas::TranslationRequestBus::BroadcastResult(details, &GraphCanvas::TranslationRequests::GetDetails, key, details);
// Add to the tooltip the C++ class for reference
if (!details.m_tooltip.empty())
{
details.m_tooltip.append("\n");
}
details.m_tooltip.append(AZStd::string::format("[C++] %s", busName.c_str()));
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");
@@ -486,6 +554,13 @@ namespace ScriptCanvasEditor::Nodes
// Set the name
graphCanvasEntity->SetName(AZStd::string::format("GC-Node(%s)", decoratedName.c_str()));
// Add to the tooltip the C++ class for reference
if (!details.m_tooltip.empty())
{
details.m_tooltip.append("\n");
}
details.m_tooltip.append(AZStd::string::format("[C++] %s", busName.c_str()));
GraphCanvas::NodeRequestBus::Event(graphCanvasNodeId, &GraphCanvas::NodeRequests::SetTooltip, details.m_tooltip);
GraphCanvas::NodeTitleRequestBus::Event(graphCanvasNodeId, &GraphCanvas::NodeTitleRequests::SetTitle, details.m_name);
@@ -730,7 +805,7 @@ namespace ScriptCanvasEditor::Nodes
return graphCanvasNodeId;
}
// Function Nodes
// Function Nodes
AZ::EntityId DisplayFunctionNode(AZ::EntityId graphCanvasGraphId, const ScriptCanvas::Nodes::Core::FunctionCallNode* functionNode)
{
return DisplayFunctionNode(graphCanvasGraphId, const_cast<ScriptCanvas::Nodes::Core::FunctionCallNode*>(functionNode));
@@ -12,6 +12,7 @@
#include <GraphCanvas/Components/Slots/SlotBus.h>
#include <GraphCanvas/Components/DynamicOrderingDynamicSlotComponent.h>
#include <ScriptCanvas/Core/ModifiableDatumView.h>
#include <ScriptCanvas/Core/NodeBus.h>
namespace ScriptCanvasEditor::Nodes
+6 -3
View File
@@ -398,6 +398,7 @@ namespace ScriptCanvasEditor
->Field("ShowUpgradeDialog", &ScriptCanvasEditorSettings::m_showUpgradeDialog)
->Field("ZoomSettings", &ScriptCanvasEditorSettings::m_zoomSettings)
->Field("ExperimentalSettings", &ScriptCanvasEditorSettings::m_experimentalSettings)
->Field("SceneContextMenuNodePaletteWidth", &ScriptCanvasEditorSettings::m_sceneContextMenuNodePaletteWidth)
;
AZ::EditContext* editContext = serialize->GetEditContext();
@@ -470,13 +471,13 @@ namespace ScriptCanvasEditor
->Attribute(AZ::Edit::Attributes::Visibility, AZ_CRC("PropertyVisibility_ShowChildrenOnly", 0xef428f20))
->DataElement(AZ::Edit::UIHandlers::Default, &ScriptCanvasEditorSettings::m_snapDistance, "Connection Snap Distance", "The distance from a slot under which connections will snap to it.")
->Attribute(AZ::Edit::Attributes::Min, 10.0)
->DataElement(AZ::Edit::UIHandlers::Default, &ScriptCanvasEditorSettings::m_enableGroupDoubleClickCollapse, "Double Click to Collapse/Uncollapse Group", "Enables the user to decide whether you can double click on a group to collapse/uncollapse a group.")
->DataElement(AZ::Edit::UIHandlers::Default, &ScriptCanvasEditorSettings::m_enableGroupDoubleClickCollapse, "Double Click to Collapse/Expand Group", "Enables the user to decide whether you can double click on a group to collapse/expand a group.")
->DataElement(AZ::Edit::UIHandlers::Default, &ScriptCanvasEditorSettings::m_allowBookmarkViewpointControl, "Bookmark Zooming", "Will cause the bookmarks to force the viewport into the state determined by the bookmark type\nBookmark Anchors - The viewport that exists when the bookmark is created.\nNode Groups - The area the Node Group covers")
->DataElement(AZ::Edit::UIHandlers::Default, &ScriptCanvasEditorSettings::m_dragNodeCouplingConfig, "Node Coupling Configuration", "Controls for managing Node Coupling.\nNode Coupling is when you are dragging a node and leave it hovered over another Node, we will try to connect the sides you overlapped with each other.")
->DataElement(AZ::Edit::UIHandlers::Default, &ScriptCanvasEditorSettings::m_dragNodeSplicingConfig, "Drag Node Splicing Configuration", "Controls for managing Node Splicing on a Drag.\nNode Splicing on a Drag will let you drag a node onto a connection, and splice that node onto the specified connection.")
->DataElement(AZ::Edit::UIHandlers::Default, &ScriptCanvasEditorSettings::m_dropNodeSplicingConfig, "Drop Node Splicing Configuration", "Controls for managing Node Splicing on a Drag.\nNode Splicing on a drop will let you drop a node onto a connection from the Node Palette, and splice that node onto the specified connection.")
->DataElement(AZ::Edit::UIHandlers::Default, &ScriptCanvasEditorSettings::m_autoSaveConfig, "AutoSave Configuration", "Controls for managing Auto Saving.\nAuto Saving will occur after the specified time of inactivity on a graph.")
->DataElement(AZ::Edit::UIHandlers::Default, &ScriptCanvasEditorSettings::m_shakeDespliceConfig, "Shake To Desplice", "Settings that controls various parameters of the Shake to Desplice feature")
->DataElement(AZ::Edit::UIHandlers::Default, &ScriptCanvasEditorSettings::m_shakeDespliceConfig, "Shake To De-splice", "Settings that controls various parameters of the Shake to De-splice feature")
->DataElement(AZ::Edit::UIHandlers::Default, &ScriptCanvasEditorSettings::m_allowNodeNudging, "Allow Node Nudging", "Controls whether or not nodes will attempt to nudge each other out of the way under various interactions.")
->DataElement(AZ::Edit::UIHandlers::Default, &ScriptCanvasEditorSettings::m_alignmentTimeMS, "Alignment Time", "Controls the amount of time nodes will take to slide into place when performing alignment commands")
->Attribute(AZ::Edit::Attributes::Min, 0)
@@ -488,8 +489,10 @@ namespace ScriptCanvasEditor
->DataElement(AZ::Edit::UIHandlers::Default, &ScriptCanvasEditorSettings::m_experimentalSettings, "Experimental Settings", "Settings that will control elements that are under development and may not work as expected")
->DataElement(AZ::Edit::UIHandlers::Default, &ScriptCanvasEditorSettings::m_saveRawTranslationOuputToFile, "Save Translation File", "Save out the raw result of translation for debug purposes")
->Attribute(AZ::Edit::Attributes::ChangeNotify, &SettingsCpp::UpdateProcessingSettings)
->DataElement(AZ::Edit::UIHandlers::Default, &ScriptCanvasEditorSettings::m_printAbstractCodeModel, "Print Abstract Modeld", "Print out the Abstract Code Model to the console at the end of parsing for debug purposes")
->DataElement(AZ::Edit::UIHandlers::Default, &ScriptCanvasEditorSettings::m_printAbstractCodeModel, "Print Abstract Model", "Print out the Abstract Code Model to the console at the end of parsing for debug purposes")
->Attribute(AZ::Edit::Attributes::ChangeNotify, &SettingsCpp::UpdateProcessingSettings)
->DataElement(AZ::Edit::UIHandlers::Default, &ScriptCanvasEditorSettings::m_sceneContextMenuNodePaletteWidth, "Context Menu Width", "Allows you to configure the width of the context menu that opens on a Script Canvas graph")
->Attribute(AZ::Edit::Attributes::Min, 120)
;
editContext->Class<ExperimentalSettings>("Experimental", "Settings for features under development that may not behave as expected yet.")
+2
View File
@@ -357,6 +357,8 @@ namespace ScriptCanvasEditor
AZ::u32 m_alignmentTimeMS;
StylingSettings m_stylingSettings;
AZ::u32 m_sceneContextMenuNodePaletteWidth = 300;
};
}
}
@@ -8,16 +8,8 @@
#pragma once
#include <QCoreApplication>
#include <AzCore/Serialization/Json/StackedString.h>
#include <AzCore/std/string/conversions.h>
#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>
#include <ScriptCanvas/Data/Data.h>
namespace Translation
{
@@ -28,447 +20,32 @@ namespace Translation
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
{
enum class TranslationContextGroup : AZ::u32
namespace TranslationHelper
{
EbusSender,
EbusHandler,
ClassMethod,
GlobalMethod,
Invalid
};
enum class TranslationItemType : AZ::u32
{
Node,
Wrapper,
ExecutionInSlot,
ExecutionOutSlot,
ParamDataSlot,
ReturnDataSlot,
BusIdSlot,
Invalid
};
enum class TranslationKeyId : AZ::u32
{
Name,
Tooltip,
Category,
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";
const char* const ebusHandler = "Handler";
const char* const classMethod = "Method";
constexpr const char* const globalMethod = "GlobalMethod";
};
// The context name and keys generated by TranslationHelper should match the keys
// being exported by the TSGenerateAction.cpp in the ScriptCanvasDeveloper Gem.
class TranslationHelper
{
public:
static AZStd::string GetContextName(TranslationContextGroup group, AZStd::string_view keyBase)
{
if (group == TranslationContextGroup::Invalid || keyBase.empty())
{
// Missing information
return AZStd::string();
}
const char* groupPart;
switch (group)
{
case TranslationContextGroup::EbusSender:
groupPart = TranslationContextGroupParts::ebusSender;
break;
case TranslationContextGroup::EbusHandler:
groupPart = TranslationContextGroupParts::ebusHandler;
break;
case TranslationContextGroup::ClassMethod:
groupPart = TranslationContextGroupParts::classMethod;
break;
case TranslationContextGroup::GlobalMethod:
groupPart = TranslationContextGroupParts::globalMethod;
break;
default:
AZ_Warning("TranslationComponent", false, "Invalid translation group ID.");
groupPart = "";
}
AZStd::string fullKey = AZStd::string::format("%s: %.*s", groupPart,
aznumeric_cast<int>(keyBase.size()), keyBase.data());
return fullKey;
}
// UserDefined
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 GetKey(TranslationContextGroup group, AZStd::string_view keyBase, AZStd::string_view keyName, TranslationItemType type, TranslationKeyId keyId, int paramIndex = 0)
{
if (group == TranslationContextGroup::Invalid || keyBase.empty()
|| type == TranslationItemType::Invalid || keyId == TranslationKeyId::Invalid)
{
// Missing information
return AZStd::string();
}
if (type != TranslationItemType::Wrapper && keyName.empty())
{
// Missing information
return AZStd::string();
}
AZStd::string fullKey;
const char* prefix = "";
if (group == TranslationContextGroup::EbusHandler)
{
prefix = TranslationKeyParts::handler;
}
const char* keyPart = GetKeyPart(keyId);
switch (type)
{
case TranslationItemType::Node:
fullKey = AZStd::string::format("%s%.*s_%.*s_%s",
prefix,
aznumeric_cast<int>(keyBase.size()),
keyBase.data(),
aznumeric_cast<int>(keyName.size()),
keyName.data(),
keyPart
);
break;
case TranslationItemType::Wrapper:
fullKey = GetClassKey(group, keyBase, keyId);
break;
case TranslationItemType::ExecutionInSlot:
fullKey = AZStd::string::format("%s%.*s_%.*s_%s_%s",
prefix,
aznumeric_cast<int>(keyBase.size()),
keyBase.data(),
aznumeric_cast<int>(keyName.size()),
keyName.data(),
TranslationKeyParts::in,
keyPart
);
break;
case TranslationItemType::ExecutionOutSlot:
fullKey = AZStd::string::format("%s%.*s_%.*s_%s_%s",
prefix,
aznumeric_cast<int>(keyBase.size()),
keyBase.data(),
aznumeric_cast<int>(keyName.size()),
keyName.data(),
TranslationKeyParts::out,
keyPart
);
break;
case TranslationItemType::ParamDataSlot:
fullKey = AZStd::string::format("%s%.*s_%.*s_%s%d_%s",
prefix,
aznumeric_cast<int>(keyBase.size()),
keyBase.data(),
aznumeric_cast<int>(keyName.size()),
keyName.data(),
TranslationKeyParts::param,
paramIndex,
keyPart
);
break;
case TranslationItemType::ReturnDataSlot:
fullKey = AZStd::string::format("%s%.*s_%.*s_%s%d_%s",
prefix,
aznumeric_cast<int>(keyBase.size()),
keyBase.data(),
aznumeric_cast<int>(keyName.size()),
keyName.data(),
TranslationKeyParts::output,
paramIndex,
keyPart
);
break;
case TranslationItemType::BusIdSlot:
fullKey = AZStd::string::format("%s%.*s_%.*s_%s_%s",
prefix,
aznumeric_cast<int>(keyBase.size()),
keyBase.data(),
aznumeric_cast<int>(keyName.size()),
keyName.data(),
TranslationKeyParts::busid,
keyPart
);
break;
default:
AZ_Warning("ScriptCanvas TranslationHelper", false, "Invalid translation item type.");
}
AZStd::to_upper(fullKey.begin(), fullKey.end());
return fullKey;
}
static AZStd::string GetClassKey(TranslationContextGroup group, AZStd::string_view keyBase, TranslationKeyId keyId)
{
const char* prefix = "";
if (group == TranslationContextGroup::EbusHandler)
{
prefix = TranslationKeyParts::handler;
}
const char* keyPart = GetKeyPart(keyId);
AZStd::string fullKey = AZStd::string::format("%s%.*s_%s",
prefix,
aznumeric_cast<int>(keyBase.size()),
keyBase.data(),
keyPart
);
AZStd::to_upper(fullKey.begin(), fullKey.end());
return fullKey;
}
static AZStd::string GetGlobalMethodKey(AZStd::string_view keyName, TranslationItemType keyType,
TranslationKeyId keyId, int paramIndex = 0)
{
const char* keyPart = GetKeyPart(keyId);
AZStd::string fullKey;
switch (keyType)
{
case TranslationItemType::Node:
fullKey = AZStd::string::format("%.*s_%s",
aznumeric_cast<int>(keyName.size()),
keyName.data(),
keyPart
);
break;
case TranslationItemType::ExecutionInSlot:
fullKey = AZStd::string::format("%.*s_%s_%s",
aznumeric_cast<int>(keyName.size()),
keyName.data(),
TranslationKeyParts::in,
keyPart
);
break;
case TranslationItemType::ExecutionOutSlot:
fullKey = AZStd::string::format("%.*s_%s_%s",
aznumeric_cast<int>(keyName.size()),
keyName.data(),
TranslationKeyParts::out,
keyPart
);
break;
case TranslationItemType::ParamDataSlot:
fullKey = AZStd::string::format("%.*s_%s%d_%s",
aznumeric_cast<int>(keyName.size()),
keyName.data(),
TranslationKeyParts::param,
paramIndex,
keyPart
);
break;
case TranslationItemType::ReturnDataSlot:
fullKey = AZStd::string::format("%.*s_%s%d_%s",
aznumeric_cast<int>(keyName.size()),
keyName.data(),
TranslationKeyParts::output,
paramIndex,
keyPart
);
break;
default:
AZ_Warning("ScriptCanvas TranslationHelper", false, "Invalid translation item type.");
}
AZStd::to_upper(fullKey.begin(), fullKey.end());
return fullKey;
}
static const char* GetKeyPart(TranslationKeyId keyId)
{
const char* keyPart = "";
switch (keyId)
{
case TranslationKeyId::Name:
keyPart = TranslationKeyParts::name;
break;
case TranslationKeyId::Tooltip:
keyPart = TranslationKeyParts::tooltip;
break;
case TranslationKeyId::Category:
keyPart = TranslationKeyParts::category;
break;
default:
AZ_Warning("ScriptCanvas TranslationHelper", false, "Invalid translation key ID.");
}
return keyPart;
}
static TranslationItemType GetItemType(ScriptCanvas::SlotDescriptor slotDescriptor)
{
if (slotDescriptor == ScriptCanvas::SlotDescriptors::ExecutionIn())
{
return TranslationItemType::ExecutionInSlot;
}
else if (slotDescriptor == ScriptCanvas::SlotDescriptors::ExecutionOut())
{
return TranslationItemType::ExecutionOutSlot;
}
else if (slotDescriptor == ScriptCanvas::SlotDescriptors::DataIn())
{
return TranslationItemType::ParamDataSlot;
}
else if (slotDescriptor == ScriptCanvas::SlotDescriptors::DataOut())
{
return TranslationItemType::ReturnDataSlot;
}
return TranslationItemType::Invalid;
}
static AZStd::string GetSafeTypeName(ScriptCanvas::Data::Type dataType)
inline AZStd::string GetSafeTypeName(ScriptCanvas::Data::Type dataType)
{
if (!dataType.IsValid())
{
return "";
}
return ScriptCanvas::Data::GetName(dataType);
AZStd::string azType = dataType.GetAZType().ToString<AZStd::string>();
GraphCanvas::TranslationKey key;
key << "BehaviorType" << azType << "details";
GraphCanvas::TranslationRequests::Details details;
details.m_name = ScriptCanvas::Data::GetName(dataType);
GraphCanvas::TranslationRequestBus::BroadcastResult(details, &GraphCanvas::TranslationRequests::GetDetails, key, details);
return details.m_name;
}
static AZStd::string GetKeyTranslation(TranslationContextGroup group, AZStd::string_view keyBase, AZStd::string_view keyName, TranslationItemType type, TranslationKeyId keyId, int paramIndex = 0)
{
AZStd::string translationContext = TranslationHelper::GetContextName(group, keyBase);
AZStd::string translationKey = TranslationHelper::GetKey(group, keyBase, keyName, type, keyId, paramIndex);
AZStd::string translated = QCoreApplication::translate(translationContext.c_str(), translationKey.c_str()).toUtf8().data();
if (translated == translationKey)
{
return AZStd::string();
}
return translated;
}
static AZStd::string GetClassKeyTranslation(TranslationContextGroup group, AZStd::string_view keyBase, TranslationKeyId keyId)
{
AZStd::string translationContext = TranslationHelper::GetContextName(group, keyBase);
AZStd::string translationKey = TranslationHelper::GetClassKey(group, keyBase, keyId);
AZStd::string translated = QCoreApplication::translate(translationContext.c_str(), translationKey.c_str()).toUtf8().data();
if (translated == translationKey)
{
return AZStd::string();
}
return translated;
}
static AZStd::string GetGlobalMethodKeyTranslation(AZStd::string_view keyName,
TranslationItemType keyType, TranslationKeyId keyId, int paramIndex = 0)
{
AZStd::string translationKey = TranslationHelper::GetGlobalMethodKey(keyName, keyType, keyId, paramIndex);
AZStd::string translated = QCoreApplication::translate(TranslationContextGroupParts::globalMethod, translationKey.c_str()).toUtf8().data();
if (translated == translationKey)
{
return AZStd::string();
}
return translated;
}
// Use the StackedString to index the translation keys as a Json Pointer
static AZ::StackedString GetAzEventHandlerRootPointer(AZStd::string_view eventName)
{
AZ::StackedString path(AZ::StackedString::Format::JsonPointer);
path.Push(eventName);
return path;
}
};
}
}
@@ -69,6 +69,9 @@ namespace ScriptCanvasEditor
void CanvasWidget::ShowScene(const ScriptCanvas::ScriptCanvasId& scriptCanvasId)
{
EditorGraphRequests* editorGraphRequests = EditorGraphRequestBus::FindFirstHandler(scriptCanvasId);
// #sc-editor-asset check if needed: editorGraphRequests->SetAssetId(m_assetId);
editorGraphRequests->CreateGraphCanvasScene();
AZ::EntityId graphCanvasSceneId = editorGraphRequests->GetGraphCanvasGraphId();
@@ -81,6 +84,13 @@ namespace ScriptCanvasEditor
void CanvasWidget::SetAssetId(const ScriptCanvasEditor::SourceHandle& assetId)
{
m_assetId = assetId;
// #sc-editor-asset check if needed:
/*
if (EditorGraphRequests* editorGraphRequests = EditorGraphRequestBus::FindFirstHandler(m_scriptCanvasId))
{
editorGraphRequests->SetAssetId(m_assetId);
}
*/
}
const GraphCanvas::ViewId& CanvasWidget::GetViewId() const
@@ -16,7 +16,6 @@
#include <AzCore/Serialization/Utils.h>
#include <AzCore/UserSettings/UserSettings.h>
#include <GraphCanvas/Types/TranslationTypes.h>
#include <GraphCanvas/Components/SceneBus.h>
#include <GraphCanvas/Components/StyleBus.h>
@@ -200,7 +199,7 @@ namespace ScriptCanvasEditor
AZ::TypeId DataTypePaletteModel::FindTypeIdForIndex(const QModelIndex& index) const
{
AZ::TypeId retVal;
AZ::TypeId retVal = AZ::TypeId::CreateNull();
if (index.row() >= 0 && index.row() < m_variableTypes.size())
{
@@ -244,7 +243,16 @@ namespace ScriptCanvasEditor
AZStd::string DataTypePaletteModel::FindTypeNameForTypeId(const AZ::TypeId& typeId) const
{
return TranslationHelper::GetSafeTypeName(ScriptCanvas::Data::FromAZType(typeId));
GraphCanvas::TranslationKey key;
key << "BehaviorType" << typeId.ToString<AZStd::string>() << "details";
GraphCanvas::TranslationRequests::Details details;
details.m_name = TranslationHelper::GetSafeTypeName(ScriptCanvas::Data::FromAZType(typeId));
GraphCanvas::TranslationRequestBus::BroadcastResult(details, &GraphCanvas::TranslationRequests::GetDetails, key, details);
return details.m_name;
}
void DataTypePaletteModel::TogglePendingPinChange(const AZ::Uuid& azVarType)
@@ -83,7 +83,16 @@ namespace ScriptCanvasEditor
, m_propertyStatus(propertyStatus)
{
GraphCanvas::TranslationKey key;
key << "BehaviorClass" << className << "methods" << methodName << "details";
AZStd::string updatedMethodName;
if (propertyStatus != ScriptCanvas::PropertyStatus::None)
{
updatedMethodName = (propertyStatus == ScriptCanvas::PropertyStatus::Getter) ? "Get" : "Set";
}
updatedMethodName.append(methodName);
key << "BehaviorClass" << className << "methods" << updatedMethodName << "details";
GraphCanvas::TranslationRequests::Details details;
details.m_name = methodName;
@@ -94,15 +103,6 @@ namespace ScriptCanvasEditor
SetName(details.m_name.c_str());
SetToolTip(details.m_tooltip.c_str());
if (propertyStatus == ScriptCanvas::PropertyStatus::Getter)
{
SetName(AZStd::string::format("Get %s", GetName().toUtf8().data()).data());
}
else if (propertyStatus == ScriptCanvas::PropertyStatus::Setter)
{
SetName(AZStd::string::format("Set %s", GetName().toUtf8().data()).data());
}
SetTitlePalette("MethodNodeTitlePalette");
}
@@ -160,13 +160,14 @@ namespace ScriptCanvasEditor
: DraggableNodePaletteTreeItem(nodeModelInformation.m_methodName, ScriptCanvasEditor::AssetEditorId)
, m_methodName{ nodeModelInformation.m_methodName }
{
SetToolTip(QString::fromUtf8(nodeModelInformation.m_displayName.data(),
aznumeric_cast<int>(nodeModelInformation.m_displayName.size())));
SetToolTip(QString::fromUtf8(nodeModelInformation.m_toolTip.data(),
aznumeric_cast<int>(nodeModelInformation.m_toolTip.size())));
SetTitlePalette("MethodNodeTitlePalette");
if (!nodeModelInformation.m_displayName.empty())
{
SetName(nodeModelInformation.m_displayName.c_str());
}
}
GraphCanvas::GraphCanvasMimeEvent* GlobalMethodEventPaletteTreeItem::CreateMimeEvent() const
@@ -180,6 +181,27 @@ namespace ScriptCanvasEditor
return m_methodName;
}
AZ::IO::Path GlobalMethodEventPaletteTreeItem::GetTranslationDataPath() const
{
AZStd::string propertyName = m_methodName;
AZ::StringFunc::Replace(propertyName, "::Getter", "");
AZ::StringFunc::Replace(propertyName, "::Setter", "");
AZStd::string filename = GraphCanvas::TranslationKey::Sanitize(propertyName);
return AZ::IO::Path("Properties") / filename;
}
void GlobalMethodEventPaletteTreeItem::GenerateTranslationData()
{
AZStd::string propertyName = m_methodName;
AZ::StringFunc::Replace(propertyName, "::Getter", "");
AZ::StringFunc::Replace(propertyName, "::Setter", "");
ScriptCanvasEditorTools::TranslationGeneration translation;
translation.TranslateBehaviorProperty(propertyName);
}
//////////////////////////////
// CreateCustomNodeMimeEvent
//////////////////////////////
@@ -70,10 +70,13 @@ namespace ScriptCanvasEditor
AZ::ComponentApplicationBus::BroadcastResult(behaviorContext, &AZ::ComponentApplicationRequests::GetBehaviorContext);
const char* className = m_className.toUtf8().data();
auto behaviorClass = behaviorContext->m_classes.find(className);
if (behaviorContext->m_classes.contains(className))
{
auto behaviorClass = behaviorContext->m_classes.find(className);
ScriptCanvasEditorTools::TranslationGeneration translation;
translation.TranslateBehaviorClass(behaviorClass->second);
ScriptCanvasEditorTools::TranslationGeneration translation;
translation.TranslateBehaviorClass(behaviorClass->second);
}
}
private:
@@ -121,6 +124,10 @@ namespace ScriptCanvasEditor
const AZStd::string& GetMethodName() const;
AZ::IO::Path GetTranslationDataPath() const override;
void GenerateTranslationData() override;
private:
AZStd::string m_methodName;
};
@@ -611,8 +611,9 @@ namespace
{
categoryPath.append(details.m_name.c_str());
}
else
else if (categoryPath.contains("Other"))
{
// Use the BehaviorEBus name to categorize within the 'Other' category
categoryPath.append(behaviorEbus.m_name.c_str());
}
}
@@ -657,8 +658,9 @@ namespace
{
categoryPath.append(details.m_name.c_str());
}
else
else if (categoryPath.contains("Other"))
{
// Use the behavior EBus name to categorize within the 'Other' category
categoryPath.append(behaviorEbus.m_name.c_str());
}
@@ -877,6 +879,7 @@ namespace ScriptCanvasEditor
void NodePaletteModel::RepopulateModel()
{
AZ_PROFILE_FUNCTION(ScriptCanvas);
ClearRegistry();
PopulateNodePaletteModel((*this));
@@ -1019,12 +1022,19 @@ namespace ScriptCanvasEditor
GraphCanvas::TranslationRequestBus::BroadcastResult(catdetails, &GraphCanvas::TranslationRequests::GetDetails, catkey, catdetails);
GraphCanvas::TranslationKey key;
key << "BehaviorClass" << methodClass.c_str() << "methods" << methodName.c_str() << "details";
AZStd::string updatedMethodName;
if (propertyStatus != ScriptCanvas::PropertyStatus::None)
{
updatedMethodName = (propertyStatus == ScriptCanvas::PropertyStatus::Getter) ? "Get" : "Set";
}
updatedMethodName += methodName;
key << "BehaviorClass" << methodClass.c_str() << "methods" << updatedMethodName << "details";
GraphCanvas::TranslationRequests::Details details;
GraphCanvas::TranslationRequestBus::BroadcastResult(details, &GraphCanvas::TranslationRequests::GetDetails, key, details);
methodModelInformation->m_displayName = details.m_name.empty() ? methodName : details.m_name;
methodModelInformation->m_displayName = details.m_name.empty() ? updatedMethodName : details.m_name;
methodModelInformation->m_toolTip = details.m_tooltip;
methodModelInformation->m_categoryPath = categoryPath;
@@ -1049,17 +1059,22 @@ namespace ScriptCanvasEditor
if (auto registerIter = m_registeredNodes.find(nodeIdentifier); registerIter == m_registeredNodes.end())
{
auto methodModelInformation = AZStd::make_unique<GlobalMethodNodeModelInformation>();
methodModelInformation->m_methodName = behaviorMethod.m_name;
methodModelInformation->m_nodeIdentifier = nodeIdentifier;
methodModelInformation->m_methodName = behaviorMethod.m_name;
methodModelInformation->m_titlePaletteOverride = "MethodNodeTitlePalette";
AZStd::string name = behaviorProperty->m_name;
AZ::StringFunc::Replace(name, "::Getter", "");
AZ::StringFunc::Replace(name, "::Setter", "");
GraphCanvas::TranslationKey key;
key << "Constant" << behaviorProperty->m_name.c_str() << "details";
key << "Constant" << name << "details";
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;
@@ -26,12 +26,18 @@
#include <AzCore/Serialization/SerializeContext.h>
#include <AzCore/UserSettings/UserSettings.h>
#include <AzCore/std/containers/map.h>
#include <AzFramework/Gem/GemInfo.h>
#include <AzFramework/StringFunc/StringFunc.h>
#include <AzToolsFramework/API/EditorAssetSystemAPI.h>
#include <AzToolsFramework/AssetBrowser/Entries/ProductAssetBrowserEntry.h>
#include <AzToolsFramework/AssetBrowser/Entries/SourceAssetBrowserEntry.h>
#include <AzToolsFramework/AssetEditor/AssetEditorUtils.h>
#include <AzToolsFramework/ToolsComponents/EditorComponentBase.h>
#include <AzQtComponents/Utilities/DesktopUtilities.h>
#include <Editor/Assets/ScriptCanvasAssetHelpers.h>
#include <Editor/Components/IconComponent.h>
#include <Editor/GraphCanvas/GraphCanvasEditorNotificationBusId.h>
@@ -50,9 +56,11 @@
#include <Editor/View/Widgets/NodePalette/VariableNodePaletteTreeItemTypes.h>
#include <Editor/View/Widgets/ScriptCanvasNodePaletteDockWidget.h>
#include <Editor/View/Widgets/ui_ScriptCanvasNodePaletteToolbar.h>
#include <GraphCanvas/Widgets/NodePalette/NodePaletteTreeView.h>
#include <GraphCanvas/Widgets/NodePalette/NodePaletteWidget.h>
#include <GraphCanvas/Widgets/NodePalette/TreeItems/NodePaletteTreeItem.h>
#include <ScriptCanvas/Asset/RuntimeAsset.h>
#include <ScriptCanvas/Core/Attributes.h>
#include <ScriptCanvas/Core/SubgraphInterfaceUtility.h>
@@ -63,7 +71,6 @@
#include <ScriptCanvas/Libraries/Libraries.h>
#include <ScriptCanvas/Utils/NodeUtils.h>
#include <ScriptEvents/ScriptEventsAsset.h>
#include "AzQtComponents/Utilities/DesktopUtilities.h"
namespace ScriptCanvasEditor
{
@@ -639,7 +646,7 @@ namespace ScriptCanvasEditor
m_mimeType = NodePaletteDockWidget::GetMimeType();
m_isInContextMenu = isInContextMenu;
m_allowArrowKeyNavigation = isInContextMenu;
m_saveIdentifier = m_isInContextMenu ? "ScriptCanvas" : "ScriptCnavas_ContextMenu";
m_saveIdentifier = m_isInContextMenu ? "ScriptCanvas" : "ScriptCanvas_ContextMenu";
m_rootTreeItem = Widget::NodePaletteWidget::ExternalCreateNodePaletteRoot(nodePaletteModel, assetModel);
}
@@ -710,7 +717,7 @@ namespace ScriptCanvasEditor
{
m_openTranslationData = new QAction(treeView);
m_openTranslationData->setText("Open Translation Data");
m_openTranslationData->setText("Explore Translation Data");
treeView->addAction(m_openTranslationData);
QObject::connect(m_openTranslationData, &QAction::triggered, this, &NodePaletteDockWidget::OpenTranslationData);
@@ -877,17 +884,14 @@ namespace ScriptCanvasEditor
{
QModelIndexList indexList = GetTreeView()->selectionModel()->selectedRows();
if (indexList.size() == 1)
QSortFilterProxyModel* filterModel = static_cast<QSortFilterProxyModel*>(GetTreeView()->model());
for (const QModelIndex& index : indexList)
{
QSortFilterProxyModel* filterModel = static_cast<QSortFilterProxyModel*>(GetTreeView()->model());
QModelIndex sourceIndex = filterModel->mapToSource(index);
for (const QModelIndex& index : indexList)
{
QModelIndex sourceIndex = filterModel->mapToSource(index);
GraphCanvas::NodePaletteTreeItem* nodePaletteItem = static_cast<GraphCanvas::NodePaletteTreeItem*>(sourceIndex.internalPointer());
nodePaletteItem->GenerateTranslationData();
}
GraphCanvas::NodePaletteTreeItem* nodePaletteItem = static_cast<GraphCanvas::NodePaletteTreeItem*>(sourceIndex.internalPointer());
nodePaletteItem->GenerateTranslationData();
}
}
@@ -19,7 +19,6 @@
#include <AzToolsFramework/ToolsComponents/EditorComponentBase.h>
#include <GraphCanvas/Types/TranslationTypes.h>
#include <GraphCanvas/Components/SceneBus.h>
#include <GraphCanvas/Components/StyleBus.h>
@@ -18,7 +18,6 @@
#include <AzToolsFramework/ToolsComponents/EditorComponentBase.h>
#include <GraphCanvas/Types/TranslationTypes.h>
#include <GraphCanvas/Components/SceneBus.h>
#include <GraphCanvas/Components/StyleBus.h>
@@ -416,6 +416,8 @@ namespace ScriptCanvasEditor
, m_closeCurrentGraphAfterSave(false)
, m_styleManager(ScriptCanvasEditor::AssetEditorId, "ScriptCanvas/StyleSheet/graphcanvas_style.json")
{
AZ_PROFILE_FUNCTION(ScriptCanvas);
VariablePaletteRequestBus::Handler::BusConnect();
GraphCanvas::AssetEditorAutomationRequestBus::Handler::BusConnect(ScriptCanvasEditor::AssetEditorId);
@@ -12,6 +12,8 @@
#include <QMimeData>
#include <QInputDialog>
#include <AzCore/UserSettings/UserSettings.h>
#include <AzToolsFramework/API/ToolsApplicationAPI.h>
#include <Editor/Nodes/NodeUtils.h>
@@ -41,6 +43,8 @@
#include <Editor/View/Widgets/NodePalette/VariableNodePaletteTreeItemTypes.h>
#include "ScriptCanvasContextMenus.h"
#include "Settings.h"
#include <ScriptCanvas/Core/NodeBus.h>
#include <ScriptCanvas/Core/Slot.h>
#include <GraphCanvas/Editor/EditorTypes.h>
@@ -53,6 +57,7 @@
#include <GraphCanvas/Components/Nodes/NodeTitleBus.h>
#include <GraphCanvas/Components/NodeDescriptors/FunctionDefinitionNodeDescriptorComponent.h>
namespace ScriptCanvasEditor
{
////////////////////////////
@@ -805,6 +810,13 @@ namespace ScriptCanvasEditor
SceneContextMenu::SceneContextMenu(const NodePaletteModel& paletteModel, AzToolsFramework::AssetBrowser::AssetBrowserFilterModel* assetModel)
: GraphCanvas::SceneContextMenu(ScriptCanvasEditor::AssetEditorId)
{
auto userSettings = AZ::UserSettings::CreateFind<EditorSettings::ScriptCanvasEditorSettings>(AZ_CRC("ScriptCanvasPreviewSettings", 0x1c5a2965), AZ::UserSettings::CT_LOCAL);
if (userSettings)
{
m_userNodePaletteWidth = userSettings->m_sceneContextMenuNodePaletteWidth;
}
const bool inContextMenu = true;
Widget::ScriptCanvasNodePaletteConfig paletteConfig(paletteModel, assetModel, inContextMenu);
AddNodePaletteMenuAction(paletteConfig);