Merging from development

Signed-off-by: Esteban Papp <81431996+amznestebanpapp@users.noreply.github.com>
This commit is contained in:
Esteban Papp
2021-12-07 12:35:41 -08:00
parent b1eeebb6b6
commit cd5306febf
334 changed files with 9946 additions and 3757 deletions
@@ -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);
@@ -29,14 +29,19 @@ namespace ScriptCanvasEditor
( AZStd::function<bool()> onReadOnlyFile
, AZStd::function<void(const FileSaveResult& result)> onComplete);
void Save(AZ::Data::Asset<AZ::Data::AssetData> asset);
const SourceHandle& GetSource() const;
void Save(const SourceHandle& source);
private:
AZStd::mutex m_mutex;
bool m_sourceFileReleased = false;
SourceHandle m_source;
AZStd::function<void(const FileSaveResult& result)> m_onComplete;
AZStd::function<bool()> m_onReadOnlyFile;
void OnSourceFileReleased(AZ::Data::Asset<AZ::Data::AssetData> asset);
void OnSourceFileReleased(const SourceHandle& source);
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,12 @@ namespace ScriptCanvasEditor
AZ::SystemTickBus::Handler::BusConnect();
}
const AZ::Data::AssetInfo& Modifier::GetCurrentAsset() const
size_t Modifier::GetCurrentIndex() const
{
return m_state == State::GatheringDependencies
? m_assets[m_assetIndex].info
: m_assets[m_dependencyOrderedAssetIndicies[m_assetIndex]].info;
? m_assetIndex
: m_dependencyOrderedAssetIndicies[m_assetIndex];
}
AZStd::unordered_set<size_t>& Modifier::GetOrCreateDependencyIndexSet()
@@ -65,14 +63,10 @@ namespace ScriptCanvasEditor
AZ_Assert(serializeContext, "SerializeContext is required to enumerate dependent assets in the ScriptCanvas file");
bool anyFailures = false;
auto asset = LoadAsset();
if (asset
&& asset.GetAs<ScriptCanvasAsset>()
&& asset.GetAs<ScriptCanvasAsset>()->GetScriptCanvasGraph()
&& asset.GetAs<ScriptCanvasAsset>()->GetScriptCanvasGraph()->GetGraphData())
if (m_result.asset.Get() && m_result.asset.Mod()->GetGraphData())
{
auto graphData = asset.GetAs<ScriptCanvasAsset>()->GetScriptCanvasGraph()->GetGraphData();
auto graphData = m_result.asset.Mod()->GetGraphData();
auto dependencyGrabber = [this]
( void* instancePointer
@@ -107,71 +101,69 @@ 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"
, m_result.asset.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());
, m_result.asset.Path().c_str());
}
ModelNotificationsBus::Broadcast
( &ModelNotificationsTraits::OnUpgradeDependenciesGathered
, GetCurrentAsset()
, m_result.asset
, anyFailures ? Result::Failure : Result::Success);
ReleaseCurrentAsset();
// Flush asset database events to ensure no asset references are held by closures queued on Ebuses.
AZ::Data::AssetManager::Instance().DispatchEvents();
}
AZ::Data::Asset<AZ::Data::AssetData> Modifier::LoadAsset()
void 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& handle = m_result.asset;
if (!handle.IsGraphValid())
{
return asset;
}
else
{
return {};
auto outcome = LoadFromFile(handle.Path().c_str());
if (outcome.IsSuccess())
{
handle = outcome.TakeValue();
}
}
}
void Modifier::ModificationComplete(const ModificationResult& result)
{
m_result = result;
if (result.errorMessage.empty())
if (!result.errorMessage.empty())
{
SaveModifiedGraph(result);
ReportModificationError(result.errorMessage);
}
else if (m_result.asset.Describe() != result.asset.Describe())
{
ReportModificationError("Received modifiction complete notification for different result");
}
else
{
ReportModificationError(result.errorMessage);
SaveModifiedGraph(result);
}
}
void Modifier::ModifyCurrentAsset()
{
m_result = {};
m_result.assetInfo = GetCurrentAsset();
m_result.asset = m_assets[GetCurrentIndex()];
ModelNotificationsBus::Broadcast(&ModelNotificationsTraits::OnUpgradeModificationBegin, m_config, m_result.asset);
LoadAsset();
ModelNotificationsBus::Broadcast(&ModelNotificationsTraits::OnUpgradeModificationBegin, m_config, GetCurrentAsset());
if (auto asset = LoadAsset())
if (m_result.asset.IsGraphValid())
{
ModificationNotificationsBus::Handler::BusConnect();
m_modifyState = ModifyState::InProgress;
m_config.modification(asset);
m_config.modification(m_result.asset);
}
else
{
@@ -182,24 +174,30 @@ namespace ScriptCanvasEditor
void Modifier::ModifyNextAsset()
{
ModelNotificationsBus::Broadcast
( &ModelNotificationsTraits::OnUpgradeModificationEnd, m_config, GetCurrentAsset(), m_result);
( &ModelNotificationsTraits::OnUpgradeModificationEnd, m_config, m_result.asset, m_result);
ModificationNotificationsBus::Handler::BusDisconnect();
m_modifyState = ModifyState::Idle;
ReleaseCurrentAsset();
++m_assetIndex;
m_result = {};
}
void Modifier::ReleaseCurrentAsset()
{
m_result.asset = m_result.asset.Describe();
}
void Modifier::ReportModificationError(AZStd::string_view report)
{
m_result.asset = {};
m_result.errorMessage = report;
m_results.m_failures.push_back(m_result);
m_results.m_failures.push_back({ m_result.asset.Describe(), report });
ModifyNextAsset();
}
void Modifier::ReportModificationSuccess()
{
m_results.m_successes.push_back(m_result.assetInfo);
m_result.asset = m_result.asset.Describe();
m_results.m_successes.push_back({ m_result.asset.Describe(), {} });
ModifyNextAsset();
}
@@ -227,7 +225,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());
}
@@ -259,7 +257,7 @@ namespace ScriptCanvasEditor
m_modifyState = ModifyState::Saving;
m_fileSaver = AZStd::make_unique<FileSaver>
( m_config.onReadOnlyFile
, [this](const FileSaveResult& result) { OnFileSaveComplete(result); });
, [this](const FileSaveResult& fileSaveResult) { OnFileSaveComplete(fileSaveResult); });
m_fileSaver->Save(result.asset);
}
@@ -287,7 +285,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
@@ -299,7 +297,7 @@ namespace ScriptCanvasEditor
m_dependencyOrderedAssetIndicies.push_back(index);
}
// go straight into ModifyinGraphs
// go straight into ModifyingGraphs
m_assetIndex = m_assets.size();
}
}
@@ -322,6 +320,7 @@ namespace ScriptCanvasEditor
else
{
GatherDependencies();
ReleaseCurrentAsset();
++m_assetIndex;
}
}
@@ -380,10 +379,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->m_result.asset.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;
@@ -67,9 +67,10 @@ namespace ScriptCanvasEditor
State m_state = State::GatheringDependencies;
ModifyState m_modifyState = ModifyState::Idle;
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)
@@ -82,13 +83,14 @@ namespace ScriptCanvasEditor
AZStd::unique_ptr<FileSaver> m_fileSaver;
FileSaveResult m_fileSaveResult;
size_t GetCurrentIndex() const;
void GatherDependencies();
const AZ::Data::AssetInfo& GetCurrentAsset() const;
AZStd::unordered_set<size_t>& GetOrCreateDependencyIndexSet();
AZ::Data::Asset<AZ::Data::AssetData> LoadAsset();
void LoadAsset();
void ModifyCurrentAsset();
void ModifyNextAsset();
void ModificationComplete(const ModificationResult& result) override;
void ReleaseCurrentAsset();
void ReportModificationError(AZStd::string_view report);
void ReportModificationSuccess();
void ReportSaveResult();
@@ -6,9 +6,49 @@
*
*/
#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);
AZStd::string fullPath = sourceEntry->GetFullPath();
AzFramework::StringFunc::Path::Normalize(fullPath);
result.m_catalogAssets.push_back(
ScriptCanvasEditor::SourceHandle(nullptr, sourceEntry->GetSourceUuid(), fullPath));
}
const int rowCount = model.rowCount(index);
for (int i = 0; i < rowCount; ++i)
{
TraverseTree(model.index(i, 0, index), model, result);
}
}
}
namespace ScriptCanvasEditor
{
@@ -18,60 +58,54 @@ 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());
ModelNotificationsBus::Broadcast(&ModelNotificationsTraits::OnScanFilteredGraph, GetCurrentAsset());
VE_LOG("Scanner: Excluded: %s ", ModCurrentAsset().Path().c_str());
m_result.m_filteredAssets.push_back(ModCurrentAsset().Describe());
ModelNotificationsBus::Broadcast(&ModelNotificationsTraits::OnScanFilteredGraph, ModCurrentAsset());
}
else
{
VE_LOG("Scanner: Included: %s ", GetCurrentAsset().m_relativePath.c_str());
m_result.m_unfiltered.push_back({ asset, GetCurrentAsset() });
ModelNotificationsBus::Broadcast(&ModelNotificationsTraits::OnScanUnFilteredGraph, GetCurrentAsset());
VE_LOG("Scanner: Included: %s ", ModCurrentAsset().Path().c_str());
m_result.m_unfiltered.push_back(ModCurrentAsset().Describe());
ModelNotificationsBus::Broadcast(&ModelNotificationsTraits::OnScanUnFilteredGraph, ModCurrentAsset());
}
}
const AZ::Data::AssetInfo& Scanner::GetCurrentAsset() const
{
return m_result.m_catalogAssets[m_catalogAssetIndex];
}
const ScanResult& Scanner::GetResult() const
{
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(ModCurrentAsset().Path().c_str());
if (fileOutcome.IsSuccess())
{
return asset;
return fileOutcome.GetValue();
}
else
{
@@ -79,6 +113,11 @@ namespace ScriptCanvasEditor
}
}
SourceHandle& Scanner::ModCurrentAsset()
{
return m_result.m_catalogAssets[m_catalogAssetIndex];
}
void Scanner::OnSystemTick()
{
if (m_catalogAssetIndex == m_result.m_catalogAssets.size())
@@ -93,19 +132,19 @@ namespace ScriptCanvasEditor
}
else
{
if (auto asset = LoadAsset())
if (auto asset = LoadAsset(); asset.IsGraphValid())
{
VE_LOG("Scanner: Loaded: %s ", GetCurrentAsset().m_relativePath.c_str());
VE_LOG("Scanner: Loaded: %s ", ModCurrentAsset().Path().c_str());
FilterAsset(asset);
}
else
{
VE_LOG("Scanner: Failed to load: %s ", GetCurrentAsset().m_relativePath.c_str());
m_result.m_loadErrors.push_back(GetCurrentAsset());
ModelNotificationsBus::Broadcast(&ModelNotificationsTraits::OnScanLoadFailure, GetCurrentAsset());
VE_LOG("Scanner: Failed to load: %s ", ModCurrentAsset().Path().c_str());
m_result.m_loadErrors.push_back(ModCurrentAsset().Describe());
ModelNotificationsBus::Broadcast(&ModelNotificationsTraits::OnScanLoadFailure, ModCurrentAsset());
}
VE_LOG("Scanner: scan of %s complete", GetCurrentAsset().m_relativePath.c_str());
VE_LOG("Scanner: scan of %s complete", ModCurrentAsset().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);
SourceHandle LoadAsset();
SourceHandle& ModCurrentAsset();
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,15 +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())
{
GeneralRequestBus::BroadcastResult(openOutcome, &GeneralRequests::OpenScriptCanvasAsset, assetId, -1);
GeneralRequestBus::BroadcastResult(openOutcome, &GeneralRequests::OpenScriptCanvasAsset, asset, Tracker::ScriptCanvasFileState::UNMODIFIED, -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);
};
}