videocollection/videocollectionwrapper/src/videothumbnaildata_p.cpp
author hgs
Fri, 03 Sep 2010 12:37:43 +0300
changeset 58 d2b028fd1f7d
parent 50 21fe8338c6bf
permissions -rw-r--r--
201035
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
30
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  VideoThumbnailDataPrivate class implementation
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
58
hgs
parents: 50
diff changeset
    18
// Version : %version: 24.1.5 %
36
hgs
parents: 35
diff changeset
    19
30
hgs
parents:
diff changeset
    20
// INCLUDE FILES
34
hgs
parents: 30
diff changeset
    21
#include <qapplication.h>
hgs
parents: 30
diff changeset
    22
#include <qpixmap.h>
hgs
parents: 30
diff changeset
    23
#include <qtimer.h>
38
hgs
parents: 37
diff changeset
    24
#include <qpainter.h>
30
hgs
parents:
diff changeset
    25
#include <mpxmediageneraldefs.h>
35
hgs
parents: 34
diff changeset
    26
#include <hbicon.h>
hgs
parents: 34
diff changeset
    27
34
hgs
parents: 30
diff changeset
    28
#include <vcxmyvideosdefs.h>
36
hgs
parents: 35
diff changeset
    29
#include <videocollectioncommon.h>
30
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
#include "videothumbnaildata_p.h"
hgs
parents:
diff changeset
    32
#include "videocollectionwrapper.h"
58
hgs
parents: 50
diff changeset
    33
#include "videoproxymodelgeneric.h"
34
hgs
parents: 30
diff changeset
    34
#include "videothumbnailfetcher.h"
36
hgs
parents: 35
diff changeset
    35
#include "videocollectiontrace.h"
30
hgs
parents:
diff changeset
    36
hgs
parents:
diff changeset
    37
// Maximum thumbnails kept in memory.
hgs
parents:
diff changeset
    38
const int THUMBNAIL_CACHE_SIZE = 60;
hgs
parents:
diff changeset
    39
// Maximum of thumbnail fetches done at one background fetch round.
hgs
parents:
diff changeset
    40
const int THUMBNAIL_BACKGROUND_FETCH_AMOUNT = 20;
hgs
parents:
diff changeset
    41
// Milliseconds for the background fetch timer.
hgs
parents:
diff changeset
    42
const int THUMBNAIL_BACKGROUND_TIMEOUT = 100;
hgs
parents:
diff changeset
    43
// Milliseconds while thumbnail ready events are gathered before they 
hgs
parents:
diff changeset
    44
// are signaled.
hgs
parents:
diff changeset
    45
const int THUMBNAIL_READY_SIGNAL_TIMEOUT = 50;
hgs
parents:
diff changeset
    46
// Priority for background thumbnail fetches.
hgs
parents:
diff changeset
    47
const int BACKGROUND_FETCH_PRIORITY = 3000;
hgs
parents:
diff changeset
    48
38
hgs
parents: 37
diff changeset
    49
// Size for default thumbnail, these match with large thumbnail in lists. 
hgs
parents: 37
diff changeset
    50
const int DEFAULT_THUMBNAIL_WIDTH = 114;
hgs
parents: 37
diff changeset
    51
const int DEFAULT_THUMBNAIL_HEIGHT = 64;
hgs
parents: 37
diff changeset
    52
30
hgs
parents:
diff changeset
    53
/**
hgs
parents:
diff changeset
    54
 * global qHash function required fo creating hash values for TMPXItemId -keys
hgs
parents:
diff changeset
    55
 */
hgs
parents:
diff changeset
    56
inline uint qHash(TMPXItemId key) 
38
hgs
parents: 37
diff changeset
    57
{
hgs
parents: 37
diff changeset
    58
    QPair<uint, uint> keyPair(key.iId1, key.iId2);
30
hgs
parents:
diff changeset
    59
hgs
parents:
diff changeset
    60
    return qHash(keyPair);
hgs
parents:
diff changeset
    61
}
hgs
parents:
diff changeset
    62
hgs
parents:
diff changeset
    63
// ================= MEMBER FUNCTIONS =======================
hgs
parents:
diff changeset
    64
//
hgs
parents:
diff changeset
    65
hgs
parents:
diff changeset
    66
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    67
// VideoThumbnailDataPrivate::VideoThumbnailDataPrivate()
hgs
parents:
diff changeset
    68
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    69
//
36
hgs
parents: 35
diff changeset
    70
VideoThumbnailDataPrivate::VideoThumbnailDataPrivate() 
hgs
parents: 35
diff changeset
    71
    : mThumbnailFetcher( 0 )
hgs
parents: 35
diff changeset
    72
    , mCurrentModel( 0 )
hgs
parents: 35
diff changeset
    73
    , mCurrentFetchIndex( 0 )
hgs
parents: 35
diff changeset
    74
    , mCurrentBackgroundFetchCount( 0 )
hgs
parents: 35
diff changeset
    75
    , mBgFetchTimer( 0 )
hgs
parents: 35
diff changeset
    76
    , mTbnReportTimer( 0 )
hgs
parents: 35
diff changeset
    77
    , mSignalsConnected( false )
hgs
parents: 35
diff changeset
    78
    , mBackgroundFetchingEnabled( true )
30
hgs
parents:
diff changeset
    79
{
36
hgs
parents: 35
diff changeset
    80
	FUNC_LOG;
37
hgs
parents: 36
diff changeset
    81
	initialize();
30
hgs
parents:
diff changeset
    82
}
hgs
parents:
diff changeset
    83
hgs
parents:
diff changeset
    84
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    85
// VideoThumbnailDataPrivate::~VideoThumbnailDataPrivate()
hgs
parents:
diff changeset
    86
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    87
//
hgs
parents:
diff changeset
    88
VideoThumbnailDataPrivate::~VideoThumbnailDataPrivate()
hgs
parents:
diff changeset
    89
{
36
hgs
parents: 35
diff changeset
    90
	FUNC_LOG;
30
hgs
parents:
diff changeset
    91
    cleanup();
hgs
parents:
diff changeset
    92
}
hgs
parents:
diff changeset
    93
hgs
parents:
diff changeset
    94
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    95
// VideoThumbnailDataPrivate::initialize()
hgs
parents:
diff changeset
    96
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    97
//
hgs
parents:
diff changeset
    98
int VideoThumbnailDataPrivate::initialize()
hgs
parents:
diff changeset
    99
{
36
hgs
parents: 35
diff changeset
   100
	FUNC_LOG;
30
hgs
parents:
diff changeset
   101
    mThumbnailData.setMaxCost(THUMBNAIL_CACHE_SIZE);
hgs
parents:
diff changeset
   102
    
34
hgs
parents: 30
diff changeset
   103
    if(!mThumbnailFetcher)
30
hgs
parents:
diff changeset
   104
    {
34
hgs
parents: 30
diff changeset
   105
        mThumbnailFetcher = new VideoThumbnailFetcher();        
30
hgs
parents:
diff changeset
   106
    }
hgs
parents:
diff changeset
   107
hgs
parents:
diff changeset
   108
    if(!mBgFetchTimer)
hgs
parents:
diff changeset
   109
    {
hgs
parents:
diff changeset
   110
        mBgFetchTimer = new QTimer();
hgs
parents:
diff changeset
   111
    }
hgs
parents:
diff changeset
   112
    
hgs
parents:
diff changeset
   113
    if(!mTbnReportTimer)
hgs
parents:
diff changeset
   114
    {
hgs
parents:
diff changeset
   115
        mTbnReportTimer = new QTimer();
hgs
parents:
diff changeset
   116
    }
hgs
parents:
diff changeset
   117
hgs
parents:
diff changeset
   118
    if(connectSignals() < 0)
hgs
parents:
diff changeset
   119
    {
36
hgs
parents: 35
diff changeset
   120
        ERROR(-1, "VideoThumbnailDataPrivate::initialize() failed to connect signals.");
30
hgs
parents:
diff changeset
   121
        cleanup();
hgs
parents:
diff changeset
   122
        return -1;
hgs
parents:
diff changeset
   123
    }
37
hgs
parents: 36
diff changeset
   124
30
hgs
parents:
diff changeset
   125
    return 0;
hgs
parents:
diff changeset
   126
}
hgs
parents:
diff changeset
   127
hgs
parents:
diff changeset
   128
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   129
// VideoThumbnailDataPrivate::cleanup()
hgs
parents:
diff changeset
   130
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   131
//
hgs
parents:
diff changeset
   132
void VideoThumbnailDataPrivate::cleanup()
hgs
parents:
diff changeset
   133
{
36
hgs
parents: 35
diff changeset
   134
	FUNC_LOG;
30
hgs
parents:
diff changeset
   135
    disconnectSignals();
hgs
parents:
diff changeset
   136
34
hgs
parents: 30
diff changeset
   137
    delete mThumbnailFetcher;
hgs
parents: 30
diff changeset
   138
    mThumbnailFetcher = 0;
hgs
parents: 30
diff changeset
   139
    
30
hgs
parents:
diff changeset
   140
    freeThumbnailData();
hgs
parents:
diff changeset
   141
    
hgs
parents:
diff changeset
   142
    if(mTbnReportTimer)
hgs
parents:
diff changeset
   143
    {
hgs
parents:
diff changeset
   144
        mTbnReportTimer->stop();
hgs
parents:
diff changeset
   145
        delete mTbnReportTimer;
hgs
parents:
diff changeset
   146
        mTbnReportTimer = 0;
hgs
parents:
diff changeset
   147
    }
hgs
parents:
diff changeset
   148
    
hgs
parents:
diff changeset
   149
    if(mBgFetchTimer)
hgs
parents:
diff changeset
   150
    {
hgs
parents:
diff changeset
   151
        mBgFetchTimer->stop();
hgs
parents:
diff changeset
   152
        delete mBgFetchTimer;
hgs
parents:
diff changeset
   153
        mBgFetchTimer = 0;
hgs
parents:
diff changeset
   154
    }
hgs
parents:
diff changeset
   155
}
hgs
parents:
diff changeset
   156
hgs
parents:
diff changeset
   157
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   158
// VideoThumbnailDataPrivate::disconnectSignals()
hgs
parents:
diff changeset
   159
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   160
//
hgs
parents:
diff changeset
   161
void VideoThumbnailDataPrivate::disconnectSignals()
hgs
parents:
diff changeset
   162
{
36
hgs
parents: 35
diff changeset
   163
	FUNC_LOG;
30
hgs
parents:
diff changeset
   164
    if(mSignalsConnected)
hgs
parents:
diff changeset
   165
    {
37
hgs
parents: 36
diff changeset
   166
		disconnect(mThumbnailFetcher, SIGNAL(thumbnailReady(QPixmap , const TMPXItemId &, int )),
hgs
parents: 36
diff changeset
   167
                    this, SLOT(thumbnailReadySlot(QPixmap , const TMPXItemId &, int )));
34
hgs
parents: 30
diff changeset
   168
        disconnect(mThumbnailFetcher, SIGNAL(allThumbnailsFetched()),
hgs
parents: 30
diff changeset
   169
                 this, SLOT(allThumbnailsFetchedSlot()));          
30
hgs
parents:
diff changeset
   170
        disconnect(mBgFetchTimer, SIGNAL(timeout()), this, SLOT(doBackgroundFetching()));
hgs
parents:
diff changeset
   171
        disconnect(mTbnReportTimer, SIGNAL(timeout()), this, SLOT(reportThumbnailsReadySlot()));
hgs
parents:
diff changeset
   172
    }
hgs
parents:
diff changeset
   173
    mSignalsConnected = false;
hgs
parents:
diff changeset
   174
}
hgs
parents:
diff changeset
   175
hgs
parents:
diff changeset
   176
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   177
// VideoThumbnailDataPrivate::connectSignals()
hgs
parents:
diff changeset
   178
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   179
//
hgs
parents:
diff changeset
   180
int VideoThumbnailDataPrivate::connectSignals()
hgs
parents:
diff changeset
   181
{
36
hgs
parents: 35
diff changeset
   182
	FUNC_LOG;
30
hgs
parents:
diff changeset
   183
    if(!mSignalsConnected)
hgs
parents:
diff changeset
   184
    {
37
hgs
parents: 36
diff changeset
   185
        if(!connect(mThumbnailFetcher, SIGNAL(thumbnailReady( QPixmap , const TMPXItemId &, int )),
hgs
parents: 36
diff changeset
   186
                    this, SLOT(thumbnailReadySlot( QPixmap , const TMPXItemId &, int))) ||
34
hgs
parents: 30
diff changeset
   187
            !connect(mThumbnailFetcher, SIGNAL(allThumbnailsFetched()),
hgs
parents: 30
diff changeset
   188
                     this, SLOT(allThumbnailsFetchedSlot())) ||
30
hgs
parents:
diff changeset
   189
           !connect(mBgFetchTimer, SIGNAL(timeout()), this, SLOT(doBackgroundFetching())) ||
hgs
parents:
diff changeset
   190
           !connect(mTbnReportTimer, SIGNAL(timeout()), this, SLOT(reportThumbnailsReadySlot())))
hgs
parents:
diff changeset
   191
        {
hgs
parents:
diff changeset
   192
            return -1;
hgs
parents:
diff changeset
   193
        }
hgs
parents:
diff changeset
   194
        
hgs
parents:
diff changeset
   195
        QApplication *app = qApp;
hgs
parents:
diff changeset
   196
        if(!connect(app, SIGNAL(aboutToQuit()), this, SLOT(aboutToQuitSlot())))
hgs
parents:
diff changeset
   197
        {
hgs
parents:
diff changeset
   198
            return -1;
hgs
parents:
diff changeset
   199
        }
hgs
parents:
diff changeset
   200
        
hgs
parents:
diff changeset
   201
        mSignalsConnected = true;
hgs
parents:
diff changeset
   202
    }
hgs
parents:
diff changeset
   203
    return 0;
hgs
parents:
diff changeset
   204
}
hgs
parents:
diff changeset
   205
hgs
parents:
diff changeset
   206
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   207
// VideoThumbnailDataPrivate::getThumbnail()
hgs
parents:
diff changeset
   208
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   209
//
50
hgs
parents: 44
diff changeset
   210
const QIcon* VideoThumbnailDataPrivate::getThumbnail( const TMPXItemId &mediaId)
30
hgs
parents:
diff changeset
   211
{
hgs
parents:
diff changeset
   212
    const QIcon *thumbnail = mThumbnailData[mediaId];
hgs
parents:
diff changeset
   213
    if(!thumbnail)
hgs
parents:
diff changeset
   214
    {
hgs
parents:
diff changeset
   215
        return defaultThumbnail(mediaId);
hgs
parents:
diff changeset
   216
    }
hgs
parents:
diff changeset
   217
    return thumbnail;
hgs
parents:
diff changeset
   218
}
hgs
parents:
diff changeset
   219
hgs
parents:
diff changeset
   220
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   221
// VideoThumbnailDataPrivate::startFetchingThumbnails()
hgs
parents:
diff changeset
   222
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   223
//
hgs
parents:
diff changeset
   224
int VideoThumbnailDataPrivate::startFetchingThumbnails(const QList<QModelIndex> &indexes, int priority)
hgs
parents:
diff changeset
   225
{
36
hgs
parents: 35
diff changeset
   226
	FUNC_LOG;
58
hgs
parents: 50
diff changeset
   227
	
34
hgs
parents: 30
diff changeset
   228
    if(!mCurrentModel || !mThumbnailFetcher)
30
hgs
parents:
diff changeset
   229
    {
hgs
parents:
diff changeset
   230
        return -1;
hgs
parents:
diff changeset
   231
    }
hgs
parents:
diff changeset
   232
    if(indexes.count() == 0)
hgs
parents:
diff changeset
   233
    {
hgs
parents:
diff changeset
   234
        return 0;
hgs
parents:
diff changeset
   235
    }
hgs
parents:
diff changeset
   236
    
34
hgs
parents: 30
diff changeset
   237
    mThumbnailFetcher->pauseFetching();
hgs
parents: 30
diff changeset
   238
hgs
parents: 30
diff changeset
   239
    int fetchCountBefore = mThumbnailFetcher->fetchCount();
30
hgs
parents:
diff changeset
   240
    
34
hgs
parents: 30
diff changeset
   241
    // Fetch the thumbnails
30
hgs
parents:
diff changeset
   242
    for(int i = 0; i < indexes.count(); i++)
hgs
parents:
diff changeset
   243
    {
34
hgs
parents: 30
diff changeset
   244
        startFetchingThumbnail(mCurrentModel->getMediaIdAtIndex(indexes[i]), priority--);
30
hgs
parents:
diff changeset
   245
    }
hgs
parents:
diff changeset
   246
    
34
hgs
parents: 30
diff changeset
   247
    int started = mThumbnailFetcher->fetchCount() - fetchCountBefore;
hgs
parents: 30
diff changeset
   248
    
37
hgs
parents: 36
diff changeset
   249
	// Start the fetches and cancel previous ones.
hgs
parents: 36
diff changeset
   250
    mThumbnailFetcher->continueFetching(true);
34
hgs
parents: 30
diff changeset
   251
    
hgs
parents: 30
diff changeset
   252
    return started;
30
hgs
parents:
diff changeset
   253
}
hgs
parents:
diff changeset
   254
hgs
parents:
diff changeset
   255
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   256
// VideoThumbnailDataPrivate::startFetchingThumbnail()
hgs
parents:
diff changeset
   257
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   258
//
50
hgs
parents: 44
diff changeset
   259
int VideoThumbnailDataPrivate::startFetchingThumbnail(const TMPXItemId &mediaId, int priority)
30
hgs
parents:
diff changeset
   260
{
34
hgs
parents: 30
diff changeset
   261
    if(!mCurrentModel || !mThumbnailFetcher)
30
hgs
parents:
diff changeset
   262
    {
hgs
parents:
diff changeset
   263
        return -1;
hgs
parents:
diff changeset
   264
    }
hgs
parents:
diff changeset
   265
hgs
parents:
diff changeset
   266
    // Check that it's not fetched before.
hgs
parents:
diff changeset
   267
    if(mThumbnailData.contains(mediaId))
hgs
parents:
diff changeset
   268
    {
hgs
parents:
diff changeset
   269
        return 0;
hgs
parents:
diff changeset
   270
    }
hgs
parents:
diff changeset
   271
34
hgs
parents: 30
diff changeset
   272
    QString fileName = mCurrentModel->getMediaFilePathForId(mediaId);
hgs
parents: 30
diff changeset
   273
    
hgs
parents: 30
diff changeset
   274
    // Thumbnail fetcher signals into thumbnailReadySlot when thumbnail ready
30
hgs
parents:
diff changeset
   275
    if(fileName.length() > 0)
hgs
parents:
diff changeset
   276
    {
37
hgs
parents: 36
diff changeset
   277
        mThumbnailFetcher->addFetch(fileName, mediaId, priority);
30
hgs
parents:
diff changeset
   278
    }
hgs
parents:
diff changeset
   279
34
hgs
parents: 30
diff changeset
   280
    return 0;
30
hgs
parents:
diff changeset
   281
}
hgs
parents:
diff changeset
   282
hgs
parents:
diff changeset
   283
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   284
// VideoThumbnailDataPrivate::doBackgroundFetching()
hgs
parents:
diff changeset
   285
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   286
//
hgs
parents:
diff changeset
   287
void VideoThumbnailDataPrivate::doBackgroundFetching()
hgs
parents:
diff changeset
   288
{
36
hgs
parents: 35
diff changeset
   289
	FUNC_LOG;
44
hgs
parents: 38
diff changeset
   290
	INFO_1("VideoThumbnailDataPrivate::doBackgroundFetching() bg fetch count: %d", mCurrentBackgroundFetchCount);
hgs
parents: 38
diff changeset
   291
	
34
hgs
parents: 30
diff changeset
   292
    if(!mCurrentModel || !mThumbnailFetcher)
30
hgs
parents:
diff changeset
   293
    {
hgs
parents:
diff changeset
   294
        return;
hgs
parents:
diff changeset
   295
    }
44
hgs
parents: 38
diff changeset
   296
    
30
hgs
parents:
diff changeset
   297
    if(mCurrentBackgroundFetchCount >= THUMBNAIL_CACHE_SIZE)
hgs
parents:
diff changeset
   298
    {
hgs
parents:
diff changeset
   299
        return;
hgs
parents:
diff changeset
   300
    }
hgs
parents:
diff changeset
   301
    
34
hgs
parents: 30
diff changeset
   302
    int maxIndex = mCurrentModel->rowCount();
30
hgs
parents:
diff changeset
   303
    if(maxIndex == 0)
hgs
parents:
diff changeset
   304
    {
hgs
parents:
diff changeset
   305
        return;
hgs
parents:
diff changeset
   306
    }
hgs
parents:
diff changeset
   307
hgs
parents:
diff changeset
   308
    // Delta to UI index where fetch has been done already.  
hgs
parents:
diff changeset
   309
    int currentDelta = mCurrentBackgroundFetchCount/2;
hgs
parents:
diff changeset
   310
    
hgs
parents:
diff changeset
   311
    // How many will be fetched.  
hgs
parents:
diff changeset
   312
    const int fetchAmount = THUMBNAIL_BACKGROUND_FETCH_AMOUNT/2;
hgs
parents:
diff changeset
   313
hgs
parents:
diff changeset
   314
    QList<QModelIndex> indexes;
hgs
parents:
diff changeset
   315
34
hgs
parents: 30
diff changeset
   316
    // Items after the current fetch index.
hgs
parents: 30
diff changeset
   317
    int startIndex = mCurrentFetchIndex+currentDelta;
hgs
parents: 30
diff changeset
   318
    int endIndex = mCurrentFetchIndex+currentDelta+fetchAmount;
30
hgs
parents:
diff changeset
   319
    getModelIndexes(indexes, startIndex, endIndex);
hgs
parents:
diff changeset
   320
34
hgs
parents: 30
diff changeset
   321
    // Items before the current fetch index.
hgs
parents: 30
diff changeset
   322
    startIndex = mCurrentFetchIndex-currentDelta-fetchAmount;
hgs
parents: 30
diff changeset
   323
    endIndex = mCurrentFetchIndex-currentDelta;
30
hgs
parents:
diff changeset
   324
    getModelIndexes(indexes, startIndex, endIndex);
34
hgs
parents: 30
diff changeset
   325
    
30
hgs
parents:
diff changeset
   326
    mCurrentBackgroundFetchCount += THUMBNAIL_BACKGROUND_FETCH_AMOUNT;
hgs
parents:
diff changeset
   327
hgs
parents:
diff changeset
   328
    int fetchesStarted = startFetchingThumbnails(indexes, BACKGROUND_FETCH_PRIORITY);
hgs
parents:
diff changeset
   329
    
hgs
parents:
diff changeset
   330
    // No thumbnails to fetch, start again.
hgs
parents:
diff changeset
   331
    if(fetchesStarted == 0)
hgs
parents:
diff changeset
   332
    {
hgs
parents:
diff changeset
   333
        continueBackgroundFetch();
hgs
parents:
diff changeset
   334
    }
hgs
parents:
diff changeset
   335
}
hgs
parents:
diff changeset
   336
hgs
parents:
diff changeset
   337
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   338
// VideoThumbnailDataPrivate::getModelIndexes()
hgs
parents:
diff changeset
   339
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   340
//
50
hgs
parents: 44
diff changeset
   341
void VideoThumbnailDataPrivate::getModelIndexes(QList<QModelIndex> &indexes, int &startIndex, int &endIndex)
30
hgs
parents:
diff changeset
   342
{
36
hgs
parents: 35
diff changeset
   343
	FUNC_LOG;
44
hgs
parents: 38
diff changeset
   344
    INFO_2("VideoThumbnailDataPrivate::getModelIndexes() from %d to %d", startIndex, endIndex);
hgs
parents: 38
diff changeset
   345
	
30
hgs
parents:
diff changeset
   346
    QModelIndex index;
hgs
parents:
diff changeset
   347
    for(int i = startIndex; i < endIndex; i++)
hgs
parents:
diff changeset
   348
    {
hgs
parents:
diff changeset
   349
        if(i >= 0)
hgs
parents:
diff changeset
   350
        {
34
hgs
parents: 30
diff changeset
   351
            index = mCurrentModel->index(i, 0);
30
hgs
parents:
diff changeset
   352
            if(index.isValid())
hgs
parents:
diff changeset
   353
            {
hgs
parents:
diff changeset
   354
                indexes.append(index);
hgs
parents:
diff changeset
   355
            }
hgs
parents:
diff changeset
   356
        }
hgs
parents:
diff changeset
   357
    }
hgs
parents:
diff changeset
   358
}
hgs
parents:
diff changeset
   359
hgs
parents:
diff changeset
   360
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   361
// VideoThumbnailDataPrivate::thumbnailReadySlot()
hgs
parents:
diff changeset
   362
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   363
//
37
hgs
parents: 36
diff changeset
   364
void VideoThumbnailDataPrivate::thumbnailReadySlot(QPixmap tnData, const TMPXItemId &mediaId, int error)
30
hgs
parents:
diff changeset
   365
{
hgs
parents:
diff changeset
   366
    if(!error && !tnData.isNull())
hgs
parents:
diff changeset
   367
    {
hgs
parents:
diff changeset
   368
        mThumbnailData.insert(mediaId, new QIcon(tnData));
hgs
parents:
diff changeset
   369
        
hgs
parents:
diff changeset
   370
        // Gather list of media ids and emit thumbnailReady signals in larger set
hgs
parents:
diff changeset
   371
        // when timer goes off.
hgs
parents:
diff changeset
   372
        if(mTbnReportTimer && !mTbnReportTimer->isActive())
hgs
parents:
diff changeset
   373
        {
hgs
parents:
diff changeset
   374
            mTbnReportTimer->setSingleShot(true);
hgs
parents:
diff changeset
   375
            mTbnReportTimer->start(THUMBNAIL_READY_SIGNAL_TIMEOUT);
hgs
parents:
diff changeset
   376
        }
hgs
parents:
diff changeset
   377
hgs
parents:
diff changeset
   378
        // Save the media id for the signal.  
hgs
parents:
diff changeset
   379
        mReadyThumbnailMediaIds.append(mediaId);
hgs
parents:
diff changeset
   380
    }
hgs
parents:
diff changeset
   381
}
hgs
parents:
diff changeset
   382
hgs
parents:
diff changeset
   383
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   384
// VideoThumbnailDataPrivate::reportThumbnailsReadySlot()
hgs
parents:
diff changeset
   385
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   386
//
hgs
parents:
diff changeset
   387
void VideoThumbnailDataPrivate::reportThumbnailsReadySlot()
hgs
parents:
diff changeset
   388
{
36
hgs
parents: 35
diff changeset
   389
	FUNC_LOG;
30
hgs
parents:
diff changeset
   390
    emit thumbnailsFetched(mReadyThumbnailMediaIds);
hgs
parents:
diff changeset
   391
    mReadyThumbnailMediaIds.clear();
hgs
parents:
diff changeset
   392
}
hgs
parents:
diff changeset
   393
hgs
parents:
diff changeset
   394
// -----------------------------------------------------------------------------
34
hgs
parents: 30
diff changeset
   395
// VideoThumbnailDataPrivate::allThumbnailsFetchedSlot()
30
hgs
parents:
diff changeset
   396
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   397
//
34
hgs
parents: 30
diff changeset
   398
void VideoThumbnailDataPrivate::allThumbnailsFetchedSlot()
30
hgs
parents:
diff changeset
   399
{
36
hgs
parents: 35
diff changeset
   400
	FUNC_LOG;
34
hgs
parents: 30
diff changeset
   401
    continueBackgroundFetch();
30
hgs
parents:
diff changeset
   402
}
hgs
parents:
diff changeset
   403
hgs
parents:
diff changeset
   404
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   405
// VideoThumbnailDataPrivate::defaultThumbnail()
hgs
parents:
diff changeset
   406
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   407
//
50
hgs
parents: 44
diff changeset
   408
