[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [digikam] app/album: Port album thumbnail loader to thumbnail changes
From: Marcel Wiesweg <marcel.wiesweg () gmx ! de>
Date: 2014-11-16 18:04:48
Message-ID: E1Xq4Bs-0007Vt-It () scm ! kde ! org
[Download RAW message or body]
Git commit 6097ab0c22af09cbdca9c9add94a27aa2b0a4b75 by Marcel Wiesweg.
Committed on 16/11/2014 at 15:41.
Pushed by mwiesweg into branch 'master'.
Port album thumbnail loader to thumbnail changes
M +41 -36 app/album/albumthumbnailloader.cpp
M +2 -2 app/album/albumthumbnailloader.h
http://commits.kde.org/digikam/6097ab0c22af09cbdca9c9add94a27aa2b0a4b75
diff --git a/app/album/albumthumbnailloader.cpp b/app/album/albumthumbnailloader.cpp
index 3260c09..d67c01a 100644
--- a/app/album/albumthumbnailloader.cpp
+++ b/app/album/albumthumbnailloader.cpp
@@ -46,6 +46,7 @@
#include "album.h"
#include "albummanager.h"
#include "applicationsettings.h"
+#include "imageinfo.h"
#include "metadatasettings.h"
#include "thumbnailloadthread.h"
#include "thumbnailsize.h"
@@ -53,8 +54,8 @@
namespace Digikam
{
-typedef QMap<QString, QList<int> > PathAlbumMap;
-typedef QMap<int, QPixmap> AlbumThumbnailMap;
+typedef QMap<qlonglong, QList<int> > IdAlbumMap;
+typedef QMap<int, QPixmap> AlbumThumbnailMap;
class AlbumThumbnailLoaderCreator
{
@@ -85,13 +86,25 @@ public:
ThumbnailLoadThread* iconTagThumbThread;
ThumbnailLoadThread* iconAlbumThumbThread;
- PathAlbumMap pathAlbumMap;
+ IdAlbumMap idAlbumMap;
AlbumThumbnailMap thumbnailMap;
QCache<QPair<QString, int>, QPixmap> iconCache;
};
+bool operator<(const ThumbnailIdentifier& a, const ThumbnailIdentifier& b)
+{
+ if (a.id || b.id)
+ {
+ return a.id < b.id;
+ }
+ else
+ {
+ return a.filePath < b.filePath;
+ }
+}
+
AlbumThumbnailLoader* AlbumThumbnailLoader::instance()
{
return &creator->object;
@@ -205,11 +218,9 @@ bool AlbumThumbnailLoader::getTagThumbnail(TAlbum* const album, QPixmap& icon)
{
if (!album->icon().isEmpty() && d->iconSize > d->minBlendSize)
{
- if (album->icon().startsWith('/'))
+ if (album->iconId())
{
- KUrl iconKURL;
- iconKURL.setPath(album->icon());
- addUrl(album, iconKURL);
+ addUrl(album, album->iconId());
icon = QPixmap();
return true;
}
@@ -238,11 +249,9 @@ QPixmap AlbumThumbnailLoader::getTagThumbnailDirectly(TAlbum* const album)
return *it;
}
- if (album->icon().startsWith('/'))
+ if (album->iconId())
{
- KUrl iconKURL;
- iconKURL.setPath(album->icon());
- addUrl(album, iconKURL);
+ addUrl(album, album->iconId());
}
else
{
@@ -256,9 +265,9 @@ QPixmap AlbumThumbnailLoader::getTagThumbnailDirectly(TAlbum* const album)
bool AlbumThumbnailLoader::getAlbumThumbnail(PAlbum* const album)
{
- if (!album->icon().isEmpty() && d->iconSize > d->minBlendSize)
+ if (album->iconId() && d->iconSize > d->minBlendSize)
{
- addUrl(album, album->iconKURL());
+ addUrl(album, album->iconId());
}
else
{
@@ -270,7 +279,7 @@ bool AlbumThumbnailLoader::getAlbumThumbnail(PAlbum* const album)
QPixmap AlbumThumbnailLoader::getAlbumThumbnailDirectly(PAlbum* const album)
{
- if (!album->icon().isEmpty() && d->iconSize > d->minBlendSize)
+ if (album->iconId() && d->iconSize > d->minBlendSize)
{
// icon cached?
AlbumThumbnailMap::const_iterator it = d->thumbnailMap.constFind(album->globalID());
@@ -281,21 +290,14 @@ QPixmap AlbumThumbnailLoader::getAlbumThumbnailDirectly(PAlbum* const album)
}
// schedule for loading
- addUrl(album, album->iconKURL());
+ addUrl(album, album->iconId());
}
return getStandardAlbumIcon(album);
}
-void AlbumThumbnailLoader::addUrl(Album* const album, const KUrl& url)
+void AlbumThumbnailLoader::addUrl(Album* const album, qlonglong id)
{
-/*
- QPixmap* const pix = d->cache->find(album->iconKURL().toLocalFile());
-
- if (pix)
- return pix;
-*/
-
// First check cached thumbnails.
// We use a private cache which is actually a map to be sure to cache _all_ album thumbnails.
// At startup, this is not relevant, as the views will add their requests in a row.
@@ -312,11 +314,11 @@ void AlbumThumbnailLoader::addUrl(Album* const album, const KUrl& url)
}
// Check if the URL has already been added
- PathAlbumMap::iterator it = d->pathAlbumMap.find(url.toLocalFile());
+ IdAlbumMap::iterator it = d->idAlbumMap.find(id);
- if (it == d->pathAlbumMap.end())
+ if (it == d->idAlbumMap.end())
{
- // use two IOslaves so that tag and album thumbnails are loaded
+ // use two threads so that tag and album thumbnails are loaded
// in parallel and not first album, then tag thumbnails
if (album->type() == Album::TAG)
{
@@ -333,7 +335,7 @@ void AlbumThumbnailLoader::addUrl(Album* const album, const KUrl& url)
}
// use the asynchronous version - with queued connections, see above
- d->iconTagThumbThread->find(url.toLocalFile());
+ d->iconTagThumbThread->find(ImageInfo::thumbnailIdentifier(id));
}
else
{
@@ -349,11 +351,11 @@ void AlbumThumbnailLoader::addUrl(Album* const album, const KUrl& url)
Qt::QueuedConnection);
}
- d->iconAlbumThumbThread->find(url.toLocalFile());
+ d->iconAlbumThumbThread->find(ImageInfo::thumbnailIdentifier(id));
}
// insert new entry to map, add album globalID
- QList<int> &list = d->pathAlbumMap[url.toLocalFile()];
+ QList<int> &list = d->idAlbumMap[id];
list.removeAll(album->globalID());
list.push_back(album->globalID());
}
@@ -375,7 +377,7 @@ void AlbumThumbnailLoader::setThumbnailSize(int size)
d->iconSize = size;
// clear task list
- d->pathAlbumMap.clear();
+ d->idAlbumMap.clear();
// clear cached thumbnails
d->thumbnailMap.clear();
@@ -404,9 +406,10 @@ void AlbumThumbnailLoader::slotGotThumbnailFromIcon(const LoadingDescription& lo
// We need to find all albums for which the given url has been requested,
// and emit a signal for each album.
- PathAlbumMap::iterator it = d->pathAlbumMap.find(loadingDescription.filePath);
+ ThumbnailIdentifier id = loadingDescription.thumbnailIdentifier();
+ IdAlbumMap::iterator it = d->idAlbumMap.find(id.id);
- if (it != d->pathAlbumMap.end())
+ if (it != d->idAlbumMap.end())
{
AlbumManager* const manager = AlbumManager::instance();
@@ -440,7 +443,7 @@ void AlbumThumbnailLoader::slotGotThumbnailFromIcon(const LoadingDescription& lo
}
}
- d->pathAlbumMap.erase(it);
+ d->idAlbumMap.erase(it);
}
}
@@ -474,17 +477,18 @@ void AlbumThumbnailLoader::slotIconChanged(Album* album)
d->thumbnailMap.remove(album->globalID());
}
+/*
+ * This code is maximally inefficient
QImage AlbumThumbnailLoader::getAlbumPreviewDirectly(PAlbum* const album, int size)
{
- if (!album->iconKURL().toLocalFile().isEmpty())
+ if (album->iconId())
{
ThumbnailLoadThread* const thread = new ThumbnailLoadThread;
thread->setPixmapRequested(false);
thread->setThumbnailSize(size);
ThumbnailImageCatcher* const catcher = new ThumbnailImageCatcher(thread);
- catcher->thread()->deleteThumbnail(album->iconKURL().toLocalFile());
catcher->setActive(true);
- catcher->thread()->find(album->iconKURL().toLocalFile());
+ catcher->thread()->find(ThumbnailIdentifier(album->iconId());
catcher->enqueue();
QList<QImage> images = catcher->waitForThumbnails();
catcher->setActive(false);
@@ -497,5 +501,6 @@ QImage AlbumThumbnailLoader::getAlbumPreviewDirectly(PAlbum* const album, int si
return loadIcon("folder", size).toImage();
}
+*/
} // namespace Digikam
diff --git a/app/album/albumthumbnailloader.h b/app/album/albumthumbnailloader.h
index a177b39..4f518d0 100644
--- a/app/album/albumthumbnailloader.h
+++ b/app/album/albumthumbnailloader.h
@@ -145,7 +145,7 @@ public:
/** Return a preview of physical album directly without to use cache.
* Size of image can be passed as argument.
*/
- QImage getAlbumPreviewDirectly(PAlbum* const album, int size);
+ //QImage getAlbumPreviewDirectly(PAlbum* const album, int size);
public:
@@ -188,7 +188,7 @@ private:
AlbumThumbnailLoader();
~AlbumThumbnailLoader();
- void addUrl(Album* const album, const KUrl& url);
+ void addUrl(Album* const album, qlonglong id);
QPixmap loadIcon(const QString& name, int size = 0) const;
int computeIconSize(RelativeSize size) const;
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic