Merge pull request #3964 from aws-lumberyard-dev/carlitosan/development

Upgrades and stability fixes for version explorer
This commit is contained in:
carlitosan
2021-09-09 10:42:53 -07:00
committed by GitHub
31 changed files with 874 additions and 3382 deletions
@@ -93,6 +93,49 @@ namespace ScriptCanvasEditor
}
}
AZ::Outcome<void, AZStd::string> LoadScriptCanvasDataFromJson
( ScriptCanvas::ScriptCanvasData& dataTarget
, AZStd::string_view source
, AZ::SerializeContext& serializeContext)
{
namespace JSRU = AZ::JsonSerializationUtils;
using namespace ScriptCanvas;
AZ::JsonDeserializerSettings settings;
settings.m_serializeContext = &serializeContext;
settings.m_metadata.Create<SerializationListeners>();
auto loadResult = JSRU::LoadObjectFromStringByType
( &dataTarget
, azrtti_typeid<ScriptCanvasData>()
, source
, &settings);
if (!loadResult.IsSuccess())
{
return loadResult;
}
if (auto graphData = dataTarget.ModGraph())
{
auto listeners = settings.m_metadata.Find<SerializationListeners>();
AZ_Assert(listeners, "Failed to find SerializationListeners");
ScriptCanvasAssetHandlerCpp::CollectNodes(graphData->GetGraphData()->m_nodes, *listeners);
for (auto listener : *listeners)
{
listener->OnDeserialize();
}
}
else
{
return AZ::Failure(AZStd::string("Failed to find graph data after loading source"));
}
return AZ::Success();
}
AZ::Data::AssetHandler::LoadResult ScriptCanvasAssetHandler::LoadAssetData
( const AZ::Data::Asset<AZ::Data::AssetData>& assetTarget
, AZStd::shared_ptr<AZ::Data::AssetDataStream> streamSource
@@ -110,8 +153,9 @@ namespace ScriptCanvasEditor
{
streamSource->Seek(0U, AZ::IO::GenericStream::ST_SEEK_BEGIN);
auto& scriptCanvasDataTarget = scriptCanvasAssetTarget->GetScriptCanvasData();
AZStd::vector<AZ::u8> byteBuffer;
AZStd::vector<char> byteBuffer;
byteBuffer.resize_no_construct(streamSource->GetLength());
// this duplicate stream is to allow for trying again if the JSON read fails
AZ::IO::ByteContainerStream<decltype(byteBuffer)> byteStreamSource(&byteBuffer);
const size_t bytesRead = streamSource->Read(byteBuffer.size(), byteBuffer.data());
scriptCanvasDataTarget.m_scriptCanvasEntity.reset(nullptr);
@@ -123,47 +167,45 @@ namespace ScriptCanvasEditor
settings.m_serializeContext = m_serializeContext;
settings.m_metadata.Create<SerializationListeners>();
// attempt JSON deserialization...
if (JSRU::LoadObjectFromStreamByType
( &scriptCanvasDataTarget
, azrtti_typeid<ScriptCanvasData>()
, byteStreamSource
, &settings).IsSuccess())
auto jsonResult = LoadScriptCanvasDataFromJson
( scriptCanvasDataTarget
, AZStd::string_view{ byteBuffer.begin(), byteBuffer.size() }
, *m_serializeContext);
if (jsonResult.IsSuccess())
{
if (auto graphData = scriptCanvasAssetTarget->GetScriptCanvasGraph()
? scriptCanvasAssetTarget->GetScriptCanvasGraph()->GetGraphData()
: nullptr)
{
auto listeners = settings.m_metadata.Find<SerializationListeners>();
AZ_Assert(listeners, "Failed to create SerializationListeners");
ScriptCanvasAssetHandlerCpp::CollectNodes(graphData->m_nodes, *listeners);
for (auto listener : *listeners)
{
listener->OnDeserialize();
}
return AZ::Data::AssetHandler::LoadResult::LoadComplete;
}
else
{
AZ_Warning("ScriptCanvas", false, "ScriptCanvasAssetHandler::LoadAssetData failed to load graph data from JOSON");
}
return AZ::Data::AssetHandler::LoadResult::LoadComplete;
}
#if defined(OBJECT_STREAM_EDITOR_ASSET_LOADING_SUPPORT_ENABLED)////
else
{// ...if there is a failure, check if it is saved in the old format
{
// ...if there is a failure, check if it is saved in the old format
byteStreamSource.Seek(0U, AZ::IO::GenericStream::ST_SEEK_BEGIN);
// tolerate unknown classes in the editor. Let the asset processor warn about bad nodes...
if (AZ::Utils::LoadObjectFromStreamInPlace
(byteStreamSource
( byteStreamSource
, scriptCanvasDataTarget
, m_serializeContext
, AZ::ObjectStream::FilterDescriptor(assetLoadFilterCB, AZ::ObjectStream::FILTERFLAG_IGNORE_UNKNOWN_CLASSES)))
{
AZ_Warning
( "ScriptCanvas"
, false
, "ScriptCanvasAssetHandler::LoadAssetData failed to load graph data from JSON, %s, consider converting to JSON"
" by opening it and saving it, or running the graph update tool from the editor0"
, jsonResult.GetError().c_str());
return AZ::Data::AssetHandler::LoadResult::LoadComplete;
}
}
#else
else
{
AZ_Warning
( "ScriptCanvas"
, false
, "ScriptCanvasAssetHandler::LoadAssetData failed to load graph data from JSON %s"
, jsonResult.GetError().c_str()");
}
#endif//defined(OBJECT_STREAM_EDITOR_ASSET_LOADING_SUPPORT_ENABLED)
}
}
@@ -3467,11 +3467,12 @@ namespace ScriptCanvasEditor
m_focusHelper.SetActiveGraph(GetGraphCanvasGraphId());
}
bool Graph::UpgradeGraph(const AZ::Data::Asset<AZ::Data::AssetData>& asset)
bool Graph::UpgradeGraph(const AZ::Data::Asset<AZ::Data::AssetData>& asset, UpgradeRequest request, bool isVerbose)
{
m_upgradeSM.SetAsset(asset);
m_upgradeSM.SetVerbose(isVerbose);
if (!GetVersion().IsLatest())
if (request == UpgradeRequest::Forced || !GetVersion().IsLatest())
{
m_upgradeSM.Run(Start::StateID());
return true;
@@ -79,7 +79,7 @@ namespace ScriptCanvasEditor
{
if (node->GetComponents().empty())
{
AZ_TracePrintf("Script Canvas", "Removing node due to missing components: %s\nVerify that all gems that this script relies on are enabled\n", node->GetName().c_str());
AZ_TracePrintf(ScriptCanvas::k_VersionExplorerWindow.data(), "Removing node due to missing components: %s\nVerify that all gems that this script relies on are enabled\n", node->GetName().c_str());
nodesToRemove.push_back(node);
}
@@ -193,7 +193,7 @@ namespace ScriptCanvasEditor
}
else
{
AZ_Warning("ScriptCanvas", false, "Could not find ScriptCanvas Node with id %llu", static_cast<AZ::u64>(scriptCanvasSourceEndpoint.GetNodeId()));
AZ_Warning(ScriptCanvas::k_VersionExplorerWindow.data(), false, "Could not find ScriptCanvas Node with id %llu", static_cast<AZ::u64>(scriptCanvasSourceEndpoint.GetNodeId()));
}
AZ::EntityId graphCanvasSourceSlotId;
@@ -213,7 +213,7 @@ namespace ScriptCanvasEditor
if (!graphCanvasSourceSlotId.IsValid())
{
AZ_Warning("ScriptCanvas", sm->m_deletedNodes.count(scriptCanvasSourceEndpoint.GetNodeId()) > 0, "Could not create connection(%s) for Node(%s).", connectionId.ToString().c_str(), scriptCanvasSourceEndpoint.GetNodeId().ToString().c_str());
AZ_Warning(ScriptCanvas::k_VersionExplorerWindow.data(), sm->m_deletedNodes.count(scriptCanvasSourceEndpoint.GetNodeId()) > 0, "Could not create connection(%s) for Node(%s).", connectionId.ToString().c_str(), scriptCanvasSourceEndpoint.GetNodeId().ToString().c_str());
graph->DisconnectById(connectionId);
continue;
}
@@ -229,7 +229,7 @@ namespace ScriptCanvasEditor
}
else
{
AZ_Warning("ScriptCanvas", false, "Could not find ScriptCanvas Node with id %llu", static_cast<AZ::u64>(scriptCanvasSourceEndpoint.GetNodeId()));
AZ_Warning(ScriptCanvas::k_VersionExplorerWindow.data(), false, "Could not find ScriptCanvas Node with id %llu", static_cast<AZ::u64>(scriptCanvasSourceEndpoint.GetNodeId()));
}
SlotMappingRequestBus::EventResult(graphCanvasTargetEndpoint.m_slotId, graphCanvasTargetEndpoint.GetNodeId(), &SlotMappingRequests::MapToGraphCanvasId, scriptCanvasTargetEndpoint.GetSlotId());
@@ -245,7 +245,7 @@ namespace ScriptCanvasEditor
if (!graphCanvasTargetEndpoint.IsValid())
{
AZ_Warning("ScriptCanvas", sm->m_deletedNodes.count(scriptCanvasTargetEndpoint.GetNodeId()) > 0, "Could not create connection(%s) for Node(%s).", connectionId.ToString().c_str(), scriptCanvasTargetEndpoint.GetNodeId().ToString().c_str());
AZ_Warning(ScriptCanvas::k_VersionExplorerWindow.data(), sm->m_deletedNodes.count(scriptCanvasTargetEndpoint.GetNodeId()) > 0, "Could not create connection(%s) for Node(%s).", connectionId.ToString().c_str(), scriptCanvasTargetEndpoint.GetNodeId().ToString().c_str());
graph->DisconnectById(connectionId);
continue;
}
@@ -422,7 +422,7 @@ namespace ScriptCanvasEditor
if (!sm->m_updateReport.IsEmpty())
{
// currently, it is expected that there are no deleted old slots, those need manual correction
AZ_Error("ScriptCanvas", sm->m_updateReport.m_deletedOldSlots.empty(), "Graph upgrade path: If old slots are deleted, manual upgrading is required");
AZ_Error(ScriptCanvas::k_VersionExplorerWindow.data(), sm->m_updateReport.m_deletedOldSlots.empty(), "Graph upgrade path: If old slots are deleted, manual upgrading is required");
UpdateConnectionStatus(*graph, sm->m_updateReport);
}
}
@@ -511,17 +511,19 @@ namespace ScriptCanvasEditor
bool saveRawTranslationOuputToFile = ScriptCanvas::Grammar::g_saveRawTranslationOuputToFile;
ScriptCanvas::Grammar::g_saveRawTranslationOuputToFile = false;
// save parsing status before after, just because it didn't parse after doesn't mean it didn't before
graph->Parse(validationResults);
ScriptCanvas::Grammar::g_saveRawTranslationOuputToFile = saveRawTranslationOuputToFile;
if (validationResults.HasResults())
if (validationResults.HasErrors())
{
AZ::Interface<IUpgradeRequests>::Get()->GraphNeedsManualUpgrade(sm->m_asset.GetId());
for (auto& err : validationResults.GetEvents())
{
// Register this graph as needing manual updates
AZ::Interface<IUpgradeRequests>::Get()->GraphNeedsManualUpgrade(sm->m_asset.GetId());
Log("%s: %s\n", err->GetIdentifier().c_str(), err->GetDescription().data());
}
}
@@ -678,6 +680,7 @@ namespace ScriptCanvasEditor
if (m_asset != asset)
{
m_asset = asset;
SetDebugPrefix(asset.GetHint());
}
}
@@ -690,6 +693,10 @@ namespace ScriptCanvasEditor
//////////////////////////////////////////////////////////////////////
// State Machine Internals
bool StateMachine::GetVerbose() const
{
return m_isVerbose;
}
void StateMachine::OnSystemTick()
{
@@ -743,7 +750,22 @@ namespace ScriptCanvasEditor
AZ::SystemTickBus::Handler::BusConnect();
}
}
void StateMachine::SetVerbose(bool isVerbose)
{
m_isVerbose = isVerbose;
}
const AZStd::string& StateMachine::GetDebugPrefix() const
{
return m_debugPrefix;
}
void StateMachine::SetDebugPrefix(AZStd::string_view prefix)
{
m_debugPrefix = prefix;
}
}
@@ -20,6 +20,11 @@ namespace AZ
namespace ScriptCanvasEditor
{
AZ::Outcome<void, AZStd::string> LoadScriptCanvasDataFromJson
( ScriptCanvas::ScriptCanvasData& dataTarget
, AZStd::string_view source
, AZ::SerializeContext& serializeContext);
/**
* Manages editor Script Canvas graph assets.
*/
@@ -49,7 +54,7 @@ namespace ScriptCanvasEditor
// Called by the asset database to perform actual asset save. Returns true if successful otherwise false (default - as we don't require support save).
bool SaveAssetData(const AZ::Data::Asset<AZ::Data::AssetData>& asset, AZ::IO::GenericStream* stream) override;
bool SaveAssetData(const ScriptCanvasAsset* assetData, AZ::IO::GenericStream* stream);
bool SaveAssetData(const ScriptCanvasAsset* assetData, AZ::IO::GenericStream* stream , AZ::DataStream::StreamType streamType);
bool SaveAssetData(const ScriptCanvasAsset* assetData, AZ::IO::GenericStream* stream, AZ::DataStream::StreamType streamType);
// Called by the asset database when an asset should be deleted.
void DestroyAsset(AZ::Data::AssetPtr ptr) override;
@@ -0,0 +1,23 @@
/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#include <ScriptCanvas/Assets/ScriptCanvasBaseAssetData.h>
#include <ScriptCanvas/Components/EditorGraph.h>
namespace ScriptCanvas
{
Graph* ScriptCanvasData::ModGraph()
{
return AZ::EntityUtils::FindFirstDerivedComponent<ScriptCanvas::Graph>(m_scriptCanvasEntity.get());
}
const Graph* ScriptCanvasData::GetGraph() const
{
return AZ::EntityUtils::FindFirstDerivedComponent<ScriptCanvas::Graph>(m_scriptCanvasEntity.get());
}
}
@@ -28,6 +28,10 @@ namespace ScriptCanvas
AZ::Entity* GetScriptCanvasEntity() const { return m_scriptCanvasEntity.get(); }
Graph* ModGraph();
const Graph* GetGraph() const;
AZStd::unique_ptr<AZ::Entity> m_scriptCanvasEntity;
private:
ScriptCanvasData(const ScriptCanvasData&) = delete;
@@ -223,9 +223,9 @@ namespace ScriptCanvasEditor
using AssetList = AZStd::list<AZ::Data::AssetInfo>;
virtual AssetList& GetAssetsToUpgrade() = 0;
virtual void ClearGraphsThatNeedUpgrade() = 0;
virtual void GraphNeedsManualUpgrade(const AZ::Data::AssetId&) = 0;
virtual AZStd::vector<AZ::Data::AssetId>& GetGraphsThatNeedManualUpgrade() = 0;
virtual const AZStd::vector<AZ::Data::AssetId>& GetGraphsThatNeedManualUpgrade() const = 0;
virtual bool IsUpgrading() = 0;
virtual void SetIsUpgrading(bool isUpgrading) = 0;
};
@@ -230,7 +230,12 @@ namespace ScriptCanvasEditor
/////
EditorGraphUpgradeMachine m_upgradeSM;
bool UpgradeGraph(const AZ::Data::Asset<AZ::Data::AssetData>& asset);
enum UpgradeRequest
{
IfOutOfDate,
Forced
};
bool UpgradeGraph(const AZ::Data::Asset<AZ::Data::AssetData>& asset, UpgradeRequest request, bool isVerbose = true);
void ConnectGraphCanvasBuses();
void DisconnectGraphCanvasBuses();
///////
@@ -131,8 +131,20 @@ namespace ScriptCanvasEditor
void OnSystemTick() override;
bool GetVerbose() const;
void SetVerbose(bool isVerbose);
const AZStd::string& GetDebugPrefix() const;
void SetDebugPrefix(AZStd::string_view);
AZStd::shared_ptr<IState> m_currentState = nullptr;
AZStd::vector<AZStd::shared_ptr<IState>> m_states;
private:
bool m_isVerbose = true;
AZStd::string m_debugPrefix;
};
//! This state machine will collect and share a variety of data from the EditorGraph
@@ -342,19 +354,22 @@ namespace ScriptCanvasEditor
int EvaluateTransition() override;
};
template <typename Traits>
void ScriptCanvasEditor::State<Traits>::Log(const char* format, ...)
{
if (m_verbose)
{
char sBuffer[1024];
char sBuffer[2048];
va_list ArgList;
va_start(ArgList, format);
azvsnprintf(sBuffer, sizeof(sBuffer), format, ArgList);
sBuffer[sizeof(sBuffer) - 1] = '\0';
va_end(ArgList);
AZ_TracePrintf("Script Canvas", "%s\n", sBuffer);
AZ_TracePrintf(ScriptCanvas::k_VersionExplorerWindow.data()
, "%s-%s\n"
, m_stateMachine->GetDebugPrefix().c_str()
, sBuffer);
}
}
}
@@ -1,3 +1,4 @@
/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
@@ -109,6 +110,11 @@ namespace ScriptCanvasEditor
////////////////////////////////////////////////////////////////////////
// IUpgradeRequests...
void ClearGraphsThatNeedUpgrade()
{
m_assetsThatNeedManualUpgrade.clear();
}
IUpgradeRequests::AssetList& GetAssetsToUpgrade() override
{
return m_assetsToConvert;
@@ -122,7 +128,7 @@ namespace ScriptCanvasEditor
}
}
AZStd::vector<AZ::Data::AssetId>& GetGraphsThatNeedManualUpgrade() override
const AZStd::vector<AZ::Data::AssetId>& GetGraphsThatNeedManualUpgrade() const override
{
return m_assetsThatNeedManualUpgrade;
}
@@ -92,7 +92,7 @@ namespace ScriptCanvasEditor
void UpgradeTool::closeEvent(QCloseEvent* event)
{
m_keepEditorAlive.reset();
// m_keepEditorAlive.reset();
DisconnectBuses();
@@ -110,7 +110,7 @@ namespace ScriptCanvasEditor
{
setWindowFlag(Qt::WindowCloseButtonHint, false);
m_keepEditorAlive = AZStd::make_unique<EditorKeepAlive>();
// m_keepEditorAlive = AZStd::make_unique<EditorKeepAlive>();
UpdateSettings();
@@ -581,74 +581,6 @@ namespace ScriptCanvasEditor
accept();
}
template <typename AssetType>
AZ::Entity* UpgradeGraph(AZ::Data::Asset<AZ::Data::AssetData>& asset, UpgradeTool* upgradeTool)
{
AssetType* scriptCanvasAsset = asset.GetAs<AssetType>();
AZ_Assert(scriptCanvasAsset, "Unable to get the asset of type: %s", azrtti_typeid<AssetType>().template ToString<AZStd::string>().c_str());
if (!scriptCanvasAsset)
{
return nullptr;
}
AZ::Entity* scriptCanvasEntity = scriptCanvasAsset->GetScriptCanvasEntity();
AZ_Assert(scriptCanvasEntity, "The Script Canvas asset must have a valid entity");
if (!scriptCanvasEntity)
{
return nullptr;
}
auto graphComponent = scriptCanvasEntity->FindComponent<ScriptCanvasEditor::Graph>();
AZ_Assert(graphComponent, "The Script Canvas entity must have a Graph component");
bool isLatest = graphComponent->GetVersion().IsLatest();
if (isLatest)
{
++upgradeTool->SkippedGraphCount();
// No need to upgrade
return nullptr;
}
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();
}
if (graphComponent)
{
if (!graphComponent->UpgradeGraph(asset))
{
++upgradeTool->SkippedGraphCount();
}
else
{
++upgradeTool->UpgradedGraphCount();
}
}
return scriptCanvasEntity;
}
void UpgradeTool::SaveLog()
{
AZStd::string outputFileName = AZStd::string::format("@devroot@/ScriptCanvasUpgradeReport.html");
@@ -688,29 +620,9 @@ namespace ScriptCanvasEditor
outputFile.Close();
}
AZ::Entity* UpgradeTool::AssetUpgradeJob(AZ::Data::Asset<AZ::Data::AssetData>& asset)
AZ::Entity* UpgradeTool::AssetUpgradeJob(AZ::Data::Asset<AZ::Data::AssetData>&)
{
using namespace ScriptCanvasEditor;
AZ_Assert(asset.IsReady(), "The asset must be ready by now");
AZStd::lock_guard<AZStd::recursive_mutex> myLocker(m_mutex);
AZ::Entity* scriptCanvasEntity = nullptr;
if (asset.GetType() == azrtti_typeid<ScriptCanvasAsset>())
{
scriptCanvasEntity = UpgradeGraph<ScriptCanvasAsset>(asset, this);
}
if (!scriptCanvasEntity)
{
// This may happen if the graph failed or did not need to upgrade
AZ_TracePrintf("Script Canvas", "%s .. up to date!\n", asset.GetHint().c_str());
return nullptr;
}
// The rest will happen when we get notified that the graph is done.
return scriptCanvasEntity;
return nullptr;
}
void UpgradeTool::RetryMove(AZ::Data::Asset<AZ::Data::AssetData>& asset, const AZStd::string& source, const AZStd::string& target)
@@ -780,28 +692,6 @@ namespace ScriptCanvasEditor
return false;
}
ScriptCanvasEditor::EditorKeepAlive::EditorKeepAlive()
{
ISystem* system = nullptr;
CrySystemRequestBus::BroadcastResult(system, &CrySystemRequestBus::Events::GetCrySystem);
m_edKeepEditorActive = system->GetIConsole()->GetCVar("ed_KeepEditorActive");
if (m_edKeepEditorActive)
{
m_keepEditorActive = m_edKeepEditorActive->GetIVal();
m_edKeepEditorActive->Set(1);
}
}
ScriptCanvasEditor::EditorKeepAlive::~EditorKeepAlive()
{
if (m_edKeepEditorActive)
{
m_edKeepEditorActive->Set(m_keepEditorActive);
}
}
#include <Editor/View/Windows/Tools/UpgradeTool/moc_UpgradeTool.cpp>
}
@@ -38,18 +38,7 @@ namespace Ui
namespace ScriptCanvasEditor
{
//! Scoped utility to set and restore the "ed_KeepEditorActive" CVar in order to allow
//! the upgrade tool to work even if the editor is not in the foreground
class EditorKeepAlive
{
public:
EditorKeepAlive();
~EditorKeepAlive();
private:
int m_keepEditorActive;
ICVar* m_edKeepEditorActive;
};
class KeepEditorAlive;
//! A tool that collects and upgrades all Script Canvas graphs in the asset catalog
class UpgradeTool
@@ -140,7 +129,7 @@ namespace ScriptCanvasEditor
AZStd::unique_ptr<Ui::UpgradeTool> m_ui;
AZStd::recursive_mutex m_mutex;
AZStd::unique_ptr<EditorKeepAlive> m_keepEditorAlive;
// AZStd::unique_ptr<EditorKeepAlive> m_keepEditorAlive;
AZStd::vector<AZStd::string> m_logs;
File diff suppressed because it is too large Load Diff
@@ -20,11 +20,11 @@ AZ_POP_DISABLE_WARNING
#include <AzQtComponents/Components/StyledDialog.h>
#include <ScriptCanvas/Bus/EditorScriptCanvasBus.h>
#include <ScriptCanvas/Core/Core.h>
#include <ISystem.h>
#include <IConsole.h>
#include <AzCore/Debug/TraceMessageBus.h>
#include "UpgradeTool.h"
#endif
class QPushButton;
@@ -41,6 +41,19 @@ namespace AzQtComponents
namespace ScriptCanvasEditor
{
//! Scoped utility to set and restore the "ed_KeepEditorActive" CVar in order to allow
//! the upgrade tool to work even if the editor is not in the foreground
class EditorKeepAlive
{
public:
EditorKeepAlive();
~EditorKeepAlive();
private:
int m_keepEditorActive;
ICVar* m_edKeepEditorActive;
};
//! A tool that collects and upgrades all Script Canvas graphs in the asset catalog
class VersionExplorer
: public AzQtComponents::StyledDialog
@@ -71,14 +84,10 @@ namespace ScriptCanvasEditor
Inactive,
Backup,
Scan,
Upgrade
Upgrade,
};
ProcessState m_state = ProcessState::Inactive;
bool DoBackup();
void BackupAsset(const AZ::Data::AssetInfo& assetInfo);
void BackupComplete();
void DoScan();
void ScanComplete(const AZ::Data::Asset<AZ::Data::AssetData>&);
@@ -97,24 +106,21 @@ namespace ScriptCanvasEditor
bool OnPreWarning(const char* /*window*/, const char* /*fileName*/, int /*line*/, const char* /*func*/, const char* /*message*/) override;
//
void CaptureLogFromTraceBus(const char* window, const char* message);
bool CaptureLogFromTraceBus(const char* window, const char* message);
enum class OperationResult
{
Success,
SkipBackup,
BackupSuccess,
BackupFail,
BackupFail_CreateFolder,
BackupFail_FileNotFound
Failure,
};
void GraphUpgradeComplete(const AZ::Data::Asset<AZ::Data::AssetData>&, OperationResult result = OperationResult::Success);
void GraphUpgradeComplete(const AZ::Data::Asset<AZ::Data::AssetData>, OperationResult result, AZStd::string_view message);
bool IsUpgrading() const;
bool m_inProgress = false;
size_t m_currentAssetIndex = 0;
// scan fields
size_t m_currentAssetRowIndex = 0;
size_t m_inspectedAssets = 0;
size_t m_failedAssets = 0;
size_t m_discoveredAssets = 0;
@@ -129,7 +135,16 @@ namespace ScriptCanvasEditor
AZStd::unique_ptr<Ui::VersionExplorer> m_ui;
AZStd::unique_ptr<ScriptCanvas::Grammar::SettingsCache> m_settingsCache;
// upgrade fields
AZStd::recursive_mutex m_mutex;
bool m_upgradeComplete = false;
AZ::Data::Asset<AZ::Data::AssetData> m_upgradeAsset;
int m_upgradeAssetIndex = 0;
OperationResult m_upgradeResult;
AZStd::string m_upgradeMessage;
AZStd::string m_tmpFileName;
AZStd::unique_ptr<EditorKeepAlive> m_keepEditorAlive;
@@ -146,18 +161,19 @@ namespace ScriptCanvasEditor
void FinalizeUpgrade();
void FinalizeScan();
OperationResult BackupGraph(const AZ::Data::Asset<AZ::Data::AssetData>&);
void BackupComplete();
AZStd::string BackupGraph(const AZ::Data::Asset<AZ::Data::AssetData>&);
void UpgradeGraph(const AZ::Data::Asset<AZ::Data::AssetData>&);
void RetryMove(const AZ::Data::Asset<AZ::Data::AssetData>& asset, const AZStd::string& source, const AZStd::string& target);
void GraphUpgradeCompleteUIUpdate(const AZ::Data::Asset<AZ::Data::AssetData>& asset, OperationResult result = OperationResult::Success);
void GraphUpgradeCompleteUIUpdate(const AZ::Data::Asset<AZ::Data::AssetData> asset, OperationResult result, AZStd::string_view message);
void OnGraphUpgradeComplete(AZ::Data::Asset<AZ::Data::AssetData>&, bool skipped = false) override;
void OnSourceFileReleased(AZ::Data::Asset<AZ::Data::AssetData> asset);
void closeEvent(QCloseEvent* event) override;
bool m_overwriteAll = false;
void PerformMove(AZ::Data::Asset<AZ::Data::AssetData>& asset, const AZStd::string& source, const AZStd::string& target);
void PerformMove(AZ::Data::Asset<AZ::Data::AssetData> asset, AZStd::string source, AZStd::string target, size_t remainingAttempts);
void Log(const char* format, ...);
};
@@ -9,8 +9,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>747</width>
<height>687</height>
<width>1363</width>
<height>770</height>
</rect>
</property>
<property name="sizePolicy">
@@ -261,10 +261,10 @@
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOn</enum>
</property>
<property name="readOnly">
<property name="verticalScrollBarPolicy">
<enum>Qt::ScrollBarAlwaysOn</enum>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
@@ -273,6 +273,16 @@
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="5" column="0">
<widget class="QCheckBox" name="makeBackupCheckbox">
<property name="text">
<string>Backup before upgrade</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QPushButton" name="scanButton">
<property name="sizePolicy">
@@ -311,36 +321,16 @@
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QCheckBox" name="onlyShowOutdated">
<item row="5" column="7">
<widget class="QCheckBox" name="verbose">
<property name="text">
<string>Only show outdated graphs</string>
<string>Verbose</string>
</property>
<property name="checked">
<bool>true</bool>
<bool>false</bool>
</property>
</widget>
</item>
<item row="5" column="6">
<widget class="QCheckBox" name="forceUpgrade">
<property name="text">
<string>Force Upgrade</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
<item row="5" column="7">
<widget class="QCheckBox" name="verbose">
<property name="text">
<string>Verbose</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
<item row="5" column="4">
<widget class="QPushButton" name="closeButton">
<property name="sizePolicy">
@@ -354,16 +344,36 @@
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QCheckBox" name="makeBackupCheckbox">
<item row="5" column="1">
<widget class="QCheckBox" name="onlyShowOutdated">
<property name="text">
<string>Backup before upgrade</string>
<string>Only show outdated graphs</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="5" column="6">
<widget class="QCheckBox" name="forceUpgrade">
<property name="text">
<string>Force Upgrade</string>
</property>
<property name="checked">
<bool>false</bool>
</property>
</widget>
</item>
<item row="5" column="8">
<widget class="QCheckBox" name="updateReportingOnly">
<property name="text">
<string>Update Reporting Only</string>
</property>
<property name="tristate">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
</layout>