const QIcon* VideoThumbnailDataPrivate::defaultThumbnail(const TMPXItemId &mediaId)
30
hgs
parents:
diff changeset
   409
{
58
hgs
parents: 50
diff changeset
   410
    FUNC_LOG;
hgs
parents: 50
diff changeset
   411
    
hgs
parents: 50
diff changeset
   412
    if(!mBackgroundFetchingEnabled)
hgs
parents: 50
diff changeset
   413
    {
hgs
parents: 50
diff changeset
   414
        return 0;
hgs
parents: 50
diff changeset
   415
    }
hgs
parents: 50
diff changeset
   416
    
35
hgs
parents: 34
diff changeset
   417
    const TMPXItemId defaultIdVideo(KMaxTUint32-1, KVcxMvcMediaTypeVideo);
hgs
parents: 34
diff changeset
   418
    const TMPXItemId defaultIdAlbum(KMaxTUint32-1, KVcxMvcMediaTypeAlbum);
hgs
parents: 34
diff changeset
   419
    const TMPXItemId defaultIdDownloads(KVcxMvcCategoryIdDownloads, KVcxMvcMediaTypeCategory);
hgs
parents: 34
diff changeset
   420
    const TMPXItemId defaultIdCaptured(KVcxMvcCategoryIdCaptured, KVcxMvcMediaTypeCategory);
hgs
parents: 34
diff changeset
   421
hgs
parents: 34
diff changeset
   422
    // Default thumbnail for video
58
hgs
parents: 50
diff changeset
   423
    if(mediaId.iId2 == KVcxMvcMediaTypeVideo)
30
hgs
parents:
diff changeset
   424
    {
35
hgs
parents: 34
diff changeset
   425
        if(!mDefaultThumbnails.contains(defaultIdVideo))
hgs
parents: 34
diff changeset
   426
        {
38
hgs
parents: 37
diff changeset
   427
            mDefaultThumbnails[defaultIdVideo] = loadIcon("qtg_large_video");
35
hgs
parents: 34
diff changeset
   428
        }
58
hgs
parents: 50
diff changeset
   429
        return mDefaultThumbnails[defaultIdVideo];
30
hgs
parents:
diff changeset
   430
    }
hgs
parents:
diff changeset
   431
    else
hgs
parents:
diff changeset
   432
    {
35
hgs
parents: 34
diff changeset
   433
        // Default thumbnail for user defined album.
hgs
parents: 34
diff changeset
   434
        if(mediaId.iId2 == KVcxMvcMediaTypeAlbum)
hgs
parents: 34
diff changeset
   435
        {
hgs
parents: 34
diff changeset
   436
            if(!mDefaultThumbnails.contains(defaultIdAlbum))
hgs
parents: 34
diff changeset
   437
            {
38
hgs
parents: 37
diff changeset
   438
                mDefaultThumbnails[defaultIdAlbum] = loadIcon("qtg_large_video_collection");
35
hgs
parents: 34
diff changeset
   439
            }
58
hgs
parents: 50
diff changeset
   440
            return mDefaultThumbnails[defaultIdAlbum];
35
hgs
parents: 34
diff changeset
   441
        }
hgs
parents: 34
diff changeset
   442
hgs
parents: 34
diff changeset
   443
        // Thumbnails for default collections.
hgs
parents: 34
diff changeset
   444
        switch(mediaId.iId1)
hgs
parents: 34
diff changeset
   445
        {
hgs
parents: 34
diff changeset
   446
            case KVcxMvcCategoryIdDownloads:
hgs
parents: 34
diff changeset
   447
            {
hgs
parents: 34
diff changeset
   448
                if(!mDefaultThumbnails.contains(defaultIdDownloads))
hgs
parents: 34
diff changeset
   449
                {
38
hgs
parents: 37
diff changeset
   450
                    mDefaultThumbnails[defaultIdDownloads] = loadIcon("qtg_large_video_download");
35
hgs
parents: 34
diff changeset
   451
                }
58
hgs
parents: 50
diff changeset
   452
                return mDefaultThumbnails[defaultIdDownloads];
35
hgs
parents: 34
diff changeset
   453
            }
hgs
parents: 34
diff changeset
   454
            
hgs
parents: 34
diff changeset
   455
            case KVcxMvcCategoryIdCaptured:
hgs
parents: 34
diff changeset
   456
            {
hgs
parents: 34
diff changeset
   457
                if(!mDefaultThumbnails.contains(defaultIdCaptured))
hgs
parents: 34
diff changeset
   458
                {
38
hgs
parents: 37
diff changeset
   459
                    mDefaultThumbnails[defaultIdCaptured] = loadIcon("qtg_large_video_capture");
35
hgs
parents: 34
diff changeset
   460
                }
58
hgs
parents: 50
diff changeset
   461
                return mDefaultThumbnails[defaultIdCaptured];
35
hgs
parents: 34
diff changeset
   462
            }
hgs
parents: 34
diff changeset
   463
hgs
parents: 34
diff changeset
   464
            default:
hgs
parents: 34
diff changeset
   465
            {
58
hgs
parents: 50
diff changeset
   466
                return 0;
35
hgs
parents: 34
diff changeset
   467
            }
hgs
parents: 34
diff changeset
   468
        }
30
hgs
parents:
diff changeset
   469
    }
hgs
parents:
diff changeset
   470
}
hgs
parents:
diff changeset
   471
hgs
parents:
diff changeset
   472
// -----------------------------------------------------------------------------
38
hgs
parents: 37
diff changeset
   473
// VideoThumbnailDataPrivate::loadIcon()
hgs
parents: 37
diff changeset
   474
// -----------------------------------------------------------------------------
hgs
parents: 37
diff changeset
   475
//
58
hgs
parents: 50
diff changeset
   476
