From a5a42e3268dd3888327630615cf4c8f3cf82e3d8 Mon Sep 17 00:00:00 2001
From: carlitosan <82187351+carlitosan@users.noreply.github.com>
Date: Tue, 30 Nov 2021 14:05:31 -0800
Subject: [PATCH] Add dialog window for messaging when SC assets fail to save
Signed-off-by: carlitosan <82187351+carlitosan@users.noreply.github.com>
---
.../Code/Editor/View/Windows/MainWindow.cpp | 60 ++++++++++++++++++-
.../Code/Editor/View/Windows/MainWindow.h | 10 +++-
2 files changed, 67 insertions(+), 3 deletions(-)
diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp b/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp
index e61b015aae..778ad9d5b7 100644
--- a/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp
+++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.cpp
@@ -914,6 +914,12 @@ namespace ScriptCanvasEditor
void MainWindow::closeEvent(QCloseEvent* event)
{
+ if (m_forceCloseInProgress)
+ {
+ event->accept();
+ return;
+ }
+
// If we are in the middle of saving a graph. We don't want to close ourselves down and potentially retrigger the saving logic.
if (m_queueCloseRequest)
{
@@ -1981,6 +1987,7 @@ namespace ScriptCanvasEditor
EnableAssetView(memoryAsset);
+ ClearSaveAttempt();
UnblockCloseRequests();
}
@@ -1992,6 +1999,7 @@ namespace ScriptCanvasEditor
void MainWindow::SaveAsset(AZ::Data::AssetId assetId, const Callbacks::OnSave& onSave)
{
+ MarkSaveAttempt();
PrepareAssetForSave(assetId);
auto onSaveCallback = [this, onSave](bool saveSuccess, AZ::Data::AssetPtr asset, AZ::Data::AssetId previousAssetId)
@@ -2020,6 +2028,7 @@ namespace ScriptCanvasEditor
void MainWindow::SaveNewAsset(AZStd::string_view path, AZ::Data::AssetId inMemoryAssetId, const Callbacks::OnSave& onSave)
{
+ MarkSaveAttempt();
PrepareAssetForSave(inMemoryAssetId);
auto onSaveCallback = [this, onSave](bool saveSuccess, AZ::Data::AssetPtr asset, AZ::Data::AssetId previousAssetId)
@@ -4213,6 +4222,11 @@ namespace ScriptCanvasEditor
void MainWindow::OnSystemTick()
{
+ if (m_saveAttemptInProgress)
+ {
+ EvaluateSaveAttempt();
+ }
+
if (HasSystemTickAction(SystemTickActionFlag::RefreshPropertyGrid))
{
RemoveSystemTickAction(SystemTickActionFlag::RefreshPropertyGrid);
@@ -4246,13 +4260,56 @@ namespace ScriptCanvasEditor
RemoveSystemTickAction(SystemTickActionFlag::CloseNextTabAction);
CloseNextTab();
}
+ }
- if (m_systemTickActions == 0)
+ void MainWindow::ClearSaveAttempt()
+ {
+ m_saveAttemptInProgress = false;
+
+ if (!m_systemTickActions)
{
AZ::SystemTickBus::Handler::BusDisconnect();
}
}
+ bool MainWindow::EvaluateSaveAttempt()
+ {
+ const AZ::s64 k_saveAttemptSeconds = 20;
+
+ if (m_saveAttemptInProgress)
+ {
+ auto saveDuration = AZStd::chrono::seconds(AZStd::chrono::system_clock::now() - m_saveAttemptTime).count();
+
+ if (saveDuration > k_saveAttemptSeconds)
+ {
+ WarnOnFailedSaveAttempt();
+ }
+ }
+
+ return m_forceCloseInProgress;
+ }
+
+ void MainWindow::MarkSaveAttempt()
+ {
+ m_saveAttemptInProgress = true;
+ m_saveAttemptTime = AZStd::chrono::system_clock::now();
+
+ if (!AZ::SystemTickBus::Handler::BusIsConnected())
+ {
+ AZ::SystemTickBus::Handler::BusConnect();
+ }
+ }
+
+ void MainWindow::WarnOnFailedSaveAttempt()
+ {
+ m_forceCloseInProgress = true;
+ QMessageBox::critical(this, QString(), QObject::tr
+ ("The ScriptCanvas Editor has encountered an external bug which prevents it from tracking the file state.
"
+ "Likely the Asset Processor has crashed. ScriptCanvas files may have saved successfully, but the O3DE Engine and Asset Processor should be restarted before continuing work."));
+ AZ::SystemTickBus::Handler::BusDisconnect();
+ qobject_cast(parent())->close();
+ }
+
void MainWindow::OnCommandStarted(AZ::Crc32)
{
PushPreventUndoStateUpdate();
@@ -4486,7 +4543,6 @@ namespace ScriptCanvasEditor
{
AZ::SystemTickBus::Handler::BusConnect();
}
-
m_systemTickActions |= action;
}
diff --git a/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.h b/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.h
index 7672f0a199..d73da41219 100644
--- a/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.h
+++ b/Gems/ScriptCanvas/Code/Editor/View/Windows/MainWindow.h
@@ -51,7 +51,7 @@
#include
#include
-
+//#include
#include
#if SCRIPTCANVAS_EDITOR
@@ -798,5 +798,13 @@ namespace ScriptCanvasEditor
Workspace* m_workspace;
void OnSaveCallback(bool saveSuccess, AZ::Data::AssetPtr, AZ::Data::AssetId previousFileAssetId);
+
+ bool m_saveAttemptInProgress = false;
+ bool m_forceCloseInProgress = false;
+ AZStd::chrono::system_clock::time_point m_saveAttemptTime;
+ void ClearSaveAttempt();
+ bool EvaluateSaveAttempt();
+ void MarkSaveAttempt();
+ void WarnOnFailedSaveAttempt();
};
}