From 799659118215fbbcc62d72e993ef961fdd8af850 Mon Sep 17 00:00:00 2001 From: Guthrie Adams Date: Fri, 11 Feb 2022 21:06:38 -0600 Subject: [PATCH] Removing thumbnail context from thumbnail system This work has been on hold for a while. Revisiting removal of thumbnail contexts now while debugging related lockups exiting tools from script. Thumbnail contexts are an unused layer of indirection that makes debugging the system more difficult. All systems were only referencing the default context. Signed-off-by: Guthrie Adams --- .../AssetBrowser/AssetBrowserComponent.cpp | 7 +- .../Thumbnails/ProductThumbnail.cpp | 4 +- .../Thumbnails/SourceThumbnail.cpp | 3 +- .../Views/AssetBrowserTreeView.cpp | 5 - .../AssetBrowser/Views/AssetBrowserTreeView.h | 1 - .../AssetBrowser/Views/EntryDelegate.cpp | 9 +- .../AssetBrowser/Views/EntryDelegate.h | 4 - .../AzToolsFramework/Thumbnails/Thumbnail.cpp | 16 ++- .../AzToolsFramework/Thumbnails/Thumbnail.h | 21 +-- .../Thumbnails/ThumbnailContext.cpp | 132 ----------------- .../Thumbnails/ThumbnailContext.h | 86 ----------- .../Thumbnails/ThumbnailWidget.cpp | 5 +- .../Thumbnails/ThumbnailWidget.h | 3 +- .../Thumbnails/ThumbnailerBus.h | 36 ++--- .../Thumbnails/ThumbnailerComponent.cpp | 133 +++++++++++++----- .../Thumbnails/ThumbnailerComponent.h | 59 +++++--- .../Thumbnails/ThumbnailerNullComponent.cpp | 25 ++-- .../Thumbnails/ThumbnailerNullComponent.h | 17 +-- .../UI/PropertyEditor/PropertyAssetCtrl.cpp | 3 +- .../PropertyEditor/ThumbnailPropertyCtrl.cpp | 6 +- .../UI/PropertyEditor/ThumbnailPropertyCtrl.h | 2 +- .../aztoolsframework_files.cmake | 2 - .../Tests/ThumbnailerTests.cpp | 79 ----------- .../Code/Source/Thumbnail/ImageThumbnail.cpp | 6 +- .../ImageThumbnailSystemComponent.cpp | 10 +- .../AssetGridDialog/AssetGridDialog.cpp | 5 +- .../EditorCommonFeaturesSystemComponent.cpp | 9 +- .../Source/SharedPreview/SharedPreviewer.cpp | 3 +- .../Source/SharedPreview/SharedThumbnail.cpp | 14 +- 29 files changed, 222 insertions(+), 483 deletions(-) delete mode 100644 Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailContext.cpp delete mode 100644 Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailContext.h diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserComponent.cpp index 172bd3a29c..a91102b85c 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/AssetBrowserComponent.cpp @@ -21,7 +21,6 @@ #include #include #include -#include #include #include #include @@ -71,9 +70,9 @@ namespace AzToolsFramework AssetBrowserInteractionNotificationBus::Handler::BusConnect(); using namespace Thumbnailer; - ThumbnailerRequestBus::Broadcast(&ThumbnailerRequests::RegisterThumbnailProvider, MAKE_TCACHE(FolderThumbnailCache), ThumbnailContext::DefaultContext); - ThumbnailerRequestBus::Broadcast(&ThumbnailerRequests::RegisterThumbnailProvider, MAKE_TCACHE(SourceThumbnailCache), ThumbnailContext::DefaultContext); - ThumbnailerRequestBus::Broadcast(&ThumbnailerRequests::RegisterThumbnailProvider, MAKE_TCACHE(ProductThumbnailCache), ThumbnailContext::DefaultContext); + ThumbnailerRequestBus::Broadcast(&ThumbnailerRequests::RegisterThumbnailProvider, MAKE_TCACHE(FolderThumbnailCache)); + ThumbnailerRequestBus::Broadcast(&ThumbnailerRequests::RegisterThumbnailProvider, MAKE_TCACHE(SourceThumbnailCache)); + ThumbnailerRequestBus::Broadcast(&ThumbnailerRequests::RegisterThumbnailProvider, MAKE_TCACHE(ProductThumbnailCache)); AzFramework::SocketConnection* socketConn = AzFramework::SocketConnection::GetInstance(); AZ_Assert(socketConn, "AzToolsFramework::AssetBrowser::AssetBrowserComponent requires a valid socket conection!"); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/ProductThumbnail.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/ProductThumbnail.cpp index 5dd0cf5170..bc7ad75957 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/ProductThumbnail.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/ProductThumbnail.cpp @@ -75,7 +75,9 @@ namespace AzToolsFramework bool foundIt = false; AZStd::string watchFolder; AZ::Data::AssetInfo assetInfo; - AzToolsFramework::AssetSystemRequestBus::BroadcastResult(foundIt, &AzToolsFramework::AssetSystemRequestBus::Events::GetSourceInfoBySourcePath, iconPath.toUtf8().constData(), assetInfo, watchFolder); + AssetSystemRequestBus::BroadcastResult( + foundIt, &AssetSystemRequestBus::Events::GetSourceInfoBySourcePath, iconPath.toUtf8().constData(), assetInfo, + watchFolder); if (foundIt) { diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/SourceThumbnail.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/SourceThumbnail.cpp index 4869e0d09f..d7eb83a0bb 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/SourceThumbnail.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Thumbnails/SourceThumbnail.cpp @@ -67,7 +67,8 @@ namespace AzToolsFramework bool foundIt = false; AZStd::string watchFolder; AZ::Data::AssetInfo assetInfo; - AssetSystemRequestBus::BroadcastResult(foundIt, &AssetSystemRequestBus::Events::GetSourceInfoBySourceUUID, sourceKey->GetSourceUuid(), assetInfo, watchFolder); + AssetSystemRequestBus::BroadcastResult( + foundIt, &AssetSystemRequestBus::Events::GetSourceInfoBySourceUUID, sourceKey->GetSourceUuid(), assetInfo, watchFolder); QString iconPathToUse; if (foundIt) diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/AssetBrowserTreeView.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/AssetBrowserTreeView.cpp index 93a153cc16..c976f01fde 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/AssetBrowserTreeView.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/AssetBrowserTreeView.cpp @@ -203,11 +203,6 @@ namespace AzToolsFramework return selectionModel()->selectedIndexes(); } - void AssetBrowserTreeView::SetThumbnailContext(const char* thumbnailContext) const - { - m_delegate->SetThumbnailContext(thumbnailContext); - } - void AssetBrowserTreeView::SetShowSourceControlIcons(bool showSourceControlsIcons) { m_delegate->SetShowSourceControlIcons(showSourceControlsIcons); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/AssetBrowserTreeView.h b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/AssetBrowserTreeView.h index cae50efe17..ea13c0d2a6 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/AssetBrowserTreeView.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/AssetBrowserTreeView.h @@ -73,7 +73,6 @@ namespace AzToolsFramework void OnAssetBrowserComponentReady() override; ////////////////////////////////////////////////////////////////////////// - void SetThumbnailContext(const char* context) const; void SetShowSourceControlIcons(bool showSourceControlsIcons); void UpdateAfterFilter(bool hasFilter, bool selectFirstValidEntry); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/EntryDelegate.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/EntryDelegate.cpp index 5eca1f457f..c4ce1012c1 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/EntryDelegate.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/EntryDelegate.cpp @@ -112,11 +112,6 @@ namespace AzToolsFramework } } - void EntryDelegate::SetThumbnailContext(const char* thumbnailContext) - { - m_thumbnailContext = thumbnailContext; - } - void EntryDelegate::SetShowSourceControlIcons(bool showSourceControl) { m_showSourceControl = showSourceControl; @@ -125,8 +120,8 @@ namespace AzToolsFramework int EntryDelegate::DrawThumbnail(QPainter* painter, const QPoint& point, const QSize& size, Thumbnailer::SharedThumbnailKey thumbnailKey) const { SharedThumbnail thumbnail; - ThumbnailerRequestsBus::BroadcastResult(thumbnail, &ThumbnailerRequests::GetThumbnail, thumbnailKey, m_thumbnailContext.c_str()); - AZ_Assert(thumbnail, "The shared numbernail was not available from the ThumbnailerRequestsBus."); + ThumbnailerRequestBus::BroadcastResult(thumbnail, &ThumbnailerRequests::GetThumbnail, thumbnailKey); + AZ_Assert(thumbnail, "The shared numbernail was not available from the ThumbnailerRequestBus."); AZ_Assert(painter, "A null QPainter was passed in to DrawThumbnail."); if (!painter || !thumbnail || thumbnail->GetState() == Thumbnail::State::Failed) { diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/EntryDelegate.h b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/EntryDelegate.h index 7c7d919f2d..be7f919462 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/EntryDelegate.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/AssetBrowser/Views/EntryDelegate.h @@ -11,7 +11,6 @@ #if !defined(Q_MOC_RUN) #include #include -#include AZ_PUSH_DISABLE_WARNING(4251 4800, "-Wunknown-warning-option") // 4251: class 'QScopedPointer' needs to have dll-interface to be used by clients of class 'QBrush' // 4800: 'uint': forcing value to bool 'true' or 'false' (performance warning) #include @@ -50,14 +49,11 @@ namespace AzToolsFramework QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const override; void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override; - //! Set location where thumbnails are located for this instance of asset browser - void SetThumbnailContext(const char* thumbnailContext); //! Set whether to show source control icons, this is still temporary mainly to support existing functionality of material browser void SetShowSourceControlIcons(bool showSourceControl); protected: int m_iconSize; - AZStd::string m_thumbnailContext = ThumbnailContext::DefaultContext; bool m_showSourceControl = false; //! Draw a thumbnail and return its width int DrawThumbnail(QPainter* painter, const QPoint& point, const QSize& size, Thumbnailer::SharedThumbnailKey thumbnailKey) const; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/Thumbnail.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/Thumbnail.cpp index 0762a07493..d6e39a5027 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/Thumbnail.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/Thumbnail.cpp @@ -23,7 +23,15 @@ namespace AzToolsFramework ////////////////////////////////////////////////////////////////////////// // ThumbnailKey ////////////////////////////////////////////////////////////////////////// - bool ThumbnailKey::IsReady() const { return m_ready; } + void ThumbnailKey::SetReady(bool ready) + { + m_ready = ready; + } + + bool ThumbnailKey::IsReady() const + { + return m_ready; + } bool ThumbnailKey::UpdateThumbnail() { @@ -75,10 +83,8 @@ namespace AzToolsFramework if (m_state == State::Unloaded) { m_state = State::Loading; - QThreadPool* threadPool; - ThumbnailContextRequestBus::BroadcastResult( - threadPool, - &ThumbnailContextRequestBus::Handler::GetThreadPool); + QThreadPool* threadPool = {}; + ThumbnailerRequestBus::BroadcastResult(threadPool, &ThumbnailerRequestBus::Handler::GetThreadPool); QFuture future = QtConcurrent::run(threadPool, [this](){ LoadThread(); }); m_watcher.setFuture(future); } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/Thumbnail.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/Thumbnail.h index d3351959db..e76e90cec8 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/Thumbnail.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/Thumbnail.h @@ -26,13 +26,11 @@ namespace AzToolsFramework //! ThumbnailKey is used to locate thumbnails in thumbnail cache /* ThumbnailKey contains any kind of identifiable information to retrieve thumbnails (e.g. assetId, assetType, filename, etc.) - To use thumbnail system, keep reference to your thumbnail key, and retrieve Thumbnail via ThumbnailerRequestsBus + To use thumbnail system, keep reference to your thumbnail key, and retrieve Thumbnail via ThumbnailerRequestBus */ class ThumbnailKey : public QObject { - friend class ThumbnailContext; - Q_OBJECT public: AZ_RTTI(ThumbnailKey, "{43F20F6B-333D-4226-8E4F-331A62315255}"); @@ -40,6 +38,8 @@ namespace AzToolsFramework ThumbnailKey() = default; virtual ~ThumbnailKey() = default; + void SetReady(bool ready); + bool IsReady() const; virtual bool UpdateThumbnail(); @@ -47,13 +47,13 @@ namespace AzToolsFramework virtual size_t GetHash() const; virtual bool Equals(const ThumbnailKey* other) const; + Q_SIGNALS: //! Updated signal is dispatched whenever thumbnail data was changed. Anyone using this thumbnail should listen to this. void ThumbnailUpdatedSignal() const; //! Force update mapped thumbnails void UpdateThumbnailSignal() const; - private: bool m_ready = false; }; @@ -114,11 +114,14 @@ namespace AzToolsFramework ThumbnailProvider() = default; virtual ~ThumbnailProvider() = default; virtual bool GetThumbnail(SharedThumbnailKey key, SharedThumbnail& thumbnail) = 0; - //! Priority identifies ThumbnailProvider order in ThumbnailContext - //! Higher priority means this ThumbnailProvider will take precedence in generating a thumbnail when - //! a supplied ThumbnailKey is supported by multiple providers. - virtual int GetPriority() const { return 0; } - //! A unique ThumbnailProvider name identifying it in a ThumbnailContext + //! Priority identifies ThumbnailProvider order + //! Higher priority means this ThumbnailProvider will take precedence in generating a thumbnail when a supplied ThumbnailKey is + //! supported by multiple providers. + virtual int GetPriority() const + { + return 0; + } + //! A unique ThumbnailProvider name identifyier virtual const char* GetProviderName() const = 0; }; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailContext.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailContext.cpp deleted file mode 100644 index cd2c673a24..0000000000 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailContext.cpp +++ /dev/null @@ -1,132 +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 -#include -#include -#include -#include - -AZ_PUSH_DISABLE_WARNING(4244 4251, "-Wunknown-warning-option") // 4251: 'QImageIOHandler::d_ptr': class 'QScopedPointer>' needs to have dll-interface to be used by clients of class 'QImageIOHandler' -#include -AZ_POP_DISABLE_WARNING - -namespace AzToolsFramework -{ - namespace Thumbnailer - { - ThumbnailContext::ThumbnailContext() - : m_missingThumbnail(new MissingThumbnail()) - , m_loadingThumbnail(new LoadingThumbnail()) - , m_threadPool(this) - { - ThumbnailContextRequestBus::Handler::BusConnect(); - } - - ThumbnailContext::~ThumbnailContext() - { - ThumbnailContextRequestBus::Handler::BusDisconnect(); - } - - bool ThumbnailContext::IsLoading(SharedThumbnailKey key) - { - SharedThumbnail thumbnail; - - for (auto& provider : m_providers) - { - if (provider->GetThumbnail(key, thumbnail)) - { - return thumbnail->GetState() == Thumbnail::State::Unloaded || - thumbnail->GetState() == Thumbnail::State::Loading; - } - } - return false; - } - - void ThumbnailContext::RedrawThumbnail() - { - AzToolsFramework::AssetBrowser::AssetBrowserViewRequestBus::Broadcast(&AzToolsFramework::AssetBrowser::AssetBrowserViewRequests::Update); - } - - QThreadPool* ThumbnailContext::GetThreadPool() - { - return &m_threadPool; - } - - SharedThumbnail ThumbnailContext::GetThumbnail(SharedThumbnailKey key) - { - SharedThumbnail thumbnail; - // find provider who can handle supplied key - for (auto& provider : m_providers) - { - if (provider->GetThumbnail(key, thumbnail)) - { - // if thumbnail is ready return it - if (thumbnail->GetState() == Thumbnail::State::Ready) - { - return thumbnail; - } - // if thumbnail is not loaded, start loading it, meanwhile return loading thumbnail - if (thumbnail->GetState() == Thumbnail::State::Unloaded) - { - // listen to the loading signal, so the anyone using it will update loading animation - connect(m_loadingThumbnail.data(), &Thumbnail::Updated, key.data(), &ThumbnailKey::ThumbnailUpdatedSignal); - AzQtComponents::StyledBusyLabel* busyLabel; - AzToolsFramework::AssetBrowser::AssetBrowserComponentRequestBus::BroadcastResult(busyLabel, &AzToolsFramework::AssetBrowser::AssetBrowserComponentRequests::GetStyledBusyLabel); - connect(busyLabel, &AzQtComponents::StyledBusyLabel::repaintNeeded, this, &ThumbnailContext::RedrawThumbnail); - // once the thumbnail is loaded, disconnect it from loading thumbnail - connect(thumbnail.data(), &Thumbnail::Updated, this , [this, key, thumbnail, busyLabel]() - { - disconnect(m_loadingThumbnail.data(), &Thumbnail::Updated, key.data(), &ThumbnailKey::ThumbnailUpdatedSignal); - disconnect(busyLabel, &AzQtComponents::StyledBusyLabel::repaintNeeded, this, &ThumbnailContext::RedrawThumbnail); - thumbnail->disconnect(); - connect(thumbnail.data(), &Thumbnail::Updated, key.data(), &ThumbnailKey::ThumbnailUpdatedSignal); - connect(key.data(), &ThumbnailKey::UpdateThumbnailSignal, thumbnail.data(), &Thumbnail::Update); - key->m_ready = true; - Q_EMIT key->ThumbnailUpdatedSignal(); - }); - thumbnail->Load(); - } - if (thumbnail->GetState() == Thumbnail::State::Failed) - { - return m_missingThumbnail; - } - return m_loadingThumbnail; - } - } - return m_missingThumbnail; - } - - void ThumbnailContext::RegisterThumbnailProvider(SharedThumbnailProvider providerToAdd) - { - auto it = AZStd::find_if(m_providers.begin(), m_providers.end(), [providerToAdd](const SharedThumbnailProvider& provider) - { - return AZ::StringFunc::Equal(provider->GetProviderName(), providerToAdd->GetProviderName()); - }); - - if (it != m_providers.end()) - { - AZ_Error("ThumbnailContext", false, "Provider with name %s is already registered with context.", providerToAdd->GetProviderName()); - return; - } - - m_providers.insert(providerToAdd); - } - - void ThumbnailContext::UnregisterThumbnailProvider(const char* providerName) - { - auto it = AZStd::remove_if(m_providers.begin(), m_providers.end(), [providerName](const SharedThumbnailProvider& provider) - { - return AZ::StringFunc::Equal(provider->GetProviderName(), providerName); - }); - m_providers.erase(it, m_providers.end()); - } - } // namespace Thumbnailer -} // namespace AzToolsFramework - -#include "Thumbnails/moc_ThumbnailContext.cpp" diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailContext.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailContext.h deleted file mode 100644 index 77d56b7831..0000000000 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailContext.h +++ /dev/null @@ -1,86 +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 -#include -#include -#include - -#include -#include -#include -#endif - -class QString; -class QPixmap; - -namespace AzToolsFramework -{ - namespace Thumbnailer - { - class ThumbnailProvider; - - //! ThumbnailContext provides distinct thumbnail location for specific context - /* - There can be any number of contexts for every unique feature that may need different types of thumbnails. - For example 'AssetBrowser' context provides thumbnails specific to Asset Browser - 'PreviewContext' may provide thumbnails for Preview Widget - 'MaterialBrowser' may provide thumbnails for Material Browser - etc. - */ - class ThumbnailContext - : public QObject - , public ThumbnailContextRequestBus::Handler - { - Q_OBJECT - public: - AZ_CLASS_ALLOCATOR(ThumbnailContext, AZ::SystemAllocator, 0); - - ThumbnailContext(); - ~ThumbnailContext() override; - - //! Is the thumbnail currently loading or is about to load. - bool IsLoading(SharedThumbnailKey key); - //! Retrieve thumbnail by key, generate one if needed - SharedThumbnail GetThumbnail(SharedThumbnailKey key); - //! Add new thumbnail cache - void RegisterThumbnailProvider(SharedThumbnailProvider providerToAdd); - //! Remove thumbnail cache by name if found - void UnregisterThumbnailProvider(const char* providerName); - - void RedrawThumbnail(); - - //! Default context used for most thumbnails - static constexpr const char* DefaultContext = "Default"; - - // ThumbnailContextRequestBus::Handler interface overrides... - QThreadPool* GetThreadPool() override; - - private: - struct ProviderCompare { - bool operator() (const SharedThumbnailProvider& lhs, const SharedThumbnailProvider& rhs) const - { - // sorting in reverse, higher priority means the provider should be considered first - return lhs->GetPriority() > rhs->GetPriority(); - } - }; - - //! Collection of thumbnail caches provided by this context - AZStd::multiset m_providers; - //! Default missing thumbnail used when no thumbnail for given key can be found within this context - SharedThumbnail m_missingThumbnail; - //! Default loading thumbnail used when thumbnail is found by is not yet generated - SharedThumbnail m_loadingThumbnail; - //! There is only a limited number of threads on global threadPool, because there can be many thumbnails rendering at once - //! an individual threadPool is needed to avoid deadlocks - QThreadPool m_threadPool; - }; - } // namespace Thumbnailer -} // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailWidget.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailWidget.cpp index 38bd854f17..e7c31fd1e1 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailWidget.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailWidget.cpp @@ -30,14 +30,13 @@ namespace AzToolsFramework { } - void ThumbnailWidget::SetThumbnailKey(SharedThumbnailKey key, const char* contextName) + void ThumbnailWidget::SetThumbnailKey(SharedThumbnailKey key) { if (m_key) { disconnect(m_key.data(), &ThumbnailKey::ThumbnailUpdatedSignal, this, &ThumbnailWidget::KeyUpdatedSlot); } m_key = key; - m_contextName = contextName; connect(m_key.data(), &ThumbnailKey::ThumbnailUpdatedSignal, this, &ThumbnailWidget::KeyUpdatedSlot); repaint(); } @@ -65,7 +64,7 @@ namespace AzToolsFramework { // thumbnail instance is not stored locally, but retrieved each paintEvent since thumbnail mapped to a specific key may change SharedThumbnail thumbnail; - ThumbnailerRequestsBus::BroadcastResult(thumbnail, &ThumbnailerRequests::GetThumbnail, m_key, m_contextName.c_str()); + ThumbnailerRequestBus::BroadcastResult(thumbnail, &ThumbnailerRequests::GetThumbnail, m_key); QPainter painter(this); // Scaling and centering pixmap within bounds to preserve aspect ratio diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailWidget.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailWidget.h index 6dab575af5..a916673702 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailWidget.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailWidget.h @@ -32,7 +32,7 @@ namespace AzToolsFramework ~ThumbnailWidget() override = default; //! Call this to set what thumbnail widget will display - void SetThumbnailKey(SharedThumbnailKey key, const char* contextName = "Default"); + void SetThumbnailKey(SharedThumbnailKey key); //! Remove current thumbnail void ClearThumbnail(); @@ -44,7 +44,6 @@ namespace AzToolsFramework private: SharedThumbnailKey m_key; - AZStd::string m_contextName; private Q_SLOTS: void KeyUpdatedSlot(); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailerBus.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailerBus.h index acd8ba3966..75aa21af2d 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailerBus.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailerBus.h @@ -19,48 +19,30 @@ namespace AzToolsFramework { namespace Thumbnailer { - //! Interaction with thumbnail context - class ThumbnailContextRequests - : public AZ::EBusTraits - { - public: - //! Get thread pool for drawing thumbnails - virtual QThreadPool* GetThreadPool() = 0; - }; - - using ThumbnailContextRequestBus = AZ::EBus; - //! Interaction with thumbnailer class ThumbnailerRequests : public AZ::EBusTraits { public: - //! Add thumbnail context - virtual void RegisterContext(const char* contextName) = 0; - - //! Remove thumbnail context and all associated ThumbnailProviders - virtual void UnregisterContext(const char* contextName) = 0; - - //! Return whether a given ThumbnailContext has been registered - virtual bool HasContext(const char* contextName) const = 0; - - //! Add new thumbnail provider to ThumbnailContext - virtual void RegisterThumbnailProvider(SharedThumbnailProvider provider, const char* contextName) = 0; + //! Add new thumbnail provider + virtual void RegisterThumbnailProvider(SharedThumbnailProvider provider) = 0; - //! Remove thumbnail provider from ThumbnailContext - virtual void UnregisterThumbnailProvider(const char* providerName, const char* contextName) = 0; + //! Remove thumbnail provider + virtual void UnregisterThumbnailProvider(const char* providerName) = 0; //! Retrieve thumbnail by key, //! if no thumbnail matching found, one of ThumbnailProviders will attempt to create //! If no compatible providers found, MissingThumbnail will be returned - virtual SharedThumbnail GetThumbnail(SharedThumbnailKey thumbnailKey, const char* contextName) = 0; + virtual SharedThumbnail GetThumbnail(SharedThumbnailKey thumbnailKey) = 0; //! Return whether the thumbnail is loading. - virtual bool IsLoading(SharedThumbnailKey thumbnailKey, const char* contextName) = 0; + virtual bool IsLoading(SharedThumbnailKey thumbnailKey) = 0; + + //! Get thread pool for drawing thumbnails + virtual QThreadPool* GetThreadPool() = 0; }; using ThumbnailerRequestBus = AZ::EBus; - using ThumbnailerRequestsBus = AZ::EBus; //deprecated //! Request product thumbnail to be rendered class ThumbnailerRendererRequests diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailerComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailerComponent.cpp index 170785b631..50504d3652 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailerComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailerComponent.cpp @@ -6,11 +6,14 @@ * */ -#include - #include +#include +#include +#include +#include +#include +#include #include -#include #include #include @@ -19,8 +22,10 @@ namespace AzToolsFramework { namespace Thumbnailer { - ThumbnailerComponent::ThumbnailerComponent() + : m_missingThumbnail(new MissingThumbnail()) + , m_loadingThumbnail(new LoadingThumbnail()) + , m_threadPool(this) { } @@ -28,14 +33,13 @@ namespace AzToolsFramework void ThumbnailerComponent::Activate() { - RegisterContext(ThumbnailContext::DefaultContext); - BusConnect(); + ThumbnailerRequestBus::Handler::BusConnect(); } void ThumbnailerComponent::Deactivate() { - BusDisconnect(); - m_thumbnails.clear(); + ThumbnailerRequestBus::Handler::BusDisconnect(); + m_providers.clear(); } void ThumbnailerComponent::Reflect(AZ::ReflectContext* context) @@ -49,59 +53,114 @@ namespace AzToolsFramework void ThumbnailerComponent::GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible) { - incompatible.push_back(AZ_CRC("ThumbnailerService", 0x65422b97)); + incompatible.push_back(AZ_CRC_CE("ThumbnailerService")); } void ThumbnailerComponent::GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided) { - provided.push_back(AZ_CRC("ThumbnailerService", 0x65422b97)); + provided.push_back(AZ_CRC_CE("ThumbnailerService")); } - void ThumbnailerComponent::RegisterContext(const char* contextName) + void ThumbnailerComponent::RegisterThumbnailProvider(SharedThumbnailProvider provider) { - AZ_Assert(m_thumbnails.find(contextName) == m_thumbnails.end(), "Context %s already registered", contextName); - m_thumbnails[contextName] = AZStd::make_shared(); - } + auto it = AZStd::find_if(m_providers.begin(), m_providers.end(), [provider](const SharedThumbnailProvider& existingProvider) + { + return AZ::StringFunc::Equal(provider->GetProviderName(), existingProvider->GetProviderName()); + }); - void ThumbnailerComponent::UnregisterContext(const char* contextName) - { - AZ_Assert(m_thumbnails.find(contextName) != m_thumbnails.end(), "Context %s not registered", contextName); - m_thumbnails.erase(contextName); + if (it != m_providers.end()) + { + AZ_Error("ThumbnailerComponent", false, "Provider with name %s is already registered with context.", provider->GetProviderName()); + return; + } + + m_providers.insert(provider); } - bool ThumbnailerComponent::HasContext(const char* contextName) const + void ThumbnailerComponent::UnregisterThumbnailProvider(const char* providerName) { - return m_thumbnails.find(contextName) != m_thumbnails.end(); + AZStd::erase_if( + m_providers, + [providerName](const SharedThumbnailProvider& provider) + { + return AZ::StringFunc::Equal(provider->GetProviderName(), providerName); + }); + } - void ThumbnailerComponent::RegisterThumbnailProvider(SharedThumbnailProvider provider, const char* contextName) + SharedThumbnail ThumbnailerComponent::GetThumbnail(SharedThumbnailKey key) { - auto it = m_thumbnails.find(contextName); - AZ_Assert(it != m_thumbnails.end(), "Context %s not registered", contextName); - it->second->RegisterThumbnailProvider(provider); + // find provider who can handle supplied key + for (auto& provider : m_providers) + { + SharedThumbnail thumbnail; + if (provider->GetThumbnail(key, thumbnail)) + { + // if thumbnail is ready return it + if (thumbnail->GetState() == Thumbnail::State::Ready) + { + return thumbnail; + } + + // if thumbnail is not loaded, start loading it, meanwhile return loading thumbnail + if (thumbnail->GetState() == Thumbnail::State::Unloaded) + { + // listen to the loading signal, so the anyone using it will update loading animation + AzQtComponents::StyledBusyLabel* busyLabel; + AssetBrowser::AssetBrowserComponentRequestBus::BroadcastResult(busyLabel, &AssetBrowser::AssetBrowserComponentRequests::GetStyledBusyLabel); + QObject::connect(m_loadingThumbnail.data(), &Thumbnail::Updated, key.data(), &ThumbnailKey::ThumbnailUpdatedSignal); + QObject::connect(busyLabel, &AzQtComponents::StyledBusyLabel::repaintNeeded, this, &ThumbnailerComponent::RedrawThumbnail); + + // once the thumbnail is loaded, disconnect it from loading thumbnail + QObject::connect(thumbnail.data(), &Thumbnail::Updated, this , [this, key, thumbnail, busyLabel]() + { + QObject::disconnect(m_loadingThumbnail.data(), &Thumbnail::Updated, key.data(), &ThumbnailKey::ThumbnailUpdatedSignal); + QObject::disconnect(busyLabel, &AzQtComponents::StyledBusyLabel::repaintNeeded, this, &ThumbnailerComponent::RedrawThumbnail); + + thumbnail->disconnect(); + QObject::connect(thumbnail.data(), &Thumbnail::Updated, key.data(), &ThumbnailKey::ThumbnailUpdatedSignal); + QObject::connect(key.data(), &ThumbnailKey::UpdateThumbnailSignal, thumbnail.data(), &Thumbnail::Update); + + key->SetReady(true); + Q_EMIT key->ThumbnailUpdatedSignal(); + }); + + thumbnail->Load(); + } + + if (thumbnail->GetState() == Thumbnail::State::Failed) + { + return m_missingThumbnail; + } + + return m_loadingThumbnail; + } + } + return m_missingThumbnail; } - void ThumbnailerComponent::UnregisterThumbnailProvider(const char* providerName, const char* contextName) + bool ThumbnailerComponent::IsLoading(SharedThumbnailKey key) { - auto it = m_thumbnails.find(contextName); - AZ_Assert(it != m_thumbnails.end(), "Context %s not registered", contextName); - it->second->UnregisterThumbnailProvider(providerName); + for (auto& provider : m_providers) + { + SharedThumbnail thumbnail; + if (provider->GetThumbnail(key, thumbnail)) + { + return thumbnail->GetState() == Thumbnail::State::Unloaded || thumbnail->GetState() == Thumbnail::State::Loading; + } + } + return false; } - SharedThumbnail ThumbnailerComponent::GetThumbnail(SharedThumbnailKey key, const char* contextName) + QThreadPool* ThumbnailerComponent::GetThreadPool() { - auto it = m_thumbnails.find(contextName); - AZ_Assert(it != m_thumbnails.end(), "Context %s not registered", contextName); - return it->second->GetThumbnail(key); + return &m_threadPool; } - bool ThumbnailerComponent::IsLoading(SharedThumbnailKey key, const char* contextName) + void ThumbnailerComponent::RedrawThumbnail() { - auto it = m_thumbnails.find(contextName); - AZ_Assert(it != m_thumbnails.end(), "Context %s not registered", contextName); - return it->second->IsLoading(key); + AssetBrowser::AssetBrowserViewRequestBus::Broadcast(&AssetBrowser::AssetBrowserViewRequests::Update); } - } // namespace Thumbnailer } // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailerComponent.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailerComponent.h index bd075e28da..33184fa748 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailerComponent.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailerComponent.h @@ -7,19 +7,29 @@ */ #pragma once -#include +#if !defined(Q_MOC_RUN) #include +#include +#include +#include #include +#include +#include +#include +#endif + +class QString; +class QPixmap; + namespace AzToolsFramework { namespace Thumbnailer { - class ThumbnailContext; - class ThumbnailerComponent : public AZ::Component - , public ThumbnailerRequestsBus::Handler + , public ThumbnailerRequestBus::Handler + , public QObject { public: AZ_COMPONENT(ThumbnailerComponent, "{80090CA5-6A3A-4554-B5FE-A6D74ECB2D84}") @@ -27,28 +37,41 @@ namespace AzToolsFramework ThumbnailerComponent(); virtual ~ThumbnailerComponent(); - ////////////////////////////////////////////////////////////////////////// - // AZ::Component - ////////////////////////////////////////////////////////////////////////// + // AZ::Component overrides... void Activate() override; void Deactivate() override; static void Reflect(AZ::ReflectContext* context); static void GetIncompatibleServices(AZ::ComponentDescriptor::DependencyArrayType& incompatible); static void GetProvidedServices(AZ::ComponentDescriptor::DependencyArrayType& provided); - ////////////////////////////////////////////////////////////////////////// - // ThumbnailerRequests - ////////////////////////////////////////////////////////////////////////// - void RegisterContext(const char* contextName) override; - void UnregisterContext(const char* contextName) override; - bool HasContext(const char* contextName) const override; - void RegisterThumbnailProvider(SharedThumbnailProvider provider, const char* contextName) override; - void UnregisterThumbnailProvider(const char* providerName, const char* contextName) override; - SharedThumbnail GetThumbnail(SharedThumbnailKey thumbnailKey, const char* contextName) override; - bool IsLoading(SharedThumbnailKey thumbnailKey, const char* contextName) override; + // ThumbnailerRequestBus::Handler interface overrides... + void RegisterThumbnailProvider(SharedThumbnailProvider provider) override; + void UnregisterThumbnailProvider(const char* providerName) override; + SharedThumbnail GetThumbnail(SharedThumbnailKey thumbnailKey) override; + bool IsLoading(SharedThumbnailKey thumbnailKey) override; + QThreadPool* GetThreadPool() override; + + void RedrawThumbnail(); private: - AZStd::unordered_map> m_thumbnails; + struct ProviderCompare + { + bool operator()(const SharedThumbnailProvider& lhs, const SharedThumbnailProvider& rhs) const + { + // sorting in reverse, higher priority means the provider should be considered first + return lhs->GetPriority() > rhs->GetPriority(); + } + }; + + //! Collection of thumbnail caches provided by this context + AZStd::multiset m_providers; + //! Default missing thumbnail used when no thumbnail for given key can be found within this context + SharedThumbnail m_missingThumbnail; + //! Default loading thumbnail used when thumbnail is found by is not yet generated + SharedThumbnail m_loadingThumbnail; + //! There is only a limited number of threads on global threadPool, because there can be many thumbnails rendering at once + //! an individual threadPool is needed to avoid deadlocks + QThreadPool m_threadPool; }; } // Thumbnailer } // namespace AssetBrowser diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailerNullComponent.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailerNullComponent.cpp index 2be634d379..e2d40030c3 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailerNullComponent.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailerNullComponent.cpp @@ -9,7 +9,6 @@ #include #include #include -#include #include namespace AzToolsFramework @@ -47,35 +46,27 @@ namespace AzToolsFramework services.push_back(AZ_CRC("ThumbnailerService", 0x65422b97)); } - void ThumbnailerNullComponent::RegisterContext(const char* /*contextName*/) + void ThumbnailerNullComponent::RegisterThumbnailProvider(AzToolsFramework::Thumbnailer::SharedThumbnailProvider /*provider*/) { } - void ThumbnailerNullComponent::UnregisterContext(const char* /*contextName*/) + void ThumbnailerNullComponent::UnregisterThumbnailProvider(const char* /*providerName*/) { } - bool ThumbnailerNullComponent::HasContext(const char* /*contextName*/) const - { - return false; - } - - void ThumbnailerNullComponent::RegisterThumbnailProvider(AzToolsFramework::Thumbnailer::SharedThumbnailProvider /*provider*/, const char* /*contextName*/) - { - } - - void ThumbnailerNullComponent::UnregisterThumbnailProvider(const char* /*providerName*/, const char* /*contextName*/) + AzToolsFramework::Thumbnailer::SharedThumbnail ThumbnailerNullComponent::GetThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey /*key*/) { + return m_nullThumbnail; } - AzToolsFramework::Thumbnailer::SharedThumbnail ThumbnailerNullComponent::GetThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey /*key*/, const char* /*contextName*/) + bool ThumbnailerNullComponent::IsLoading(AzToolsFramework::Thumbnailer::SharedThumbnailKey /*thumbnailKey*/) { - return m_nullThumbnail; + return false; } - bool ThumbnailerNullComponent::IsLoading(AzToolsFramework::Thumbnailer::SharedThumbnailKey /*thumbnailKey*/, const char* /*contextName*/) + QThreadPool* ThumbnailerNullComponent::GetThreadPool() { - return false; + return nullptr; } } // namespace Thumbnailer } // namespace AzToolsFramework diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailerNullComponent.h b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailerNullComponent.h index 41ae051b0d..5fec43ee7c 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailerNullComponent.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/Thumbnails/ThumbnailerNullComponent.h @@ -19,11 +19,9 @@ namespace AzToolsFramework { namespace Thumbnailer { - class ThumbnailContext; - class ThumbnailerNullComponent : public AZ::Component - , public AzToolsFramework::Thumbnailer::ThumbnailerRequestsBus::Handler + , public AzToolsFramework::Thumbnailer::ThumbnailerRequestBus::Handler { public: AZ_COMPONENT(ThumbnailerNullComponent, "{8009D651-3FAA-9815-B99E-AF174A3B29D4}") @@ -42,13 +40,12 @@ namespace AzToolsFramework ////////////////////////////////////////////////////////////////////////// // ThumbnailerRequests ////////////////////////////////////////////////////////////////////////// - void RegisterContext(const char* contextName) override; - void UnregisterContext(const char* contextName) override; - bool HasContext(const char* contextName) const override; - void RegisterThumbnailProvider(AzToolsFramework::Thumbnailer::SharedThumbnailProvider provider, const char* contextName) override; - void UnregisterThumbnailProvider(const char* providerName, const char* contextName) override; - AzToolsFramework::Thumbnailer::SharedThumbnail GetThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey thumbnailKey, const char* contextName) override; - bool IsLoading(AzToolsFramework::Thumbnailer::SharedThumbnailKey thumbnailKey, const char* contextName) override; + void RegisterThumbnailProvider(AzToolsFramework::Thumbnailer::SharedThumbnailProvider provider) override; + void UnregisterThumbnailProvider(const char* providerName) override; + AzToolsFramework::Thumbnailer::SharedThumbnail GetThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey thumbnailKey) override; + bool IsLoading(AzToolsFramework::Thumbnailer::SharedThumbnailKey thumbnailKey) override; + QThreadPool* GetThreadPool() override; + private: AzToolsFramework::Thumbnailer::SharedThumbnail m_nullThumbnail; }; diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.cpp index 5f7f487381..d57d16fd74 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/PropertyAssetCtrl.cpp @@ -52,7 +52,6 @@ AZ_POP_DISABLE_WARNING #include #include #include -#include #include #include @@ -1206,7 +1205,7 @@ namespace AzToolsFramework SharedThumbnailKey thumbnailKey = MAKE_TKEY(AzToolsFramework::AssetBrowser::ProductThumbnailKey, assetID); if (m_showThumbnail) { - m_thumbnail->SetThumbnailKey(thumbnailKey, Thumbnailer::ThumbnailContext::DefaultContext); + m_thumbnail->SetThumbnailKey(thumbnailKey); } return; } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.cpp b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.cpp index ec817f4ae1..683a7b8005 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.cpp +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.cpp @@ -65,11 +65,11 @@ namespace AzToolsFramework UpdateVisibility(); } - void ThumbnailPropertyCtrl::SetThumbnailKey(Thumbnailer::SharedThumbnailKey key, const char* contextName) + void ThumbnailPropertyCtrl::SetThumbnailKey(Thumbnailer::SharedThumbnailKey key) { m_key = key; - m_thumbnail->SetThumbnailKey(m_key, contextName); - m_thumbnailEnlarged->SetThumbnailKey(m_key, contextName); + m_thumbnail->SetThumbnailKey(m_key); + m_thumbnailEnlarged->SetThumbnailKey(m_key); UpdateVisibility(); } diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.h b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.h index ffd8234190..be317b8a92 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.h +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/UI/PropertyEditor/ThumbnailPropertyCtrl.h @@ -34,7 +34,7 @@ namespace AzToolsFramework explicit ThumbnailPropertyCtrl(QWidget* parent = nullptr); //! Call this to set what thumbnail widget will display - void SetThumbnailKey(Thumbnailer::SharedThumbnailKey key, const char* contextName = "Default"); + void SetThumbnailKey(Thumbnailer::SharedThumbnailKey key); //! Remove current thumbnail void ClearThumbnail(); diff --git a/Code/Framework/AzToolsFramework/AzToolsFramework/aztoolsframework_files.cmake b/Code/Framework/AzToolsFramework/AzToolsFramework/aztoolsframework_files.cmake index 53e9a97b1d..3947008ce7 100644 --- a/Code/Framework/AzToolsFramework/AzToolsFramework/aztoolsframework_files.cmake +++ b/Code/Framework/AzToolsFramework/AzToolsFramework/aztoolsframework_files.cmake @@ -86,8 +86,6 @@ set(FILES Thumbnails/Thumbnail.cpp Thumbnails/Thumbnail.h Thumbnails/Thumbnail.inl - Thumbnails/ThumbnailContext.cpp - Thumbnails/ThumbnailContext.h Thumbnails/ThumbnailerBus.h Thumbnails/ThumbnailWidget.cpp Thumbnails/ThumbnailWidget.h diff --git a/Code/Framework/AzToolsFramework/Tests/ThumbnailerTests.cpp b/Code/Framework/AzToolsFramework/Tests/ThumbnailerTests.cpp index 2a7b370684..c6e4defcc1 100644 --- a/Code/Framework/AzToolsFramework/Tests/ThumbnailerTests.cpp +++ b/Code/Framework/AzToolsFramework/Tests/ThumbnailerTests.cpp @@ -71,83 +71,4 @@ namespace UnitTest AZ::Entity* m_testEntity = nullptr; }; - - TEST_F(ThumbnailerTests, ThumbnailerComponent_RegisterUnregisterContext) - { - constexpr const char* contextName1 = "Context1"; - constexpr const char* contextName2 = "Context2"; - - auto checkHasContext = [](const char* contextName) - { - bool hasContext = false; - AzToolsFramework::Thumbnailer::ThumbnailerRequestBus::BroadcastResult(hasContext, &AzToolsFramework::Thumbnailer::ThumbnailerRequests::HasContext, contextName); - return hasContext; - }; - - EXPECT_FALSE(checkHasContext(contextName1)); - EXPECT_FALSE(checkHasContext(contextName2)); - - AzToolsFramework::Thumbnailer::ThumbnailerRequestBus::Broadcast(&AzToolsFramework::Thumbnailer::ThumbnailerRequests::RegisterContext, contextName1); - - EXPECT_TRUE(checkHasContext(contextName1)); - EXPECT_FALSE(checkHasContext(contextName2)); - - AzToolsFramework::Thumbnailer::ThumbnailerRequestBus::Broadcast(&AzToolsFramework::Thumbnailer::ThumbnailerRequests::RegisterContext, contextName2); - - EXPECT_TRUE(checkHasContext(contextName1)); - EXPECT_TRUE(checkHasContext(contextName2)); - - AzToolsFramework::Thumbnailer::ThumbnailerRequestBus::Broadcast(&AzToolsFramework::Thumbnailer::ThumbnailerRequests::UnregisterContext, contextName1); - - EXPECT_FALSE(checkHasContext(contextName1)); - EXPECT_TRUE(checkHasContext(contextName2)); - - AzToolsFramework::Thumbnailer::ThumbnailerRequestBus::Broadcast(&AzToolsFramework::Thumbnailer::ThumbnailerRequests::UnregisterContext, contextName2); - - EXPECT_FALSE(checkHasContext(contextName1)); - EXPECT_FALSE(checkHasContext(contextName2)); - } - - TEST_F(ThumbnailerTests, ThumbnailerComponent_Deactivate_ClearTumbnailContexts) - { - constexpr const char* contextName1 = "Context1"; - constexpr const char* contextName2 = "Context2"; - - auto checkHasContext = [](const char* contextName) - { - bool hasContext = false; - AzToolsFramework::Thumbnailer::ThumbnailerRequestBus::BroadcastResult(hasContext, &AzToolsFramework::Thumbnailer::ThumbnailerRequests::HasContext, contextName); - return hasContext; - }; - - AzToolsFramework::Thumbnailer::ThumbnailerRequestBus::Broadcast(&AzToolsFramework::Thumbnailer::ThumbnailerRequests::RegisterContext, contextName1); - AzToolsFramework::Thumbnailer::ThumbnailerRequestBus::Broadcast(&AzToolsFramework::Thumbnailer::ThumbnailerRequests::RegisterContext, contextName2); - - EXPECT_TRUE(checkHasContext(contextName1)); - EXPECT_TRUE(checkHasContext(contextName2)); - - m_testEntity->Deactivate(); - m_testEntity->Activate(); - - EXPECT_FALSE(checkHasContext(contextName1)); - EXPECT_FALSE(checkHasContext(contextName2)); - } - - TEST_F(ThumbnailerTests, ThumbnailerComponent_RegisterContextTwice_Assert) - { - constexpr const char* contextName1 = "Context1"; - - AzToolsFramework::Thumbnailer::ThumbnailerRequestBus::Broadcast(&AzToolsFramework::Thumbnailer::ThumbnailerRequests::RegisterContext, contextName1); - - AZ_TEST_START_TRACE_SUPPRESSION; - AzToolsFramework::Thumbnailer::ThumbnailerRequestBus::Broadcast(&AzToolsFramework::Thumbnailer::ThumbnailerRequests::RegisterContext, contextName1); - AZ_TEST_STOP_TRACE_SUPPRESSION(1); - } - - TEST_F(ThumbnailerTests, ThumbnailerComponent_UnregisterUnknownContext_Assert) - { - AZ_TEST_START_TRACE_SUPPRESSION; - AzToolsFramework::Thumbnailer::ThumbnailerRequestBus::Broadcast(&AzToolsFramework::Thumbnailer::ThumbnailerRequests::UnregisterContext, "ContextDoesNotExist"); - AZ_TEST_STOP_TRACE_SUPPRESSION(1); - } } // namespace UnitTest diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Thumbnail/ImageThumbnail.cpp b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Thumbnail/ImageThumbnail.cpp index cdd63dca18..44653db0a3 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Thumbnail/ImageThumbnail.cpp +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Thumbnail/ImageThumbnail.cpp @@ -59,10 +59,11 @@ namespace ImageProcessingAtom void ImageThumbnail::LoadThread() { + m_state = State::Loading; AzToolsFramework::Thumbnailer::ThumbnailerRendererRequestBus::Event( AZ::RPI::StreamingImageAsset::RTTI_Type(), &AzToolsFramework::Thumbnailer::ThumbnailerRendererRequests::RenderThumbnail, - m_key, - ImageThumbnailSize); + m_key, ImageThumbnailSize); + // wait for response from thumbnail renderer m_renderWait.acquire(); } @@ -70,6 +71,7 @@ namespace ImageProcessingAtom void ImageThumbnail::ThumbnailRendered(const QPixmap& thumbnailImage) { m_pixmap = thumbnailImage; + m_state = State::Ready; m_renderWait.release(); } diff --git a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Thumbnail/ImageThumbnailSystemComponent.cpp b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Thumbnail/ImageThumbnailSystemComponent.cpp index 5a41411d86..f3458196d0 100644 --- a/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Thumbnail/ImageThumbnailSystemComponent.cpp +++ b/Gems/Atom/Asset/ImageProcessingAtom/Code/Source/Thumbnail/ImageThumbnailSystemComponent.cpp @@ -17,7 +17,6 @@ #include #include #include -#include #include #include #include @@ -84,18 +83,15 @@ namespace ImageProcessingAtom { using namespace AzToolsFramework::Thumbnailer; - ThumbnailerRequestsBus::Broadcast( - &ThumbnailerRequests::RegisterThumbnailProvider, MAKE_TCACHE(Thumbnails::ImageThumbnailCache), - ThumbnailContext::DefaultContext); + ThumbnailerRequestBus::Broadcast(&ThumbnailerRequests::RegisterThumbnailProvider, MAKE_TCACHE(Thumbnails::ImageThumbnailCache)); } void ImageThumbnailSystemComponent::TeardownThumbnails() { using namespace AzToolsFramework::Thumbnailer; - ThumbnailerRequestsBus::Broadcast( - &ThumbnailerRequests::UnregisterThumbnailProvider, Thumbnails::ImageThumbnailCache::ProviderName, - ThumbnailContext::DefaultContext); + ThumbnailerRequestBus::Broadcast( + &ThumbnailerRequests::UnregisterThumbnailProvider, Thumbnails::ImageThumbnailCache::ProviderName); } void ImageThumbnailSystemComponent::OnApplicationAboutToStop() diff --git a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/AssetGridDialog/AssetGridDialog.cpp b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/AssetGridDialog/AssetGridDialog.cpp index ed19c4890d..806c5fddbc 100644 --- a/Gems/Atom/Tools/AtomToolsFramework/Code/Source/AssetGridDialog/AssetGridDialog.cpp +++ b/Gems/Atom/Tools/AtomToolsFramework/Code/Source/AssetGridDialog/AssetGridDialog.cpp @@ -13,7 +13,6 @@ #include #include #include -#include #include #include @@ -105,9 +104,7 @@ namespace AtomToolsFramework AzToolsFramework::Thumbnailer::ThumbnailWidget* thumbnail = new AzToolsFramework::Thumbnailer::ThumbnailWidget(itemWidget); thumbnail->setFixedSize(m_tileSize); - thumbnail->SetThumbnailKey( - MAKE_TKEY(AzToolsFramework::AssetBrowser::ProductThumbnailKey, selectableAsset.m_assetId), - AzToolsFramework::Thumbnailer::ThumbnailContext::DefaultContext); + thumbnail->SetThumbnailKey(MAKE_TKEY(AzToolsFramework::AssetBrowser::ProductThumbnailKey, selectableAsset.m_assetId)); thumbnail->updateGeometry(); itemWidget->layout()->addWidget(thumbnail); diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/EditorCommonFeaturesSystemComponent.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/EditorCommonFeaturesSystemComponent.cpp index 0250640d65..65efd83109 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/EditorCommonFeaturesSystemComponent.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/EditorCommonFeaturesSystemComponent.cpp @@ -14,7 +14,6 @@ #include #include #include -#include #include #include #include @@ -217,8 +216,8 @@ namespace AZ using namespace AzToolsFramework::Thumbnailer; using namespace LyIntegration; - ThumbnailerRequestsBus::Broadcast( - &ThumbnailerRequests::RegisterThumbnailProvider, MAKE_TCACHE(SharedThumbnailCache), ThumbnailContext::DefaultContext); + ThumbnailerRequestBus::Broadcast( + &ThumbnailerRequests::RegisterThumbnailProvider, MAKE_TCACHE(SharedThumbnailCache)); if (!m_thumbnailRenderer) { @@ -236,9 +235,7 @@ namespace AZ using namespace AzToolsFramework::Thumbnailer; using namespace LyIntegration; - ThumbnailerRequestsBus::Broadcast( - &ThumbnailerRequests::UnregisterThumbnailProvider, SharedThumbnailCache::ProviderName, - ThumbnailContext::DefaultContext); + ThumbnailerRequestBus::Broadcast(&ThumbnailerRequests::UnregisterThumbnailProvider, SharedThumbnailCache::ProviderName); m_thumbnailRenderer.reset(); m_previewerFactory.reset(); diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/SharedPreview/SharedPreviewer.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/SharedPreview/SharedPreviewer.cpp index 942af55721..0f96b2964d 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/SharedPreview/SharedPreviewer.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/SharedPreview/SharedPreviewer.cpp @@ -11,7 +11,6 @@ #include #include #include -#include #include #include @@ -51,7 +50,7 @@ namespace AZ using namespace AzToolsFramework::Thumbnailer; auto thumbnailKey = entry->GetThumbnailKey(); - m_ui->m_previewWidget->SetThumbnailKey(thumbnailKey, ThumbnailContext::DefaultContext); + m_ui->m_previewWidget->SetThumbnailKey(thumbnailKey); m_fileInfo = QString::fromUtf8(entry->GetName().c_str()); UpdateFileInfo(); } diff --git a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/SharedPreview/SharedThumbnail.cpp b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/SharedPreview/SharedThumbnail.cpp index d07c4577e8..82221afcc5 100644 --- a/Gems/AtomLyIntegration/CommonFeatures/Code/Source/SharedPreview/SharedThumbnail.cpp +++ b/Gems/AtomLyIntegration/CommonFeatures/Code/Source/SharedPreview/SharedThumbnail.cpp @@ -35,8 +35,15 @@ namespace AZ m_state = State::Failed; } + SharedThumbnail::~SharedThumbnail() + { + AzToolsFramework::Thumbnailer::ThumbnailerRendererNotificationBus::Handler::BusDisconnect(); + AzFramework::AssetCatalogEventBus::Handler::BusDisconnect(); + } + void SharedThumbnail::LoadThread() { + m_state = State::Loading; AzToolsFramework::Thumbnailer::ThumbnailerRendererRequestBus::QueueEvent( m_assetInfo.m_assetType, &AzToolsFramework::Thumbnailer::ThumbnailerRendererRequests::RenderThumbnail, m_key, SharedThumbnailSize); @@ -45,15 +52,10 @@ namespace AZ m_renderWait.acquire(); } - SharedThumbnail::~SharedThumbnail() - { - AzToolsFramework::Thumbnailer::ThumbnailerRendererNotificationBus::Handler::BusDisconnect(); - AzFramework::AssetCatalogEventBus::Handler::BusDisconnect(); - } - void SharedThumbnail::ThumbnailRendered(const QPixmap& thumbnailImage) { m_pixmap = thumbnailImage; + m_state = State::Ready; m_renderWait.release(); }