stubbed out refactor of version explorer
Signed-off-by: chcurran <82187351+carlitosan@users.noreply.github.com>
This commit is contained in:
@@ -704,78 +704,7 @@ namespace ScriptCanvasEditor
|
||||
|
||||
m_autoSaveTimer.setSingleShot(true);
|
||||
connect(&m_autoSaveTimer, &QTimer::timeout, this, &MainWindow::OnAutoSave);
|
||||
|
||||
UpdateMenuState(false);
|
||||
|
||||
PromptForUpgrade();
|
||||
}
|
||||
|
||||
void MainWindow::PromptForUpgrade()
|
||||
{
|
||||
static bool displayUpgradePrompt = false; // Set to true if you need the upgrade dialog to show up on ScriptCanvas editor open
|
||||
if (displayUpgradePrompt && m_showUpgradeTool)
|
||||
{
|
||||
QTimer::singleShot(1.f, this, [this]()
|
||||
{
|
||||
UpgradeTool* upgradeTool = aznew UpgradeTool(this);
|
||||
|
||||
QPoint centerPoint = frameGeometry().center();
|
||||
|
||||
upgradeTool->adjustSize();
|
||||
upgradeTool->move(centerPoint.x() - upgradeTool->width() / 2, centerPoint.y() - upgradeTool->height() / 2);
|
||||
|
||||
if (upgradeTool->exec() == QDialog::Accepted)
|
||||
{
|
||||
// Manual correction
|
||||
size_t assetsThatNeedManualInspection = AZ::Interface<IUpgradeRequests>::Get()->GetGraphsThatNeedManualUpgrade().size();
|
||||
QString message = QObject::tr("%1 Graph(s) upgraded<br>%2 graph(s) did not require upgrade").arg(upgradeTool->UpgradedGraphCount()).arg(upgradeTool->SkippedGraphCount());
|
||||
if (assetsThatNeedManualInspection > 0)
|
||||
{
|
||||
message.append(QObject::tr("<br>%1 graph(s) that need manual corrections. You will be prompted to review them after you close this dialog.<br>").arg(assetsThatNeedManualInspection));
|
||||
}
|
||||
|
||||
// Report
|
||||
char resolvedBuffer[AZ_MAX_PATH_LEN] = { 0 };
|
||||
AZStd::string outputFileName = AZStd::string::format("@devroot@/ScriptCanvasUpgradeReport.html");
|
||||
AZ::IO::FileIOBase::GetInstance()->ResolvePath(outputFileName.c_str(), resolvedBuffer, AZ_MAX_PATH_LEN);
|
||||
AZStd::string urlToReport = AZStd::string::format("For more information see the <a href=\"%s\">Upgrade Report</a>.", resolvedBuffer);
|
||||
message.append(QObject::tr("<br>%1").arg(urlToReport.c_str()));
|
||||
|
||||
// Backup
|
||||
if (upgradeTool->HasBackup())
|
||||
{
|
||||
AZStd::string outputFileName2 = AZStd::string::format("@devroot@/ScriptCanvas_BACKUP");
|
||||
|
||||
AZ::IO::FileIOBase::GetInstance()->ResolvePath(outputFileName2.c_str(), resolvedBuffer, AZ_MAX_PATH_LEN);
|
||||
|
||||
AZStd::string backupPath = AZStd::string::format("<br>Open the <a href=\"%s\">Backup Folder</a>.", resolvedBuffer);
|
||||
message.append(QObject::tr("%1").arg(backupPath.c_str()));
|
||||
}
|
||||
|
||||
// Done upgrading, show details
|
||||
QMessageBox mb(QMessageBox::Information,
|
||||
QObject::tr("Upgrade Complete"),
|
||||
message,
|
||||
QMessageBox::Ok, this);
|
||||
mb.setTextFormat(Qt::RichText);
|
||||
|
||||
centerPoint = frameGeometry().center();
|
||||
|
||||
mb.adjustSize();
|
||||
mb.move(centerPoint.x() - width() / 2, centerPoint.y() - height() / 2);
|
||||
|
||||
mb.exec();
|
||||
|
||||
// If there are graphs that need manual correction, show the helper
|
||||
if (assetsThatNeedManualInspection > 0)
|
||||
{
|
||||
UpgradeHelper* upgradeHelper = new UpgradeHelper(this);
|
||||
upgradeHelper->show();
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
MainWindow::~MainWindow()
|
||||
|
||||
@@ -51,7 +51,6 @@
|
||||
|
||||
#include <Editor/View/Widgets/AssetGraphSceneDataBus.h>
|
||||
|
||||
#include <Editor/View/Windows/Tools/UpgradeTool/UpgradeTool.h>
|
||||
#include <Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.h>
|
||||
|
||||
#if SCRIPTCANVAS_EDITOR
|
||||
@@ -806,7 +805,5 @@ namespace ScriptCanvasEditor
|
||||
Workspace* m_workspace;
|
||||
|
||||
void OnSaveCallback(bool saveSuccess, AZ::Data::AssetPtr, AZ::Data::AssetId previousFileAssetId);
|
||||
|
||||
void PromptForUpgrade();
|
||||
};
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,180 @@
|
||||
/*
|
||||
* 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
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#if !defined(Q_MOC_RUN)
|
||||
#include <AzCore/PlatformDef.h>
|
||||
|
||||
AZ_PUSH_DISABLE_WARNING(4244 4251 4800, "-Wunknown-warning-option")
|
||||
#include <QProgressBar>
|
||||
AZ_POP_DISABLE_WARNING
|
||||
|
||||
#include <AzCore/Component/EntityId.h>
|
||||
#include <AzCore/Component/TickBus.h>
|
||||
#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>
|
||||
#endif
|
||||
|
||||
class QPushButton;
|
||||
|
||||
namespace Ui
|
||||
{
|
||||
class VersionExplorer;
|
||||
}
|
||||
|
||||
namespace AzQtComponents
|
||||
{
|
||||
class StyledBusyLabel;
|
||||
}
|
||||
|
||||
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
|
||||
, private AZ::SystemTickBus::Handler
|
||||
, private UpgradeNotifications::Bus::Handler
|
||||
, private AZ::Debug::TraceMessageBus::Handler
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
AZ_CLASS_ALLOCATOR(VersionExplorer, AZ::SystemAllocator, 0);
|
||||
|
||||
explicit VersionExplorer(QWidget* parent = nullptr);
|
||||
~VersionExplorer();
|
||||
|
||||
private:
|
||||
|
||||
static constexpr int ColumnAsset = 0;
|
||||
static constexpr int ColumnAction = 1;
|
||||
static constexpr int ColumnBrowse = 2;
|
||||
static constexpr int ColumnStatus = 3;
|
||||
|
||||
void OnScan();
|
||||
void OnClose();
|
||||
|
||||
enum class ProcessState
|
||||
{
|
||||
Inactive,
|
||||
Backup,
|
||||
Scan,
|
||||
Upgrade,
|
||||
};
|
||||
ProcessState m_state = ProcessState::Inactive;
|
||||
|
||||
void DoScan();
|
||||
void ScanComplete(const AZ::Data::Asset<AZ::Data::AssetData>&);
|
||||
|
||||
void InspectAsset(AZ::Data::Asset<AZ::Data::AssetData>& asset, AZ::Data::AssetInfo& assetInfo);
|
||||
|
||||
void OnUpgradeAll();
|
||||
|
||||
// SystemTickBus::Handler
|
||||
void OnSystemTick() override;
|
||||
//
|
||||
|
||||
// AZ::Debug::TranceMessageBus::Handler
|
||||
bool OnException(const char* /*message*/) override;
|
||||
bool OnPrintf(const char* /*window*/, const char* /*message*/) override;
|
||||
bool OnPreError(const char* /*window*/, const char* /*fileName*/, int /*line*/, const char* /*func*/, const char* /*message*/) override;
|
||||
bool OnPreWarning(const char* /*window*/, const char* /*fileName*/, int /*line*/, const char* /*func*/, const char* /*message*/) override;
|
||||
//
|
||||
|
||||
bool CaptureLogFromTraceBus(const char* window, const char* message);
|
||||
|
||||
enum class OperationResult
|
||||
{
|
||||
Success,
|
||||
Failure,
|
||||
};
|
||||
|
||||
void GraphUpgradeComplete(const AZ::Data::Asset<AZ::Data::AssetData>, OperationResult result, AZStd::string_view message);
|
||||
|
||||
bool IsUpgrading() const;
|
||||
|
||||
bool m_inProgress = false;
|
||||
// scan fields
|
||||
size_t m_currentAssetRowIndex = 0;
|
||||
size_t m_inspectedAssets = 0;
|
||||
size_t m_failedAssets = 0;
|
||||
size_t m_discoveredAssets = 0;
|
||||
|
||||
IUpgradeRequests::AssetList m_assetsToInspect;
|
||||
IUpgradeRequests::AssetList::iterator m_inspectingAsset;
|
||||
using UpgradeAssets = AZStd::vector<AZ::Data::Asset<AZ::Data::AssetData>>;
|
||||
UpgradeAssets m_assetsToUpgrade;
|
||||
UpgradeAssets::iterator m_inProgressAsset;
|
||||
|
||||
AZ::Data::Asset<AZ::Data::AssetData> m_currentAsset;
|
||||
|
||||
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;
|
||||
|
||||
AZStd::deque<AZStd::string> m_logs;
|
||||
|
||||
AZ::Entity* m_scriptCanvasEntity = nullptr;
|
||||
|
||||
bool m_isUpgradingSingleGraph = false;
|
||||
|
||||
void UpgradeSingle(QPushButton* item, AzQtComponents::StyledBusyLabel* spinner, AZ::Data::AssetInfo assetInfo);
|
||||
|
||||
void FlushLogs();
|
||||
|
||||
void FinalizeUpgrade();
|
||||
void FinalizeScan();
|
||||
|
||||
void BackupComplete();
|
||||
AZStd::string BackupGraph(const AZ::Data::Asset<AZ::Data::AssetData>&);
|
||||
void UpgradeGraph(const AZ::Data::Asset<AZ::Data::AssetData>&);
|
||||
|
||||
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, AZStd::string source, AZStd::string target, size_t remainingAttempts);
|
||||
|
||||
void Log(const char* format, ...);
|
||||
};
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,167 @@
|
||||
/*
|
||||
* 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
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#if !defined(Q_MOC_RUN)
|
||||
#include <AzCore/PlatformDef.h>
|
||||
|
||||
AZ_PUSH_DISABLE_WARNING(4244 4251 4800, "-Wunknown-warning-option")
|
||||
#include <QProgressBar>
|
||||
AZ_POP_DISABLE_WARNING
|
||||
|
||||
#include <AzCore/Component/EntityId.h>
|
||||
#include <AzCore/Component/TickBus.h>
|
||||
#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>
|
||||
#endif
|
||||
|
||||
class QPushButton;
|
||||
|
||||
namespace Ui
|
||||
{
|
||||
class Modifier;
|
||||
}
|
||||
|
||||
namespace AzQtComponents
|
||||
{
|
||||
class StyledBusyLabel;
|
||||
}
|
||||
|
||||
namespace ScriptCanvasEditor
|
||||
{
|
||||
//! A tool that collects and upgrades all Script Canvas graphs in the asset catalog
|
||||
class Modifier
|
||||
: public AzQtComponents::StyledDialog
|
||||
, private AZ::SystemTickBus::Handler
|
||||
, private UpgradeNotifications::Bus::Handler
|
||||
, private AZ::Debug::TraceMessageBus::Handler
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
AZ_CLASS_ALLOCATOR(Modifier, AZ::SystemAllocator, 0);
|
||||
|
||||
explicit Modifier(QWidget* parent = nullptr);
|
||||
~Modifier();
|
||||
|
||||
private:
|
||||
|
||||
static constexpr int ColumnAsset = 0;
|
||||
static constexpr int ColumnAction = 1;
|
||||
static constexpr int ColumnBrowse = 2;
|
||||
static constexpr int ColumnStatus = 3;
|
||||
|
||||
void OnScan();
|
||||
void OnClose();
|
||||
|
||||
enum class ProcessState
|
||||
{
|
||||
Inactive,
|
||||
Backup,
|
||||
Scan,
|
||||
Upgrade,
|
||||
};
|
||||
ProcessState m_state = ProcessState::Inactive;
|
||||
|
||||
void DoScan();
|
||||
void ScanComplete(const AZ::Data::Asset<AZ::Data::AssetData>&);
|
||||
|
||||
void InspectAsset(AZ::Data::Asset<AZ::Data::AssetData>& asset, AZ::Data::AssetInfo& assetInfo);
|
||||
|
||||
void OnUpgradeAll();
|
||||
|
||||
// SystemTickBus::Handler
|
||||
void OnSystemTick() override;
|
||||
//
|
||||
|
||||
// AZ::Debug::TranceMessageBus::Handler
|
||||
bool OnException(const char* /*message*/) override;
|
||||
bool OnPrintf(const char* /*window*/, const char* /*message*/) override;
|
||||
bool OnPreError(const char* /*window*/, const char* /*fileName*/, int /*line*/, const char* /*func*/, const char* /*message*/) override;
|
||||
bool OnPreWarning(const char* /*window*/, const char* /*fileName*/, int /*line*/, const char* /*func*/, const char* /*message*/) override;
|
||||
//
|
||||
|
||||
bool CaptureLogFromTraceBus(const char* window, const char* message);
|
||||
|
||||
enum class OperationResult
|
||||
{
|
||||
Success,
|
||||
Failure,
|
||||
};
|
||||
|
||||
void GraphUpgradeComplete(const AZ::Data::Asset<AZ::Data::AssetData>, OperationResult result, AZStd::string_view message);
|
||||
|
||||
bool IsUpgrading() const;
|
||||
|
||||
bool m_inProgress = false;
|
||||
// scan fields
|
||||
size_t m_currentAssetRowIndex = 0;
|
||||
size_t m_inspectedAssets = 0;
|
||||
size_t m_failedAssets = 0;
|
||||
size_t m_discoveredAssets = 0;
|
||||
|
||||
IUpgradeRequests::AssetList m_assetsToInspect;
|
||||
IUpgradeRequests::AssetList::iterator m_inspectingAsset;
|
||||
using UpgradeAssets = AZStd::vector<AZ::Data::Asset<AZ::Data::AssetData>>;
|
||||
UpgradeAssets m_assetsToUpgrade;
|
||||
UpgradeAssets::iterator m_inProgressAsset;
|
||||
|
||||
AZ::Data::Asset<AZ::Data::AssetData> m_currentAsset;
|
||||
|
||||
AZStd::unique_ptr<Ui::Modifier> 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;
|
||||
|
||||
AZStd::deque<AZStd::string> m_logs;
|
||||
|
||||
AZ::Entity* m_scriptCanvasEntity = nullptr;
|
||||
|
||||
bool m_isUpgradingSingleGraph = false;
|
||||
|
||||
void UpgradeSingle(QPushButton* item, AzQtComponents::StyledBusyLabel* spinner, AZ::Data::AssetInfo assetInfo);
|
||||
|
||||
void FlushLogs();
|
||||
|
||||
void FinalizeUpgrade();
|
||||
void FinalizeScan();
|
||||
|
||||
void BackupComplete();
|
||||
AZStd::string BackupGraph(const AZ::Data::Asset<AZ::Data::AssetData>&);
|
||||
void UpgradeGraph(const AZ::Data::Asset<AZ::Data::AssetData>&);
|
||||
|
||||
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, AZStd::string source, AZStd::string target, size_t remainingAttempts);
|
||||
|
||||
void Log(const char* format, ...);
|
||||
};
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,167 @@
|
||||
/*
|
||||
* 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
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#if !defined(Q_MOC_RUN)
|
||||
#include <AzCore/PlatformDef.h>
|
||||
|
||||
AZ_PUSH_DISABLE_WARNING(4244 4251 4800, "-Wunknown-warning-option")
|
||||
#include <QProgressBar>
|
||||
AZ_POP_DISABLE_WARNING
|
||||
|
||||
#include <AzCore/Component/EntityId.h>
|
||||
#include <AzCore/Component/TickBus.h>
|
||||
#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>
|
||||
#endif
|
||||
|
||||
class QPushButton;
|
||||
|
||||
namespace Ui
|
||||
{
|
||||
class Scanner;
|
||||
}
|
||||
|
||||
namespace AzQtComponents
|
||||
{
|
||||
class StyledBusyLabel;
|
||||
}
|
||||
|
||||
namespace ScriptCanvasEditor
|
||||
{
|
||||
//! A tool that collects and upgrades all Script Canvas graphs in the asset catalog
|
||||
class Scanner
|
||||
: public AzQtComponents::StyledDialog
|
||||
, private AZ::SystemTickBus::Handler
|
||||
, private UpgradeNotifications::Bus::Handler
|
||||
, private AZ::Debug::TraceMessageBus::Handler
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
AZ_CLASS_ALLOCATOR(Scanner, AZ::SystemAllocator, 0);
|
||||
|
||||
explicit Scanner(QWidget* parent = nullptr);
|
||||
~Scanner();
|
||||
|
||||
private:
|
||||
|
||||
static constexpr int ColumnAsset = 0;
|
||||
static constexpr int ColumnAction = 1;
|
||||
static constexpr int ColumnBrowse = 2;
|
||||
static constexpr int ColumnStatus = 3;
|
||||
|
||||
void OnScan();
|
||||
void OnClose();
|
||||
|
||||
enum class ProcessState
|
||||
{
|
||||
Inactive,
|
||||
Backup,
|
||||
Scan,
|
||||
Upgrade,
|
||||
};
|
||||
ProcessState m_state = ProcessState::Inactive;
|
||||
|
||||
void DoScan();
|
||||
void ScanComplete(const AZ::Data::Asset<AZ::Data::AssetData>&);
|
||||
|
||||
void InspectAsset(AZ::Data::Asset<AZ::Data::AssetData>& asset, AZ::Data::AssetInfo& assetInfo);
|
||||
|
||||
void OnUpgradeAll();
|
||||
|
||||
// SystemTickBus::Handler
|
||||
void OnSystemTick() override;
|
||||
//
|
||||
|
||||
// AZ::Debug::TranceMessageBus::Handler
|
||||
bool OnException(const char* /*message*/) override;
|
||||
bool OnPrintf(const char* /*window*/, const char* /*message*/) override;
|
||||
bool OnPreError(const char* /*window*/, const char* /*fileName*/, int /*line*/, const char* /*func*/, const char* /*message*/) override;
|
||||
bool OnPreWarning(const char* /*window*/, const char* /*fileName*/, int /*line*/, const char* /*func*/, const char* /*message*/) override;
|
||||
//
|
||||
|
||||
bool CaptureLogFromTraceBus(const char* window, const char* message);
|
||||
|
||||
enum class OperationResult
|
||||
{
|
||||
Success,
|
||||
Failure,
|
||||
};
|
||||
|
||||
void GraphUpgradeComplete(const AZ::Data::Asset<AZ::Data::AssetData>, OperationResult result, AZStd::string_view message);
|
||||
|
||||
bool IsUpgrading() const;
|
||||
|
||||
bool m_inProgress = false;
|
||||
// scan fields
|
||||
size_t m_currentAssetRowIndex = 0;
|
||||
size_t m_inspectedAssets = 0;
|
||||
size_t m_failedAssets = 0;
|
||||
size_t m_discoveredAssets = 0;
|
||||
|
||||
IUpgradeRequests::AssetList m_assetsToInspect;
|
||||
IUpgradeRequests::AssetList::iterator m_inspectingAsset;
|
||||
using UpgradeAssets = AZStd::vector<AZ::Data::Asset<AZ::Data::AssetData>>;
|
||||
UpgradeAssets m_assetsToUpgrade;
|
||||
UpgradeAssets::iterator m_inProgressAsset;
|
||||
|
||||
AZ::Data::Asset<AZ::Data::AssetData> m_currentAsset;
|
||||
|
||||
AZStd::unique_ptr<Ui::Scanner> 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;
|
||||
|
||||
AZStd::deque<AZStd::string> m_logs;
|
||||
|
||||
AZ::Entity* m_scriptCanvasEntity = nullptr;
|
||||
|
||||
bool m_isUpgradingSingleGraph = false;
|
||||
|
||||
void UpgradeSingle(QPushButton* item, AzQtComponents::StyledBusyLabel* spinner, AZ::Data::AssetInfo assetInfo);
|
||||
|
||||
void FlushLogs();
|
||||
|
||||
void FinalizeUpgrade();
|
||||
void FinalizeScan();
|
||||
|
||||
void BackupComplete();
|
||||
AZStd::string BackupGraph(const AZ::Data::Asset<AZ::Data::AssetData>&);
|
||||
void UpgradeGraph(const AZ::Data::Asset<AZ::Data::AssetData>&);
|
||||
|
||||
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, AZStd::string source, AZStd::string target, size_t remainingAttempts);
|
||||
|
||||
void Log(const char* format, ...);
|
||||
};
|
||||
}
|
||||
@@ -1,697 +0,0 @@
|
||||
/*
|
||||
* 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 <QMessageBox>
|
||||
#include <QDateTime>
|
||||
|
||||
#include "UpgradeTool.h"
|
||||
|
||||
#include <AzCore/Component/ComponentApplicationBus.h>
|
||||
#include <AzCore/Component/TickBus.h>
|
||||
#include <AzCore/IO/SystemFile.h>
|
||||
#include <AzCore/UserSettings/UserSettingsProvider.h>
|
||||
|
||||
#include <AzFramework/Asset/AssetSystemBus.h>
|
||||
#include <AzFramework/IO/FileOperations.h>
|
||||
|
||||
#include <AzToolsFramework/API/EditorAssetSystemAPI.h>
|
||||
#include <AzToolsFramework/API/ToolsApplicationAPI.h>
|
||||
#include <AzToolsFramework/SourceControl/SourceControlAPI.h>
|
||||
|
||||
#include <AzQtComponents/Components/Widgets/CheckBox.h>
|
||||
|
||||
#include <Editor/Settings.h>
|
||||
#include <Editor/View/Windows/Tools/UpgradeTool/UpgradeTool.h>
|
||||
#include <Editor/View/Windows/Tools/UpgradeTool/ui_UpgradeTool.h>
|
||||
|
||||
#include <ScriptCanvas/Bus/EditorScriptCanvasBus.h>
|
||||
#include <ScriptCanvas/Components/EditorGraph.h>
|
||||
|
||||
#include "UpgradeHelper.h"
|
||||
|
||||
namespace ScriptCanvasEditor
|
||||
{
|
||||
UpgradeTool::UpgradeTool(QWidget* parent /*= nullptr*/)
|
||||
: AzQtComponents::StyledDialog(parent)
|
||||
, m_ui(new Ui::UpgradeTool())
|
||||
{
|
||||
m_ui->setupUi(this);
|
||||
|
||||
AzQtComponents::CheckBox::applyToggleSwitchStyle(m_ui->doNotAskCheckbox);
|
||||
AzQtComponents::CheckBox::applyToggleSwitchStyle(m_ui->makeBackupCheckbox);
|
||||
|
||||
m_ui->progressFrame->setVisible(false);
|
||||
|
||||
connect(m_ui->upgradeButton, &QPushButton::pressed, this, &UpgradeTool::OnUpgrade);
|
||||
connect(m_ui->notNowButton, &QPushButton::pressed, this, &UpgradeTool::OnNoThanks);
|
||||
|
||||
UpgradeNotifications::Bus::Handler::BusConnect();
|
||||
AZ::Debug::TraceMessageBus::Handler::BusConnect();
|
||||
|
||||
resize(700, 100);
|
||||
}
|
||||
|
||||
void UpgradeTool::OnNoThanks()
|
||||
{
|
||||
DisconnectBuses();
|
||||
|
||||
UpdateSettings();
|
||||
|
||||
reject();
|
||||
}
|
||||
|
||||
void UpgradeTool::UpdateSettings()
|
||||
{
|
||||
auto userSettings = AZ::UserSettings::CreateFind<EditorSettings::ScriptCanvasEditorSettings>(AZ_CRC("ScriptCanvasPreviewSettings", 0x1c5a2965), AZ::UserSettings::CT_LOCAL);
|
||||
if (userSettings)
|
||||
{
|
||||
userSettings->m_showUpgradeDialog = !m_ui->doNotAskCheckbox->isChecked();
|
||||
|
||||
AZ::UserSettingsOwnerRequestBus::Event(AZ::UserSettings::CT_LOCAL, &AZ::UserSettingsOwnerRequests::SaveSettings);
|
||||
}
|
||||
}
|
||||
|
||||
UpgradeTool::~UpgradeTool()
|
||||
{
|
||||
DisconnectBuses();
|
||||
}
|
||||
|
||||
void UpgradeTool::DisconnectBuses()
|
||||
{
|
||||
UpgradeNotifications::Bus::Handler::BusDisconnect();
|
||||
|
||||
AZ::SystemTickBus::Handler::BusDisconnect();
|
||||
AZ::Data::AssetBus::MultiHandler::BusDisconnect();
|
||||
AZ::Debug::TraceMessageBus::Handler::BusDisconnect();
|
||||
}
|
||||
|
||||
void UpgradeTool::closeEvent(QCloseEvent* event)
|
||||
{
|
||||
// m_keepEditorAlive.reset();
|
||||
|
||||
DisconnectBuses();
|
||||
|
||||
UpgradeNotifications::Bus::Broadcast(&UpgradeNotifications::OnUpgradeCancelled);
|
||||
|
||||
AzQtComponents::StyledDialog::closeEvent(event);
|
||||
}
|
||||
|
||||
bool UpgradeTool::HasBackup() const
|
||||
{
|
||||
return m_ui->makeBackupCheckbox->isChecked();
|
||||
}
|
||||
|
||||
void UpgradeTool::OnUpgrade()
|
||||
{
|
||||
setWindowFlag(Qt::WindowCloseButtonHint, false);
|
||||
|
||||
// m_keepEditorAlive = AZStd::make_unique<EditorKeepAlive>();
|
||||
|
||||
UpdateSettings();
|
||||
|
||||
UpgradeNotifications::Bus::Broadcast(&UpgradeNotifications::OnUpgradeStart);
|
||||
|
||||
m_assetsToUpgrade.clear();
|
||||
|
||||
IUpgradeRequests* upgradeRequests = AZ::Interface<IUpgradeRequests>::Get();
|
||||
m_assetsToUpgrade = upgradeRequests->GetAssetsToUpgrade();
|
||||
|
||||
AZ::SystemTickBus::Handler::BusConnect();
|
||||
|
||||
if (m_ui->makeBackupCheckbox->isChecked())
|
||||
{
|
||||
if (!DoBackup())
|
||||
{
|
||||
// There was a problem, ask if the user wants to keep going or abort
|
||||
QMessageBox mb(QMessageBox::Warning,
|
||||
QObject::tr("Backup Failed"),
|
||||
QObject::tr("Failed to backup your Script Canvas graphs, do you want to proceed with upgrade?"),
|
||||
QMessageBox::Yes | QMessageBox::No, this);
|
||||
|
||||
if (mb.exec() == QMessageBox::Yes)
|
||||
{
|
||||
DoUpgrade();
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DoUpgrade();
|
||||
}
|
||||
}
|
||||
|
||||
bool UpgradeTool::DoBackup()
|
||||
{
|
||||
if (!m_assetsToUpgrade.empty())
|
||||
{
|
||||
m_state = UpgradeState::Backup;
|
||||
|
||||
m_inProgressAsset = m_assetsToUpgrade.begin();
|
||||
|
||||
m_ui->progressFrame->setVisible(true);
|
||||
m_ui->progressBar->setRange(0, aznumeric_cast<int>(m_assetsToUpgrade.size()));
|
||||
|
||||
m_ui->spinner->SetIsBusy(true);
|
||||
m_ui->spinner->SetBusyIconSize(32);
|
||||
|
||||
m_ui->upgradeButton->setEnabled(false);
|
||||
m_ui->notNowButton->setEnabled(false);
|
||||
m_ui->doNotAskCheckbox->setEnabled(false);
|
||||
m_ui->makeBackupCheckbox->setEnabled(false);
|
||||
|
||||
// Make the folder for the backup
|
||||
|
||||
QDateTime theTime = QDateTime::currentDateTime();
|
||||
QString subFolder = theTime.toString("yyyy-MM-dd [HH.mm.ss]");
|
||||
|
||||
m_backupPath = AZStd::string::format("@devroot@/ScriptCanvas_BACKUP/%s", subFolder.toUtf8().data());
|
||||
char backupPathCStr[AZ_MAX_PATH_LEN] = { 0 };
|
||||
AZ::IO::FileIOBase::GetInstance()->ResolvePath(m_backupPath.c_str(), backupPathCStr, AZ_MAX_PATH_LEN);
|
||||
m_backupPath = backupPathCStr;
|
||||
|
||||
if (!AZ::IO::FileIOBase::GetInstance()->Exists(m_backupPath.c_str()))
|
||||
{
|
||||
if (AZ::IO::FileIOBase::GetInstance()->CreatePath(m_backupPath.c_str()) != AZ::IO::ResultCode::Success)
|
||||
{
|
||||
AZ_Error("Script Canvas", false, "Failed to create backup folder %s", m_backupPath.c_str());
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void UpgradeTool::BackupComplete()
|
||||
{
|
||||
m_currentAssetIndex = 0;
|
||||
m_ui->progressBar->setValue(0);
|
||||
|
||||
DoUpgrade();
|
||||
}
|
||||
|
||||
void UpgradeTool::DoUpgrade()
|
||||
{
|
||||
m_state = UpgradeState::Upgrade;
|
||||
|
||||
if (!m_assetsToUpgrade.empty())
|
||||
{
|
||||
m_ui->progressFrame->setVisible(true);
|
||||
m_ui->progressBar->setRange(0, aznumeric_cast<int>(m_assetsToUpgrade.size()));
|
||||
|
||||
m_ui->spinner->SetIsBusy(true);
|
||||
m_ui->spinner->SetBusyIconSize(32);
|
||||
|
||||
m_ui->upgradeButton->setEnabled(false);
|
||||
m_ui->notNowButton->setEnabled(false);
|
||||
m_ui->doNotAskCheckbox->setEnabled(false);
|
||||
m_ui->makeBackupCheckbox->setEnabled(false);
|
||||
|
||||
m_inProgressAsset = m_assetsToUpgrade.begin();
|
||||
}
|
||||
}
|
||||
|
||||
void UpgradeTool::OnAssetReady(AZ::Data::Asset<AZ::Data::AssetData> asset)
|
||||
{
|
||||
// Start asset upgrade job when current asset is unassigned only
|
||||
// If current asset is present, there is ongoing progress handling this asset already
|
||||
if (IsOnReadyAssetForCurrentProcess(asset.GetId()))
|
||||
{
|
||||
m_inProgress = true;
|
||||
m_currentAsset = asset;
|
||||
m_scriptCanvasEntity = AssetUpgradeJob(asset);
|
||||
if (!m_scriptCanvasEntity)
|
||||
{
|
||||
ResetUpgradeCurrentAsset();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void UpgradeTool::OnAssetError(AZ::Data::Asset<AZ::Data::AssetData> asset)
|
||||
{
|
||||
// Reset upgrade target when script canvas entity is unassigned only.
|
||||
// If script canvas entity is present, we should let the conversion progress finish itself.
|
||||
if (IsCurrentProcessFreeToAbort(asset.GetId()))
|
||||
{
|
||||
AZ_TracePrintf("Script Canvas", "Asset fails to get load: %s\n", asset.GetHint().c_str());
|
||||
ResetUpgradeCurrentAsset();
|
||||
}
|
||||
}
|
||||
|
||||
void UpgradeTool::OnAssetUnloaded(const AZ::Data::AssetId assetId, const AZ::Data::AssetType)
|
||||
{
|
||||
// Reset upgrade target when script canvas entity is unassigned only.
|
||||
// If script canvas entity is present, we should let the conversion progress finish itself.
|
||||
if (IsCurrentProcessFreeToAbort(assetId))
|
||||
{
|
||||
AZ_TracePrintf("Script Canvas", "Asset gets unloaded: %s\n", m_inProgressAsset->m_relativePath.c_str());
|
||||
ResetUpgradeCurrentAsset();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void UpgradeTool::OnGraphUpgradeComplete(AZ::Data::Asset<AZ::Data::AssetData>& asset, bool skipped /*=false*/)
|
||||
{
|
||||
if (!skipped)
|
||||
{
|
||||
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;
|
||||
bool tmpFilesaved = false;
|
||||
|
||||
// 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))
|
||||
{
|
||||
AZ::IO::FileIOStream fileStream(tmpFileName.c_str(), AZ::IO::OpenMode::ModeWrite | AZ::IO::OpenMode::ModeText);
|
||||
|
||||
if (fileStream.IsOpen())
|
||||
{
|
||||
if (asset.GetType() == azrtti_typeid<ScriptCanvasAsset>())
|
||||
{
|
||||
tmpFilesaved = AZ::Utils::SaveObjectToStream<ScriptCanvas::ScriptCanvasData>(fileStream, AZ::DataStream::ST_XML, &asset.GetAs<ScriptCanvasAsset>()->GetScriptCanvasData());
|
||||
}
|
||||
|
||||
fileStream.Close();
|
||||
}
|
||||
|
||||
using SCCommandBus = AzToolsFramework::SourceControlCommandBus;
|
||||
SCCommandBus::Broadcast(&SCCommandBus::Events::RequestEdit, fullPath.c_str(), true,
|
||||
[this, &asset, fullPath, tmpFileName, tmpFilesaved](bool /*success*/, const AzToolsFramework::SourceControlFileInfo& info)
|
||||
{
|
||||
if (!info.IsReadOnly())
|
||||
{
|
||||
if (tmpFilesaved)
|
||||
{
|
||||
PerformMove(asset, tmpFileName, fullPath);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (m_overwriteAll)
|
||||
{
|
||||
MakeWriteable(info);
|
||||
|
||||
if (tmpFilesaved)
|
||||
{
|
||||
PerformMove(asset, tmpFileName, fullPath);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int result = QMessageBox::No;
|
||||
if (!m_overwriteAll)
|
||||
{
|
||||
QMessageBox mb(QMessageBox::Warning,
|
||||
QObject::tr("Failed to Save Upgraded File"),
|
||||
QObject::tr("The upgraded file could not be saved because the file is read only.\nDo you want to make it writeable and overwrite it?"),
|
||||
QMessageBox::YesToAll | QMessageBox::Yes | QMessageBox::No, this);
|
||||
|
||||
result = mb.exec();
|
||||
if (result == QMessageBox::YesToAll)
|
||||
{
|
||||
m_overwriteAll = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (result == QMessageBox::Yes || m_overwriteAll)
|
||||
{
|
||||
MakeWriteable(info);
|
||||
|
||||
if (tmpFilesaved)
|
||||
{
|
||||
PerformMove(asset, tmpFileName, fullPath);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// We skipped the upgrade (it's up to date), just mark it complete
|
||||
AZ::SystemTickBus::QueueFunction([this, asset]() { UpgradeComplete(asset, true); });
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void UpgradeTool::MakeWriteable(const AzToolsFramework::SourceControlFileInfo& info)
|
||||
{
|
||||
AZ::IO::SystemFile::SetWritable(info.m_filePath.c_str(), true);
|
||||
}
|
||||
|
||||
void UpgradeTool::PerformMove(AZ::Data::Asset<AZ::Data::AssetData>& asset, const AZStd::string& source, const AZStd::string& target)
|
||||
{
|
||||
auto moveResult = AZ::IO::SmartMove(source.c_str(), target.c_str());
|
||||
if (moveResult.GetResultCode() == AZ::IO::ResultCode::Success)
|
||||
{
|
||||
// Bump the slice asset up in the asset processor's queue.
|
||||
AzFramework::AssetSystemRequestBus::Broadcast(&AzFramework::AssetSystem::AssetSystemRequests::EscalateAssetBySearchTerm, target.c_str());
|
||||
|
||||
AZ::SystemTickBus::QueueFunction([this, &asset]() { UpgradeComplete(asset); });
|
||||
}
|
||||
else
|
||||
{
|
||||
auto streamer = AZ::Interface<AZ::IO::IStreamer>::Get();
|
||||
AZ::IO::FileRequestPtr flushRequest = streamer->FlushCache(target.c_str());
|
||||
streamer->SetRequestCompleteCallback(flushRequest, [this, &asset, source, target]([[maybe_unused]] AZ::IO::FileRequestHandle request)
|
||||
{
|
||||
// Continue saving.
|
||||
AZ::SystemTickBus::QueueFunction([this, &asset, source, target]() { RetryMove(asset, source, target); });
|
||||
});
|
||||
streamer->QueueRequest(flushRequest);
|
||||
}
|
||||
}
|
||||
|
||||
bool UpgradeTool::IsOnReadyAssetForCurrentProcess(const AZ::Data::AssetId& assetId)
|
||||
{
|
||||
return !m_currentAsset && m_inProgressAsset != m_assetsToUpgrade.end() && m_inProgressAsset->m_assetId == assetId;
|
||||
}
|
||||
|
||||
bool UpgradeTool::IsCurrentProcessFreeToAbort(const AZ::Data::AssetId& assetId)
|
||||
{
|
||||
return !m_scriptCanvasEntity && m_inProgressAsset != m_assetsToUpgrade.end() && m_inProgressAsset->m_assetId == assetId;
|
||||
}
|
||||
|
||||
bool UpgradeTool::IsUpgradeCompleteForAllAssets()
|
||||
{
|
||||
return !m_inProgress && !m_currentAsset && !m_scriptCanvasEntity && m_inProgressAsset == m_assetsToUpgrade.end();
|
||||
}
|
||||
|
||||
bool UpgradeTool::IsUpgradeCompleteForCurrentAsset()
|
||||
{
|
||||
return !m_inProgress && !m_currentAsset && !m_scriptCanvasEntity && m_inProgressAsset != m_assetsToUpgrade.end();
|
||||
}
|
||||
|
||||
void UpgradeTool::ResetUpgradeCurrentAsset()
|
||||
{
|
||||
AZ::Data::AssetBus::MultiHandler::BusDisconnect(m_currentAsset.GetId());
|
||||
|
||||
if (m_scriptCanvasEntity)
|
||||
{
|
||||
m_scriptCanvasEntity->Deactivate();
|
||||
m_scriptCanvasEntity = nullptr;
|
||||
}
|
||||
|
||||
if (m_inProgressAsset != m_assetsToUpgrade.end())
|
||||
{
|
||||
m_inProgressAsset = m_assetsToUpgrade.erase(m_inProgressAsset);
|
||||
}
|
||||
|
||||
m_currentAsset.Release();
|
||||
m_currentAsset = {};
|
||||
m_inProgress = false;
|
||||
}
|
||||
|
||||
void UpgradeTool::OnSystemTick()
|
||||
{
|
||||
switch (m_state)
|
||||
{
|
||||
case UpgradeTool::UpgradeState::Upgrade:
|
||||
|
||||
if (IsUpgradeCompleteForCurrentAsset())
|
||||
{
|
||||
m_inProgress = true;
|
||||
AZ::Data::AssetInfo& assetToUpgrade = *m_inProgressAsset;
|
||||
|
||||
if (!AZ::Data::AssetBus::MultiHandler::BusIsConnectedId(assetToUpgrade.m_assetId))
|
||||
{
|
||||
AZ::Data::AssetBus::MultiHandler::BusConnect(assetToUpgrade.m_assetId);
|
||||
}
|
||||
|
||||
auto asset = AZ::Data::AssetManager::Instance().GetAsset(assetToUpgrade.m_assetId, assetToUpgrade.m_assetType, AZ::Data::AssetLoadBehavior::Default);
|
||||
asset.BlockUntilLoadComplete();
|
||||
|
||||
auto streamer = AZ::Interface<AZ::IO::IStreamer>::Get();
|
||||
AZ::IO::FileRequestPtr flushRequest = streamer->FlushCache(assetToUpgrade.m_relativePath);
|
||||
streamer->SetRequestCompleteCallback(flushRequest, []([[maybe_unused]] AZ::IO::FileRequestHandle request)
|
||||
{
|
||||
});
|
||||
streamer->QueueRequest(flushRequest);
|
||||
|
||||
if (asset.IsReady() || asset.GetStatus() == AZ::Data::AssetData::AssetStatus::ReadyPreNotify)
|
||||
{
|
||||
m_currentAsset = asset;
|
||||
m_scriptCanvasEntity = AssetUpgradeJob(asset);
|
||||
if (!m_scriptCanvasEntity)
|
||||
{
|
||||
ResetUpgradeCurrentAsset();
|
||||
}
|
||||
}
|
||||
|
||||
m_ui->spinner->SetText(QObject::tr("%1").arg(assetToUpgrade.m_relativePath.c_str()));
|
||||
}
|
||||
else if (IsUpgradeCompleteForAllAssets())
|
||||
{
|
||||
FinalizeUpgrade();
|
||||
}
|
||||
break;
|
||||
|
||||
case UpgradeTool::UpgradeState::Backup:
|
||||
|
||||
if (m_inProgressAsset != m_assetsToUpgrade.end())
|
||||
{
|
||||
AZ::Data::AssetInfo& assetToBackup = *m_inProgressAsset;
|
||||
|
||||
m_ui->spinner->SetText(QObject::tr("%1").arg(assetToBackup.m_relativePath.c_str()));
|
||||
|
||||
BackupAsset(assetToBackup);
|
||||
|
||||
m_ui->progressBar->setValue(aznumeric_cast<int>(++m_currentAssetIndex));
|
||||
}
|
||||
else
|
||||
{
|
||||
BackupComplete();
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
AZ::Data::AssetManager::Instance().DispatchEvents();
|
||||
AZ::SystemTickBus::ExecuteQueuedEvents();
|
||||
|
||||
}
|
||||
|
||||
void UpgradeTool::BackupAsset(const AZ::Data::AssetInfo& assetInfo)
|
||||
{
|
||||
|
||||
AZStd::string devRoot = "@devroot@";
|
||||
AZStd::string devAssets = "@devassets@";
|
||||
|
||||
char devRootCStr[AZ_MAX_PATH_LEN] = { 0 };
|
||||
AZ::IO::FileIOBase::GetInstance()->ResolvePath(devRoot.c_str(), devRootCStr, AZ_MAX_PATH_LEN);
|
||||
|
||||
char devAssetsCStr[AZ_MAX_PATH_LEN] = { 0 };
|
||||
AZ::IO::FileIOBase::GetInstance()->ResolvePath(devAssets.c_str(), devAssetsCStr, AZ_MAX_PATH_LEN);
|
||||
|
||||
AZStd::string relativePath = devAssetsCStr;
|
||||
AzFramework::StringFunc::Replace(relativePath, devRootCStr, "");
|
||||
if (relativePath.starts_with("/"))
|
||||
{
|
||||
relativePath = relativePath.substr(1, relativePath.size() - 1);
|
||||
}
|
||||
|
||||
AZStd::string sourceFilePath;
|
||||
|
||||
// Using this to get the watch folder
|
||||
AZStd::string watchFolder;
|
||||
AZ::Data::AssetInfo assetInfo2;
|
||||
bool sourceInfoFound{};
|
||||
AzToolsFramework::AssetSystemRequestBus::BroadcastResult(sourceInfoFound, &AzToolsFramework::AssetSystemRequestBus::Events::GetSourceInfoBySourcePath, assetInfo.m_relativePath.c_str(), assetInfo2, watchFolder);
|
||||
if (sourceInfoFound)
|
||||
{
|
||||
AZStd::string assetPath;
|
||||
AzFramework::StringFunc::Path::Join(watchFolder.c_str(), assetInfo.m_relativePath.c_str(), assetPath);
|
||||
|
||||
sourceFilePath = assetPath;
|
||||
}
|
||||
|
||||
devRoot = devRootCStr;
|
||||
AzFramework::StringFunc::Path::Normalize(devRoot);
|
||||
|
||||
relativePath = sourceFilePath;
|
||||
AzFramework::StringFunc::Replace(relativePath, devRoot.c_str(), "");
|
||||
if (relativePath.starts_with("/"))
|
||||
{
|
||||
relativePath = relativePath.substr(1, relativePath.size() - 1);
|
||||
}
|
||||
|
||||
AZStd::string targetFilePath;
|
||||
AzFramework::StringFunc::Path::Join(m_backupPath.c_str(), relativePath.c_str(), targetFilePath);
|
||||
|
||||
if (AZ::IO::FileIOBase::GetInstance()->Copy(sourceFilePath.c_str(), targetFilePath.c_str()) != AZ::IO::ResultCode::Error)
|
||||
{
|
||||
AZStd::string filename;
|
||||
AzFramework::StringFunc::Path::GetFileName(sourceFilePath.c_str(), filename);
|
||||
AZ_TracePrintf("Script Canvas", "Backup: %s -> %s\n", filename.c_str(), targetFilePath.c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
AZ_TracePrintf("Script Canvas", "(Error) Failed to create backup: %s -> %s\n", sourceFilePath.c_str(), targetFilePath.c_str());
|
||||
}
|
||||
|
||||
++m_inProgressAsset;
|
||||
}
|
||||
|
||||
void UpgradeTool::UpgradeComplete(const AZ::Data::Asset<AZ::Data::AssetData>& asset, bool skipped /*= false*/)
|
||||
{
|
||||
m_ui->progressBar->setValue(aznumeric_cast<int>(++m_currentAssetIndex));
|
||||
|
||||
ResetUpgradeCurrentAsset();
|
||||
|
||||
if (!skipped)
|
||||
{
|
||||
AZStd::string filename;
|
||||
AzFramework::StringFunc::Path::GetFileName(asset.GetHint().c_str(), filename);
|
||||
AZ_TracePrintf("Script Canvas", "%s -> Upgraded and Saved!\n", filename.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
void UpgradeTool::FinalizeUpgrade()
|
||||
{
|
||||
setWindowFlag(Qt::WindowCloseButtonHint, true);
|
||||
|
||||
AZ::SystemTickBus::Handler::BusDisconnect();
|
||||
|
||||
m_currentAsset = {};
|
||||
|
||||
SaveLog();
|
||||
|
||||
UpgradeNotifications::Bus::Broadcast(&UpgradeNotifications::OnUpgradeComplete);
|
||||
|
||||
AZ_TracePrintf("Script Canvas", "\nUpgrade Complete!\n");
|
||||
|
||||
DisconnectBuses();
|
||||
|
||||
accept();
|
||||
}
|
||||
|
||||
void UpgradeTool::SaveLog()
|
||||
{
|
||||
AZStd::string outputFileName = AZStd::string::format("@devroot@/ScriptCanvasUpgradeReport.html");
|
||||
|
||||
char resolvedBuffer[AZ_MAX_PATH_LEN] = { 0 };
|
||||
AZ::IO::FileIOBase::GetInstance()->ResolvePath(outputFileName.c_str(), resolvedBuffer, AZ_MAX_PATH_LEN);
|
||||
|
||||
AZStd::string endPath = resolvedBuffer;
|
||||
AZ::StringFunc::Path::Normalize(endPath);
|
||||
|
||||
AZ::IO::SystemFile outputFile;
|
||||
if (!outputFile.Open(endPath.c_str(),
|
||||
AZ::IO::SystemFile::SF_OPEN_CREATE | AZ::IO::SystemFile::SF_OPEN_WRITE_ONLY))
|
||||
{
|
||||
AZ_Error("Script Canvas", false, "Failed to open file for writing: %s", endPath.c_str());
|
||||
return;
|
||||
}
|
||||
|
||||
QDateTime theTime = QDateTime::currentDateTime();
|
||||
AZStd::string timeStamp = theTime.toString("yyyy-MM-dd [HH.mm.ss]").toUtf8().data();
|
||||
|
||||
AZStd::string header = "<html>\n<head>\n<style>\nbody {color:white; background:black;}\n .error { color:red;}\n .warning {color:darkorange;}\n</style>\n</head>\n<body>\n";
|
||||
header.append(AZStd::string::format("Log captured: %s<br>\n", timeStamp.c_str()).c_str());
|
||||
|
||||
outputFile.Write(header.c_str(), header.size());
|
||||
for (auto& log : m_logs)
|
||||
{
|
||||
AZStd::string logText = AZStd::string::format("%s<br>", log.c_str());
|
||||
AzFramework::StringFunc::Replace(logText, "\n", "<br>\n");
|
||||
outputFile.Write(logText.data(), logText.size());
|
||||
}
|
||||
AZStd::string footer = "\n</body>\n</html>";
|
||||
outputFile.Write(footer.c_str(), footer.size());
|
||||
|
||||
|
||||
|
||||
outputFile.Close();
|
||||
}
|
||||
|
||||
AZ::Entity* UpgradeTool::AssetUpgradeJob(AZ::Data::Asset<AZ::Data::AssetData>&)
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void UpgradeTool::RetryMove(AZ::Data::Asset<AZ::Data::AssetData>& asset, const AZStd::string& source, const AZStd::string& target)
|
||||
{
|
||||
auto moveResult = AZ::IO::SmartMove(source.c_str(), target.c_str());
|
||||
if (moveResult.GetResultCode() == AZ::IO::ResultCode::Success)
|
||||
{
|
||||
// Bump the slice asset up in the asset processor's queue.
|
||||
AzFramework::AssetSystemRequestBus::Broadcast(&AzFramework::AssetSystem::AssetSystemRequests::EscalateAssetBySearchTerm, target.c_str());
|
||||
|
||||
AZ::SystemTickBus::QueueFunction([this, &asset]() { UpgradeComplete(asset); });
|
||||
}
|
||||
else
|
||||
{
|
||||
auto streamer = AZ::Interface<AZ::IO::IStreamer>::Get();
|
||||
AZ::IO::FileRequestPtr flushRequest = streamer->FlushCache(target.c_str());
|
||||
streamer->SetRequestCompleteCallback(flushRequest, [this, &asset, source, target]([[maybe_unused]] AZ::IO::FileRequestHandle request)
|
||||
{
|
||||
// Continue saving.
|
||||
AZ::SystemTickBus::QueueFunction([this, &asset, source, target]() { RetryMove(asset, source, target); });
|
||||
});
|
||||
streamer->QueueRequest(flushRequest);
|
||||
|
||||
|
||||
//AZ::SystemTickBus::QueueFunction([this, &asset, source, target]() { RetryMove(asset, source, target); });
|
||||
}
|
||||
}
|
||||
|
||||
void UpgradeTool::CaptureLogFromTraceBus(const char* /*window*/, const char* message)
|
||||
{
|
||||
AZStd::string msg = message;
|
||||
if (msg.ends_with("\n"))
|
||||
{
|
||||
msg = msg.substr(0, msg.size() - 1);
|
||||
}
|
||||
|
||||
m_logs.push_back(msg);
|
||||
}
|
||||
|
||||
bool UpgradeTool::OnPreError(const char* window, const char* /*fileName*/, int /*line*/, const char* /*func*/, const char* message)
|
||||
{
|
||||
AZStd::string msg = AZStd::string::format("<span class='error'>(Error): %s</span><br>", message);
|
||||
CaptureLogFromTraceBus(window, msg.c_str());
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool UpgradeTool::OnPreWarning(const char* window, const char* /*fileName*/, int /*line*/, const char* /*func*/, const char* message)
|
||||
{
|
||||
AZStd::string msg = AZStd::string::format("<span class='warning'>(Warning): %s</span><br>", message);
|
||||
CaptureLogFromTraceBus(window, msg.c_str());
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool UpgradeTool::OnException(const char* message)
|
||||
{
|
||||
AZStd::string msg = AZStd::string::format("<span class='error'>(Exception): %s</span><br>", message);
|
||||
CaptureLogFromTraceBus("Script Canvas", msg.c_str());
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool UpgradeTool::OnPrintf(const char* window, const char* message)
|
||||
{
|
||||
CaptureLogFromTraceBus(window, message);
|
||||
return false;
|
||||
}
|
||||
|
||||
#include <Editor/View/Windows/Tools/UpgradeTool/moc_UpgradeTool.cpp>
|
||||
|
||||
}
|
||||
@@ -1,149 +0,0 @@
|
||||
/*
|
||||
* 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
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#if !defined(Q_MOC_RUN)
|
||||
#include <AzCore/PlatformDef.h>
|
||||
|
||||
AZ_PUSH_DISABLE_WARNING(4244 4251 4800, "-Wunknown-warning-option")
|
||||
#include <QProgressBar>
|
||||
AZ_POP_DISABLE_WARNING
|
||||
|
||||
#include <AzCore/Component/EntityId.h>
|
||||
#include <AzCore/Component/TickBus.h>
|
||||
|
||||
#include <AzToolsFramework/SourceControl/SourceControlAPI.h>
|
||||
|
||||
#include <AzQtComponents/Components/StyledDialog.h>
|
||||
|
||||
#include <ScriptCanvas/Bus/EditorScriptCanvasBus.h>
|
||||
|
||||
#include <ISystem.h>
|
||||
#include <IConsole.h>
|
||||
#include <AzCore/Debug/TraceMessageBus.h>
|
||||
#endif
|
||||
|
||||
class QPushButton;
|
||||
|
||||
namespace Ui
|
||||
{
|
||||
class UpgradeTool;
|
||||
}
|
||||
|
||||
namespace ScriptCanvasEditor
|
||||
{
|
||||
class KeepEditorAlive;
|
||||
|
||||
//! A tool that collects and upgrades all Script Canvas graphs in the asset catalog
|
||||
class UpgradeTool
|
||||
: public AzQtComponents::StyledDialog
|
||||
, private AZ::SystemTickBus::Handler
|
||||
, private AZ::Data::AssetBus::MultiHandler
|
||||
, private UpgradeNotifications::Bus::Handler
|
||||
, private AZ::Debug::TraceMessageBus::Handler
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
AZ_CLASS_ALLOCATOR(UpgradeTool, AZ::SystemAllocator, 0);
|
||||
|
||||
UpgradeTool(QWidget* parent = nullptr);
|
||||
~UpgradeTool();
|
||||
|
||||
size_t& UpgradedGraphCount() { return m_upgradedAssets; }
|
||||
size_t& SkippedGraphCount() { return m_skippedAssets; }
|
||||
|
||||
bool HasBackup() const;
|
||||
|
||||
private:
|
||||
|
||||
bool IsOnReadyAssetForCurrentProcess(const AZ::Data::AssetId& assetId);
|
||||
bool IsCurrentProcessFreeToAbort(const AZ::Data::AssetId& assetId);
|
||||
bool IsUpgradeCompleteForAllAssets();
|
||||
bool IsUpgradeCompleteForCurrentAsset();
|
||||
void ResetUpgradeCurrentAsset();
|
||||
|
||||
void OnUpgrade();
|
||||
void OnNoThanks();
|
||||
void UpdateSettings();
|
||||
|
||||
enum class UpgradeState
|
||||
{
|
||||
Inactive,
|
||||
Backup,
|
||||
Upgrade
|
||||
};
|
||||
UpgradeState m_state = UpgradeState::Inactive;
|
||||
|
||||
bool DoBackup();
|
||||
void BackupAsset(const AZ::Data::AssetInfo& assetInfo);
|
||||
void BackupComplete();
|
||||
|
||||
void DoUpgrade();
|
||||
void UpgradeComplete(const AZ::Data::Asset<AZ::Data::AssetData>&, bool skipped = false);
|
||||
|
||||
AZ::Entity* AssetUpgradeJob(AZ::Data::Asset<AZ::Data::AssetData>& asset);
|
||||
|
||||
// SystemTickBus::Handler
|
||||
void OnSystemTick() override;
|
||||
//
|
||||
|
||||
// AssetBus::Handler
|
||||
void OnAssetReady(AZ::Data::Asset<AZ::Data::AssetData> asset) override;
|
||||
void OnAssetError(AZ::Data::Asset<AZ::Data::AssetData> asset) override;
|
||||
void OnAssetUnloaded(const AZ::Data::AssetId assetId, const AZ::Data::AssetType assetType) override;
|
||||
//
|
||||
|
||||
// AZ::Debug::TranceMessageBus::Handler
|
||||
bool OnException(const char* /*message*/) override;
|
||||
bool OnPrintf(const char* /*window*/, const char* /*message*/) override;
|
||||
bool OnPreError(const char* /*window*/, const char* /*fileName*/, int /*line*/, const char* /*func*/, const char* /*message*/) override;
|
||||
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);
|
||||
|
||||
void OnGraphUpgradeComplete(AZ::Data::Asset<AZ::Data::AssetData>&, bool skipped = false) override;
|
||||
|
||||
void RetryMove(AZ::Data::Asset<AZ::Data::AssetData>& asset, const AZStd::string& source, const AZStd::string& target);
|
||||
|
||||
void SaveLog();
|
||||
|
||||
bool m_inProgress = false;
|
||||
size_t m_currentAssetIndex = 0;
|
||||
|
||||
size_t m_upgradedAssets = 0;
|
||||
size_t m_skippedAssets = 0;
|
||||
|
||||
IUpgradeRequests::AssetList m_assetsToUpgrade;
|
||||
IUpgradeRequests::AssetList::iterator m_inProgressAsset;
|
||||
|
||||
AZ::Data::Asset<AZ::Data::AssetData> m_currentAsset;
|
||||
|
||||
AZStd::unique_ptr<Ui::UpgradeTool> m_ui;
|
||||
AZStd::recursive_mutex m_mutex;
|
||||
|
||||
// AZStd::unique_ptr<EditorKeepAlive> m_keepEditorAlive;
|
||||
|
||||
AZStd::vector<AZStd::string> m_logs;
|
||||
|
||||
AZ::Entity* m_scriptCanvasEntity = nullptr;
|
||||
|
||||
AZStd::string m_backupPath;
|
||||
|
||||
void FinalizeUpgrade();
|
||||
void DisconnectBuses();
|
||||
|
||||
void closeEvent(QCloseEvent* event) override;
|
||||
|
||||
bool m_overwriteAll = false;
|
||||
void MakeWriteable(const AzToolsFramework::SourceControlFileInfo& info);
|
||||
void PerformMove(AZ::Data::Asset<AZ::Data::AssetData>& asset, const AZStd::string& source, const AZStd::string& target);
|
||||
};
|
||||
}
|
||||
@@ -1,260 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>UpgradeTool</class>
|
||||
<widget class="QWidget" name="UpgradeTool">
|
||||
<property name="windowModality">
|
||||
<enum>Qt::WindowModal</enum>
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>801</width>
|
||||
<height>328</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Script Canvas Upgrade</string>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||
<property name="spacing">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>5</number>
|
||||
</property>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string><html><head/><body><p>Script Canvas graphs are now compiled into Lua by the Asset Processor! In order to complete this upgrade, all graphs in your current project must be updated.</p><p>This upgrading is making changes to the underlying Script Canvas graph format. Depending on the number of scripts you've created this process could take a few minutes to complete. </p><p>This upgrade is required for any projects saved on 1.26 or earlier.</p><p>If you choose &quot;Not now&quot;, your project may not work correctly.</p></body></html></string>
|
||||
</property>
|
||||
<property name="scaledContents">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QFrame" name="frame_3">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>80</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<property name="spacing">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QFrame" name="progressFrame">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="autoFillBackground">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="styleSheet">
|
||||
<string notr="true">background-color: rgb(47, 47, 47);</string>
|
||||
</property>
|
||||
<property name="frameShape">
|
||||
<enum>QFrame::NoFrame</enum>
|
||||
</property>
|
||||
<property name="frameShadow">
|
||||
<enum>QFrame::Raised</enum>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="AzQtComponents::StyledBusyLabel" name="spinner" native="true">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>32</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="autoFillBackground">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QProgressBar" name="progressBar">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>24</number>
|
||||
</property>
|
||||
<property name="textVisible">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::MinimumExpanding</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_6">
|
||||
<item>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="6" column="0">
|
||||
<widget class="QCheckBox" name="makeBackupCheckbox">
|
||||
<property name="text">
|
||||
<string>Backup my source graphs</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0">
|
||||
<widget class="QCheckBox" name="doNotAskCheckbox">
|
||||
<property name="text">
|
||||
<string>Do not ask me again</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="1">
|
||||
<widget class="QPushButton" name="upgradeButton">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="layoutDirection">
|
||||
<enum>Qt::LeftToRight</enum>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Upgrade</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="2">
|
||||
<widget class="QPushButton" name="notNowButton">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="layoutDirection">
|
||||
<enum>Qt::LeftToRight</enum>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Not now</string>
|
||||
</property>
|
||||
<property name="autoDefault">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>AzQtComponents::StyledBusyLabel</class>
|
||||
<extends>QWidget</extends>
|
||||
<header location="global">AzQtComponents/Components/StyledBusyLabel.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
@@ -10,21 +10,17 @@
|
||||
|
||||
#if !defined(Q_MOC_RUN)
|
||||
#include <AzCore/PlatformDef.h>
|
||||
|
||||
AZ_PUSH_DISABLE_WARNING(4244 4251 4800, "-Wunknown-warning-option")
|
||||
#include <QProgressBar>
|
||||
AZ_POP_DISABLE_WARNING
|
||||
|
||||
#include <AzCore/Component/EntityId.h>
|
||||
#include <AzCore/Component/TickBus.h>
|
||||
#include <AzCore/Debug/TraceMessageBus.h>
|
||||
#include <AzQtComponents/Components/StyledDialog.h>
|
||||
|
||||
#include <IConsole.h>
|
||||
#include <ISystem.h>
|
||||
#include <ScriptCanvas/Bus/EditorScriptCanvasBus.h>
|
||||
#include <ScriptCanvas/Core/Core.h>
|
||||
|
||||
#include <ISystem.h>
|
||||
#include <IConsole.h>
|
||||
#include <AzCore/Debug/TraceMessageBus.h>
|
||||
#endif
|
||||
|
||||
class QPushButton;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,167 @@
|
||||
/*
|
||||
* 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
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#if !defined(Q_MOC_RUN)
|
||||
#include <AzCore/PlatformDef.h>
|
||||
|
||||
AZ_PUSH_DISABLE_WARNING(4244 4251 4800, "-Wunknown-warning-option")
|
||||
#include <QProgressBar>
|
||||
AZ_POP_DISABLE_WARNING
|
||||
|
||||
#include <AzCore/Component/EntityId.h>
|
||||
#include <AzCore/Component/TickBus.h>
|
||||
#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>
|
||||
#endif
|
||||
|
||||
class QPushButton;
|
||||
|
||||
namespace Ui
|
||||
{
|
||||
class VersionExplorerLog;
|
||||
}
|
||||
|
||||
namespace AzQtComponents
|
||||
{
|
||||
class StyledBusyLabel;
|
||||
}
|
||||
|
||||
namespace ScriptCanvasEditor
|
||||
{
|
||||
//! A tool that collects and upgrades all Script Canvas graphs in the asset catalog
|
||||
class VersionExplorerLog
|
||||
: public AzQtComponents::StyledDialog
|
||||
, private AZ::SystemTickBus::Handler
|
||||
, private UpgradeNotifications::Bus::Handler
|
||||
, private AZ::Debug::TraceMessageBus::Handler
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
AZ_CLASS_ALLOCATOR(VersionExplorerLog, AZ::SystemAllocator, 0);
|
||||
|
||||
explicit VersionExplorerLog(QWidget* parent = nullptr);
|
||||
~VersionExplorerLog();
|
||||
|
||||
private:
|
||||
|
||||
static constexpr int ColumnAsset = 0;
|
||||
static constexpr int ColumnAction = 1;
|
||||
static constexpr int ColumnBrowse = 2;
|
||||
static constexpr int ColumnStatus = 3;
|
||||
|
||||
void OnScan();
|
||||
void OnClose();
|
||||
|
||||
enum class ProcessState
|
||||
{
|
||||
Inactive,
|
||||
Backup,
|
||||
Scan,
|
||||
Upgrade,
|
||||
};
|
||||
ProcessState m_state = ProcessState::Inactive;
|
||||
|
||||
void DoScan();
|
||||
void ScanComplete(const AZ::Data::Asset<AZ::Data::AssetData>&);
|
||||
|
||||
void InspectAsset(AZ::Data::Asset<AZ::Data::AssetData>& asset, AZ::Data::AssetInfo& assetInfo);
|
||||
|
||||
void OnUpgradeAll();
|
||||
|
||||
// SystemTickBus::Handler
|
||||
void OnSystemTick() override;
|
||||
//
|
||||
|
||||
// AZ::Debug::TranceMessageBus::Handler
|
||||
bool OnException(const char* /*message*/) override;
|
||||
bool OnPrintf(const char* /*window*/, const char* /*message*/) override;
|
||||
bool OnPreError(const char* /*window*/, const char* /*fileName*/, int /*line*/, const char* /*func*/, const char* /*message*/) override;
|
||||
bool OnPreWarning(const char* /*window*/, const char* /*fileName*/, int /*line*/, const char* /*func*/, const char* /*message*/) override;
|
||||
//
|
||||
|
||||
bool CaptureLogFromTraceBus(const char* window, const char* message);
|
||||
|
||||
enum class OperationResult
|
||||
{
|
||||
Success,
|
||||
Failure,
|
||||
};
|
||||
|
||||
void GraphUpgradeComplete(const AZ::Data::Asset<AZ::Data::AssetData>, OperationResult result, AZStd::string_view message);
|
||||
|
||||
bool IsUpgrading() const;
|
||||
|
||||
bool m_inProgress = false;
|
||||
// scan fields
|
||||
size_t m_currentAssetRowIndex = 0;
|
||||
size_t m_inspectedAssets = 0;
|
||||
size_t m_failedAssets = 0;
|
||||
size_t m_discoveredAssets = 0;
|
||||
|
||||
IUpgradeRequests::AssetList m_assetsToInspect;
|
||||
IUpgradeRequests::AssetList::iterator m_inspectingAsset;
|
||||
using UpgradeAssets = AZStd::vector<AZ::Data::Asset<AZ::Data::AssetData>>;
|
||||
UpgradeAssets m_assetsToUpgrade;
|
||||
UpgradeAssets::iterator m_inProgressAsset;
|
||||
|
||||
AZ::Data::Asset<AZ::Data::AssetData> m_currentAsset;
|
||||
|
||||
AZStd::unique_ptr<Ui::VersionExplorerLog> 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;
|
||||
|
||||
AZStd::deque<AZStd::string> m_logs;
|
||||
|
||||
AZ::Entity* m_scriptCanvasEntity = nullptr;
|
||||
|
||||
bool m_isUpgradingSingleGraph = false;
|
||||
|
||||
void UpgradeSingle(QPushButton* item, AzQtComponents::StyledBusyLabel* spinner, AZ::Data::AssetInfo assetInfo);
|
||||
|
||||
void FlushLogs();
|
||||
|
||||
void FinalizeUpgrade();
|
||||
void FinalizeScan();
|
||||
|
||||
void BackupComplete();
|
||||
AZStd::string BackupGraph(const AZ::Data::Asset<AZ::Data::AssetData>&);
|
||||
void UpgradeGraph(const AZ::Data::Asset<AZ::Data::AssetData>&);
|
||||
|
||||
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, AZStd::string source, AZStd::string target, size_t remainingAttempts);
|
||||
|
||||
void Log(const char* format, ...);
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
#include <AzCore/EBus/EBus.h>
|
||||
|
||||
namespace ScriptCanvasEditor
|
||||
{
|
||||
class VersionExplorerNotificationsTraits : public AZ::EBusTraits
|
||||
{
|
||||
public:
|
||||
static const AZ::EBusAddressPolicy AddressPolicy = AZ::EBusHandlerPolicy::Multiple;
|
||||
using BusIdType = VersionExplorerNotificationsTraits*;
|
||||
};
|
||||
using VersionExplorerNotificationsBus = AZ:EBus<VersionExplorerNotificationsTraits>;
|
||||
|
||||
class VersionExplorerRequestsTraits : public AZ::EBusTraits
|
||||
{
|
||||
public:
|
||||
static const AZ::EBusHandlerPolicy = AZ::EBusHandlerPolicy::Single;
|
||||
};
|
||||
using VersionExplorerRequestsBus = AZ:EBus<VersionExplorerRequestsTraits>;
|
||||
}
|
||||
@@ -262,12 +262,17 @@ set(FILES
|
||||
Editor/View/Windows/Tools/UpgradeTool/UpgradeHelper.h
|
||||
Editor/View/Windows/Tools/UpgradeTool/UpgradeHelper.cpp
|
||||
Editor/View/Windows/Tools/UpgradeTool/UpgradeHelper.ui
|
||||
Editor/View/Windows/Tools/UpgradeTool/UpgradeTool.cpp
|
||||
Editor/View/Windows/Tools/UpgradeTool/UpgradeTool.h
|
||||
Editor/View/Windows/Tools/UpgradeTool/UpgradeTool.ui
|
||||
Editor/View/Windows/Tools/UpgradeTool/Scanner.h
|
||||
Editor/View/Windows/Tools/UpgradeTool/Scanner.cpp
|
||||
Editor/View/Windows/Tools/UpgradeTool/Modifier.h
|
||||
Editor/View/Windows/Tools/UpgradeTool/Modifier.cpp
|
||||
Editor/View/Windows/Tools/UpgradeTool/FileSaver.h
|
||||
Editor/View/Windows/Tools/UpgradeTool/FileSaver.cpp
|
||||
Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.h
|
||||
Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.cpp
|
||||
Editor/View/Windows/Tools/UpgradeTool/VersionExplorer.ui
|
||||
Editor/View/Windows/Tools/UpgradeTool/VersionExplorerLog.h
|
||||
Editor/View/Windows/Tools/UpgradeTool/VersionExplorerLog.cpp
|
||||
Editor/Framework/ScriptCanvasGraphUtilities.inl
|
||||
Editor/Framework/ScriptCanvasGraphUtilities.h
|
||||
Editor/Framework/ScriptCanvasTraceUtilities.h
|
||||
|
||||
Reference in New Issue
Block a user