QIcon *VideoThumbnailDataPrivate::loadIcon(QString iconName)
hgs
parents: 50
diff changeset
   477
{   
hgs
parents: 50
diff changeset
   478
    FUNC_LOG;
38
hgs
parents: 37
diff changeset
   479
    
58
hgs
parents: 50
diff changeset
   480
    HbIcon resource(iconName);
hgs
parents: 50
diff changeset
   481
    QIcon *icon = 0;
hgs
parents: 50
diff changeset
   482
    
hgs
parents: 50
diff changeset
   483
    if(!resource.isNull())
38
hgs
parents: 37
diff changeset
   484
    {
58
hgs
parents: 50
diff changeset
   485
        // Set matching height, width is adjusted automaticly.
hgs
parents: 50
diff changeset
   486
        resource.setHeight(DEFAULT_THUMBNAIL_HEIGHT);
hgs
parents: 50
diff changeset
   487
        
38
hgs
parents: 37
diff changeset
   488
        QPixmap dest = QPixmap(DEFAULT_THUMBNAIL_WIDTH, DEFAULT_THUMBNAIL_HEIGHT);
hgs
parents: 37
diff changeset
   489
        
hgs
parents: 37
diff changeset
   490
        QPainter painter(&dest);
hgs
parents: 37
diff changeset
   491
        painter.setCompositionMode(QPainter::CompositionMode_Source);
58
hgs
parents: 50
diff changeset
   492
        painter.fillRect(dest.rect(), Qt::transparent);        
hgs
parents: 50
diff changeset
   493
        resource.paint(&painter, dest.rect());
38
hgs
parents: 37
diff changeset
   494
        painter.end();
hgs
parents: 37
diff changeset
   495
        
58
hgs
parents: 50
diff changeset
   496
        icon = new QIcon(dest);
38
hgs
parents: 37
diff changeset
   497
    }
58
hgs
parents: 50
diff changeset
   498
    
hgs
parents: 50
diff changeset
   499
    return icon;
38
hgs
parents: 37
diff changeset
   500
}
hgs
parents: 37
diff changeset
   501
hgs
parents: 37
diff changeset
   502
// -----------------------------------------------------------------------------
30
hgs
parents:
diff changeset
   503
// VideoThumbnailDataPrivate::removeThumbnail()
hgs
parents:
diff changeset
   504
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   505
//
50
hgs
parents: 44
diff changeset
   506
bool VideoThumbnailDataPrivate::removeThumbnail(const TMPXItemId &mediaId)
30
hgs
parents:
diff changeset
   507
{
36
hgs
parents: 35
diff changeset
   508
	FUNC_LOG;
30
hgs
parents:
diff changeset
   509
    return mThumbnailData.remove(mediaId);
hgs
parents:
diff changeset
   510
}
hgs
parents:
diff changeset
   511
hgs
parents:
diff changeset
   512
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   513
// VideoThumbnailDataPrivate::enableBackgroundFetching()
hgs
parents:
diff changeset
   514
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   515
//
hgs
parents:
diff changeset
   516
void VideoThumbnailDataPrivate::enableBackgroundFetching(bool enable)
hgs
parents:
diff changeset
   517
{
36
hgs
parents: 35
diff changeset
   518
	FUNC_LOG;
hgs
parents: 35
diff changeset
   519
    INFO_1("VideoThumbnailDataPrivate::enableBackgroundFetching() enable: %d", enable);
30
hgs
parents:
diff changeset
   520
    mBackgroundFetchingEnabled = enable;
34
hgs
parents: 30
diff changeset
   521
    startBackgroundFetching(mCurrentModel, 0);
hgs
parents: 30
diff changeset
   522
}
hgs
parents: 30
diff changeset
   523
hgs
parents: 30
diff changeset
   524
// -----------------------------------------------------------------------------
hgs
parents: 30
diff changeset
   525
// VideoThumbnailDataPrivate::enableThumbnailCreation()
hgs
parents: 30
diff changeset
   526
// -----------------------------------------------------------------------------
hgs
parents: 30
diff changeset
   527
//
hgs
parents: 30
diff changeset
   528
void VideoThumbnailDataPrivate::enableThumbnailCreation(bool enable)
hgs
parents: 30
diff changeset
   529
{
36
hgs
parents: 35
diff changeset
   530
	FUNC_LOG;
hgs
parents: 35
diff changeset
   531
	INFO_1("VideoThumbnailDataPrivate::enableThumbnailCreation() enable: %d", enable);
34
hgs
parents: 30
diff changeset
   532
    if(mThumbnailFetcher)
36
hgs
parents: 35
diff changeset
   533
    {
34
hgs
parents: 30
diff changeset
   534
        mThumbnailFetcher->enableThumbnailCreation(enable);
36
hgs
parents: 35
diff changeset
   535
    }
30
hgs
parents:
diff changeset
   536
}
hgs
parents:
diff changeset
   537
hgs
parents:
diff changeset
   538
// -----------------------------------------------------------------------------
50
hgs
parents: 44
diff changeset
   539
// VideoThumbnailDataPrivate::backgroundFetchingEnabled()
hgs
parents: 44
diff changeset
   540
// -----------------------------------------------------------------------------
hgs
parents: 44
diff changeset
   541
//
hgs
parents: 44
diff changeset
   542
bool VideoThumbnailDataPrivate::backgroundFetchingEnabled()
hgs
parents: 44
diff changeset
   543
{
hgs
parents: 44
diff changeset
   544
    return mBackgroundFetchingEnabled;
hgs
parents: 44
diff changeset
   545
}
hgs
parents: 44
diff changeset
   546
hgs
parents: 44
diff changeset
   547
// -----------------------------------------------------------------------------
30
hgs
parents:
diff changeset
   548
// VideoThumbnailDataPrivate::freeThumbnailData()
hgs
parents:
diff changeset
   549
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   550
//
hgs
parents:
diff changeset
   551
