editor sc component switched over to source handle, not yet connected to file notifications

Signed-off-by: chcurran <82187351+carlitosan@users.noreply.github.com>
This commit is contained in:
chcurran
2021-11-19 10:03:16 -08:00
committed by Chris Burel
parent b772db5e73
commit ad8cfa5f99
10 changed files with 271 additions and 211 deletions
@@ -26,18 +26,20 @@
#include <ScriptCanvas/Assets/ScriptCanvasAsset.h>
#include <ScriptCanvas/Bus/RequestBus.h>
#include <ScriptCanvas/Components/EditorGraph.h>
#include <ScriptCanvas/Components/EditorUtils.h>
#include <ScriptCanvas/Components/EditorGraphVariableManagerComponent.h>
#include <ScriptCanvas/Components/EditorScriptCanvasComponent.h>
#include <ScriptCanvas/Core/Node.h>
#include <ScriptCanvas/PerformanceStatisticsBus.h>
#include <LyViewPaneNames.h>
#include <ScriptCanvas/Assets/ScriptCanvasFileHandling.h>
namespace EditorScriptCanvasComponentCpp
{
enum Version
{
PrefabIntegration = 10,
AddSourceHandle,
// add description above
Current
};
@@ -142,6 +144,25 @@ namespace ScriptCanvasEditor
}
}
if (rootElement.GetVersion() < EditorScriptCanvasComponentCpp::Version::AddSourceHandle)
{
ScriptCanvasAssetHolder assetHolder;
if (!rootElement.FindSubElementAndGetData(AZ_CRC_CE("m_assetHolder"), assetHolder))
{
AZ_Error("ScriptCanvas", false, "EditorScriptCanvasComponent conversion failed: could not retrieve old 'm_assetHolder'");
return false;
}
auto assetId = assetHolder.GetAssetId();
auto path = assetHolder.GetAssetHint();
if (!rootElement.AddElementWithData(serializeContext, "runtimeDataOverrides", SourceHandle(nullptr, assetId.m_guid, path)))
{
AZ_Error("ScriptCanvas", false, "EditorScriptCanvasComponent conversion failed: failed to add 'sourceHandle'");
return false;
}
}
return true;
}
@@ -153,9 +174,9 @@ namespace ScriptCanvasEditor
serializeContext->Class<EditorScriptCanvasComponent, EditorComponentBase>()
->Version(EditorScriptCanvasComponentCpp::Version::Current, &EditorScriptCanvasComponentVersionConverter)
->Field("m_name", &EditorScriptCanvasComponent::m_name)
->Field("m_assetHolder", &EditorScriptCanvasComponent::m_scriptCanvasAssetHolder)
->Field("runtimeDataIsValid", &EditorScriptCanvasComponent::m_runtimeDataIsValid)
->Field("runtimeDataOverrides", &EditorScriptCanvasComponent::m_variableOverrides)
->Field("sourceHandle", &EditorScriptCanvasComponent::m_sourceHandle)
;
if (AZ::EditContext* editContext = serializeContext->GetEditContext())
@@ -171,7 +192,7 @@ namespace ScriptCanvasEditor
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("UI", 0x27ff46b0))
->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Level", 0x9aeacc13))
->Attribute(AZ::Edit::Attributes::HelpPageURL, "https://o3de.org/docs/user-guide/components/reference/scripting/script-canvas/")
->DataElement(AZ::Edit::UIHandlers::Default, &EditorScriptCanvasComponent::m_scriptCanvasAssetHolder, "Script Canvas Asset", "Script Canvas asset associated with this component")
->DataElement(AZ::Edit::UIHandlers::Default, &EditorScriptCanvasComponent::m_sourceHandle, "Script Canvas Source File", "Script Canvas source file associated with this component")
->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly)
->DataElement(AZ::Edit::UIHandlers::Default, &EditorScriptCanvasComponent::m_variableOverrides, "Properties", "Script Canvas Graph Properties")
->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly)
@@ -181,19 +202,13 @@ namespace ScriptCanvasEditor
}
EditorScriptCanvasComponent::EditorScriptCanvasComponent()
: EditorScriptCanvasComponent(AZ::Data::Asset<ScriptCanvasAsset>())
: EditorScriptCanvasComponent(SourceHandle())
{
}
EditorScriptCanvasComponent::EditorScriptCanvasComponent(AZ::Data::Asset<ScriptCanvasAsset> asset)
: m_scriptCanvasAssetHolder()
EditorScriptCanvasComponent::EditorScriptCanvasComponent(const SourceHandle& sourceHandle)
: m_sourceHandle(sourceHandle)
{
if (asset.GetId().IsValid())
{
m_scriptCanvasAssetHolder.SetAsset(asset.GetId());
}
m_scriptCanvasAssetHolder.SetScriptChangedCB([this](AZ::Data::AssetId assetId) { OnScriptCanvasAssetChanged(assetId); });
}
EditorScriptCanvasComponent::~EditorScriptCanvasComponent()
@@ -209,42 +224,35 @@ namespace ScriptCanvasEditor
void EditorScriptCanvasComponent::UpdateName()
{
AZ::Data::AssetId assetId = m_scriptCanvasAssetHolder.GetAssetId();
if (assetId.IsValid())
{
// Pathname from the asset doesn't seem to return a value unless the asset has been loaded up once(which isn't done until we try to show it).
// Using the Job system to determine the asset name instead.
AZ::Outcome<AzToolsFramework::AssetSystem::JobInfoContainer> jobOutcome = AZ::Failure();
AzToolsFramework::AssetSystemJobRequestBus::BroadcastResult(jobOutcome, &AzToolsFramework::AssetSystemJobRequestBus::Events::GetAssetJobsInfoByAssetID, assetId, false, false);
AZStd::string assetPath;
AZStd::string assetName;
if (jobOutcome.IsSuccess())
{
AzToolsFramework::AssetSystem::JobInfoContainer& jobs = jobOutcome.GetValue();
// Get the asset relative path
if (!jobs.empty())
{
assetPath = jobs[0].m_sourceFile;
}
// Get the asset file name
assetName = assetPath;
if (!assetPath.empty())
{
AzFramework::StringFunc::Path::GetFileName(assetPath.c_str(), assetName);
SetName(assetName);
}
}
}
SetName(m_sourceHandle.Path().Filename().Native());
}
void EditorScriptCanvasComponent::OpenEditor()
{
m_scriptCanvasAssetHolder.OpenEditor();
AzToolsFramework::OpenViewPane(LyViewPane::ScriptCanvas);
AZ::Outcome<int, AZStd::string> openOutcome = AZ::Failure(AZStd::string());
if (m_sourceHandle.IsValid())
{
GeneralRequestBus::BroadcastResult(openOutcome, &GeneralRequests::OpenScriptCanvasAsset, m_sourceHandle, -1);
if (!openOutcome)
{
AZ_Warning("Script Canvas", openOutcome, "%s", openOutcome.GetError().data());
}
}
else if (GetEntityId().IsValid())
{
AzToolsFramework::EntityIdList selectedEntityIds;
AzToolsFramework::ToolsApplicationRequestBus::BroadcastResult(selectedEntityIds, &AzToolsFramework::ToolsApplicationRequests::GetSelectedEntities);
// Going to bypass the multiple selected entities flow for right now.
if (selectedEntityIds.size() == 1)
{
GeneralRequestBus::Broadcast(&GeneralRequests::CreateScriptCanvasAssetFor, AZStd::make_pair(GetEntityId(), GetId()));
}
}
}
void EditorScriptCanvasComponent::Init()
@@ -260,6 +268,8 @@ namespace ScriptCanvasEditor
{
EditorComponentBase::Activate();
AzToolsFramework::AssetSystemBus::Handler::BusConnect();
AZ::EntityId entityId = GetEntityId();
EditorContextMenuRequestBus::Handler::BusConnect(entityId);
@@ -268,19 +278,13 @@ namespace ScriptCanvasEditor
EditorScriptCanvasComponentLoggingBus::Handler::BusConnect(entityId);
EditorLoggingComponentNotificationBus::Broadcast(&EditorLoggingComponentNotifications::OnEditorScriptCanvasComponentActivated, GetNamedEntityId(), GetGraphIdentifier());
AZ::Data::AssetId fileAssetId = m_scriptCanvasAssetHolder.GetAssetId();
if (fileAssetId.IsValid())
{
AssetTrackerNotificationBus::Handler::BusConnect(fileAssetId);
AzToolsFramework::ToolsApplicationNotificationBus::Broadcast(&AzToolsFramework::ToolsApplicationEvents::InvalidatePropertyDisplay, AzToolsFramework::Refresh_EntireTree_NewContent);
}
AzToolsFramework::ToolsApplicationNotificationBus::Broadcast(&AzToolsFramework::ToolsApplicationEvents::InvalidatePropertyDisplay, AzToolsFramework::Refresh_EntireTree_NewContent);
}
//=========================================================================
void EditorScriptCanvasComponent::Deactivate()
{
AssetTrackerNotificationBus::Handler::BusDisconnect();
AzToolsFramework::AssetSystemBus::Handler::BusDisconnect();
EditorScriptCanvasComponentLoggingBus::Handler::BusDisconnect();
EditorLoggingComponentNotificationBus::Broadcast(&EditorLoggingComponentNotifications::OnEditorScriptCanvasComponentDeactivated, GetNamedEntityId(), GetGraphIdentifier());
@@ -297,7 +301,7 @@ namespace ScriptCanvasEditor
m_runtimeDataIsValid = false;
auto assetTreeOutcome = LoadEditorAssetTree(m_scriptCanvasAssetHolder.GetAssetId(), m_scriptCanvasAssetHolder.GetAssetHint());
auto assetTreeOutcome = LoadEditorAssetTree(m_sourceHandle.Id(), m_sourceHandle.Path().c_str());
if (!assetTreeOutcome.IsSuccess())
{
AZ_Warning("ScriptCanvas", false, "EditorScriptCanvasComponent::BuildGameEntityData failed: %s", assetTreeOutcome.GetError().c_str());
@@ -335,7 +339,8 @@ namespace ScriptCanvasEditor
if (!m_runtimeDataIsValid)
{
AZ_Error("ScriptCanvasBuilder", false, "Runtime information did not build for ScriptCanvas Component using asset: %s", m_scriptCanvasAssetHolder.GetAssetId().ToString<AZStd::string>().c_str());
AZ_Error("ScriptCanvasBuilder", false, "Runtime information did not build for ScriptCanvas Component using asset: %s"
, m_sourceHandle.ToString().c_str());
return;
}
@@ -343,123 +348,53 @@ namespace ScriptCanvasEditor
runtimeComponent->TakeRuntimeDataOverrides(ConvertToRuntime(m_variableOverrides));
}
void EditorScriptCanvasComponent::OnCatalogAssetAdded(const AZ::Data::AssetId& assetId)
{
if (m_removedCatalogId == assetId)
{
if (!m_scriptCanvasAssetHolder.GetAssetId().IsValid())
{
SetPrimaryAsset(assetId);
m_removedCatalogId.SetInvalid();
}
}
}
void EditorScriptCanvasComponent::OnCatalogAssetRemoved(const AZ::Data::AssetId& removedAssetId, const AZ::Data::AssetInfo& /*assetInfo*/)
{
AZ::Data::AssetId assetId = m_scriptCanvasAssetHolder.GetAssetId();
if (assetId == removedAssetId)
{
m_removedCatalogId = assetId;
SetPrimaryAsset({});
}
}
void EditorScriptCanvasComponent::SetPrimaryAsset(const AZ::Data::AssetId& assetId)
{
m_scriptCanvasAssetHolder.ClearAsset();
m_sourceHandle = SourceHandle(nullptr, assetId.m_guid, {});
if (assetId.IsValid())
auto completeAsset = CompleteDescription(m_sourceHandle);
if (completeAsset)
{
ScriptCanvasMemoryAsset::pointer memoryAsset;
AssetTrackerRequestBus::BroadcastResult(memoryAsset, &AssetTrackerRequests::GetAsset, assetId);
if (memoryAsset)
{
m_scriptCanvasAssetHolder.SetAsset(memoryAsset->GetFileAssetId());
OnScriptCanvasAssetChanged(memoryAsset->GetFileAssetId());
SetName(memoryAsset->GetTabName());
}
else
{
auto scriptCanvasAsset = AZ::Data::AssetManager::Instance().FindAsset(assetId, AZ::Data::AssetLoadBehavior::Default);
if (scriptCanvasAsset)
{
m_scriptCanvasAssetHolder.SetAsset(assetId);
}
}
m_sourceHandle = *completeAsset;
}
OnScriptCanvasAssetChanged(m_sourceHandle);
SetName(m_sourceHandle.Path().Filename().Native());
AzToolsFramework::ToolsApplicationEvents::Bus::Broadcast(&AzToolsFramework::ToolsApplicationEvents::InvalidatePropertyDisplay, AzToolsFramework::Refresh_AttributesAndValues);
}
AZ::Data::AssetId EditorScriptCanvasComponent::GetAssetId() const
{
return m_scriptCanvasAssetHolder.GetAssetId();
return m_sourceHandle.Id();
}
AZ::EntityId EditorScriptCanvasComponent::GetGraphEntityId() const
void EditorScriptCanvasComponent::OnScriptCanvasAssetChanged(const SourceHandle& assetId)
{
AZ::EntityId scriptCanvasEntityId;
AZ::Data::AssetId assetId = m_scriptCanvasAssetHolder.GetAssetId();
if (assetId.IsValid())
{
AssetTrackerRequestBus::BroadcastResult(scriptCanvasEntityId, &AssetTrackerRequests::GetScriptCanvasId, assetId);
}
return scriptCanvasEntityId;
}
void EditorScriptCanvasComponent::OnAssetReady(const ScriptCanvasMemoryAsset::pointer asset)
{
OnScriptCanvasAssetReady(asset);
}
void EditorScriptCanvasComponent::OnAssetSaved(const ScriptCanvasMemoryAsset::pointer asset, bool isSuccessful)
{
if (isSuccessful)
{
OnScriptCanvasAssetReady(asset);
}
}
void EditorScriptCanvasComponent::OnAssetReloaded(const ScriptCanvasMemoryAsset::pointer asset)
{
OnScriptCanvasAssetReady(asset);
}
void EditorScriptCanvasComponent::OnScriptCanvasAssetChanged(AZ::Data::AssetId assetId)
{
AssetTrackerNotificationBus::Handler::BusDisconnect();
ScriptCanvas::GraphIdentifier newIdentifier = GetGraphIdentifier();
newIdentifier.m_assetId = assetId;
newIdentifier.m_assetId = assetId.Id();
ScriptCanvas::GraphIdentifier oldIdentifier = GetGraphIdentifier();
oldIdentifier.m_assetId = m_previousAssetId;
oldIdentifier.m_assetId = m_previousHandle.Id();
EditorLoggingComponentNotificationBus::Broadcast(&EditorLoggingComponentNotifications::OnAssetSwitched, GetNamedEntityId(), newIdentifier, oldIdentifier);
m_previousAssetId = m_scriptCanvasAssetHolder.GetAssetId();
m_previousHandle = m_sourceHandle.Describe();
// Only clear our variables when we are given a new asset id
// or when the asset was explicitly set to empty.
//
// i.e. do not clear variables when we lose the catalog asset.
if ((assetId.IsValid() && assetId != m_removedCatalogId)
|| (!assetId.IsValid() && !m_removedCatalogId.IsValid()))
if ((assetId.IsValidDescription() && assetId.Describe() != m_removedHandle.Describe())
|| (!assetId.IsValidDescription() && !m_removedHandle.IsValidDescription()))
{
ClearVariables();
}
if (assetId.IsValid())
if (assetId.IsValidDescription())
{
AssetTrackerNotificationBus::Handler::BusConnect(assetId);
ScriptCanvasMemoryAsset::pointer memoryAsset;
AssetTrackerRequestBus::BroadcastResult(memoryAsset, &AssetTrackerRequests::GetAsset, assetId);
if (memoryAsset && memoryAsset->GetAsset().GetStatus() == AZ::Data::AssetData::AssetStatus::Ready)
if (auto loaded = LoadFromFile(assetId.Path().c_str()); loaded.IsSuccess())
{
OnScriptCanvasAssetReady(memoryAsset);
OnScriptCanvasAssetReady(loaded.GetValue());
}
}
@@ -476,39 +411,49 @@ namespace ScriptCanvasEditor
AZ::ScriptSystemRequestBus::Broadcast(&AZ::ScriptSystemRequests::GarbageCollect);
}
void EditorScriptCanvasComponent::SetAssetId(const AZ::Data::AssetId& assetId)
void EditorScriptCanvasComponent::SetAssetId(const SourceHandle& assetId)
{
if (m_scriptCanvasAssetHolder.GetAssetId() != assetId)
if (m_sourceHandle.Describe() != assetId.Describe())
{
// Invalidate the previously removed catalog id if we are setting a new asset id
m_removedCatalogId.SetInvalid();
SetPrimaryAsset(assetId);
m_removedHandle = {};
SetPrimaryAsset(assetId.Id());
}
}
void EditorScriptCanvasComponent::SourceFileChanged(AZStd::string /*relativePath*/, AZStd::string /*scanFolder*/, AZ::Uuid /*fileAssetId*/)
{}
void EditorScriptCanvasComponent::SourceFileRemoved(AZStd::string /*relativePath*/, AZStd::string /*scanFolder*/, AZ::Uuid /*fileAssetId*/)
{}
void EditorScriptCanvasComponent::SourceFileFailed(AZStd::string /*relativePath*/, AZStd::string /*scanFolder*/, AZ::Uuid /*fileAssetId*/)
{}
bool EditorScriptCanvasComponent::HasAssetId() const
{
return m_scriptCanvasAssetHolder.GetAssetId().IsValid();
return !m_sourceHandle.Id().IsNull();
}
ScriptCanvas::GraphIdentifier EditorScriptCanvasComponent::GetGraphIdentifier() const
{
// For now we don't want to deal with disambiguating duplicates of the same script running on one entity.
// Should that change we need to add the component id back into this.
return ScriptCanvas::GraphIdentifier(m_scriptCanvasAssetHolder.GetAssetId(), 0);
return ScriptCanvas::GraphIdentifier(m_sourceHandle.Id(), 0);
}
void EditorScriptCanvasComponent::OnScriptCanvasAssetReady(const ScriptCanvasMemoryAsset::pointer memoryAsset)
void EditorScriptCanvasComponent::OnScriptCanvasAssetReady(const SourceHandle& sourceHandle)
{
if (memoryAsset->GetFileAssetId() == m_scriptCanvasAssetHolder.GetAssetId())
if (sourceHandle.IsValid())
{
auto assetData = memoryAsset->GetAsset();
[[maybe_unused]] AZ::Entity* scriptCanvasEntity = assetData->GetScriptCanvasEntity();
AZ_Assert(scriptCanvasEntity, "This graph must have a valid entity");
BuildGameEntityData();
UpdateName();
AzToolsFramework::ToolsApplicationNotificationBus::Broadcast(&AzToolsFramework::ToolsApplicationEvents::InvalidatePropertyDisplay, AzToolsFramework::Refresh_EntireTree_NewContent);
}
else
{
// #sc_editor_asset clear or disable something
}
}
void EditorScriptCanvasComponent::ClearVariables()