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 <guthadam@amazon.com>
This commit is contained in:
+3
-4
@@ -21,7 +21,6 @@
|
||||
#include <AzToolsFramework/AssetBrowser/AssetEntryChangeset.h>
|
||||
#include <AzToolsFramework/AssetBrowser/Entries/AssetBrowserEntryCache.h>
|
||||
#include <AzToolsFramework/Thumbnails/ThumbnailerBus.h>
|
||||
#include <AzToolsFramework/Thumbnails/ThumbnailContext.h>
|
||||
#include <AzToolsFramework/AssetBrowser/Thumbnails/FolderThumbnail.h>
|
||||
#include <AzToolsFramework/AssetBrowser/Thumbnails/SourceThumbnail.h>
|
||||
#include <AzToolsFramework/AssetBrowser/Thumbnails/ProductThumbnail.h>
|
||||
@@ -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!");
|
||||
|
||||
+3
-1
@@ -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)
|
||||
{
|
||||
|
||||
+2
-1
@@ -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)
|
||||
|
||||
-5
@@ -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);
|
||||
|
||||
-1
@@ -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);
|
||||
|
||||
|
||||
+2
-7
@@ -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)
|
||||
{
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
#if !defined(Q_MOC_RUN)
|
||||
#include <AzCore/std/function/function_fwd.h>
|
||||
#include <AzToolsFramework/Thumbnails/Thumbnail.h>
|
||||
#include <AzToolsFramework/Thumbnails/ThumbnailContext.h>
|
||||
AZ_PUSH_DISABLE_WARNING(4251 4800, "-Wunknown-warning-option") // 4251: class 'QScopedPointer<QBrushData,QBrushDataPointerDeleter>' 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 <QStyledItemDelegate>
|
||||
@@ -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;
|
||||
|
||||
@@ -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<void> future = QtConcurrent::run(threadPool, [this](){ LoadThread(); });
|
||||
m_watcher.setFuture(future);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
@@ -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 <AzFramework/StringFunc/StringFunc.h>
|
||||
#include <AzToolsFramework/Thumbnails/ThumbnailContext.h>
|
||||
#include <AzToolsFramework/Thumbnails/MissingThumbnail.h>
|
||||
#include <AzToolsFramework/Thumbnails/LoadingThumbnail.h>
|
||||
#include <AzToolsFramework/AssetBrowser/AssetBrowserBus.h>
|
||||
|
||||
AZ_PUSH_DISABLE_WARNING(4244 4251, "-Wunknown-warning-option") // 4251: 'QImageIOHandler::d_ptr': class 'QScopedPointer<QImageIOHandlerPrivate,QScopedPointerDeleter<T>>' needs to have dll-interface to be used by clients of class 'QImageIOHandler'
|
||||
#include <AzQtComponents/Components/StyledBusyLabel.h>
|
||||
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"
|
||||
@@ -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 <AzCore/Memory/SystemAllocator.h>
|
||||
#include <AzCore/std/containers/set.h>
|
||||
#include <AzToolsFramework/Thumbnails/Thumbnail.h>
|
||||
#include <AzToolsFramework/Thumbnails/ThumbnailerBus.h>
|
||||
|
||||
#include <QObject>
|
||||
#include <QList>
|
||||
#include <QThreadPool>
|
||||
#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<SharedThumbnailProvider, ProviderCompare> 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
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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<ThumbnailContextRequests>;
|
||||
|
||||
//! Interaction with thumbnailer
|
||||
class ThumbnailerRequests
|
||||
: public AZ::EBusTraits
|
||||
{
|
||||
public:
|
||||
//! Add thumbnail context
|
||||
virtual void RegisterContext(const char* contextName) = 0;
|
||||
//! Add new thumbnail provider
|
||||
virtual void RegisterThumbnailProvider(SharedThumbnailProvider provider) = 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;
|
||||
|
||||
//! 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<ThumbnailerRequests>;
|
||||
using ThumbnailerRequestsBus = AZ::EBus<ThumbnailerRequests>; //deprecated
|
||||
|
||||
//! Request product thumbnail to be rendered
|
||||
class ThumbnailerRendererRequests
|
||||
|
||||
+97
-38
@@ -6,11 +6,14 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <AzCore/std/smart_ptr/make_shared.h>
|
||||
|
||||
#include <AzCore/Serialization/SerializeContext.h>
|
||||
#include <AzCore/std/smart_ptr/make_shared.h>
|
||||
#include <AzFramework/StringFunc/StringFunc.h>
|
||||
#include <AzQtComponents/Components/StyledBusyLabel.h>
|
||||
#include <AzToolsFramework/AssetBrowser/AssetBrowserBus.h>
|
||||
#include <AzToolsFramework/Thumbnails/LoadingThumbnail.h>
|
||||
#include <AzToolsFramework/Thumbnails/MissingThumbnail.h>
|
||||
#include <AzToolsFramework/Thumbnails/ThumbnailerComponent.h>
|
||||
#include <AzToolsFramework/Thumbnails/ThumbnailContext.h>
|
||||
|
||||
#include <QApplication>
|
||||
#include <QStyle>
|
||||
@@ -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<ThumbnailContext>();
|
||||
auto it = AZStd::find_if(m_providers.begin(), m_providers.end(), [provider](const SharedThumbnailProvider& existingProvider)
|
||||
{
|
||||
return AZ::StringFunc::Equal(provider->GetProviderName(), existingProvider->GetProviderName());
|
||||
});
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
void ThumbnailerComponent::UnregisterContext(const char* contextName)
|
||||
void ThumbnailerComponent::UnregisterThumbnailProvider(const char* providerName)
|
||||
{
|
||||
AZ_Assert(m_thumbnails.find(contextName) != m_thumbnails.end(), "Context %s not registered", contextName);
|
||||
m_thumbnails.erase(contextName);
|
||||
AZStd::erase_if(
|
||||
m_providers,
|
||||
[providerName](const SharedThumbnailProvider& provider)
|
||||
{
|
||||
return AZ::StringFunc::Equal(provider->GetProviderName(), providerName);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
bool ThumbnailerComponent::HasContext(const char* contextName) const
|
||||
SharedThumbnail ThumbnailerComponent::GetThumbnail(SharedThumbnailKey key)
|
||||
{
|
||||
return m_thumbnails.find(contextName) != m_thumbnails.end();
|
||||
// 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::RegisterThumbnailProvider(SharedThumbnailProvider provider, 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->RegisterThumbnailProvider(provider);
|
||||
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;
|
||||
}
|
||||
|
||||
void ThumbnailerComponent::UnregisterThumbnailProvider(const char* providerName, const char* contextName)
|
||||
QThreadPool* ThumbnailerComponent::GetThreadPool()
|
||||
{
|
||||
auto it = m_thumbnails.find(contextName);
|
||||
AZ_Assert(it != m_thumbnails.end(), "Context %s not registered", contextName);
|
||||
it->second->UnregisterThumbnailProvider(providerName);
|
||||
return &m_threadPool;
|
||||
}
|
||||
|
||||
SharedThumbnail ThumbnailerComponent::GetThumbnail(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->GetThumbnail(key);
|
||||
AssetBrowser::AssetBrowserViewRequestBus::Broadcast(&AssetBrowser::AssetBrowserViewRequests::Update);
|
||||
}
|
||||
|
||||
bool ThumbnailerComponent::IsLoading(SharedThumbnailKey key, const char* contextName)
|
||||
{
|
||||
auto it = m_thumbnails.find(contextName);
|
||||
AZ_Assert(it != m_thumbnails.end(), "Context %s not registered", contextName);
|
||||
return it->second->IsLoading(key);
|
||||
}
|
||||
|
||||
} // namespace Thumbnailer
|
||||
} // namespace AzToolsFramework
|
||||
|
||||
|
||||
+41
-18
@@ -7,19 +7,29 @@
|
||||
*/
|
||||
#pragma once
|
||||
|
||||
#include <AzCore/Memory/SystemAllocator.h>
|
||||
#if !defined(Q_MOC_RUN)
|
||||
#include <AzCore/Component/Component.h>
|
||||
#include <AzCore/Memory/SystemAllocator.h>
|
||||
#include <AzCore/std/containers/set.h>
|
||||
#include <AzToolsFramework/Thumbnails/Thumbnail.h>
|
||||
#include <AzToolsFramework/Thumbnails/ThumbnailerBus.h>
|
||||
|
||||
#include <QList>
|
||||
#include <QObject>
|
||||
#include <QThreadPool>
|
||||
#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<AZStd::string, AZStd::shared_ptr<ThumbnailContext>> 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<SharedThumbnailProvider, ProviderCompare> 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
|
||||
|
||||
+9
-18
@@ -9,7 +9,6 @@
|
||||
#include <AzCore/std/smart_ptr/make_shared.h>
|
||||
#include <AzCore/Serialization/SerializeContext.h>
|
||||
#include <AzToolsFramework/Thumbnails/ThumbnailerNullComponent.h>
|
||||
#include <AzToolsFramework/Thumbnails/ThumbnailContext.h>
|
||||
#include <AzToolsFramework/Thumbnails/MissingThumbnail.h>
|
||||
|
||||
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*/, const char* /*contextName*/)
|
||||
AzToolsFramework::Thumbnailer::SharedThumbnail ThumbnailerNullComponent::GetThumbnail(AzToolsFramework::Thumbnailer::SharedThumbnailKey /*key*/)
|
||||
{
|
||||
return m_nullThumbnail;
|
||||
}
|
||||
|
||||
bool ThumbnailerNullComponent::IsLoading(AzToolsFramework::Thumbnailer::SharedThumbnailKey /*thumbnailKey*/, const char* /*contextName*/)
|
||||
bool ThumbnailerNullComponent::IsLoading(AzToolsFramework::Thumbnailer::SharedThumbnailKey /*thumbnailKey*/)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
QThreadPool* ThumbnailerNullComponent::GetThreadPool()
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
} // namespace Thumbnailer
|
||||
} // namespace AzToolsFramework
|
||||
|
||||
+7
-10
@@ -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;
|
||||
};
|
||||
|
||||
+1
-2
@@ -52,7 +52,6 @@ AZ_POP_DISABLE_WARNING
|
||||
#include <AzToolsFramework/AssetBrowser/AssetBrowserBus.h>
|
||||
#include <AzToolsFramework/Thumbnails/ThumbnailWidget.h>
|
||||
#include <AzToolsFramework/Thumbnails/ThumbnailerBus.h>
|
||||
#include <AzToolsFramework/Thumbnails/ThumbnailContext.h>
|
||||
#include <AzToolsFramework/AssetBrowser/Thumbnails/ProductThumbnail.h>
|
||||
|
||||
#include <AzToolsFramework/AssetBrowser/AssetBrowserEntry.h>
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
+3
-3
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
+3
-7
@@ -17,7 +17,6 @@
|
||||
#include <AzToolsFramework/AssetBrowser/AssetBrowserEntry.h>
|
||||
#include <AzToolsFramework/AssetBrowser/Thumbnails/ProductThumbnail.h>
|
||||
#include <AzToolsFramework/AssetBrowser/Thumbnails/SourceThumbnail.h>
|
||||
#include <AzToolsFramework/Thumbnails/ThumbnailContext.h>
|
||||
#include <ImageLoader/ImageLoaders.h>
|
||||
#include <Processing/ImageConvert.h>
|
||||
#include <Processing/ImageToProcess.h>
|
||||
@@ -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()
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
#include <AzQtComponents/Components/Widgets/LineEdit.h>
|
||||
#include <AzQtComponents/Components/Widgets/Text.h>
|
||||
#include <AzToolsFramework/AssetBrowser/Thumbnails/ProductThumbnail.h>
|
||||
#include <AzToolsFramework/Thumbnails/ThumbnailContext.h>
|
||||
#include <AzToolsFramework/Thumbnails/ThumbnailWidget.h>
|
||||
#include <AzToolsFramework/Thumbnails/ThumbnailerBus.h>
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
+3
-6
@@ -14,7 +14,6 @@
|
||||
#include <AzFramework/API/ApplicationAPI.h>
|
||||
#include <AzToolsFramework/API/EditorCameraBus.h>
|
||||
#include <AzToolsFramework/API/ToolsApplicationAPI.h>
|
||||
#include <AzToolsFramework/Thumbnails/ThumbnailContext.h>
|
||||
#include <EditorCommonFeaturesSystemComponent.h>
|
||||
#include <SharedPreview/SharedThumbnail.h>
|
||||
#include <SkinnedMesh/SkinnedMeshDebugDisplay.h>
|
||||
@@ -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();
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
#include <AzToolsFramework/AssetBrowser/AssetBrowserBus.h>
|
||||
#include <AzToolsFramework/AssetBrowser/AssetBrowserEntry.h>
|
||||
#include <AzToolsFramework/Thumbnails/Thumbnail.h>
|
||||
#include <AzToolsFramework/Thumbnails/ThumbnailContext.h>
|
||||
#include <SharedPreview/SharedPreviewUtils.h>
|
||||
#include <SharedPreview/SharedPreviewer.h>
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user