void VideoThumbnailDataPrivate::freeThumbnailData()
hgs
parents:
diff changeset
   552
{
36
hgs
parents: 35
diff changeset
   553
	FUNC_LOG;
30
hgs
parents:
diff changeset
   554
    // Stop timers.
37
hgs
parents: 36
diff changeset
   555
	if(mBgFetchTimer)
36
hgs
parents: 35
diff changeset
   556
    {
30
hgs
parents:
diff changeset
   557
        mBgFetchTimer->stop();
36
hgs
parents: 35
diff changeset
   558
    }
30
hgs
parents:
diff changeset
   559
    
hgs
parents:
diff changeset
   560
    if(mTbnReportTimer)
36
hgs
parents: 35
diff changeset
   561
    {
30
hgs
parents:
diff changeset
   562
        mTbnReportTimer->stop();
36
hgs
parents: 35
diff changeset
   563
    }
30
hgs
parents:
diff changeset
   564
34
hgs
parents: 30
diff changeset
   565
    if(mThumbnailFetcher)
36
hgs
parents: 35
diff changeset
   566
    {
34
hgs
parents: 30
diff changeset
   567
        mThumbnailFetcher->cancelFetches();
36
hgs
parents: 35
diff changeset
   568
    }
34
hgs
parents: 30
diff changeset
   569
    
30
hgs
parents:
diff changeset
   570
    // Clear data.
hgs
parents:
diff changeset
   571
    mReadyThumbnailMediaIds.clear();
hgs
parents:
diff changeset
   572
    mThumbnailData.clear();
58
hgs
parents: 50
diff changeset
   573
    
hgs
parents: 50
diff changeset
   574
    QHash<TMPXItemId, QIcon *>::const_iterator iter = mDefaultThumbnails.constBegin();
hgs
parents: 50
diff changeset
   575
    while(iter != mDefaultThumbnails.constEnd())
hgs
parents: 50
diff changeset
   576
    {
hgs
parents: 50
diff changeset
   577
        delete *iter;
hgs
parents: 50
diff changeset
   578
        iter++;
hgs
parents: 50
diff changeset
   579
    }
35
hgs
parents: 34
diff changeset
   580
    mDefaultThumbnails.clear();
30
hgs
parents:
diff changeset
   581
}
hgs
parents:
diff changeset
   582
hgs
parents:
diff changeset
   583
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   584
// VideoThumbnailDataPrivate::startBackgroundFetching()
hgs
parents:
diff changeset
   585
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   586
//
58
hgs
parents: 50
diff changeset
   587
void VideoThumbnailDataPrivate::startBackgroundFetching(VideoProxyModelGeneric *model, int fetchIndex)
30
hgs
parents:
diff changeset
   588
{
36
hgs
parents: 35
diff changeset
   589
	FUNC_LOG;
37
hgs
parents: 36
diff changeset
   590
hgs
parents: 36
diff changeset
   591
    // If model is null, we continue using the current one. Model and index are kept up to date even
hgs
parents: 36
diff changeset
   592
	// fetching is not enabled.
34
hgs
parents: 30
diff changeset
   593
    if(model)
36
hgs
parents: 35
diff changeset
   594
    {
34
hgs
parents: 30
diff changeset
   595
        mCurrentModel = model;
36
hgs
parents: 35
diff changeset
   596
    }
34
hgs
parents: 30
diff changeset
   597
    
30
hgs
parents:
diff changeset
   598
    mCurrentFetchIndex = fetchIndex;
hgs
parents:
diff changeset
   599
    mCurrentBackgroundFetchCount = 0;
37
hgs
parents: 36
diff changeset
   600
	
hgs
parents: 36
diff changeset
   601
	if(!mBackgroundFetchingEnabled || !mThumbnailFetcher)
hgs
parents: 36
diff changeset
   602
    {
hgs
parents: 36
diff changeset
   603
        INFO("VideoThumbnailDataPrivate::startBackgroundFetching() fetching is disabled.");
hgs
parents: 36
diff changeset
   604
        return;
hgs
parents: 36
diff changeset
   605
    }
44
hgs
parents: 38
diff changeset
   606
hgs
parents: 38
diff changeset
   607
    if(mBgFetchTimer)
hgs
parents: 38
diff changeset
   608
    {
hgs
parents: 38
diff changeset
   609
        mBgFetchTimer->stop();
hgs
parents: 38
diff changeset
   610
    }
hgs
parents: 38
diff changeset
   611
	
30
hgs
parents:
diff changeset
   612
    doBackgroundFetching();
hgs
parents:
diff changeset
   613
}
hgs
parents:
diff changeset
   614
hgs
parents:
diff changeset
   615
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   616
// VideoThumbnailDataPrivate::continueBackgroundFetch()
hgs
parents:
diff changeset
   617
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   618
//
hgs
parents:
diff changeset
   619
void VideoThumbnailDataPrivate::continueBackgroundFetch()
hgs
parents:
diff changeset
   620
{
36
hgs
parents: 35
diff changeset
   621
	FUNC_LOG;
30
hgs
parents:
diff changeset
   622
    if(!mBackgroundFetchingEnabled)
36
hgs
parents: 35
diff changeset
   623
    {
37
hgs
parents: 36
diff changeset
   624
        INFO("VideoThumbnailDataPrivate::continueBackgroundFetch() fetching is disabled.")
30
hgs
parents:
diff changeset
   625
        return;
36
hgs
parents: 35
diff changeset
   626
    }
30
hgs
parents:
diff changeset
   627
hgs
parents:
diff changeset
   628
    if(mBgFetchTimer)
hgs
parents:
diff changeset
   629
    {
hgs
parents:
diff changeset
   630
        mBgFetchTimer->stop();
hgs
parents:
diff changeset
   631
        mBgFetchTimer->setSingleShot(true);
hgs
parents:
diff changeset
   632
        mBgFetchTimer->start(THUMBNAIL_BACKGROUND_TIMEOUT);
hgs
parents:
diff changeset
   633
    }
hgs
parents:
diff changeset
   634
}
hgs
parents:
diff changeset
   635
hgs
parents:
diff changeset
   636
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   637
// VideoThumbnailDataPrivate::aboutToQuitSlot()
hgs
parents:
diff changeset
   638
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   639
//
hgs
parents:
diff changeset
   640
void VideoThumbnailDataPrivate::aboutToQuitSlot()
hgs
parents:
diff changeset
   641
{
36
hgs
parents: 35
diff changeset
   642
	FUNC_LOG;
30
hgs
parents:
diff changeset
   643
    cleanup();
hgs
parents:
diff changeset
   644
}
hgs
parents:
diff changeset
   645
hgs
parents:
diff changeset
   646
// End of file