Don't block main thread to load data from file

Signed-off-by: John <jonawals@amazon.com>
monroegm-disable-blank-issue-2
Yuriy Toporovskyy 5 years ago committed by John
parent fd4f363fe2
commit 592a8cad6d

@ -51,6 +51,12 @@ namespace ImageProcessingAtom
ImagePreviewer::~ImagePreviewer()
{
AZ::SystemTickBus::Handler::BusDisconnect();
if (m_createDisplayTextureResult.isRunning())
{
m_createDisplayTextureResult.waitForFinished();
}
}
void ImagePreviewer::Clear() const
@ -215,7 +221,11 @@ namespace ImageProcessingAtom
m_fileinfo = QString::fromUtf8(product->GetName().c_str());
m_fileinfo += GetFileSize(product->GetRelativePath().c_str());
AZ::Data::Asset<AZ::RPI::StreamingImageAsset> imageAsset = Utils::LoadImageAsset(product->GetAssetId());
CreateAndDisplayTextureItemAsync(
[assetId = product->GetAssetId()]
() -> CreateDisplayTextureResult
{
AZ::Data::Asset<AZ::RPI::StreamingImageAsset> imageAsset = Utils::LoadImageAsset(assetId);
IImageObjectPtr image = Utils::LoadImageFromImageAsset(imageAsset);
if (image)
@ -224,11 +234,16 @@ namespace ImageProcessingAtom
AZStd::string productInfo;
GetImageInfoString(imageAsset, productInfo);
m_fileinfo += QStringLiteral("\r\n");
m_fileinfo += productInfo.c_str();
QString fileInfo = QStringLiteral("\r\n");
fileInfo += productInfo.c_str();
m_previewImageObject = ConvertImageForPreview(image);
return { ConvertImageForPreview(image), fileInfo };
}
else
{
return { nullptr, "" };
}
});
DisplayTextureItem();
}
@ -239,7 +254,11 @@ namespace ImageProcessingAtom
m_fileinfo = QString::fromUtf8(source->GetName().c_str());
m_fileinfo += GetFileSize(source->GetFullPath().c_str());
IImageObjectPtr image = IImageObjectPtr(LoadImageFromFile(source->GetFullPath()));
CreateAndDisplayTextureItemAsync(
[fullPath = source->GetFullPath()]
() -> CreateDisplayTextureResult
{
IImageObjectPtr image = IImageObjectPtr(LoadImageFromFile(fullPath));
if (image)
{
@ -247,11 +266,16 @@ namespace ImageProcessingAtom
AZStd::string sourceInfo;
GetImageInfoString(image, sourceInfo);
m_fileinfo += QStringLiteral("\r\n");
m_fileinfo += sourceInfo.c_str();
QString fileInfo = QStringLiteral("\r\n");
fileInfo += sourceInfo.c_str();
m_previewImageObject = ConvertImageForPreview(image);
return { ConvertImageForPreview(image), fileInfo };
}
else
{
return { nullptr, "" };
}
});
DisplayTextureItem();
}
@ -289,6 +313,27 @@ namespace ImageProcessingAtom
updateGeometry();
}
template<class CreateFn>
void ImagePreviewer::CreateAndDisplayTextureItemAsync(CreateFn create)
{
AZ::SystemTickBus::Handler::BusConnect();
m_createDisplayTextureResult = QtConcurrent::run(AZStd::move(create));
}
void ImagePreviewer::OnSystemTick()
{
if (m_createDisplayTextureResult.isFinished())
{
CreateDisplayTextureResult result = m_createDisplayTextureResult.result();
m_previewImageObject = AZStd::move(result.first);
m_fileinfo += result.second;
AZ::SystemTickBus::Handler::BusDisconnect();
DisplayTextureItem();
}
}
void ImagePreviewer::PreviewSubImage(uint32_t mip)
{
QImage previewImage = GetSubImagePreview(m_previewImageObject, mip);

@ -13,12 +13,15 @@
#if !defined(Q_MOC_RUN)
#include <AzCore/Memory/SystemAllocator.h>
#include <AzCore/Component/TickBus.h>
#include <AzToolsFramework/AssetBrowser/Previewer/Previewer.h>
#include <Atom/ImageProcessing/ImageObject.h>
#include <QWidget>
#include <QScopedPointer>
#include <QFuture>
#include <QtConcurrent/QtConcurrent>
#endif
namespace Ui
@ -42,6 +45,7 @@ namespace ImageProcessingAtom
{
class ImagePreviewer
: public AzToolsFramework::AssetBrowser::Previewer
, private AZ::SystemTickBus::Handler
{
Q_OBJECT
public:
@ -65,16 +69,27 @@ namespace ImageProcessingAtom
QString GetFileSize(const char* path);
void DisplayTextureItem();
template<class CreateFn>
void CreateAndDisplayTextureItemAsync(CreateFn create);
void PreviewSubImage(uint32_t mip);
// QLabel word wrap does not break long words such as filenames, so manual word wrap needed
static QString WordWrap(const QString& string, int maxLength);
// SystemTickBus
void OnSystemTick() override;
QScopedPointer<Ui::ImagePreviewerClass> m_ui;
QString m_fileinfo;
QString m_name = "ImagePreviewer";
// Decompressed image in preview. Cache it so we can preview its sub images
IImageObjectPtr m_previewImageObject;
// Properties for tracking the status of an asynchronous request to display an asset browser entry
using CreateDisplayTextureResult = AZStd::pair<IImageObjectPtr, QString>;
QFuture<CreateDisplayTextureResult> m_createDisplayTextureResult;
};
}//namespace ImageProcessingAtom

Loading…
Cancel
Save