diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Debug/TraceRecorder.h b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Debug/TraceRecorder.h index acc9d804bf..a4dba9229e 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Debug/TraceRecorder.h +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Include/AtomToolsFramework/Debug/TraceRecorder.h @@ -13,20 +13,24 @@ #pragma once #include +#include #include namespace AtomToolsFramework { // Records all TraceMessageBus activity to a string - class TraceRecorder - : private AZ::Debug::TraceMessageBus::Handler + class TraceRecorder : private AZ::Debug::TraceMessageBus::Handler { public: AZ_TYPE_INFO(AtomToolsFramework::TraceRecorder, "{7B49AFD0-D0AB-4CB7-A4B5-6D88D30DCBFD}"); - TraceRecorder(); + TraceRecorder(size_t maxMessageCount = std::numeric_limits::max()); ~TraceRecorder(); + //! Get the combined output of all messages + AZStd::string GetDump() const; + + private: ////////////////////////////////////////////////////////////////////////// // AZ::Debug::TraceMessageBus::Handler overrides... bool OnAssert(const char* /*message*/) override; @@ -36,6 +40,7 @@ namespace AtomToolsFramework bool OnPrintf(const char* /*window*/, const char* /*message*/) override; ////////////////////////////////////////////////////////////////////////// - AZStd::string m_messageSink; + size_t m_maxMessageCount = std::numeric_limits::max(); + AZStd::list m_messages; }; } // namespace AtomToolsFramework diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Debug/TraceRecorder.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Debug/TraceRecorder.cpp index 3b22c16dcc..e08dd3e48a 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Debug/TraceRecorder.cpp +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/Debug/TraceRecorder.cpp @@ -11,10 +11,12 @@ */ #include +#include namespace AtomToolsFramework { - TraceRecorder::TraceRecorder() + TraceRecorder::TraceRecorder(size_t maxMessageCount) + : m_maxMessageCount(maxMessageCount) { AZ::Debug::TraceMessageBus::Handler::BusConnect(); } @@ -24,42 +26,55 @@ namespace AtomToolsFramework AZ::Debug::TraceMessageBus::Handler::BusDisconnect(); } + AZStd::string TraceRecorder::GetDump() const + { + AZStd::string dump; + AZ::StringFunc::Join(dump, m_messages.begin(), m_messages.end(), "\n"); + return dump; + } + bool TraceRecorder::OnAssert(const char* message) { - m_messageSink += "Assert: "; - m_messageSink += message; - m_messageSink += "\n"; + if (m_messages.size() < m_maxMessageCount) + { + m_messages.push_back(AZStd::string::format("Assert: %s", message)); + } return false; } bool TraceRecorder::OnException(const char* message) { - m_messageSink += "Exception: "; - m_messageSink += message; - m_messageSink += "\n"; + if (m_messages.size() < m_maxMessageCount) + { + m_messages.push_back(AZStd::string::format("Exception: %s", message)); + } return false; } bool TraceRecorder::OnError(const char* /*window*/, const char* message) { - m_messageSink += "Error: "; - m_messageSink += message; - m_messageSink += "\n"; + if (m_messages.size() < m_maxMessageCount) + { + m_messages.push_back(AZStd::string::format("Error: %s", message)); + } return false; } bool TraceRecorder::OnWarning(const char* /*window*/, const char* message) { - m_messageSink += "Warning: "; - m_messageSink += message; - m_messageSink += "\n"; + if (m_messages.size() < m_maxMessageCount) + { + m_messages.push_back(AZStd::string::format("Warning: %s", message)); + } return false; } bool TraceRecorder::OnPrintf(const char* /*window*/, const char* message) { - m_messageSink += message; - m_messageSink += "\n"; + if (m_messages.size() < m_maxMessageCount) + { + m_messages.push_back(AZStd::string::format("%s", message)); + } return false; } diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocumentSystemComponent.cpp b/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocumentSystemComponent.cpp index 7faeca3f27..2fd1aac211 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocumentSystemComponent.cpp +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocumentSystemComponent.cpp @@ -209,7 +209,7 @@ namespace MaterialEditor QString("Would you like to reopen the document:\n%1?").arg(documentPath.c_str()), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { - AtomToolsFramework::TraceRecorder traceRecorder; + AtomToolsFramework::TraceRecorder traceRecorder(m_maxMessageBoxLineCount); bool openResult = false; MaterialDocumentRequestBus::EventResult(openResult, documentId, &MaterialDocumentRequestBus::Events::Open, documentPath); @@ -217,7 +217,7 @@ namespace MaterialEditor { QMessageBox::critical( QApplication::activeWindow(), QString("Material document could not be opened"), - QString("Failed to open: \n%1\n\n%2").arg(documentPath.c_str()).arg(traceRecorder.m_messageSink.c_str())); + QString("Failed to open: \n%1\n\n%2").arg(documentPath.c_str()).arg(traceRecorder.GetDump().c_str())); MaterialDocumentSystemRequestBus::Broadcast(&MaterialDocumentSystemRequestBus::Events::CloseDocument, documentId); } } @@ -233,7 +233,7 @@ namespace MaterialEditor QString("Would you like to update the document with these changes:\n%1?").arg(documentPath.c_str()), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) { - AtomToolsFramework::TraceRecorder traceRecorder; + AtomToolsFramework::TraceRecorder traceRecorder(m_maxMessageBoxLineCount); bool openResult = false; MaterialDocumentRequestBus::EventResult(openResult, documentId, &MaterialDocumentRequestBus::Events::Rebuild); @@ -241,7 +241,7 @@ namespace MaterialEditor { QMessageBox::critical( QApplication::activeWindow(), QString("Material document could not be opened"), - QString("Failed to open: \n%1\n\n%2").arg(documentPath.c_str()).arg(traceRecorder.m_messageSink.c_str())); + QString("Failed to open: \n%1\n\n%2").arg(documentPath.c_str()).arg(traceRecorder.GetDump().c_str())); MaterialDocumentSystemRequestBus::Broadcast(&MaterialDocumentSystemRequestBus::Events::CloseDocument, documentId); } } @@ -313,7 +313,7 @@ namespace MaterialEditor } } - AtomToolsFramework::TraceRecorder traceRecorder; + AtomToolsFramework::TraceRecorder traceRecorder(m_maxMessageBoxLineCount); bool closeResult = true; MaterialDocumentRequestBus::EventResult(closeResult, documentId, &MaterialDocumentRequestBus::Events::Close); @@ -321,7 +321,7 @@ namespace MaterialEditor { QMessageBox::critical( QApplication::activeWindow(), QString("Material document could not be closed"), - QString("Failed to close: \n%1\n\n%2").arg(documentPath.c_str()).arg(traceRecorder.m_messageSink.c_str())); + QString("Failed to close: \n%1\n\n%2").arg(documentPath.c_str()).arg(traceRecorder.GetDump().c_str())); return false; } @@ -379,7 +379,7 @@ namespace MaterialEditor return false; } - AtomToolsFramework::TraceRecorder traceRecorder; + AtomToolsFramework::TraceRecorder traceRecorder(m_maxMessageBoxLineCount); bool result = false; MaterialDocumentRequestBus::EventResult(result, documentId, &MaterialDocumentRequestBus::Events::Save); @@ -387,7 +387,7 @@ namespace MaterialEditor { QMessageBox::critical( QApplication::activeWindow(), QString("Material document could not be saved"), - QString("Failed to save: \n%1\n\n%2").arg(saveMaterialPath.c_str()).arg(traceRecorder.m_messageSink.c_str())); + QString("Failed to save: \n%1\n\n%2").arg(saveMaterialPath.c_str()).arg(traceRecorder.GetDump().c_str())); return false; } @@ -409,7 +409,7 @@ namespace MaterialEditor return false; } - AtomToolsFramework::TraceRecorder traceRecorder; + AtomToolsFramework::TraceRecorder traceRecorder(m_maxMessageBoxLineCount); bool result = false; MaterialDocumentRequestBus::EventResult(result, documentId, &MaterialDocumentRequestBus::Events::SaveAsCopy, saveMaterialPath); @@ -417,7 +417,7 @@ namespace MaterialEditor { QMessageBox::critical( QApplication::activeWindow(), QString("Material document could not be saved"), - QString("Failed to save: \n%1\n\n%2").arg(saveMaterialPath.c_str()).arg(traceRecorder.m_messageSink.c_str())); + QString("Failed to save: \n%1\n\n%2").arg(saveMaterialPath.c_str()).arg(traceRecorder.GetDump().c_str())); return false; } @@ -439,7 +439,7 @@ namespace MaterialEditor return false; } - AtomToolsFramework::TraceRecorder traceRecorder; + AtomToolsFramework::TraceRecorder traceRecorder(m_maxMessageBoxLineCount); bool result = false; MaterialDocumentRequestBus::EventResult(result, documentId, &MaterialDocumentRequestBus::Events::SaveAsChild, saveMaterialPath); @@ -447,7 +447,7 @@ namespace MaterialEditor { QMessageBox::critical( QApplication::activeWindow(), QString("Material document could not be saved"), - QString("Failed to save: \n%1\n\n%2").arg(saveMaterialPath.c_str()).arg(traceRecorder.m_messageSink.c_str())); + QString("Failed to save: \n%1\n\n%2").arg(saveMaterialPath.c_str()).arg(traceRecorder.GetDump().c_str())); return false; } @@ -497,7 +497,7 @@ namespace MaterialEditor } } - AtomToolsFramework::TraceRecorder traceRecorder; + AtomToolsFramework::TraceRecorder traceRecorder(m_maxMessageBoxLineCount); AZ::Uuid documentId = AZ::Uuid::CreateNull(); MaterialDocumentSystemRequestBus::BroadcastResult(documentId, &MaterialDocumentSystemRequestBus::Events::CreateDocument); @@ -505,11 +505,11 @@ namespace MaterialEditor { QMessageBox::critical( QApplication::activeWindow(), QString("Material document could not be created"), - QString("Failed to create: \n%1\n\n%2").arg(requestedPath.c_str()).arg(traceRecorder.m_messageSink.c_str())); + QString("Failed to create: \n%1\n\n%2").arg(requestedPath.c_str()).arg(traceRecorder.GetDump().c_str())); return AZ::Uuid::CreateNull(); } - traceRecorder.m_messageSink.clear(); + traceRecorder.GetDump().clear(); bool openResult = false; MaterialDocumentRequestBus::EventResult(openResult, documentId, &MaterialDocumentRequestBus::Events::Open, requestedPath); @@ -517,7 +517,7 @@ namespace MaterialEditor { QMessageBox::critical( QApplication::activeWindow(), QString("Material document could not be opened"), - QString("Failed to open: \n%1\n\n%2").arg(requestedPath.c_str()).arg(traceRecorder.m_messageSink.c_str())); + QString("Failed to open: \n%1\n\n%2").arg(requestedPath.c_str()).arg(traceRecorder.GetDump().c_str())); MaterialDocumentSystemRequestBus::Broadcast(&MaterialDocumentSystemRequestBus::Events::DestroyDocument, documentId); return AZ::Uuid::CreateNull(); } diff --git a/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocumentSystemComponent.h b/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocumentSystemComponent.h index 933a3351ba..b6c541421d 100644 --- a/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocumentSystemComponent.h +++ b/Gems/Atom/Tools/MaterialEditor/Code/Source/Document/MaterialDocumentSystemComponent.h @@ -98,5 +98,6 @@ namespace MaterialEditor AZStd::unordered_set m_documentIdsToRebuild; AZStd::unordered_set m_documentIdsToReopen; AZStd::unique_ptr m_settings; + const size_t m_maxMessageBoxLineCount = 15; }; }