Merge branch 'development' into redcode/driller_removal

Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com>

# Conflicts:
#	Code/Framework/AzCore/AzCore/azcore_files.cmake
#	Gems/Atom/Feature/Common/Assets/Materials/Presets/MacBeth/15_red_sRGB.tif
This commit is contained in:
Esteban Papp
2021-12-07 13:31:55 -08:00
21 changed files with 286 additions and 728 deletions
@@ -74,7 +74,7 @@ namespace ScriptCanvasEditor
AZ_Assert(loadResult.m_runtimeAsset, "failed to load dependent asset");
AZ::Outcome<ScriptCanvas::Translation::LuaAssetResult, AZStd::string> luaAssetOutcome = AZ::Failure(AZStd::string("lua asset creation for function failed"));
ScriptCanvasEditor::EditorAssetConversionBus::BroadcastResult(luaAssetOutcome, &ScriptCanvasEditor::EditorAssetConversionBusTraits::CreateLuaAsset, loadResult.m_editorAsset, loadResult.m_graphPath);
ScriptCanvasEditor::EditorAssetConversionBus::BroadcastResult(luaAssetOutcome, &ScriptCanvasEditor::EditorAssetConversionBusTraits::CreateLuaAsset, loadResult.m_editorAsset, loadResult.m_editorAsset.Path().c_str());
AZ_Assert(luaAssetOutcome.IsSuccess(), "failed to create Lua asset");
AZStd::string modulePath = namespacePath[0].data();
@@ -111,18 +111,19 @@ namespace ScriptCanvasEditor
AZ_INLINE LoadTestGraphResult LoadTestGraph(AZStd::string_view graphPath)
{
AZ::Data::Asset<ScriptCanvasEditor::ScriptCanvasAsset> editorAsset;
ScriptCanvasEditor::EditorAssetConversionBus::BroadcastResult(editorAsset, &ScriptCanvasEditor::EditorAssetConversionBusTraits::LoadAsset, graphPath);
if (editorAsset.GetData())
if (auto loadFileOutcome = LoadFromFile(graphPath); loadFileOutcome.IsSuccess())
{
AZ::Outcome< AZ::Data::Asset<ScriptCanvas::RuntimeAsset>, AZStd::string> assetOutcome = AZ::Failure(AZStd::string("asset creation failed"));
ScriptCanvasEditor::EditorAssetConversionBus::BroadcastResult(assetOutcome, &ScriptCanvasEditor::EditorAssetConversionBusTraits::CreateRuntimeAsset, editorAsset);
auto& source = loadFileOutcome.GetValue();
auto testableSource = SourceHandle(source, AZ::Uuid::CreateRandom(), source.Path().c_str());
AZ::Outcome<AZ::Data::Asset<ScriptCanvas::RuntimeAsset>, AZStd::string> assetOutcome(AZ::Failure(AZStd::string("asset create failed")));
ScriptCanvasEditor::EditorAssetConversionBus::BroadcastResult(assetOutcome
, &ScriptCanvasEditor::EditorAssetConversionBusTraits::CreateRuntimeAsset, testableSource);
if (assetOutcome.IsSuccess())
{
LoadTestGraphResult result;
result.m_graphPath = graphPath;
result.m_editorAsset = editorAsset;
result.m_editorAsset = AZStd::move(testableSource);
result.m_runtimeAsset = assetOutcome.GetValue();
result.m_entity = AZStd::make_unique<AZ::Entity>("Loaded Graph");
return result;
@@ -163,8 +164,7 @@ namespace ScriptCanvasEditor
reporter.SetExecutionMode(mode);
LoadTestGraphResult loadResult;
loadResult.m_graphPath = asset.GetHint().c_str();
loadResult.m_editorAsset = asset;
loadResult.m_editorAsset = SourceHandle(nullptr, assetId.m_guid, asset.GetHint());
AZ::EntityId scriptCanvasId;
loadResult.m_entity = AZStd::make_unique<AZ::Entity>("Loaded test graph");
loadResult.m_runtimeAsset = runtimeAsset;
@@ -205,7 +205,8 @@ namespace ScriptCanvasEditor
{
ScopedOutputSuppression outputSuppressor;
AZ::Outcome<ScriptCanvas::Translation::LuaAssetResult, AZStd::string> luaAssetOutcome = AZ::Failure(AZStd::string("lua asset creation failed"));
ScriptCanvasEditor::EditorAssetConversionBus::BroadcastResult(luaAssetOutcome, &ScriptCanvasEditor::EditorAssetConversionBusTraits::CreateLuaAsset, loadResult.m_editorAsset, loadResult.m_graphPath);
ScriptCanvasEditor::EditorAssetConversionBus::BroadcastResult(luaAssetOutcome
, &ScriptCanvasEditor::EditorAssetConversionBusTraits::CreateLuaAsset, loadResult.m_editorAsset, loadResult.m_editorAsset.Path().c_str());
reporter.MarkParseAttemptMade();
if (luaAssetOutcome.IsSuccess())
@@ -219,6 +220,8 @@ namespace ScriptCanvasEditor
{
RuntimeDataOverrides runtimeDataOverrides;
runtimeDataOverrides.m_runtimeAsset = loadResult.m_runtimeAsset;
runtimeDataOverrides.m_runtimeAsset.SetHint("original");
runtimeDataOverrides.m_runtimeAsset.Get()->m_runtimeData.m_script.SetHint("original");
#if defined(LINUX) //////////////////////////////////////////////////////////////////////////
// Temporarily disable testing on the Linux build until the file name casing discrepancy
@@ -264,6 +267,10 @@ namespace ScriptCanvasEditor
RuntimeDataOverrides dependencyRuntimeDataOverrides;
dependencyRuntimeDataOverrides.m_runtimeAsset = dependency.runtimeAsset;
AZStd::string dependencyHint = AZStd::string::format("dependency_%d", index);
dependencyRuntimeDataOverrides.m_runtimeAsset.SetHint(dependencyHint);
dependencyRuntimeDataOverrides.m_runtimeAsset.Get()->m_runtimeData.m_script.SetHint(dependencyHint);
runtimeDataOverrides.m_dependencies.push_back(dependencyRuntimeDataOverrides);
RuntimeData& dependencyData = dependencyDataBuffer[index];
@@ -52,7 +52,6 @@ namespace ScriptCanvasEditor
m_view->textEdit->setVerticalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAlwaysOn);
connect(m_view->scanButton, &QPushButton::pressed, this, &Controller::OnButtonPressScan);
connect(m_view->closeButton, &QPushButton::pressed, this, &Controller::OnButtonPressClose);
m_view->upgradeAllButton->setVisible(false);
connect(m_view->upgradeAllButton, &QPushButton::pressed, this, &Controller::OnButtonPressUpgrade);
m_view->progressBar->setValue(0);
m_view->progressBar->setVisible(false);
@@ -103,9 +102,9 @@ namespace ScriptCanvasEditor
}
}
QList<QTableWidgetItem*> Controller::FindTableItems(const AZ::Data::AssetInfo& info)
QList<QTableWidgetItem*> Controller::FindTableItems(const SourceHandle& info)
{
return m_view->tableWidget->findItems(info.m_relativePath.c_str(), Qt::MatchFlag::MatchExactly);
return m_view->tableWidget->findItems(info.Path().c_str(), Qt::MatchFlag::MatchExactly);
}
void Controller::OnButtonPressClose()
@@ -116,30 +115,20 @@ namespace ScriptCanvasEditor
void Controller::OnButtonPressScan()
{
// \todo move to another file
auto isUpToDate = [this](AZ::Data::Asset<AZ::Data::AssetData> asset)
auto isUpToDate = [this](const SourceHandle& asset)
{
AZ::Entity* scriptCanvasEntity = nullptr;
auto graphComponent = asset.Get();
if (asset.GetType() == azrtti_typeid<ScriptCanvasAsset>())
{
ScriptCanvasAsset* scriptCanvasAsset = asset.GetAs<ScriptCanvasAsset>();
if (!scriptCanvasAsset)
{
AZ_Warning
(ScriptCanvas::k_VersionExplorerWindow.data()
, false
, "InspectAsset: %s, AsestData failed to return ScriptCanvasAsset"
, asset.GetHint().c_str());
return true;
}
AZ_Warning
( ScriptCanvas::k_VersionExplorerWindow.data()
, asset.Get() != nullptr
, "InspectAsset: %s, failed to load valid graph"
, asset.Path().c_str());
scriptCanvasEntity = scriptCanvasAsset->GetScriptCanvasEntity();
AZ_Assert(scriptCanvasEntity, "The Script Canvas asset must have a valid entity");
}
auto graphComponent = scriptCanvasEntity->FindComponent<ScriptCanvasEditor::Graph>();
AZ_Assert(graphComponent, "The Script Canvas entity must have a Graph component");
return !m_view->forceUpgrade->isChecked() && graphComponent->GetVersion().IsLatest();
return graphComponent
&& (!graphComponent->GetVersion().IsLatest() || m_view->forceUpgrade->isChecked())
? ScanConfiguration::Filter::Include
: ScanConfiguration::Filter::Exclude;
};
ScanConfiguration config;
@@ -155,59 +144,19 @@ namespace ScriptCanvasEditor
OnButtonPressUpgradeImplementation({});
}
void Controller::OnButtonPressUpgradeImplementation(const AZ::Data::AssetInfo& assetInfo)
void Controller::OnButtonPressUpgradeImplementation(const SourceHandle& assetInfo)
{
auto simpleUpdate = [this](AZ::Data::Asset<AZ::Data::AssetData> asset)
auto simpleUpdate = [this](SourceHandle& asset)
{
if (asset.GetType() == azrtti_typeid<ScriptCanvasAsset>())
AZ_Warning(ScriptCanvas::k_VersionExplorerWindow.data(), asset.Get() != nullptr
, "The Script Canvas asset must have a Graph component");
if (asset.Get())
{
ScriptCanvasAsset* scriptCanvasAsset = asset.GetAs<ScriptCanvasAsset>();
AZ_Assert(scriptCanvasAsset, "Unable to get the asset of ScriptCanvasAsset, but received type: %s"
, azrtti_typeid<ScriptCanvasAsset>().template ToString<AZStd::string>().c_str());
if (!scriptCanvasAsset)
{
return;
}
AZ::Entity* scriptCanvasEntity = scriptCanvasAsset->GetScriptCanvasEntity();
AZ_Assert(scriptCanvasEntity, "View::UpgradeGraph The Script Canvas asset must have a valid entity");
if (!scriptCanvasEntity)
{
return;
}
AZ::Entity* queryEntity = nullptr;
AZ::ComponentApplicationBus::BroadcastResult(queryEntity, &AZ::ComponentApplicationRequests::FindEntity, scriptCanvasEntity->GetId());
if (queryEntity)
{
if (queryEntity->GetState() == AZ::Entity::State::Active)
{
queryEntity->Deactivate();
}
scriptCanvasEntity = queryEntity;
}
if (scriptCanvasEntity->GetState() == AZ::Entity::State::Constructed)
{
scriptCanvasEntity->Init();
}
if (scriptCanvasEntity->GetState() == AZ::Entity::State::Init)
{
scriptCanvasEntity->Activate();
}
AZ_Assert(scriptCanvasEntity->GetState() == AZ::Entity::State::Active, "Graph entity is not active");
auto graphComponent = scriptCanvasEntity->FindComponent<ScriptCanvasEditor::Graph>();
AZ_Assert(graphComponent, "The Script Canvas entity must have a Graph component");
if (graphComponent)
{
graphComponent->UpgradeGraph
(asset
, m_view->forceUpgrade->isChecked() ? Graph::UpgradeRequest::Forced : Graph::UpgradeRequest::IfOutOfDate
, m_view->verbose->isChecked());
}
asset.Mod()->UpgradeGraph
( asset
, m_view->forceUpgrade->isChecked() ? Graph::UpgradeRequest::Forced : Graph::UpgradeRequest::IfOutOfDate
, m_view->verbose->isChecked());
}
};
@@ -215,7 +164,7 @@ namespace ScriptCanvasEditor
{
int result = QMessageBox::No;
QMessageBox mb
(QMessageBox::Warning
( QMessageBox::Warning
, QObject::tr("Failed to Save Upgraded File")
, QObject::tr("The upgraded file could not be saved because the file is read only.\n"
"Do you want to make it writeable and overwrite it?")
@@ -234,12 +183,12 @@ namespace ScriptCanvasEditor
ModelRequestsBus::Broadcast(&ModelRequestsTraits::Modify, config);
}
void Controller::OnButtonPressUpgradeSingle(const AZ::Data::AssetInfo& assetInfo)
void Controller::OnButtonPressUpgradeSingle(const SourceHandle& info)
{
OnButtonPressUpgradeImplementation(assetInfo);
OnButtonPressUpgradeImplementation(info);
}
void Controller::OnUpgradeModificationBegin([[maybe_unused]] const ModifyConfiguration& config, const AZ::Data::AssetInfo& info)
void Controller::OnUpgradeModificationBegin([[maybe_unused]] const ModifyConfiguration& config, const SourceHandle& info)
{
for (auto* item : FindTableItems(info))
{
@@ -251,16 +200,16 @@ namespace ScriptCanvasEditor
void Controller::OnUpgradeModificationEnd
( [[maybe_unused]] const ModifyConfiguration& config
, const AZ::Data::AssetInfo& info
, const SourceHandle& info
, ModificationResult result)
{
if (result.errorMessage.empty())
{
VE_LOG("Successfully modified %s", result.assetInfo.m_relativePath.c_str());
VE_LOG("Successfully modified %s", result.asset.Path().c_str());
}
else
{
VE_LOG("Failed to modify %s: %s", result.assetInfo.m_relativePath.c_str(), result.errorMessage.data());
VE_LOG("Failed to modify %s: %s", result.asset.Path().c_str(), result.errorMessage.data());
}
for (auto* item : FindTableItems(info))
@@ -288,12 +237,10 @@ namespace ScriptCanvasEditor
AddLogEntries();
}
void Controller::OnGraphUpgradeComplete(AZ::Data::Asset<AZ::Data::AssetData>& asset, bool skipped)
void Controller::OnGraphUpgradeComplete(ScriptCanvasEditor::SourceHandle& asset, bool skipped)
{
ModificationResult result;
result.asset = asset;
AZ::Data::AssetCatalogRequestBus::BroadcastResult
( result.assetInfo, &AZ::Data::AssetCatalogRequests::GetAssetInfoById, asset.GetId());
if (skipped)
{
@@ -341,19 +288,19 @@ namespace ScriptCanvasEditor
}
}
void Controller::OnScanFilteredGraph(const AZ::Data::AssetInfo& info)
void Controller::OnScanFilteredGraph(const SourceHandle& info)
{
OnScannedGraph(info, Filtered::Yes);
}
void Controller::OnScannedGraph(const AZ::Data::AssetInfo& assetInfo, [[maybe_unused]] Filtered filtered)
void Controller::OnScannedGraph(const SourceHandle& assetInfo, [[maybe_unused]] Filtered filtered)
{
const int rowIndex = m_view->tableWidget->rowCount();
if (filtered == Filtered::No || !m_view->onlyShowOutdated->isChecked())
{
m_view->tableWidget->insertRow(rowIndex);
QTableWidgetItem* rowName = new QTableWidgetItem(tr(assetInfo.m_relativePath.c_str()));
QTableWidgetItem* rowName = new QTableWidgetItem(tr(assetInfo.Path().c_str()));
m_view->tableWidget->setItem(rowIndex, static_cast<int>(ColumnAsset), rowName);
SetRowSucceeded(rowIndex);
@@ -375,17 +322,11 @@ namespace ScriptCanvasEditor
m_view->tableWidget->setCellWidget(rowIndex, static_cast<int>(ColumnAction), upgradeButton);
}
char resolvedBuffer[AZ_MAX_PATH_LEN] = { 0 };
AZStd::string path = AZStd::string::format("@devroot@/%s", assetInfo.m_relativePath.c_str());
AZ::IO::FileIOBase::GetInstance()->ResolvePath(path.c_str(), resolvedBuffer, AZ_MAX_PATH_LEN);
AZ::StringFunc::Path::GetFullPath(resolvedBuffer, path);
AZ::StringFunc::Path::Normalize(path);
bool result = false;
AZ::Data::AssetInfo info;
AZStd::string watchFolder;
QByteArray assetNameUtf8 = assetInfo.m_relativePath.c_str();
QByteArray assetNameUtf8 = assetInfo.Path().c_str();
AzToolsFramework::AssetSystemRequestBus::BroadcastResult
( result
, &AzToolsFramework::AssetSystemRequestBus::Events::GetSourceInfoBySourcePath
@@ -412,41 +353,41 @@ namespace ScriptCanvasEditor
OnScannedGraphResult(assetInfo);
}
void Controller::OnScannedGraphResult([[maybe_unused]] const AZ::Data::AssetInfo& info)
void Controller::OnScannedGraphResult([[maybe_unused]] const SourceHandle& info)
{
m_view->progressBar->setValue(aznumeric_cast<int>(m_handledAssetCount));
++m_handledAssetCount;
AddLogEntries();
}
void Controller::OnScanLoadFailure(const AZ::Data::AssetInfo& info)
void Controller::OnScanLoadFailure(const SourceHandle& info)
{
const int rowIndex = m_view->tableWidget->rowCount();
m_view->tableWidget->insertRow(rowIndex);
QTableWidgetItem* rowName = new QTableWidgetItem
( tr(AZStd::string::format("Load Error: %s", info.m_relativePath.c_str()).c_str()));
( tr(AZStd::string::format("Load Error: %s", info.Path().c_str()).c_str()));
m_view->tableWidget->setItem(rowIndex, static_cast<int>(ColumnAsset), rowName);
SetRowFailed(rowIndex, "Load failed");
OnScannedGraphResult(info);
}
void Controller::OnScanUnFilteredGraph(const AZ::Data::AssetInfo& info)
void Controller::OnScanUnFilteredGraph(const SourceHandle& info)
{
OnScannedGraph(info, Filtered::No);
}
void Controller::OnUpgradeBegin
( const ModifyConfiguration& config
, [[maybe_unused]] const WorkingAssets& assets)
, [[maybe_unused]] const AZStd::vector<SourceHandle>& assets)
{
QString spinnerText = QStringLiteral("Upgrade in progress - ");
if (config.modifySingleAsset.m_assetId.IsValid())
if (!config.modifySingleAsset.Path().empty())
{
spinnerText.append(" single graph");
if (assets.size() == 1)
{
for (auto* item : FindTableItems(assets.front().info))
for (auto* item : FindTableItems(assets.front()))
{
int row = item->row();
SetRowBusy(row);
@@ -497,7 +438,7 @@ namespace ScriptCanvasEditor
m_view->scanButton->setEnabled(true);
}
void Controller::OnUpgradeDependenciesGathered(const AZ::Data::AssetInfo& info, Result result)
void Controller::OnUpgradeDependenciesGathered(const SourceHandle& info, Result result)
{
for (auto* item : FindTableItems(info))
{
@@ -526,7 +467,7 @@ namespace ScriptCanvasEditor
void Controller::OnUpgradeDependencySortBegin
( [[maybe_unused]] const ModifyConfiguration& config
, const WorkingAssets& assets)
, const AZStd::vector<SourceHandle>& assets)
{
m_handledAssetCount = 0;
m_view->progressBar->setVisible(true);
@@ -552,7 +493,7 @@ namespace ScriptCanvasEditor
void Controller::OnUpgradeDependencySortEnd
( [[maybe_unused]] const ModifyConfiguration& config
, const WorkingAssets& assets
, const AZStd::vector<SourceHandle>& assets
, [[maybe_unused]] const AZStd::vector<size_t>& sortedOrder)
{
m_handledAssetCount = 0;
@@ -15,6 +15,7 @@
#include <AzToolsFramework/SourceControl/SourceControlAPI.h>
#include <Editor/View/Windows/Tools/UpgradeTool/FileSaver.h>
#include <ScriptCanvas/Assets/ScriptCanvasAssetHandler.h>
#include <ScriptCanvas/Assets/ScriptCanvasFileHandling.h>
namespace ScriptCanvasEditor
{
@@ -27,6 +28,11 @@ namespace ScriptCanvasEditor
, m_onComplete(onComplete)
{}
const SourceHandle& FileSaver::GetSource() const
{
return m_source;
}
void FileSaver::PerformMove
( AZStd::string tmpFileName
, AZStd::string target
@@ -37,7 +43,7 @@ namespace ScriptCanvasEditor
AZ::SystemTickBus::QueueFunction([this, tmpFileName]()
{
FileSaveResult result;
result.fileSaveError = "Failed to move updated file from temporary location to tmpFileName destination";
result.fileSaveError = "Failed to move updated file from temporary location to original destination.";
result.tempFileRemovalError = RemoveTempFile(tmpFileName);
m_onComplete(result);
});
@@ -65,7 +71,9 @@ namespace ScriptCanvasEditor
auto streamer = AZ::Interface<AZ::IO::IStreamer>::Get();
AZ::IO::FileRequestPtr flushRequest = streamer->FlushCache(target.c_str());
// Bump the slice asset up in the asset processor's queue.
AzFramework::AssetSystemRequestBus::Broadcast(&AzFramework::AssetSystem::AssetSystemRequests::EscalateAssetBySearchTerm, target.c_str());
AzFramework::AssetSystemRequestBus::Broadcast
(&AzFramework::AssetSystem::AssetSystemRequests::EscalateAssetBySearchTerm, target.c_str());
AZ::SystemTickBus::QueueFunction([this, tmpFileName]()
{
FileSaveResult result;
@@ -75,28 +83,29 @@ namespace ScriptCanvasEditor
}
else
{
AZ_Warning(ScriptCanvas::k_VersionExplorerWindow.data(), false, "moving converted file to tmpFileName destination failed: %s, trying again", target.c_str());
AZ_Warning(ScriptCanvas::k_VersionExplorerWindow.data(), false
, "moving converted file to tmpFileName destination failed: %s, trying again", target.c_str());
auto streamer = AZ::Interface<AZ::IO::IStreamer>::Get();
AZ::IO::FileRequestPtr flushRequest = streamer->FlushCache(target.c_str());
streamer->SetRequestCompleteCallback(flushRequest, [this, tmpFileName, target, remainingAttempts]([[maybe_unused]] AZ::IO::FileRequestHandle request)
streamer->SetRequestCompleteCallback(flushRequest
, [this, tmpFileName, target, remainingAttempts]([[maybe_unused]] AZ::IO::FileRequestHandle request)
{
// Continue saving.
AZ::SystemTickBus::QueueFunction([this, tmpFileName, target, remainingAttempts]() { PerformMove(tmpFileName, target, remainingAttempts - 1); });
AZ::SystemTickBus::QueueFunction(
[this, tmpFileName, target, remainingAttempts]() { PerformMove(tmpFileName, target, remainingAttempts - 1); });
});
streamer->QueueRequest(flushRequest);
}
}
}
void FileSaver::OnSourceFileReleased(AZ::Data::Asset<AZ::Data::AssetData> asset)
void FileSaver::OnSourceFileReleased(const SourceHandle& source)
{
AZStd::string relativePath, fullPath;
AZ::Data::AssetCatalogRequestBus::BroadcastResult(relativePath, &AZ::Data::AssetCatalogRequests::GetAssetPathById, asset.GetId());
bool fullPathFound = false;
AzToolsFramework::AssetSystemRequestBus::BroadcastResult(fullPathFound, &AzToolsFramework::AssetSystemRequestBus::Events::GetFullSourcePathFromRelativeProductPath, relativePath, fullPath);
AZStd::string fullPath = source.Path().c_str();
AZStd::string tmpFileName;
// here we are saving the graph to a temp file instead of the original file and then copying the temp file to the original file.
// This ensures that AP will not a get a file change notification on an incomplete graph file causing it to fail processing. Temp files are ignored by AP.
// This ensures that AP will not a get a file change notification on an incomplete graph file causing it to fail processing.
// Temp files are ignored by AP.
if (!AZ::IO::CreateTempFileName(fullPath.c_str(), tmpFileName))
{
FileSaveResult result;
@@ -105,23 +114,24 @@ namespace ScriptCanvasEditor
return;
}
bool tempSavedSucceeded = false;
AZStd::string saveError;
AZ::IO::FileIOStream fileStream(tmpFileName.c_str(), AZ::IO::OpenMode::ModeWrite | AZ::IO::OpenMode::ModeText);
if (fileStream.IsOpen())
{
if (asset.GetType() == azrtti_typeid<ScriptCanvasEditor::ScriptCanvasAsset>())
auto saveOutcome = ScriptCanvasEditor::SaveToStream(source, fileStream);
if (!saveOutcome.IsSuccess())
{
ScriptCanvasEditor::ScriptCanvasAssetHandler handler;
tempSavedSucceeded = handler.SaveAssetData(asset, &fileStream);
saveError = saveOutcome.TakeError();
}
fileStream.Close();
}
if (!tempSavedSucceeded)
if (!saveError.empty())
{
FileSaveResult result;
result.fileSaveError = "Save asset data to temporary file failed";
result.fileSaveError = AZStd::string::format("Save asset data to temporary file failed: %s", saveError.c_str());
m_onComplete(result);
return;
}
@@ -131,26 +141,26 @@ namespace ScriptCanvasEditor
, fullPath.c_str()
, true
, [this, fullPath, tmpFileName]([[maybe_unused]] bool success, const AzToolsFramework::SourceControlFileInfo& info)
{
constexpr const size_t k_maxAttemps = 10;
{
constexpr const size_t k_maxAttemps = 10;
if (!info.IsReadOnly())
{
PerformMove(tmpFileName, fullPath, k_maxAttemps);
}
else if (m_onReadOnlyFile && m_onReadOnlyFile())
{
AZ::IO::SystemFile::SetWritable(info.m_filePath.c_str(), true);
PerformMove(tmpFileName, fullPath, k_maxAttemps);
}
else
{
FileSaveResult result;
result.fileSaveError = "Source file was and remained read-only";
result.tempFileRemovalError = RemoveTempFile(tmpFileName);
m_onComplete(result);
}
});
if (!info.IsReadOnly())
{
PerformMove(tmpFileName, fullPath, k_maxAttemps);
}
else if (m_onReadOnlyFile && m_onReadOnlyFile())
{
AZ::IO::SystemFile::SetWritable(info.m_filePath.c_str(), true);
PerformMove(tmpFileName, fullPath, k_maxAttemps);
}
else
{
FileSaveResult result;
result.fileSaveError = "Source file was and remained read-only";
result.tempFileRemovalError = RemoveTempFile(tmpFileName);
m_onComplete(result);
}
});
}
AZStd::string FileSaver::RemoveTempFile(AZStd::string_view tempFile)
@@ -158,7 +168,7 @@ namespace ScriptCanvasEditor
AZ::IO::FileIOBase* fileIO = AZ::IO::FileIOBase::GetInstance();
if (!fileIO)
{
return "GraphUpgradeComplete: No FileIO instance";
return "No FileIO instance";
}
if (fileIO->Exists(tempFile.data()) && !fileIO->Remove(tempFile.data()))
@@ -169,30 +179,30 @@ namespace ScriptCanvasEditor
return "";
}
void FileSaver::Save(AZ::Data::Asset<AZ::Data::AssetData> asset)
void FileSaver::Save(const SourceHandle& source)
{
AZStd::string relativePath, fullPath;
AZ::Data::AssetCatalogRequestBus::BroadcastResult(relativePath, &AZ::Data::AssetCatalogRequests::GetAssetPathById, asset.GetId());
bool fullPathFound = false;
AzToolsFramework::AssetSystemRequestBus::BroadcastResult
(fullPathFound
, &AzToolsFramework::AssetSystemRequestBus::Events::GetFullSourcePathFromRelativeProductPath
, relativePath, fullPath);
m_source = source;
if (!fullPathFound)
if (source.Path().empty())
{
FileSaveResult result;
result.fileSaveError = "Full source path not found";
result.fileSaveError = "No save location specified";
m_onComplete(result);
}
else
{
auto streamer = AZ::Interface<AZ::IO::IStreamer>::Get();
AZ::IO::FileRequestPtr flushRequest = streamer->FlushCache(fullPath);
streamer->SetRequestCompleteCallback(flushRequest, [this, asset]([[maybe_unused]] AZ::IO::FileRequestHandle request)
AZ::IO::FileRequestPtr flushRequest = streamer->FlushCache(source.Path().c_str());
streamer->SetRequestCompleteCallback(flushRequest, [this]([[maybe_unused]] AZ::IO::FileRequestHandle request)
{
this->OnSourceFileReleased(asset);
AZStd::lock_guard<AZStd::mutex> lock(m_mutex);
if (!m_sourceFileReleased)
{
m_sourceFileReleased = true;
AZ::SystemTickBus::QueueFunction([this]() { this->OnSourceFileReleased(m_source); });
}
});
streamer->QueueRequest(flushRequest);
}
}
@@ -51,6 +51,7 @@ namespace GraphCpp
VariablePanelSymantics,
AddVersionData,
RemoveFunctionGraphMarker,
FixupVersionDataTypeId,
// label your version above
Current
};
@@ -70,9 +71,17 @@ namespace ScriptCanvas
componentElementNode.AddElementWithData(context, "m_assetType", azrtti_typeid<RuntimeAsset>());
}
if (componentElementNode.GetVersion() < GraphCpp::GraphVersion::RemoveFunctionGraphMarker)
if (auto subElement = componentElementNode.FindElement(AZ_CRC_CE("isFunctionGraph")); subElement > 0)
{
componentElementNode.RemoveElementByName(AZ_CRC_CE("isFunctionGraph"));
componentElementNode.RemoveElement(subElement);
}
if (auto subElement = componentElementNode.FindSubElement(AZ_CRC_CE("versionData")))
{
if (subElement->GetId() == azrtti_typeid<SlotId>())
{
componentElementNode.RemoveElementByName(AZ_CRC_CE("versionData"));
}
}
return true;
@@ -1189,11 +1198,6 @@ namespace ScriptCanvas
m_isObserved = isObserved;
}
AZ::Data::AssetType Graph::GetAssetType() const
{
return m_assetType;
}
void Graph::VersioningRemoveSlot(ScriptCanvas::Node& scriptCanvasNode, const SlotId& slotId)
{
bool deletedSlot = true;