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:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user