fix upgrade scanner
Signed-off-by: chcurran <82187351+carlitosan@users.noreply.github.com>
This commit is contained in:
@@ -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();
|
||||
///////
|
||||
|
||||
+2
@@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user