videocollection/videocollectionwrapper/src/videothumbnaildata_p.cpp
changeset 62 0e1e938beb1a
parent 52 e3cecb93e76a
equal deleted inserted replaced
59:a76e86df7ccd 62:0e1e938beb1a
    13 *
    13 *
    14 * Description:  VideoThumbnailDataPrivate class implementation
    14 * Description:  VideoThumbnailDataPrivate class implementation
    15 *
    15 *
    16 */
    16 */
    17 
    17 
    18 // Version : %version: 24.1.3 %
    18 // Version : %version: 24.1.5 %
    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>
    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())) ||
   226 // -----------------------------------------------------------------------------
   222 // -----------------------------------------------------------------------------
   227 //
   223 //
   228 int VideoThumbnailDataPrivate::startFetchingThumbnails(const QList<QModelIndex> &indexes, int priority)
   224 int VideoThumbnailDataPrivate::startFetchingThumbnails(const QList<QModelIndex> &indexes, int priority)
   229 {
   225 {
   230 	FUNC_LOG;
   226 	FUNC_LOG;
       
   227 	
   231     if(!mCurrentModel || !mThumbnailFetcher)
   228     if(!mCurrentModel || !mThumbnailFetcher)
   232     {
   229     {
   233         return -1;
   230         return -1;
   234     }
   231     }
   235     if(indexes.count() == 0)
   232     if(indexes.count() == 0)
   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.