28 #include <vcxmyvideosdefs.h> |
28 #include <vcxmyvideosdefs.h> |
29 #include <videocollectioncommon.h> |
29 #include <videocollectioncommon.h> |
30 |
30 |
31 #include "videothumbnaildata_p.h" |
31 #include "videothumbnaildata_p.h" |
32 #include "videocollectionwrapper.h" |
32 #include "videocollectionwrapper.h" |
33 #include "videosortfilterproxymodel.h" |
33 #include "videoproxymodelgeneric.h" |
34 #include "videothumbnailfetcher.h" |
34 #include "videothumbnailfetcher.h" |
35 #include "videocollectiontrace.h" |
35 #include "videocollectiontrace.h" |
36 |
36 |
37 // Maximum thumbnails kept in memory. |
37 // Maximum thumbnails kept in memory. |
38 const int THUMBNAIL_CACHE_SIZE = 60; |
38 const int THUMBNAIL_CACHE_SIZE = 60; |
180 int VideoThumbnailDataPrivate::connectSignals() |
180 int VideoThumbnailDataPrivate::connectSignals() |
181 { |
181 { |
182 FUNC_LOG; |
182 FUNC_LOG; |
183 if(!mSignalsConnected) |
183 if(!mSignalsConnected) |
184 { |
184 { |
185 VideoSortFilterProxyModel *model = |
|
186 VideoCollectionWrapper::instance().getModel(VideoCollectionCommon::EModelTypeAllVideos); |
|
187 if(!model) |
|
188 return -1; |
|
189 if(!connect(mThumbnailFetcher, SIGNAL(thumbnailReady( QPixmap , const TMPXItemId &, int )), |
185 if(!connect(mThumbnailFetcher, SIGNAL(thumbnailReady( QPixmap , const TMPXItemId &, int )), |
190 this, SLOT(thumbnailReadySlot( QPixmap , const TMPXItemId &, int))) || |
186 this, SLOT(thumbnailReadySlot( QPixmap , const TMPXItemId &, int))) || |
191 !connect(mThumbnailFetcher, SIGNAL(allThumbnailsFetched()), |
187 !connect(mThumbnailFetcher, SIGNAL(allThumbnailsFetched()), |
192 this, SLOT(allThumbnailsFetchedSlot())) || |
188 this, SLOT(allThumbnailsFetchedSlot())) || |
193 !connect(mBgFetchTimer, SIGNAL(timeout()), this, SLOT(doBackgroundFetching())) || |
189 !connect(mBgFetchTimer, SIGNAL(timeout()), this, SLOT(doBackgroundFetching())) || |
408 // VideoThumbnailDataPrivate::defaultThumbnail() |
405 // VideoThumbnailDataPrivate::defaultThumbnail() |
409 // ----------------------------------------------------------------------------- |
406 // ----------------------------------------------------------------------------- |
410 // |
407 // |
411 const QIcon* VideoThumbnailDataPrivate::defaultThumbnail(const TMPXItemId &mediaId) |
408 const QIcon* VideoThumbnailDataPrivate::defaultThumbnail(const TMPXItemId &mediaId) |
412 { |
409 { |
|
410 FUNC_LOG; |
|
411 |
|
412 if(!mBackgroundFetchingEnabled) |
|
413 { |
|
414 return 0; |
|
415 } |
|
416 |
413 const TMPXItemId defaultIdVideo(KMaxTUint32-1, KVcxMvcMediaTypeVideo); |
417 const TMPXItemId defaultIdVideo(KMaxTUint32-1, KVcxMvcMediaTypeVideo); |
414 const TMPXItemId defaultIdAlbum(KMaxTUint32-1, KVcxMvcMediaTypeAlbum); |
418 const TMPXItemId defaultIdAlbum(KMaxTUint32-1, KVcxMvcMediaTypeAlbum); |
415 const TMPXItemId defaultIdDownloads(KVcxMvcCategoryIdDownloads, KVcxMvcMediaTypeCategory); |
419 const TMPXItemId defaultIdDownloads(KVcxMvcCategoryIdDownloads, KVcxMvcMediaTypeCategory); |
416 const TMPXItemId defaultIdCaptured(KVcxMvcCategoryIdCaptured, KVcxMvcMediaTypeCategory); |
420 const TMPXItemId defaultIdCaptured(KVcxMvcCategoryIdCaptured, KVcxMvcMediaTypeCategory); |
417 |
421 |
418 // Default thumbnail for video |
422 // Default thumbnail for video |
419 if(mediaId.iId2 == KVcxMvcMediaTypeVideo) |
423 if(mediaId.iId2 == KVcxMvcMediaTypeVideo) |
420 { |
424 { |
421 if(!mDefaultThumbnails.contains(defaultIdVideo)) |
425 if(!mDefaultThumbnails.contains(defaultIdVideo)) |
422 { |
426 { |
423 mDefaultThumbnails[defaultIdVideo] = loadIcon("qtg_large_video"); |
427 mDefaultThumbnails[defaultIdVideo] = loadIcon("qtg_large_video"); |
424 } |
428 } |
425 return &mDefaultThumbnails[defaultIdVideo].qicon(); |
429 return mDefaultThumbnails[defaultIdVideo]; |
426 } |
430 } |
427 else |
431 else |
428 { |
432 { |
429 // Default thumbnail for user defined album. |
433 // Default thumbnail for user defined album. |
430 if(mediaId.iId2 == KVcxMvcMediaTypeAlbum) |
434 if(mediaId.iId2 == KVcxMvcMediaTypeAlbum) |
431 { |
435 { |
432 if(!mDefaultThumbnails.contains(defaultIdAlbum)) |
436 if(!mDefaultThumbnails.contains(defaultIdAlbum)) |
433 { |
437 { |
434 mDefaultThumbnails[defaultIdAlbum] = loadIcon("qtg_large_video_collection"); |
438 mDefaultThumbnails[defaultIdAlbum] = loadIcon("qtg_large_video_collection"); |
435 } |
439 } |
436 return &mDefaultThumbnails[defaultIdAlbum].qicon(); |
440 return mDefaultThumbnails[defaultIdAlbum]; |
437 } |
441 } |
438 |
442 |
439 // Thumbnails for default collections. |
443 // Thumbnails for default collections. |
440 switch(mediaId.iId1) |
444 switch(mediaId.iId1) |
441 { |
445 { |
443 { |
447 { |
444 if(!mDefaultThumbnails.contains(defaultIdDownloads)) |
448 if(!mDefaultThumbnails.contains(defaultIdDownloads)) |
445 { |
449 { |
446 mDefaultThumbnails[defaultIdDownloads] = loadIcon("qtg_large_video_download"); |
450 mDefaultThumbnails[defaultIdDownloads] = loadIcon("qtg_large_video_download"); |
447 } |
451 } |
448 return &mDefaultThumbnails[defaultIdDownloads].qicon(); |
452 return mDefaultThumbnails[defaultIdDownloads]; |
449 } |
453 } |
450 |
454 |
451 case KVcxMvcCategoryIdCaptured: |
455 case KVcxMvcCategoryIdCaptured: |
452 { |
456 { |
453 if(!mDefaultThumbnails.contains(defaultIdCaptured)) |
457 if(!mDefaultThumbnails.contains(defaultIdCaptured)) |
454 { |
458 { |
455 mDefaultThumbnails[defaultIdCaptured] = loadIcon("qtg_large_video_capture"); |
459 mDefaultThumbnails[defaultIdCaptured] = loadIcon("qtg_large_video_capture"); |
456 } |
460 } |
457 return &mDefaultThumbnails[defaultIdCaptured].qicon(); |
461 return mDefaultThumbnails[defaultIdCaptured]; |
458 } |
462 } |
459 |
463 |
460 default: |
464 default: |
461 { |
465 { |
462 if(!mDefaultThumbnails.contains(defaultIdAlbum)) |
466 return 0; |
463 { |
|
464 mDefaultThumbnails[defaultIdAlbum] = loadIcon("qtg_large_video_collection"); |
|
465 } |
|
466 return &mDefaultThumbnails[defaultIdAlbum].qicon(); |
|
467 } |
467 } |
468 } |
468 } |
469 } |
469 } |
470 } |
470 } |
471 |
471 |
472 // ----------------------------------------------------------------------------- |
472 // ----------------------------------------------------------------------------- |
473 // VideoThumbnailDataPrivate::loadIcon() |
473 // VideoThumbnailDataPrivate::loadIcon() |
474 // ----------------------------------------------------------------------------- |
474 // ----------------------------------------------------------------------------- |
475 // |
475 // |
476 HbIcon VideoThumbnailDataPrivate::loadIcon(QString iconName) |
476 QIcon *VideoThumbnailDataPrivate::loadIcon(QString iconName) |
477 { |
477 { |
478 HbIcon icon(iconName); |
478 FUNC_LOG; |
479 |
479 |
480 if(!icon.isNull()) |
480 HbIcon resource(iconName); |
481 { |
481 QIcon *icon = 0; |
|
482 |
|
483 if(!resource.isNull()) |
|
484 { |
|
485 // Set matching height, width is adjusted automaticly. |
|
486 resource.setHeight(DEFAULT_THUMBNAIL_HEIGHT); |
|
487 |
482 QPixmap dest = QPixmap(DEFAULT_THUMBNAIL_WIDTH, DEFAULT_THUMBNAIL_HEIGHT); |
488 QPixmap dest = QPixmap(DEFAULT_THUMBNAIL_WIDTH, DEFAULT_THUMBNAIL_HEIGHT); |
483 |
|
484 // Scale the icon into the thumbnail area. |
|
485 QPixmap source = icon.pixmap(); |
|
486 // Smooth scaling is very expensive (size^2). Therefore we reduce the size |
|
487 // to 2x of the destination size and using fast transformation before doing final smooth scaling. |
|
488 if(source.size().width() > (6*dest.width()) || source.size().height() > (6*dest.height())) |
|
489 { |
|
490 QSize intermediate_size = QSize( dest.width() * 2, dest.height() * 2 ); |
|
491 source = source.scaled(intermediate_size, Qt::KeepAspectRatio, Qt::FastTransformation ); |
|
492 } |
|
493 QPixmap scaled = source.scaled(dest.size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); |
|
494 |
|
495 // Center the icon. |
|
496 int xDiff = 0; |
|
497 int yDiff = 0; |
|
498 if(dest.width() > scaled.width()) |
|
499 { |
|
500 xDiff = (dest.width() - scaled.width()) / 2; |
|
501 } |
|
502 if(dest.height() > scaled.height()) |
|
503 { |
|
504 yDiff = (dest.height() - scaled.height()) / 2; |
|
505 } |
|
506 |
489 |
507 // Paint it. |
|
508 QPainter painter(&dest); |
490 QPainter painter(&dest); |
509 painter.setCompositionMode(QPainter::CompositionMode_Source); |
491 painter.setCompositionMode(QPainter::CompositionMode_Source); |
510 painter.fillRect(dest.rect(), Qt::transparent); |
492 painter.fillRect(dest.rect(), Qt::transparent); |
511 painter.drawPixmap(xDiff, yDiff, scaled.width(), scaled.height(), scaled); |
493 resource.paint(&painter, dest.rect()); |
512 painter.end(); |
494 painter.end(); |
513 |
495 |
514 return HbIcon(dest); |
496 icon = new QIcon(dest); |
515 } |
497 } |
516 else |
498 |
517 { |
499 return icon; |
518 return HbIcon(); |
|
519 } |
|
520 } |
500 } |
521 |
501 |
522 // ----------------------------------------------------------------------------- |
502 // ----------------------------------------------------------------------------- |
523 // VideoThumbnailDataPrivate::removeThumbnail() |
503 // VideoThumbnailDataPrivate::removeThumbnail() |
524 // ----------------------------------------------------------------------------- |
504 // ----------------------------------------------------------------------------- |
588 } |
568 } |
589 |
569 |
590 // Clear data. |
570 // Clear data. |
591 mReadyThumbnailMediaIds.clear(); |
571 mReadyThumbnailMediaIds.clear(); |
592 mThumbnailData.clear(); |
572 mThumbnailData.clear(); |
|
573 |
|
574 QHash<TMPXItemId, QIcon *>::const_iterator iter = mDefaultThumbnails.constBegin(); |
|
575 while(iter != mDefaultThumbnails.constEnd()) |
|
576 { |
|
577 delete *iter; |
|
578 iter++; |
|
579 } |
593 mDefaultThumbnails.clear(); |
580 mDefaultThumbnails.clear(); |
594 } |
581 } |
595 |
582 |
596 // ----------------------------------------------------------------------------- |
583 // ----------------------------------------------------------------------------- |
597 // VideoThumbnailDataPrivate::startBackgroundFetching() |
584 // VideoThumbnailDataPrivate::startBackgroundFetching() |
598 // ----------------------------------------------------------------------------- |
585 // ----------------------------------------------------------------------------- |
599 // |
586 // |
600 void VideoThumbnailDataPrivate::startBackgroundFetching(VideoSortFilterProxyModel *model, int fetchIndex) |
587 void VideoThumbnailDataPrivate::startBackgroundFetching(VideoProxyModelGeneric *model, int fetchIndex) |
601 { |
588 { |
602 FUNC_LOG; |
589 FUNC_LOG; |
603 |
590 |
604 // If model is null, we continue using the current one. Model and index are kept up to date even |
591 // If model is null, we continue using the current one. Model and index are kept up to date even |
605 // fetching is not enabled. |
592 // fetching is not enabled. |