Changeset View
Changeset View
Standalone View
Standalone View
lib/thumbnailprovider/thumbnailgenerator.cpp
Show All 30 Lines | |||||
31 | #ifdef KDCRAW_FOUND | 31 | #ifdef KDCRAW_FOUND | ||
32 | #include <kdcraw/kdcraw.h> | 32 | #include <kdcraw/kdcraw.h> | ||
33 | #endif | 33 | #endif | ||
34 | 34 | | |||
35 | // Qt | 35 | // Qt | ||
36 | #include <QImageReader> | 36 | #include <QImageReader> | ||
37 | #include <QTransform> | 37 | #include <QTransform> | ||
38 | #include <QBuffer> | 38 | #include <QBuffer> | ||
39 | #include <QCoreApplication> | ||||
39 | 40 | | |||
40 | namespace Gwenview | 41 | namespace Gwenview | ||
41 | { | 42 | { | ||
42 | 43 | | |||
43 | #undef ENABLE_LOG | 44 | #undef ENABLE_LOG | ||
44 | #undef LOG | 45 | #undef LOG | ||
45 | //#define ENABLE_LOG | 46 | //#define ENABLE_LOG | ||
46 | #ifdef ENABLE_LOG | 47 | #ifdef ENABLE_LOG | ||
▲ Show 20 Lines • Show All 126 Lines • ▼ Show 20 Line(s) | |||||
173 | 174 | | |||
174 | //------------------------------------------------------------------------ | 175 | //------------------------------------------------------------------------ | ||
175 | // | 176 | // | ||
176 | // ThumbnailGenerator | 177 | // ThumbnailGenerator | ||
177 | // | 178 | // | ||
178 | //------------------------------------------------------------------------ | 179 | //------------------------------------------------------------------------ | ||
179 | ThumbnailGenerator::ThumbnailGenerator() | 180 | ThumbnailGenerator::ThumbnailGenerator() | ||
180 | : mCancel(false) | 181 | : mCancel(false) | ||
181 | {} | 182 | { | ||
183 | connect(qApp, &QCoreApplication::aboutToQuit, this, [=]() { | ||||
184 | wait(); | ||||
185 | }, Qt::DirectConnection); | ||||
186 | start(); | ||||
187 | } | ||||
182 | 188 | | |||
183 | void ThumbnailGenerator::load( | 189 | void ThumbnailGenerator::load( | ||
184 | const QString& originalUri, time_t originalTime, KIO::filesize_t originalFileSize, const QString& originalMimeType, | 190 | const QString& originalUri, time_t originalTime, KIO::filesize_t originalFileSize, const QString& originalMimeType, | ||
185 | const QString& pixPath, | 191 | const QString& pixPath, | ||
186 | const QString& thumbnailPath, | 192 | const QString& thumbnailPath, | ||
187 | ThumbnailGroup::Enum group) | 193 | ThumbnailGroup::Enum group) | ||
188 | { | 194 | { | ||
189 | QMutexLocker lock(&mMutex); | 195 | QMutexLocker lock(&mMutex); | ||
190 | Q_ASSERT(mPixPath.isNull()); | 196 | Q_ASSERT(mPixPath.isNull()); | ||
191 | 197 | | |||
192 | mOriginalUri = originalUri; | 198 | mOriginalUri = originalUri; | ||
193 | mOriginalTime = originalTime; | 199 | mOriginalTime = originalTime; | ||
194 | mOriginalFileSize = originalFileSize; | 200 | mOriginalFileSize = originalFileSize; | ||
195 | mOriginalMimeType = originalMimeType; | 201 | mOriginalMimeType = originalMimeType; | ||
196 | mPixPath = pixPath; | 202 | mPixPath = pixPath; | ||
197 | mThumbnailPath = thumbnailPath; | 203 | mThumbnailPath = thumbnailPath; | ||
198 | mThumbnailGroup = group; | 204 | mThumbnailGroup = group; | ||
199 | if (!isRunning()) start(); | | |||
200 | mCond.wakeOne(); | 205 | mCond.wakeOne(); | ||
201 | } | 206 | } | ||
202 | 207 | | |||
203 | QString ThumbnailGenerator::originalUri() const | 208 | QString ThumbnailGenerator::originalUri() const | ||
204 | { | 209 | { | ||
205 | return mOriginalUri; | 210 | return mOriginalUri; | ||
206 | } | 211 | } | ||
207 | 212 | | |||
213 | bool ThumbnailGenerator::isStopped() | ||||
214 | { | ||||
215 | QMutexLocker lock(&mMutex); | ||||
216 | return mStopped; | ||||
217 | } | ||||
218 | | ||||
208 | time_t ThumbnailGenerator::originalTime() const | 219 | time_t ThumbnailGenerator::originalTime() const | ||
209 | { | 220 | { | ||
210 | return mOriginalTime; | 221 | return mOriginalTime; | ||
211 | } | 222 | } | ||
212 | 223 | | |||
213 | KIO::filesize_t ThumbnailGenerator::originalFileSize() const | 224 | KIO::filesize_t ThumbnailGenerator::originalFileSize() const | ||
214 | { | 225 | { | ||
215 | return mOriginalFileSize; | 226 | return mOriginalFileSize; | ||
Show All 14 Lines | |||||
230 | { | 241 | { | ||
231 | QMutexLocker lock(&mMutex); | 242 | QMutexLocker lock(&mMutex); | ||
232 | mCancel = true; | 243 | mCancel = true; | ||
233 | mCond.wakeOne(); | 244 | mCond.wakeOne(); | ||
234 | } | 245 | } | ||
235 | 246 | | |||
236 | void ThumbnailGenerator::run() | 247 | void ThumbnailGenerator::run() | ||
237 | { | 248 | { | ||
238 | LOG(""); | | |||
239 | while (!testCancel()) { | 249 | while (!testCancel()) { | ||
240 | QString pixPath; | 250 | QString pixPath; | ||
241 | int pixelSize; | 251 | int pixelSize; | ||
242 | { | 252 | { | ||
243 | QMutexLocker lock(&mMutex); | 253 | QMutexLocker lock(&mMutex); | ||
244 | // empty mPixPath means nothing to do | 254 | // empty mPixPath means nothing to do | ||
245 | LOG("Waiting for mPixPath"); | | |||
246 | if (mPixPath.isNull()) { | 255 | if (mPixPath.isNull()) { | ||
247 | LOG("mPixPath.isNull"); | | |||
248 | mCond.wait(&mMutex); | 256 | mCond.wait(&mMutex); | ||
249 | } | 257 | } | ||
250 | } | 258 | } | ||
251 | if (testCancel()) { | 259 | if (testCancel()) { | ||
252 | return; | 260 | break; | ||
253 | } | 261 | } | ||
254 | { | 262 | { | ||
255 | QMutexLocker lock(&mMutex); | 263 | QMutexLocker lock(&mMutex); | ||
256 | pixPath = mPixPath; | 264 | pixPath = mPixPath; | ||
257 | pixelSize = ThumbnailGroup::pixelSize(mThumbnailGroup); | 265 | pixelSize = ThumbnailGroup::pixelSize(mThumbnailGroup); | ||
258 | } | 266 | } | ||
259 | 267 | | |||
260 | Q_ASSERT(!pixPath.isNull()); | 268 | Q_ASSERT(!pixPath.isNull()); | ||
Show All 13 Lines | 273 | { | |||
274 | } else { | 282 | } else { | ||
275 | // avoid emitting the thumb from the previous successful run | 283 | // avoid emitting the thumb from the previous successful run | ||
276 | mImage = QImage(); | 284 | mImage = QImage(); | ||
277 | qCWarning(GWENVIEW_LIB_LOG) << "Could not generate thumbnail for file" << mOriginalUri; | 285 | qCWarning(GWENVIEW_LIB_LOG) << "Could not generate thumbnail for file" << mOriginalUri; | ||
278 | } | 286 | } | ||
279 | mPixPath.clear(); // done, ready for next | 287 | mPixPath.clear(); // done, ready for next | ||
280 | } | 288 | } | ||
281 | if (testCancel()) { | 289 | if (testCancel()) { | ||
282 | return; | 290 | break; | ||
283 | } | 291 | } | ||
284 | { | 292 | { | ||
285 | QSize size(mOriginalWidth, mOriginalHeight); | 293 | QSize size(mOriginalWidth, mOriginalHeight); | ||
286 | LOG("emitting done signal, size=" << size); | 294 | LOG("emitting done signal, size=" << size); | ||
287 | QMutexLocker lock(&mMutex); | 295 | QMutexLocker lock(&mMutex); | ||
288 | emit done(mImage, size); | 296 | emit done(mImage, size); | ||
289 | LOG("Done"); | 297 | LOG("Done"); | ||
290 | } | 298 | } | ||
291 | } | 299 | } | ||
300 | | ||||
292 | LOG("Ending thread"); | 301 | LOG("Ending thread"); | ||
302 | | ||||
303 | QMutexLocker lock(&mMutex); | ||||
304 | mStopped = true; | ||||
305 | deleteLater(); | ||||
293 | } | 306 | } | ||
294 | 307 | | |||
295 | void ThumbnailGenerator::cacheThumbnail() | 308 | void ThumbnailGenerator::cacheThumbnail() | ||
296 | { | 309 | { | ||
297 | mImage.setText(QStringLiteral("Thumb::URI") , mOriginalUri); | 310 | mImage.setText(QStringLiteral("Thumb::URI") , mOriginalUri); | ||
298 | mImage.setText(QStringLiteral("Thumb::MTime") , QString::number(mOriginalTime)); | 311 | mImage.setText(QStringLiteral("Thumb::MTime") , QString::number(mOriginalTime)); | ||
299 | mImage.setText(QStringLiteral("Thumb::Size") , QString::number(mOriginalFileSize)); | 312 | mImage.setText(QStringLiteral("Thumb::Size") , QString::number(mOriginalFileSize)); | ||
300 | mImage.setText(QStringLiteral("Thumb::Mimetype") , mOriginalMimeType); | 313 | mImage.setText(QStringLiteral("Thumb::Mimetype") , mOriginalMimeType); | ||
301 | mImage.setText(QStringLiteral("Thumb::Image::Width") , QString::number(mOriginalWidth)); | 314 | mImage.setText(QStringLiteral("Thumb::Image::Width") , QString::number(mOriginalWidth)); | ||
302 | mImage.setText(QStringLiteral("Thumb::Image::Height"), QString::number(mOriginalHeight)); | 315 | mImage.setText(QStringLiteral("Thumb::Image::Height"), QString::number(mOriginalHeight)); | ||
303 | mImage.setText(QStringLiteral("Software") , QStringLiteral("Gwenview")); | 316 | mImage.setText(QStringLiteral("Software") , QStringLiteral("Gwenview")); | ||
304 | 317 | | |||
305 | emit thumbnailReadyToBeCached(mThumbnailPath, mImage); | 318 | emit thumbnailReadyToBeCached(mThumbnailPath, mImage); | ||
306 | } | 319 | } | ||
307 | 320 | | |||
308 | } // namespace | 321 | } // namespace |