18struct ThumbnailRecord {
51 if (!node->
parent())
return;
54 bool shouldRegenerateThumbnail =
false;
59 ThumbnailRecord rec = *it;
64 shouldRegenerateThumbnail =
true;
67 shouldRegenerateThumbnail =
true;
70 if (shouldRegenerateThumbnail) {
73 addJobConcurrent(jobs, [node, timeout,
this] ()
mutable {
77 const int measuredTime = timer.elapsed();
80 measuredTime > timeout) {
81 warnUI <<
"WARNING: thumbnail generation for" << node->name() <<
"took longer than expected:" << measuredTime <<
"(timeout:" << timeout <<
")";
82 warnUI <<
" This layer's thumbnail will be rendered in imprecise mode from now on";
83 node->setPreferredThumbnailBoundsMode(KisThumbnailBoundsMode::Coarse);
110 QMap<KisNodeWSP, ThumbnailRecord>
cache;
141 if (
m_d->image &&
m_d->taskGuard.isValid()) {
142 m_d->taskGuard.trigger();
149 if (
m_d->image &&
m_d->taskGuard.isValid()) {
150 m_d->taskGuard.trigger();
164 if (
m_d->image &&
m_d->taskGuard.isValid()) {
165 m_d->taskGuard.trigger();
178 auto it =
m_d->cache.find(node);
179 if (it !=
m_d->cache.end()) {
182 if (it->maxSize >
m_d->maxSize) {
183 image = image.scaled(
m_d->maxSize,
m_d->maxSize, Qt::KeepAspectRatio);
186 image = QImage(1, 1, QImage::Format_ARGB32);
195 for (
auto it =
cache.begin(); it !=
cache.end();) {
197 it =
cache.erase(it);
207 m_d->cleanupDeletedNodes();
213 m_d->cleanupDeletedNodes();
215 if (
m_d->image &&
m_d->taskGuard.isValid()) {
216 m_d->taskGuard.trigger();
228 qWarning() <<
"KisLayerThumbnailCache::slotThumbnailGenerated: node does not belong to the attached image anymore!" <<
ppVar(node) <<
ppVar(
m_d->image);
236#include "KisLayerThumbnailCache.moc"
int layerThumbnailGenerationTimeout(bool defaultValue=false) const
void initStrokeCallback() override
TaskGuard addIdleTaskWithGuard(KisIdleTaskStrokeStrategyFactory factory)
Registers the factory for the idle task.
void setImage(KisImageSP image)
QImage thumbnail(KisNodeSP node) const
void notifyNodeAdded(KisNodeSP node)
void sigLayerThumbnailUpdated(KisNodeSP node)
~KisLayerThumbnailCache()
void setIdleTaskManagerImpl(KisIdleTasksManager *manager)
QScopedPointer< Private > m_d
void setIdleTaskManager(KisIdleTasksManager *manager)
void setMaxSize(int maxSize)
void slotThumbnailGenerated(KisNodeSP node, int seqNo, int maxSize, const QImage &thumb)
void notifyNodeRemoved(KisNodeSP node)
KisRunnableStrokeJobsInterface * runnableJobsInterface() const
virtual void addRunnableJobs(const QVector< KisRunnableStrokeJobDataBase * > &list)=0
KUndo2MagicString kundo2_i18n(const char *text)
void recursiveApplyNodes(NodePointer node, Functor func)
void addJobConcurrent(QVector< Job * > &jobs, Func func)
QImage createPreferredThumbnail(qint32 w, qint32 h, Qt::AspectRatioMode aspectRatioMode=Qt::IgnoreAspectRatio)
KisThumbnailBoundsMode preferredThumbnailBoundsMode() const
virtual int thumbnailSeqNo() const
virtual bool isFakeNode() const
KisIdleTasksManager::TaskGuard taskGuard
void cleanupDeletedNodes()
QMap< KisNodeWSP, ThumbnailRecord > cache
void initStrokeCallback() override
QMap< KisNodeWSP, ThumbnailRecord > m_cache
ThumbnailsStroke(KisImageSP image, int maxSize, const QMap< KisNodeWSP, ThumbnailRecord > &cache)
void sigThumbnailGenerated(KisNodeSP node, int maxSize, int seqNo, const QImage &thumb)