fix upgrade scanner

Signed-off-by: chcurran <82187351+carlitosan@users.noreply.github.com>
This commit is contained in:
chcurran
2021-11-15 17:15:05 -08:00
parent 89a97a5e49
commit 0e7d732c61
21 changed files with 239 additions and 356 deletions
@@ -3490,7 +3490,7 @@ namespace ScriptCanvasEditor
m_focusHelper.SetActiveGraph(GetGraphCanvasGraphId());
}
bool Graph::UpgradeGraph(const AZ::Data::Asset<AZ::Data::AssetData>& asset, UpgradeRequest request, bool isVerbose)
bool Graph::UpgradeGraph(SourceHandle& asset, UpgradeRequest request, bool isVerbose)
{
m_upgradeSM.SetAsset(asset);
m_upgradeSM.SetVerbose(isVerbose);
@@ -675,19 +675,18 @@ namespace ScriptCanvasEditor
RegisterState(ParseGraph);
}
void EditorGraphUpgradeMachine::SetAsset(const AZ::Data::Asset<AZ::Data::AssetData>& asset)
void EditorGraphUpgradeMachine::SetAsset(SourceHandle& asset)
{
if (m_asset != asset)
{
m_asset = asset;
SetDebugPrefix(asset.GetHint());
SetDebugPrefix(asset.Path().c_str());
}
}
void EditorGraphUpgradeMachine::OnComplete(IState::ExitStatus exitStatus)
{
UpgradeNotificationsBus::Broadcast(&UpgradeNotifications::OnGraphUpgradeComplete, m_asset, exitStatus == IState::ExitStatus::Skipped);
m_asset = {};
}
@@ -26,6 +26,8 @@
#include <ScriptCanvas/Variable/VariableCore.h>
#include <AzCore/Interface/Interface.h>
#include <ScriptCanvas/Core/Core.h>
namespace GraphCanvas
{
class GraphCanvasTreeItem;
@@ -223,7 +225,7 @@ namespace ScriptCanvasEditor
virtual void OnUpgradeStart() {}
virtual void OnUpgradeCancelled() {}
virtual void OnGraphUpgradeComplete(AZ::Data::Asset<AZ::Data::AssetData>&, bool skipped = false) { (void)skipped; }
virtual void OnGraphUpgradeComplete(SourceHandle&, bool skipped = false) { (void)skipped; }
};
using UpgradeNotificationsBus = AZ::EBus<UpgradeNotifications>;
@@ -237,7 +237,7 @@ namespace ScriptCanvasEditor
IfOutOfDate,
Forced
};
bool UpgradeGraph(const AZ::Data::Asset<AZ::Data::AssetData>& asset, UpgradeRequest request, bool isVerbose = true);
bool UpgradeGraph(SourceHandle& asset, UpgradeRequest request, bool isVerbose = true);
void ConnectGraphCanvasBuses();
void DisconnectGraphCanvasBuses();
///////
@@ -37,6 +37,7 @@ namespace ScriptCanvasEditor
, private EditorScriptCanvasComponentLoggingBus::Handler
, private EditorScriptCanvasComponentRequestBus::Handler
, private AssetTrackerNotificationBus::Handler
, private AzToolsFramework::AssetSystemBus::Handler
, private AzToolsFramework::EditorEntityContextNotificationBus::Handler
{
@@ -44,6 +45,7 @@ namespace ScriptCanvasEditor
AZ_COMPONENT(EditorScriptCanvasComponent, "{C28E2D29-0746-451D-A639-7F113ECF5D72}", AzToolsFramework::Components::EditorComponentBase);
EditorScriptCanvasComponent();
// EditorScriptCanvasComponent(AZ::Data::Asset<ScriptCanvasAsset> asset);
EditorScriptCanvasComponent(AZ::Data::Asset<ScriptCanvasAsset> asset);
~EditorScriptCanvasComponent() override;
@@ -184,9 +184,9 @@ namespace ScriptCanvasEditor
bool m_graphNeedsDirtying = false;
Graph* m_graph = nullptr;
AZ::Data::Asset<AZ::Data::AssetData> m_asset;
SourceHandle m_asset;
void SetAsset(const AZ::Data::Asset<AZ::Data::AssetData>& asset);
void SetAsset(SourceHandle& assetasset);
void OnComplete(IState::ExitStatus exitStatus) override;
@@ -1207,7 +1207,7 @@ namespace ScriptCanvasEditor
{
if (!m_isRestoringWorkspace)
{
AZStd::string errorPath = scriptCanvasAsset.Path();
AZStd::string errorPath = scriptCanvasAsset.Path().c_str();
if (errorPath.empty())
{
@@ -1245,7 +1245,7 @@ namespace ScriptCanvasEditor
, fileAssetId.ToString().c_str()));
}
AZStd::string assetPath = scriptCanvasAsset.Path();
AZStd::string assetPath = scriptCanvasAsset.Path().c_str();
if (!assetPath.empty() && !m_loadingNewlySavedFile)
{
AddRecentFile(assetPath.c_str());
@@ -1784,7 +1784,7 @@ namespace ScriptCanvasEditor
{
isValidFileName = true;
suggestedFileFilter = ScriptCanvasAssetDescription().GetExtensionImpl();
suggestedFilename = inMemoryAssetId.Path();
suggestedFilename = inMemoryAssetId.Path().c_str();
}
else
{
@@ -1797,7 +1797,7 @@ namespace ScriptCanvasEditor
}
else
{
suggestedFilename = inMemoryAssetId.Path();
suggestedFilename = inMemoryAssetId.Path().c_str();
}
}
@@ -1892,7 +1892,7 @@ namespace ScriptCanvasEditor
AZ::Data::AssetId oldId = fileAssetId.Id();
AZ::Data::AssetInfo assetInfo;
assetInfo.m_assetId = fileAssetId.Id();
AZ_VerifyWarning("ScriptCanvas", AssetHelpers::GetAssetInfo(fileAssetId.Path(), assetInfo)
AZ_VerifyWarning("ScriptCanvas", AssetHelpers::GetAssetInfo(fileAssetId.Path().c_str(), assetInfo)
, "Failed to find asset info for source file just saved: %s", fileAssetId.Path().c_str());
const bool assetIdHasChanged = assetInfo.m_assetId.m_guid != fileAssetId.Id();
@@ -104,9 +104,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()
@@ -117,30 +117,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;
@@ -156,59 +146,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());
}
};
@@ -235,12 +185,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))
{
@@ -252,16 +202,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))
@@ -289,12 +239,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)
{
@@ -342,19 +290,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);
@@ -378,7 +326,7 @@ namespace ScriptCanvasEditor
}
char resolvedBuffer[AZ_MAX_PATH_LEN] = { 0 };
AZStd::string path = AZStd::string::format("@devroot@/%s", assetInfo.m_relativePath.c_str());
AZStd::string path = AZStd::string::format("@devroot@/%s", assetInfo.Path().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);
@@ -386,7 +334,7 @@ namespace ScriptCanvasEditor
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
@@ -413,41 +361,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);
@@ -498,7 +446,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))
{
@@ -527,7 +475,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);
@@ -553,7 +501,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;
@@ -65,36 +65,36 @@ namespace ScriptCanvasEditor
void AddLogEntries();
void EnableAllUpgradeButtons();
QList<QTableWidgetItem*> FindTableItems(const AZ::Data::AssetInfo& assetInfo);
QList<QTableWidgetItem*> FindTableItems(const SourceHandle& assetInfo);
void OnButtonPressClose();
void OnButtonPressScan();
void OnButtonPressUpgrade();
void OnButtonPressUpgradeImplementation(const AZ::Data::AssetInfo& assetInfo);
void OnButtonPressUpgradeSingle(const AZ::Data::AssetInfo& assetInfo);
void OnButtonPressUpgradeImplementation(const SourceHandle& assetInfo);
void OnButtonPressUpgradeSingle(const SourceHandle& assetInfo);
void OnGraphUpgradeComplete(AZ::Data::Asset<AZ::Data::AssetData>&, bool skipped) override;
void OnGraphUpgradeComplete(SourceHandle&, bool skipped) override;
void OnScanBegin(size_t assetCount) override;
void OnScanComplete(const ScanResult& result) override;
void OnScanFilteredGraph(const AZ::Data::AssetInfo& info) override;
void OnScanLoadFailure(const AZ::Data::AssetInfo& info) override;
void OnScanUnFilteredGraph(const AZ::Data::AssetInfo& info) override;
void OnScanFilteredGraph(const SourceHandle& info) override;
void OnScanLoadFailure(const SourceHandle& info) override;
void OnScanUnFilteredGraph(const SourceHandle& info) override;
enum class Filtered { No, Yes };
void OnScannedGraph(const AZ::Data::AssetInfo& info, Filtered filtered);
void OnScannedGraphResult(const AZ::Data::AssetInfo& info);
void OnScannedGraph(const SourceHandle& info, Filtered filtered);
void OnScannedGraphResult(const SourceHandle& info);
// for single operation UI updates, just check the assets size, or note it on the request
void OnUpgradeBegin(const ModifyConfiguration& config, const WorkingAssets& assets) override;
void OnUpgradeBegin(const ModifyConfiguration& config, const AZStd::vector<SourceHandle>& assets) override;
void OnUpgradeComplete(const ModificationResults& results) override;
void OnUpgradeDependenciesGathered(const AZ::Data::AssetInfo& info, Result result) override;
void OnUpgradeDependencySortBegin(const ModifyConfiguration& config, const WorkingAssets& assets) override;
void OnUpgradeDependenciesGathered(const SourceHandle& info, Result result) override;
void OnUpgradeDependencySortBegin(const ModifyConfiguration& config, const AZStd::vector<SourceHandle>& assets) override;
void OnUpgradeDependencySortEnd
( const ModifyConfiguration& config
, const WorkingAssets& assets
, const AZStd::vector<SourceHandle>& assets
, const AZStd::vector<size_t>& sortedOrder) override;
void OnUpgradeModificationBegin(const ModifyConfiguration& config, const AZ::Data::AssetInfo& info) override;
void OnUpgradeModificationEnd(const ModifyConfiguration& config, const AZ::Data::AssetInfo& info, ModificationResult result) override;
void OnUpgradeModificationBegin(const ModifyConfiguration& config, const SourceHandle& info) override;
void OnUpgradeModificationEnd(const ModifyConfiguration& config, const SourceHandle& info, ModificationResult result) override;
void SetLoggingPreferences();
void SetSpinnerIsBusy(bool isBusy);
@@ -127,74 +127,9 @@ namespace ScriptCanvasEditor
}
}
void FileSaver::OnSourceFileReleased(AZ::Data::Asset<AZ::Data::AssetData> asset)
{
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 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.
if (!AZ::IO::CreateTempFileName(fullPath.c_str(), tmpFileName))
{
FileSaveResult result;
result.fileSaveError = "Failure to create temporary file name";
m_onComplete(result);
return;
}
bool tempSavedSucceeded = false;
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>())
{
ScriptCanvasEditor::ScriptCanvasAssetHandler handler;
tempSavedSucceeded = handler.SaveAssetData(asset, &fileStream);
}
fileStream.Close();
}
if (!tempSavedSucceeded)
{
FileSaveResult result;
result.fileSaveError = "Save asset data to temporary file failed";
m_onComplete(result);
return;
}
AzToolsFramework::SourceControlCommandBus::Broadcast
( &AzToolsFramework::SourceControlCommandBus::Events::RequestEdit
, fullPath.c_str()
, true
, [this, fullPath, tmpFileName]([[maybe_unused]] bool success, const AzToolsFramework::SourceControlFileInfo& info)
{
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 is read-only";
result.tempFileRemovalError = RemoveTempFile(tmpFileName);
m_onComplete(result);
}
});
}
void FileSaver::OnSourceFileReleased(const SourceHandle& source)
{
AZStd::string fullPath = source.Path();
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.
@@ -285,7 +220,7 @@ namespace ScriptCanvasEditor
else
{
auto streamer = AZ::Interface<AZ::IO::IStreamer>::Get();
AZ::IO::FileRequestPtr flushRequest = streamer->FlushCache(source.Path());
AZ::IO::FileRequestPtr flushRequest = streamer->FlushCache(source.Path().c_str());
streamer->SetRequestCompleteCallback(flushRequest, [this, source]([[maybe_unused]] AZ::IO::FileRequestHandle request)
{
this->OnSourceFileReleased(source);
@@ -293,34 +228,5 @@ namespace ScriptCanvasEditor
streamer->QueueRequest(flushRequest);
}
}
void FileSaver::Save(AZ::Data::Asset<AZ::Data::AssetData> asset)
{
// #sc_editor_asset fix/remove this path that is used by the version explorer
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);
if (!fullPathFound)
{
FileSaveResult result;
result.fileSaveError = "Full source path not found";
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)
{
this->OnSourceFileReleased(asset);
});
streamer->QueueRequest(flushRequest);
}
}
}
}
@@ -30,7 +30,6 @@ namespace ScriptCanvasEditor
, AZStd::function<void(const FileSaveResult& result)> onComplete);
const SourceHandle& GetSource() const;
void Save(AZ::Data::Asset<AZ::Data::AssetData> asset);
void Save(const SourceHandle& source);
private:
@@ -39,8 +38,7 @@ namespace ScriptCanvasEditor
AZStd::function<bool()> m_onReadOnlyFile;
void OnSourceFileReleased(const SourceHandle& source);
void OnSourceFileReleased(AZ::Data::Asset<AZ::Data::AssetData> asset);
void PerformMove
( AZStd::string source
, AZStd::string target
@@ -101,7 +101,7 @@ namespace ScriptCanvasEditor
return;
}
if (modification.modifySingleAsset.m_assetId.IsValid())
if (!modification.modifySingleAsset.Path().empty())
{
const auto& results = m_scanner->GetResult();
auto iter = AZStd::find_if
@@ -109,7 +109,7 @@ namespace ScriptCanvasEditor
, results.m_unfiltered.end()
, [&modification](const auto& candidate)
{
return candidate.info.m_assetId == modification.modifySingleAsset.m_assetId;
return candidate.AnyEquals(modification.modifySingleAsset);
});
if (iter == results.m_unfiltered.end())
@@ -120,7 +120,7 @@ namespace ScriptCanvasEditor
m_state = State::ModifySingle;
m_modifier = AZStd::make_unique<Modifier>(modification, WorkingAssets{ *iter }, [this]() { OnModificationComplete(); });
m_modifier = AZStd::make_unique<Modifier>(modification, AZStd::vector<SourceHandle>{ *iter }, [this]() { OnModificationComplete(); });
}
else
{
@@ -9,53 +9,51 @@
#include <AzCore/EBus/EBus.h>
#include <AzCore/Asset/AssetManagerBus.h>
#include <ScriptCanvas/Core/Core.h>
namespace ScriptCanvasEditor
{
namespace VersionExplorer
{
struct WorkingAsset
{
AZ::Data::Asset<AZ::Data::AssetData> asset;
AZ::Data::AssetInfo info;
};
using WorkingAssets = AZStd::vector<WorkingAsset>;
struct ModifyConfiguration
{
AZStd::function<void(AZ::Data::Asset<AZ::Data::AssetData>)> modification;
AZStd::function<void(SourceHandle&)> modification;
AZStd::function<bool()> onReadOnlyFile;
AZ::Data::AssetInfo modifySingleAsset;
SourceHandle modifySingleAsset;
bool backupGraphBeforeModification = false;
bool successfulDependencyUpgradeRequired = true;
};
struct ModificationResult
{
AZ::Data::Asset<AZ::Data::AssetData> asset;
AZ::Data::AssetInfo assetInfo;
SourceHandle asset;
AZStd::string errorMessage;
};
struct ModificationResults
{
AZStd::vector<AZ::Data::AssetInfo> m_successes;
AZStd::vector<SourceHandle> m_successes;
AZStd::vector<ModificationResult> m_failures;
};
struct ScanConfiguration
{
AZStd::function<bool(AZ::Data::Asset<AZ::Data::AssetData>)> filter;
enum class Filter
{
Include,
Exclude
};
AZStd::function<Filter(const SourceHandle&)> filter;
bool reportFilteredGraphs = false;
};
struct ScanResult
{
AZStd::vector<AZ::Data::AssetInfo> m_catalogAssets;
WorkingAssets m_unfiltered;
AZStd::vector<AZ::Data::AssetInfo> m_filteredAssets;
AZStd::vector<AZ::Data::AssetInfo> m_loadErrors;
AZStd::vector<SourceHandle> m_catalogAssets;
AZStd::vector<SourceHandle> m_unfiltered;
AZStd::vector<SourceHandle> m_filteredAssets;
AZStd::vector<SourceHandle> m_loadErrors;
};
enum Result
@@ -88,20 +86,20 @@ namespace ScriptCanvasEditor
public:
virtual void OnScanBegin(size_t assetCount) = 0;
virtual void OnScanComplete(const ScanResult& result) = 0;
virtual void OnScanFilteredGraph(const AZ::Data::AssetInfo& info) = 0;
virtual void OnScanLoadFailure(const AZ::Data::AssetInfo& info) = 0;
virtual void OnScanUnFilteredGraph(const AZ::Data::AssetInfo& info) = 0;
virtual void OnScanFilteredGraph(const SourceHandle& info) = 0;
virtual void OnScanLoadFailure(const SourceHandle& info) = 0;
virtual void OnScanUnFilteredGraph(const SourceHandle& info) = 0;
virtual void OnUpgradeBegin(const ModifyConfiguration& config, const WorkingAssets& assets) = 0;
virtual void OnUpgradeBegin(const ModifyConfiguration& config, const AZStd::vector<SourceHandle>& assets) = 0;
virtual void OnUpgradeComplete(const ModificationResults& results) = 0;
virtual void OnUpgradeDependenciesGathered(const AZ::Data::AssetInfo& info, Result result) = 0;
virtual void OnUpgradeDependencySortBegin(const ModifyConfiguration& config, const WorkingAssets& assets) = 0;
virtual void OnUpgradeDependenciesGathered(const SourceHandle& info, Result result) = 0;
virtual void OnUpgradeDependencySortBegin(const ModifyConfiguration& config, const AZStd::vector<SourceHandle>& assets) = 0;
virtual void OnUpgradeDependencySortEnd
( const ModifyConfiguration& config
, const WorkingAssets& assets
, const AZStd::vector<SourceHandle>& assets
, const AZStd::vector<size_t>& sortedOrder) = 0;
virtual void OnUpgradeModificationBegin(const ModifyConfiguration& config, const AZ::Data::AssetInfo& info) = 0;
virtual void OnUpgradeModificationEnd(const ModifyConfiguration& config, const AZ::Data::AssetInfo& info, ModificationResult result) = 0;
virtual void OnUpgradeModificationBegin(const ModifyConfiguration& config, const SourceHandle& info) = 0;
virtual void OnUpgradeModificationEnd(const ModifyConfiguration& config, const SourceHandle& info, ModificationResult result) = 0;
};
using ModelNotificationsBus = AZ::EBus<ModelNotificationsTraits>;
}
@@ -6,24 +6,21 @@
*
*/
#include <Editor/Include/ScriptCanvas/Components/EditorGraph.h>
#include <Editor/View/Windows/Tools/UpgradeTool/LogTraits.h>
#include <Editor/View/Windows/Tools/UpgradeTool/Modifier.h>
#include <ScriptCanvas/Asset/RuntimeAsset.h>
#include <ScriptCanvas/Assets/ScriptCanvasAsset.h>
#include <ScriptCanvas/Assets/ScriptCanvasFileHandling.h>
#include <ScriptCanvas/Core/Graph.h>
namespace ModifierCpp
{
}
namespace ScriptCanvasEditor
{
namespace VersionExplorer
{
Modifier::Modifier
( const ModifyConfiguration& modification
, WorkingAssets&& assets
, AZStd::vector<SourceHandle>&& assets
, AZStd::function<void()> onComplete)
: m_state(State::GatheringDependencies)
, m_config(modification)
@@ -35,11 +32,11 @@ namespace ScriptCanvasEditor
AZ::SystemTickBus::Handler::BusConnect();
}
const AZ::Data::AssetInfo& Modifier::GetCurrentAsset() const
const SourceHandle& Modifier::GetCurrentAsset() const
{
return m_state == State::GatheringDependencies
? m_assets[m_assetIndex].info
: m_assets[m_dependencyOrderedAssetIndicies[m_assetIndex]].info;
? m_assets[m_assetIndex]
: m_assets[m_dependencyOrderedAssetIndicies[m_assetIndex]];
}
AZStd::unordered_set<size_t>& Modifier::GetOrCreateDependencyIndexSet()
@@ -66,13 +63,9 @@ namespace ScriptCanvasEditor
bool anyFailures = false;
auto asset = LoadAsset();
if (asset
&& asset.GetAs<ScriptCanvasAsset>()
&& asset.GetAs<ScriptCanvasAsset>()->GetScriptCanvasGraph()
&& asset.GetAs<ScriptCanvasAsset>()->GetScriptCanvasGraph()->GetGraphData())
if (asset.Get() && asset.Mod()->GetGraphData())
{
auto graphData = asset.GetAs<ScriptCanvasAsset>()->GetScriptCanvasGraph()->GetGraphData();
auto graphData = asset.Mod()->GetGraphData();
auto dependencyGrabber = [this]
( void* instancePointer
@@ -107,15 +100,15 @@ namespace ScriptCanvasEditor
, nullptr))
{
anyFailures = true;
VE_LOG("Modifier: ERROR - Failed to gather dependencies from graph data: %s"
, GetCurrentAsset().m_relativePath.c_str())
VE_LOG("Modifier: ERROR - Failed to gather dependencies from graph data: %s"
, GetCurrentAsset().Path().c_str())
}
}
else
{
anyFailures = true;
VE_LOG("Modifier: ERROR - Failed to load asset %s for modification, even though it scanned properly"
, GetCurrentAsset().m_relativePath.c_str());
, GetCurrentAsset().Path().c_str());
}
ModelNotificationsBus::Broadcast
@@ -127,18 +120,12 @@ namespace ScriptCanvasEditor
AZ::Data::AssetManager::Instance().DispatchEvents();
}
AZ::Data::Asset<AZ::Data::AssetData> Modifier::LoadAsset()
SourceHandle Modifier::LoadAsset()
{
AZ::Data::Asset<AZ::Data::AssetData> asset = AZ::Data::AssetManager::Instance().GetAsset
( GetCurrentAsset().m_assetId
, azrtti_typeid<ScriptCanvasAsset>()
, AZ::Data::AssetLoadBehavior::PreLoad);
asset.BlockUntilLoadComplete();
if (asset.IsReady())
auto outcome = LoadFromFile(GetCurrentAsset().Path().c_str());
if (outcome.IsSuccess())
{
return asset;
return outcome.TakeValue();
}
else
{
@@ -163,11 +150,11 @@ namespace ScriptCanvasEditor
void Modifier::ModifyCurrentAsset()
{
m_result = {};
m_result.assetInfo = GetCurrentAsset();
m_result.asset = GetCurrentAsset();
ModelNotificationsBus::Broadcast(&ModelNotificationsTraits::OnUpgradeModificationBegin, m_config, GetCurrentAsset());
if (auto asset = LoadAsset())
if (auto asset = LoadAsset(); asset.IsValid())
{
ModificationNotificationsBus::Handler::BusConnect();
m_modifyState = ModifyState::InProgress;
@@ -199,7 +186,7 @@ namespace ScriptCanvasEditor
void Modifier::ReportModificationSuccess()
{
m_results.m_successes.push_back(m_result.assetInfo);
m_results.m_successes.push_back(m_result.asset);
ModifyNextAsset();
}
@@ -227,7 +214,7 @@ namespace ScriptCanvasEditor
{
VE_LOG
( "Temporary file not removed for %s: %s"
, m_result.assetInfo.m_relativePath.c_str()
, m_result.asset.Path().c_str()
, result.tempFileRemovalError.c_str());
}
@@ -287,7 +274,7 @@ namespace ScriptCanvasEditor
for (size_t index = 0; index != m_assets.size(); ++index)
{
m_assetInfoIndexById.insert({ m_assets[index].info.m_assetId.m_guid, index });
m_assetInfoIndexById.insert({ m_assets[index].Id(), index });
}
}
else
@@ -380,10 +367,10 @@ namespace ScriptCanvasEditor
if (markedTemporary.contains(index))
{
AZ_Error
(ScriptCanvas::k_VersionExplorerWindow.data()
(ScriptCanvas::k_VersionExplorerWindow.data()
, false
, "Modifier: Dependency sort has failed during, circular dependency detected for Asset: %s"
, modifier->GetCurrentAsset().m_relativePath.c_str());
, modifier->GetCurrentAsset().Path().c_str());
return;
}
@@ -26,7 +26,7 @@ namespace ScriptCanvasEditor
Modifier
( const ModifyConfiguration& modification
, WorkingAssets&& assets
, AZStd::vector<SourceHandle>&& assets
, AZStd::function<void()> onComplete);
const ModificationResults& GetResult() const;
@@ -69,7 +69,7 @@ namespace ScriptCanvasEditor
size_t m_assetIndex = 0;
AZStd::function<void()> m_onComplete;
// asset infos in scanned order
WorkingAssets m_assets;
AZStd::vector<SourceHandle> m_assets;
// dependency sorted order indices into the asset vector
AZStd::vector<size_t> m_dependencyOrderedAssetIndicies;
// dependency indices by asset info index (only exist if graphs have them)
@@ -83,9 +83,9 @@ namespace ScriptCanvasEditor
FileSaveResult m_fileSaveResult;
void GatherDependencies();
const AZ::Data::AssetInfo& GetCurrentAsset() const;
const SourceHandle& GetCurrentAsset() const;
AZStd::unordered_set<size_t>& GetOrCreateDependencyIndexSet();
AZ::Data::Asset<AZ::Data::AssetData> LoadAsset();
SourceHandle LoadAsset();
void ModifyCurrentAsset();
void ModifyNextAsset();
void ModificationComplete(const ModificationResult& result) override;
@@ -6,9 +6,45 @@
*
*/
#include <AzToolsFramework/AssetBrowser/AssetBrowserBus.h>
#include <AzToolsFramework/AssetBrowser/AssetBrowserEntry.h>
#include <AzToolsFramework/AssetBrowser/AssetBrowserFilterModel.h>
#include <AzToolsFramework/AssetBrowser/AssetBrowserModel.h>
#include <Editor/View/Windows/Tools/UpgradeTool/LogTraits.h>
#include <Editor/View/Windows/Tools/UpgradeTool/Scanner.h>
#include <ScriptCanvas/Assets/ScriptCanvasAsset.h>
#include <Editor/View/Windows/Tools/UpgradeTool/LogTraits.h>
#include <ScriptCanvas/Assets/ScriptCanvasFileHandling.h>
namespace ScannerCpp
{
void TraverseTree
( QModelIndex index
, AzToolsFramework::AssetBrowser::AssetBrowserFilterModel& model
, ScriptCanvasEditor::VersionExplorer::ScanResult& result)
{
QModelIndex sourceIndex = model.mapToSource(index);
AzToolsFramework::AssetBrowser::AssetBrowserEntry* entry =
reinterpret_cast<AzToolsFramework::AssetBrowser::AssetBrowserEntry*>(sourceIndex.internalPointer());
if (entry
&& entry->GetEntryType() == AzToolsFramework::AssetBrowser::AssetBrowserEntry::AssetEntryType::Source
&& azrtti_istypeof<const AzToolsFramework::AssetBrowser::SourceAssetBrowserEntry*>(entry)
&& entry->GetFullPath().ends_with(".scriptcanvas"))
{
auto sourceEntry = azrtti_cast<const AzToolsFramework::AssetBrowser::SourceAssetBrowserEntry*>(entry);
result.m_catalogAssets.push_back(
ScriptCanvasEditor::SourceHandle(nullptr, sourceEntry->GetSourceUuid(), sourceEntry->GetFullPath()));
}
const int rowCount = model.rowCount(index);
for (int i = 0; i < rowCount; ++i)
{
TraverseTree(model.index(i, 0, index), model, result);
}
}
}
namespace ScriptCanvasEditor
{
@@ -18,39 +54,44 @@ namespace ScriptCanvasEditor
: m_config(config)
, m_onComplete(onComplete)
{
AZ::Data::AssetCatalogRequestBus::Broadcast
( &AZ::Data::AssetCatalogRequestBus::Events::EnumerateAssets
, nullptr
, [this](const AZ::Data::AssetId, const AZ::Data::AssetInfo& assetInfo)
{
if (assetInfo.m_assetType == azrtti_typeid<ScriptCanvasAsset>())
{
m_result.m_catalogAssets.push_back(assetInfo);
}
}
, nullptr);
AzToolsFramework::AssetBrowser::AssetBrowserModel* assetBrowserModel = nullptr;
AzToolsFramework::AssetBrowser::AssetBrowserComponentRequestBus::BroadcastResult
( assetBrowserModel, &AzToolsFramework::AssetBrowser::AssetBrowserComponentRequests::GetAssetBrowserModel);
if (assetBrowserModel)
{
auto stringFilter = new AzToolsFramework::AssetBrowser::StringFilter();
stringFilter->SetName("ScriptCanvas");
stringFilter->SetFilterString(".scriptcanvas");
stringFilter->SetFilterPropagation(AzToolsFramework::AssetBrowser::AssetBrowserEntryFilter::PropagateDirection::Down);
AzToolsFramework::AssetBrowser::AssetBrowserFilterModel assetFilterModel;
assetFilterModel.SetFilter(AzToolsFramework::AssetBrowser::FilterConstType(stringFilter));
assetFilterModel.setSourceModel(assetBrowserModel);
ScannerCpp::TraverseTree(QModelIndex(), assetFilterModel, m_result);
}
ModelNotificationsBus::Broadcast(&ModelNotificationsTraits::OnScanBegin, m_result.m_catalogAssets.size());
AZ::SystemTickBus::Handler::BusConnect();
}
void Scanner::FilterAsset(AZ::Data::Asset<AZ::Data::AssetData> asset)
void Scanner::FilterAsset(SourceHandle asset)
{
if (m_config.filter && m_config.filter(asset))
if (m_config.filter && m_config.filter(asset) == ScanConfiguration::Filter::Exclude)
{
VE_LOG("Scanner: Excluded: %s ", GetCurrentAsset().m_relativePath.c_str());
m_result.m_filteredAssets.push_back(GetCurrentAsset());
VE_LOG("Scanner: Excluded: %s ", GetCurrentAsset().Path().c_str());
m_result.m_filteredAssets.push_back(GetCurrentAsset().Describe());
ModelNotificationsBus::Broadcast(&ModelNotificationsTraits::OnScanFilteredGraph, GetCurrentAsset());
}
else
{
VE_LOG("Scanner: Included: %s ", GetCurrentAsset().m_relativePath.c_str());
m_result.m_unfiltered.push_back({ asset, GetCurrentAsset() });
VE_LOG("Scanner: Included: %s ", GetCurrentAsset().Path().c_str());
m_result.m_unfiltered.push_back(GetCurrentAsset().Describe());
ModelNotificationsBus::Broadcast(&ModelNotificationsTraits::OnScanUnFilteredGraph, GetCurrentAsset());
}
}
const AZ::Data::AssetInfo& Scanner::GetCurrentAsset() const
const SourceHandle& Scanner::GetCurrentAsset() const
{
return m_result.m_catalogAssets[m_catalogAssetIndex];
}
@@ -60,18 +101,12 @@ namespace ScriptCanvasEditor
return m_result;
}
AZ::Data::Asset<AZ::Data::AssetData> Scanner::LoadAsset()
SourceHandle Scanner::LoadAsset()
{
AZ::Data::Asset<AZ::Data::AssetData> asset = AZ::Data::AssetManager::Instance().GetAsset
( GetCurrentAsset().m_assetId
, azrtti_typeid<ScriptCanvasAsset>()
, AZ::Data::AssetLoadBehavior::PreLoad);
asset.BlockUntilLoadComplete();
if (asset.IsReady())
auto fileOutcome = LoadFromFile(GetCurrentAsset().Path().c_str());
if (fileOutcome.IsSuccess())
{
return asset;
return fileOutcome.GetValue();
}
else
{
@@ -93,19 +128,19 @@ namespace ScriptCanvasEditor
}
else
{
if (auto asset = LoadAsset())
if (auto asset = LoadAsset(); asset.IsValid())
{
VE_LOG("Scanner: Loaded: %s ", GetCurrentAsset().m_relativePath.c_str());
VE_LOG("Scanner: Loaded: %s ", GetCurrentAsset().Path().c_str());
FilterAsset(asset);
}
else
{
VE_LOG("Scanner: Failed to load: %s ", GetCurrentAsset().m_relativePath.c_str());
VE_LOG("Scanner: Failed to load: %s ", GetCurrentAsset().Path().c_str());
m_result.m_loadErrors.push_back(GetCurrentAsset());
ModelNotificationsBus::Broadcast(&ModelNotificationsTraits::OnScanLoadFailure, GetCurrentAsset());
}
VE_LOG("Scanner: scan of %s complete", GetCurrentAsset().m_relativePath.c_str());
VE_LOG("Scanner: scan of %s complete", GetCurrentAsset().Path().c_str());
++m_catalogAssetIndex;
}
}
@@ -33,9 +33,9 @@ namespace ScriptCanvasEditor
ScanConfiguration m_config;
ScanResult m_result;
void FilterAsset(AZ::Data::Asset<AZ::Data::AssetData>);
const AZ::Data::AssetInfo& GetCurrentAsset() const;
AZ::Data::Asset<AZ::Data::AssetData> LoadAsset();
void FilterAsset(SourceHandle);
const SourceHandle& GetCurrentAsset() const;
SourceHandle LoadAsset();
void OnSystemTick() override;
};
}
@@ -55,26 +55,25 @@ namespace ScriptCanvasEditor
for (auto& failedUpdate : result->m_failures)
{
auto& assetInfo = failedUpdate.assetInfo;
auto assetId = assetInfo.m_assetId;
auto asset = failedUpdate.asset;
m_ui->tableWidget->insertRow(rows);
connect(m_ui->closeButton, &QPushButton::pressed, this, &QDialog::accept);
connect(m_ui->tableWidget, &QTableWidget::itemDoubleClicked, this, [this, rows, assetId](QTableWidgetItem* item)
connect(m_ui->tableWidget, &QTableWidget::itemDoubleClicked, this, [this, rows, asset](QTableWidgetItem* item)
{
if (item && item->data(Qt::UserRole).toInt() == rows)
{
OpenGraph(assetId);
OpenGraph(asset);
}
}
);
auto openGraph = [this, assetId] {
OpenGraph(assetId);
auto openGraph = [this, asset] {
OpenGraph(asset);
};
QTableWidgetItem* rowName = new QTableWidgetItem(tr(assetInfo.m_relativePath.c_str()));
QTableWidgetItem* rowName = new QTableWidgetItem(tr(asset.Path().c_str()));
rowName->setData(Qt::UserRole, rows);
m_ui->tableWidget->setItem(rows, 0, rowName);
@@ -91,16 +90,15 @@ namespace ScriptCanvasEditor
}
}
void UpgradeHelper::OpenGraph(AZ::Data::AssetId assetId)
void UpgradeHelper::OpenGraph(const SourceHandle& asset)
{
// Open the graph in SC editor
AzToolsFramework::OpenViewPane(/*LyViewPane::ScriptCanvas*/"Script Canvas");
AZ::Outcome<int, AZStd::string> openOutcome = AZ::Failure(AZStd::string());
if (assetId.IsValid())
if (!asset.Path().empty())
{
// #sc_editor_asset
// GeneralRequestBus::BroadcastResult(openOutcome, &GeneralRequests::OpenScriptCanvasAsset, assetId, -1);
GeneralRequestBus::BroadcastResult(openOutcome, &GeneralRequests::OpenScriptCanvasAsset, asset, -1);
}
if (!openOutcome)
@@ -35,6 +35,8 @@ namespace Ui
namespace ScriptCanvasEditor
{
// class SourceHandle;
//! A tool that collects and upgrades all Script Canvas graphs in the asset catalog
class UpgradeHelper
: public AzQtComponents::StyledDialog
@@ -51,6 +53,6 @@ namespace ScriptCanvasEditor
AZStd::unique_ptr<Ui::UpgradeHelper> m_ui;
void OpenGraph(AZ::Data::AssetId assetId);
void OpenGraph(const SourceHandle& assetId);
};
}
@@ -189,7 +189,7 @@ namespace ScriptCanvas
namespace ScriptCanvasEditor
{
SourceHandle::SourceHandle(const SourceHandle& data, const AZ::Uuid& id, AZStd::string_view path)
SourceHandle::SourceHandle(const SourceHandle& data, const AZ::Uuid& id, const AZ::IO::Path& path)
: m_data(data.m_data)
, m_id(id)
, m_path(path)
@@ -197,7 +197,7 @@ namespace ScriptCanvasEditor
}
SourceHandle::SourceHandle(ScriptCanvas::DataPtr graph, const AZ::Uuid& id, AZStd::string_view path)
SourceHandle::SourceHandle(ScriptCanvas::DataPtr graph, const AZ::Uuid& id, const AZ::IO::Path& path)
: m_data(graph)
, m_id(id)
, m_path(path)
@@ -217,6 +217,12 @@ namespace ScriptCanvasEditor
m_path.clear();
}
// return a SourceHandle with only the Id and Path, but without a pointer to the data
SourceHandle SourceHandle::Describe() const
{
return SourceHandle(nullptr, m_id, m_path);
}
GraphPtrConst SourceHandle::Get() const
{
return m_data ? m_data->GetEditorGraph() : nullptr;
@@ -249,7 +255,7 @@ namespace ScriptCanvasEditor
return !(*this == other);
}
const AZStd::string& SourceHandle::Path() const
const AZ::IO::Path& SourceHandle::Path() const
{
return m_path;
}
@@ -9,18 +9,19 @@
#pragma once
#include <AzCore/Component/EntityId.h>
#include <AzCore/Component/EntityUtils.h>
#include <AzCore/Component/NamedEntityId.h>
#include <AzCore/IO/Path/Path.h>
#include <AzCore/Math/MathUtils.h>
#include <AzCore/Math/Uuid.h>
#include <AzCore/Memory/Memory.h>
#include <AzCore/Memory/SystemAllocator.h>
#include <AzCore/RTTI/RTTI.h>
#include <AzCore/RTTI/BehaviorContext.h>
#include <AzCore/RTTI/RTTI.h>
#include <AzCore/RTTI/ReflectContext.h>
#include <AzCore/Serialization/SerializeContext.h>
#include <AzCore/std/any.h>
#include <AzCore/std/hash.h>
#include <AzCore/Component/EntityUtils.h>
#include <AzCore/Component/NamedEntityId.h>
#include <AzCore/Math/Uuid.h>
#include <Core/NamedId.h>
#include <ScriptCanvas/Grammar/PrimitivesDeclarations.h>
@@ -326,16 +327,17 @@ namespace ScriptCanvasEditor
SourceHandle() = default;
SourceHandle(const SourceHandle& data, const AZ::Uuid& id, AZStd::string_view path);
SourceHandle(const SourceHandle& data, const AZ::Uuid& id, const AZ::IO::Path& path);
SourceHandle(ScriptCanvas::DataPtr graph, const AZ::Uuid& id, AZStd::string_view path);
~SourceHandle() = default;
SourceHandle(ScriptCanvas::DataPtr graph, const AZ::Uuid& id, const AZ::IO::Path& path);
bool AnyEquals(const SourceHandle& other) const;
void Clear();
// return a SourceHandle with only the Id and Path, but without a pointer to the data
SourceHandle Describe() const;
GraphPtrConst Get() const;
const AZ::Uuid& Id() const;
@@ -348,7 +350,7 @@ namespace ScriptCanvasEditor
bool operator!=(const SourceHandle& other) const;
const AZStd::string& Path() const;
const AZ::IO::Path& Path() const;
bool PathEquals(const SourceHandle& other) const;
@@ -357,7 +359,7 @@ namespace ScriptCanvasEditor
private:
ScriptCanvas::DataPtr m_data;
AZ::Uuid m_id = AZ::Uuid::CreateNull();
AZStd::string m_path;
AZ::IO::Path m_path;
};
}