13 * |
13 * |
14 * Description: VideoThumbnailDataPrivate class implementation |
14 * Description: VideoThumbnailDataPrivate class implementation |
15 * |
15 * |
16 */ |
16 */ |
17 |
17 |
18 // Version : %version: 21 % |
18 // Version : %version: 24 % |
19 |
19 |
20 // INCLUDE FILES |
20 // INCLUDE FILES |
21 #include <qapplication.h> |
21 #include <qapplication.h> |
22 #include <qpixmap.h> |
22 #include <qpixmap.h> |
23 #include <qtimer.h> |
23 #include <qtimer.h> |
|
24 #include <qpainter.h> |
24 #include <mpxmediageneraldefs.h> |
25 #include <mpxmediageneraldefs.h> |
25 #include <hbicon.h> |
26 #include <hbicon.h> |
26 |
27 |
27 #include <vcxmyvideosdefs.h> |
28 #include <vcxmyvideosdefs.h> |
28 #include <videocollectioncommon.h> |
29 #include <videocollectioncommon.h> |
43 // are signaled. |
44 // are signaled. |
44 const int THUMBNAIL_READY_SIGNAL_TIMEOUT = 50; |
45 const int THUMBNAIL_READY_SIGNAL_TIMEOUT = 50; |
45 // Priority for background thumbnail fetches. |
46 // Priority for background thumbnail fetches. |
46 const int BACKGROUND_FETCH_PRIORITY = 3000; |
47 const int BACKGROUND_FETCH_PRIORITY = 3000; |
47 |
48 |
|
49 // Size for default thumbnail, these match with large thumbnail in lists. |
|
50 const int DEFAULT_THUMBNAIL_WIDTH = 114; |
|
51 const int DEFAULT_THUMBNAIL_HEIGHT = 64; |
|
52 |
48 /** |
53 /** |
49 * global qHash function required fo creating hash values for TMPXItemId -keys |
54 * global qHash function required fo creating hash values for TMPXItemId -keys |
50 */ |
55 */ |
51 inline uint qHash(TMPXItemId key) |
56 inline uint qHash(TMPXItemId key) |
52 { |
57 { |
53 QPair<uint, uint> keyPair(key.iId1, key.iId2); |
58 QPair<uint, uint> keyPair(key.iId1, key.iId2); |
54 |
59 |
55 return qHash(keyPair); |
60 return qHash(keyPair); |
56 } |
61 } |
57 |
62 |
58 // ================= MEMBER FUNCTIONS ======================= |
63 // ================= MEMBER FUNCTIONS ======================= |
428 // Default thumbnail for video |
433 // Default thumbnail for video |
429 if(mediaId.iId2 == KVcxMvcMediaTypeVideo) |
434 if(mediaId.iId2 == KVcxMvcMediaTypeVideo) |
430 { |
435 { |
431 if(!mDefaultThumbnails.contains(defaultIdVideo)) |
436 if(!mDefaultThumbnails.contains(defaultIdVideo)) |
432 { |
437 { |
433 mDefaultThumbnails[defaultIdVideo] = HbIcon(":/icons/default_thumbnail_video.svg"); |
438 mDefaultThumbnails[defaultIdVideo] = loadIcon("qtg_large_video"); |
434 } |
439 } |
435 return &mDefaultThumbnails[defaultIdVideo].qicon(); |
440 return &mDefaultThumbnails[defaultIdVideo].qicon(); |
436 } |
441 } |
437 else |
442 else |
438 { |
443 { |
439 // Default thumbnail for user defined album. |
444 // Default thumbnail for user defined album. |
440 if(mediaId.iId2 == KVcxMvcMediaTypeAlbum) |
445 if(mediaId.iId2 == KVcxMvcMediaTypeAlbum) |
441 { |
446 { |
442 if(!mDefaultThumbnails.contains(defaultIdAlbum)) |
447 if(!mDefaultThumbnails.contains(defaultIdAlbum)) |
443 { |
448 { |
444 mDefaultThumbnails[defaultIdAlbum] = HbIcon("qtg_large_video_collection"); |
449 mDefaultThumbnails[defaultIdAlbum] = loadIcon("qtg_large_video_collection"); |
445 } |
450 } |
446 return &mDefaultThumbnails[defaultIdAlbum].qicon(); |
451 return &mDefaultThumbnails[defaultIdAlbum].qicon(); |
447 } |
452 } |
448 |
453 |
449 // Thumbnails for default collections. |
454 // Thumbnails for default collections. |
451 { |
456 { |
452 case KVcxMvcCategoryIdDownloads: |
457 case KVcxMvcCategoryIdDownloads: |
453 { |
458 { |
454 if(!mDefaultThumbnails.contains(defaultIdDownloads)) |
459 if(!mDefaultThumbnails.contains(defaultIdDownloads)) |
455 { |
460 { |
456 mDefaultThumbnails[defaultIdDownloads] = HbIcon("qtg_large_video_download"); |
461 mDefaultThumbnails[defaultIdDownloads] = loadIcon("qtg_large_video_download"); |
457 } |
462 } |
458 return &mDefaultThumbnails[defaultIdDownloads].qicon(); |
463 return &mDefaultThumbnails[defaultIdDownloads].qicon(); |
459 } |
464 } |
460 |
465 |
461 case KVcxMvcCategoryIdCaptured: |
466 case KVcxMvcCategoryIdCaptured: |
462 { |
467 { |
463 if(!mDefaultThumbnails.contains(defaultIdCaptured)) |
468 if(!mDefaultThumbnails.contains(defaultIdCaptured)) |
464 { |
469 { |
465 mDefaultThumbnails[defaultIdCaptured] = HbIcon("qtg_large_video_capture"); |
470 mDefaultThumbnails[defaultIdCaptured] = loadIcon("qtg_large_video_capture"); |
466 } |
471 } |
467 return &mDefaultThumbnails[defaultIdCaptured].qicon(); |
472 return &mDefaultThumbnails[defaultIdCaptured].qicon(); |
468 } |
473 } |
469 |
474 |
470 default: |
475 default: |
471 { |
476 { |
472 if(!mDefaultThumbnails.contains(defaultIdAlbum)) |
477 if(!mDefaultThumbnails.contains(defaultIdAlbum)) |
473 { |
478 { |
474 mDefaultThumbnails[defaultIdAlbum] = HbIcon("qtg_large_video_collection"); |
479 mDefaultThumbnails[defaultIdAlbum] = loadIcon("qtg_large_video_collection"); |
475 } |
480 } |
476 return &mDefaultThumbnails[defaultIdAlbum].qicon(); |
481 return &mDefaultThumbnails[defaultIdAlbum].qicon(); |
477 } |
482 } |
478 } |
483 } |
|
484 } |
|
485 } |
|
486 |
|
487 // ----------------------------------------------------------------------------- |
|
488 // VideoThumbnailDataPrivate::loadIcon() |
|
489 // ----------------------------------------------------------------------------- |
|
490 // |
|
491 HbIcon VideoThumbnailDataPrivate::loadIcon(QString iconName) |
|
492 { |
|
493 HbIcon icon(iconName); |
|
494 |
|
495 if(!icon.isNull()) |
|
496 { |
|
497 QPixmap dest = QPixmap(DEFAULT_THUMBNAIL_WIDTH, DEFAULT_THUMBNAIL_HEIGHT); |
|
498 |
|
499 // Scale the icon into the thumbnail area. |
|
500 QPixmap source = icon.pixmap(); |
|
501 // Smooth scaling is very expensive (size^2). Therefore we reduce the size |
|
502 // to 2x of the destination size and using fast transformation before doing final smooth scaling. |
|
503 if(source.size().width() > (6*dest.width()) || source.size().height() > (6*dest.height())) |
|
504 { |
|
505 QSize intermediate_size = QSize( dest.width() * 2, dest.height() * 2 ); |
|
506 source = source.scaled(intermediate_size, Qt::KeepAspectRatio, Qt::FastTransformation ); |
|
507 } |
|
508 QPixmap scaled = source.scaled(dest.size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); |
|
509 |
|
510 // Center the icon. |
|
511 int xDiff = 0; |
|
512 int yDiff = 0; |
|
513 if(dest.width() > scaled.width()) |
|
514 { |
|
515 xDiff = (dest.width() - scaled.width()) / 2; |
|
516 } |
|
517 if(dest.height() > scaled.height()) |
|
518 { |
|
519 yDiff = (dest.height() - scaled.height()) / 2; |
|
520 } |
|
521 |
|
522 // Paint it. |
|
523 QPainter painter(&dest); |
|
524 painter.setCompositionMode(QPainter::CompositionMode_Source); |
|
525 painter.fillRect(dest.rect(), Qt::transparent); |
|
526 painter.drawPixmap(xDiff, yDiff, scaled.width(), scaled.height(), scaled); |
|
527 painter.end(); |
|
528 |
|
529 return HbIcon(dest); |
|
530 } |
|
531 else |
|
532 { |
|
533 return HbIcon(); |
479 } |
534 } |
480 } |
535 } |
481 |
536 |
482 // ----------------------------------------------------------------------------- |
537 // ----------------------------------------------------------------------------- |
483 // VideoThumbnailDataPrivate::removeThumbnail() |
538 // VideoThumbnailDataPrivate::removeThumbnail() |