videocollection/videocollectionwrapper/src/videothumbnaildata_p.cpp
author hgs
Thu, 01 Apr 2010 23:32:44 +0300
changeset 35 3738fe97f027
parent 34 bbb98528c666
child 36 8aed59de29f9
permissions -rw-r--r--
201011
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
hgs
parents:
diff changeset
    18
// INCLUDE FILES
34
hgs
parents: 30
diff changeset
    19
#include <qapplication.h>
hgs
parents: 30
diff changeset
    20
#include <qpixmap.h>
hgs
parents: 30
diff changeset
    21
#include <qtimer.h>
30
hgs
parents:
diff changeset
    22
#include <mpxmediageneraldefs.h>
35
hgs
parents: 34
diff changeset
    23
#include <hbicon.h>
hgs
parents: 34
diff changeset
    24
34
hgs
parents: 30
diff changeset
    25
#include <vcxmyvideosdefs.h>
30
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
#include "videothumbnaildata_p.h"
hgs
parents:
diff changeset
    28
#include "videocollectionwrapper.h"
hgs
parents:
diff changeset
    29
#include "videosortfilterproxymodel.h"
34
hgs
parents: 30
diff changeset
    30
#include "videothumbnailfetcher.h"
30
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
// Maximum thumbnails kept in memory.
hgs
parents:
diff changeset
    33
const int THUMBNAIL_CACHE_SIZE = 60;
hgs
parents:
diff changeset
    34
// Maximum of thumbnail fetches done at one background fetch round.
hgs
parents:
diff changeset
    35
const int THUMBNAIL_BACKGROUND_FETCH_AMOUNT = 20;
hgs
parents:
diff changeset
    36
// Milliseconds for the background fetch timer.
hgs
parents:
diff changeset
    37
const int THUMBNAIL_BACKGROUND_TIMEOUT = 100;
hgs
parents:
diff changeset
    38
// Milliseconds while thumbnail ready events are gathered before they 
hgs
parents:
diff changeset
    39
// are signaled.
hgs
parents:
diff changeset
    40
const int THUMBNAIL_READY_SIGNAL_TIMEOUT = 50;
hgs
parents:
diff changeset
    41
// Priority for background thumbnail fetches.
hgs
parents:
diff changeset
    42
const int BACKGROUND_FETCH_PRIORITY = 3000;
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
/**
hgs
parents:
diff changeset
    45
 * global qHash function required fo creating hash values for TMPXItemId -keys
hgs
parents:
diff changeset
    46
 */
hgs
parents:
diff changeset
    47
inline uint qHash(TMPXItemId key) 
hgs
parents:
diff changeset
    48
{ 
hgs
parents:
diff changeset
    49
    QPair<uint, uint> keyPair(key.iId1, key.iId2); 
hgs
parents:
diff changeset
    50
hgs
parents:
diff changeset
    51
    return qHash(keyPair);
hgs
parents:
diff changeset
    52
}
hgs
parents:
diff changeset
    53
hgs
parents:
diff changeset
    54
// ================= MEMBER FUNCTIONS =======================
hgs
parents:
diff changeset
    55
//
hgs
parents:
diff changeset
    56
hgs
parents:
diff changeset
    57
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    58
// VideoThumbnailDataPrivate::VideoThumbnailDataPrivate()
hgs
parents:
diff changeset
    59
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    60
//
hgs
parents:
diff changeset
    61
VideoThumbnailDataPrivate::VideoThumbnailDataPrivate() :
34
hgs
parents: 30
diff changeset
    62
    mThumbnailFetcher(0),
hgs
parents: 30
diff changeset
    63
    mCurrentModel(0),
30
hgs
parents:
diff changeset
    64
    mCurrentFetchIndex(0),
hgs
parents:
diff changeset
    65
    mCurrentBackgroundFetchCount(0),
hgs
parents:
diff changeset
    66
    mBgFetchTimer(0),
hgs
parents:
diff changeset
    67
    mTbnReportTimer(0),
hgs
parents:
diff changeset
    68
    mSignalsConnected(false),
hgs
parents:
diff changeset
    69
    mBackgroundFetchingEnabled(true)
hgs
parents:
diff changeset
    70
{
hgs
parents:
diff changeset
    71
    initialize();
hgs
parents:
diff changeset
    72
}
hgs
parents:
diff changeset
    73
hgs
parents:
diff changeset
    74
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    75
// VideoThumbnailDataPrivate::~VideoThumbnailDataPrivate()
hgs
parents:
diff changeset
    76
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    77
//
hgs
parents:
diff changeset
    78
VideoThumbnailDataPrivate::~VideoThumbnailDataPrivate()
hgs
parents:
diff changeset
    79
{
hgs
parents:
diff changeset
    80
    cleanup();
hgs
parents:
diff changeset
    81
}
hgs
parents:
diff changeset
    82
hgs
parents:
diff changeset
    83
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    84
// VideoThumbnailDataPrivate::initialize()
hgs
parents:
diff changeset
    85
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    86
//
hgs
parents:
diff changeset
    87
int VideoThumbnailDataPrivate::initialize()
hgs
parents:
diff changeset
    88
{
hgs
parents:
diff changeset
    89
    mThumbnailData.setMaxCost(THUMBNAIL_CACHE_SIZE);
hgs
parents:
diff changeset
    90
    
34
hgs
parents: 30
diff changeset
    91
    if(!mThumbnailFetcher)
30
hgs
parents:
diff changeset
    92
    {
34
hgs
parents: 30
diff changeset
    93
        mThumbnailFetcher = new VideoThumbnailFetcher();        
30
hgs
parents:
diff changeset
    94
    }
hgs
parents:
diff changeset
    95
hgs
parents:
diff changeset
    96
    if(!mBgFetchTimer)
hgs
parents:
diff changeset
    97
    {
hgs
parents:
diff changeset
    98
        mBgFetchTimer = new QTimer();
hgs
parents:
diff changeset
    99
    }
hgs
parents:
diff changeset
   100
    
hgs
parents:
diff changeset
   101
    if(!mTbnReportTimer)
hgs
parents:
diff changeset
   102
    {
hgs
parents:
diff changeset
   103
        mTbnReportTimer = new QTimer();
hgs
parents:
diff changeset
   104
    }
hgs
parents:
diff changeset
   105
hgs
parents:
diff changeset
   106
    if(connectSignals() < 0)
hgs
parents:
diff changeset
   107
    {
hgs
parents:
diff changeset
   108
        cleanup();
hgs
parents:
diff changeset
   109
        return -1;
hgs
parents:
diff changeset
   110
    }
hgs
parents:
diff changeset
   111
    
hgs
parents:
diff changeset
   112
    return 0;
hgs
parents:
diff changeset
   113
}
hgs
parents:
diff changeset
   114
hgs
parents:
diff changeset
   115
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   116
// VideoThumbnailDataPrivate::cleanup()
hgs
parents:
diff changeset
   117
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   118
//
hgs
parents:
diff changeset
   119
void VideoThumbnailDataPrivate::cleanup()
hgs
parents:
diff changeset
   120
{
hgs
parents:
diff changeset
   121
    disconnectSignals();
hgs
parents:
diff changeset
   122
34
hgs
parents: 30
diff changeset
   123
    delete mThumbnailFetcher;
hgs
parents: 30
diff changeset
   124
    mThumbnailFetcher = 0;
hgs
parents: 30
diff changeset
   125
    
30
hgs
parents:
diff changeset
   126
    freeThumbnailData();
hgs
parents:
diff changeset
   127
    
hgs
parents:
diff changeset
   128
    if(mTbnReportTimer)
hgs
parents:
diff changeset
   129
    {
hgs
parents:
diff changeset
   130
        mTbnReportTimer->stop();
hgs
parents:
diff changeset
   131
        delete mTbnReportTimer;
hgs
parents:
diff changeset
   132
        mTbnReportTimer = 0;
hgs
parents:
diff changeset
   133
    }
hgs
parents:
diff changeset
   134
    
hgs
parents:
diff changeset
   135
    if(mBgFetchTimer)
hgs
parents:
diff changeset
   136
    {
hgs
parents:
diff changeset
   137
        mBgFetchTimer->stop();
hgs
parents:
diff changeset
   138
        delete mBgFetchTimer;
hgs
parents:
diff changeset
   139
        mBgFetchTimer = 0;
hgs
parents:
diff changeset
   140
    }
hgs
parents:
diff changeset
   141
}
hgs
parents:
diff changeset
   142
hgs
parents:
diff changeset
   143
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   144
// VideoThumbnailDataPrivate::disconnectSignals()
hgs
parents:
diff changeset
   145
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   146
//
hgs
parents:
diff changeset
   147
void VideoThumbnailDataPrivate::disconnectSignals()
hgs
parents:
diff changeset
   148
{
hgs
parents:
diff changeset
   149
    if(mSignalsConnected)
hgs
parents:
diff changeset
   150
    {
34
hgs
parents: 30
diff changeset
   151
        VideoSortFilterProxyModel *model = 
hgs
parents: 30
diff changeset
   152
                VideoCollectionWrapper::instance().getModel(VideoCollectionWrapper::EAllVideos);
hgs
parents: 30
diff changeset
   153
        if(model)
hgs
parents: 30
diff changeset
   154
            {
hgs
parents: 30
diff changeset
   155
            disconnect(model->sourceModel(), SIGNAL(modelReady()), this, SLOT(modelChangedSlot()));
hgs
parents: 30
diff changeset
   156
            disconnect(model->sourceModel(), SIGNAL(modelChanged()), this, SLOT(modelChangedSlot()));
hgs
parents: 30
diff changeset
   157
            }
hgs
parents: 30
diff changeset
   158
		disconnect(mThumbnailFetcher, SIGNAL(thumbnailReady( QPixmap , void *, int )),
hgs
parents: 30
diff changeset
   159
                    this, SLOT(thumbnailReadySlot( QPixmap , void *, int )));
hgs
parents: 30
diff changeset
   160
        disconnect(mThumbnailFetcher, SIGNAL(allThumbnailsFetched()),
hgs
parents: 30
diff changeset
   161
                 this, SLOT(allThumbnailsFetchedSlot()));          
30
hgs
parents:
diff changeset
   162
        disconnect(mBgFetchTimer, SIGNAL(timeout()), this, SLOT(doBackgroundFetching()));
hgs
parents:
diff changeset
   163
        disconnect(mTbnReportTimer, SIGNAL(timeout()), this, SLOT(reportThumbnailsReadySlot()));
hgs
parents:
diff changeset
   164
    }
hgs
parents:
diff changeset
   165
    mSignalsConnected = false;
hgs
parents:
diff changeset
   166
}
hgs
parents:
diff changeset
   167
hgs
parents:
diff changeset
   168
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   169
// VideoThumbnailDataPrivate::connectSignals()
hgs
parents:
diff changeset
   170
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   171
//
hgs
parents:
diff changeset
   172
int VideoThumbnailDataPrivate::connectSignals()
hgs
parents:
diff changeset
   173
{
hgs
parents:
diff changeset
   174
    if(!mSignalsConnected)
hgs
parents:
diff changeset
   175
    {
34
hgs
parents: 30
diff changeset
   176
        VideoSortFilterProxyModel *model = 
hgs
parents: 30
diff changeset
   177
                VideoCollectionWrapper::instance().getModel(VideoCollectionWrapper::EAllVideos);
hgs
parents: 30
diff changeset
   178
        if(!model)
hgs
parents: 30
diff changeset
   179
            return -1;
hgs
parents: 30
diff changeset
   180
        if(!connect(mThumbnailFetcher, SIGNAL(thumbnailReady( QPixmap , void *, int )),
hgs
parents: 30
diff changeset
   181
                    this, SLOT(thumbnailReadySlot( QPixmap , void *, int))) ||
hgs
parents: 30
diff changeset
   182
            !connect(mThumbnailFetcher, SIGNAL(allThumbnailsFetched()),
hgs
parents: 30
diff changeset
   183
                     this, SLOT(allThumbnailsFetchedSlot())) ||
hgs
parents: 30
diff changeset
   184
           !connect(model->sourceModel(), SIGNAL(modelReady()), this, SLOT(modelChangedSlot())) ||
hgs
parents: 30
diff changeset
   185
           !connect(model->sourceModel(), SIGNAL(modelChanged()), this, SLOT(modelChangedSlot())) ||
30
hgs
parents:
diff changeset
   186
           !connect(mBgFetchTimer, SIGNAL(timeout()), this, SLOT(doBackgroundFetching())) ||
hgs
parents:
diff changeset
   187
           !connect(mTbnReportTimer, SIGNAL(timeout()), this, SLOT(reportThumbnailsReadySlot())))
hgs
parents:
diff changeset
   188
        {
hgs
parents:
diff changeset
   189
            return -1;
hgs
parents:
diff changeset
   190
        }
hgs
parents:
diff changeset
   191
        
hgs
parents:
diff changeset
   192
        QApplication *app = qApp;
hgs
parents:
diff changeset
   193
        if(!connect(app, SIGNAL(aboutToQuit()), this, SLOT(aboutToQuitSlot())))
hgs
parents:
diff changeset
   194
        {
hgs
parents:
diff changeset
   195
            return -1;
hgs
parents:
diff changeset
   196
        }
hgs
parents:
diff changeset
   197
        
hgs
parents:
diff changeset
   198
        mSignalsConnected = true;
hgs
parents:
diff changeset
   199
    }
hgs
parents:
diff changeset
   200
    return 0;
hgs
parents:
diff changeset
   201
}
hgs
parents:
diff changeset
   202
hgs
parents:
diff changeset
   203
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   204
// VideoThumbnailDataPrivate::getThumbnail()
hgs
parents:
diff changeset
   205
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   206
//
hgs
parents:
diff changeset
   207
const QIcon* VideoThumbnailDataPrivate::getThumbnail(TMPXItemId mediaId)
hgs
parents:
diff changeset
   208
{
hgs
parents:
diff changeset
   209
    const QIcon *thumbnail = mThumbnailData[mediaId];
hgs
parents:
diff changeset
   210
    if(!thumbnail)
hgs
parents:
diff changeset
   211
    {
hgs
parents:
diff changeset
   212
        return defaultThumbnail(mediaId);
hgs
parents:
diff changeset
   213
    }
hgs
parents:
diff changeset
   214
    return thumbnail;
hgs
parents:
diff changeset
   215
}
hgs
parents:
diff changeset
   216
hgs
parents:
diff changeset
   217
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   218
// VideoThumbnailDataPrivate::startFetchingThumbnails()
hgs
parents:
diff changeset
   219
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   220
//
hgs
parents:
diff changeset
   221
int VideoThumbnailDataPrivate::startFetchingThumbnails(const QList<QModelIndex> &indexes, int priority)
hgs
parents:
diff changeset
   222
{
34
hgs
parents: 30
diff changeset
   223
    if(!mCurrentModel || !mThumbnailFetcher)
30
hgs
parents:
diff changeset
   224
    {
hgs
parents:
diff changeset
   225
        return -1;
hgs
parents:
diff changeset
   226
    }
hgs
parents:
diff changeset
   227
    if(indexes.count() == 0)
hgs
parents:
diff changeset
   228
    {
hgs
parents:
diff changeset
   229
        return 0;
hgs
parents:
diff changeset
   230
    }
hgs
parents:
diff changeset
   231
    
34
hgs
parents: 30
diff changeset
   232
    mThumbnailFetcher->pauseFetching();
hgs
parents: 30
diff changeset
   233
hgs
parents: 30
diff changeset
   234
    int fetchCountBefore = mThumbnailFetcher->fetchCount();
30
hgs
parents:
diff changeset
   235
    
34
hgs
parents: 30
diff changeset
   236
    // Fetch the thumbnails
30
hgs
parents:
diff changeset
   237
    for(int i = 0; i < indexes.count(); i++)
hgs
parents:
diff changeset
   238
    {
34
hgs
parents: 30
diff changeset
   239
        startFetchingThumbnail(mCurrentModel->getMediaIdAtIndex(indexes[i]), priority--);
30
hgs
parents:
diff changeset
   240
    }
hgs
parents:
diff changeset
   241
    
34
hgs
parents: 30
diff changeset
   242
    int started = mThumbnailFetcher->fetchCount() - fetchCountBefore;
hgs
parents: 30
diff changeset
   243
    
hgs
parents: 30
diff changeset
   244
    mThumbnailFetcher->continueFetching();
hgs
parents: 30
diff changeset
   245
    
hgs
parents: 30
diff changeset
   246
    return started;
30
hgs
parents:
diff changeset
   247
}
hgs
parents:
diff changeset
   248
hgs
parents:
diff changeset
   249
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   250
// VideoThumbnailDataPrivate::startFetchingThumbnail()
hgs
parents:
diff changeset
   251
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   252
//
hgs
parents:
diff changeset
   253
int VideoThumbnailDataPrivate::startFetchingThumbnail(TMPXItemId mediaId, int priority)
hgs
parents:
diff changeset
   254
{
34
hgs
parents: 30
diff changeset
   255
    if(!mCurrentModel || !mThumbnailFetcher)
30
hgs
parents:
diff changeset
   256
    {
hgs
parents:
diff changeset
   257
        return -1;
hgs
parents:
diff changeset
   258
    }
hgs
parents:
diff changeset
   259
hgs
parents:
diff changeset
   260
    // Check that it's not fetched before.
hgs
parents:
diff changeset
   261
    if(mThumbnailData.contains(mediaId))
hgs
parents:
diff changeset
   262
    {
hgs
parents:
diff changeset
   263
        return 0;
hgs
parents:
diff changeset
   264
    }
hgs
parents:
diff changeset
   265
34
hgs
parents: 30
diff changeset
   266
    QString fileName = mCurrentModel->getMediaFilePathForId(mediaId);
hgs
parents: 30
diff changeset
   267
    
30
hgs
parents:
diff changeset
   268
    // object containing media id to be passed throught
hgs
parents:
diff changeset
   269
    // thumbnail generation process.
hgs
parents:
diff changeset
   270
    TMPXItemId *internal = new TMPXItemId(mediaId.iId1, mediaId.iId2);
hgs
parents:
diff changeset
   271
    
34
hgs
parents: 30
diff changeset
   272
    // Thumbnail fetcher signals into thumbnailReadySlot when thumbnail ready
30
hgs
parents:
diff changeset
   273
    if(fileName.length() > 0)
hgs
parents:
diff changeset
   274
    {
34
hgs
parents: 30
diff changeset
   275
        mThumbnailFetcher->addFetch(fileName, internal, priority);
30
hgs
parents:
diff changeset
   276
    }
hgs
parents:
diff changeset
   277
34
hgs
parents: 30
diff changeset
   278
    return 0;
30
hgs
parents:
diff changeset
   279
}
hgs
parents:
diff changeset
   280
hgs
parents:
diff changeset
   281
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   282
// VideoThumbnailDataPrivate::doBackgroundFetching()
hgs
parents:
diff changeset
   283
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   284
//
hgs
parents:
diff changeset
   285
void VideoThumbnailDataPrivate::doBackgroundFetching()
hgs
parents:
diff changeset
   286
{
34
hgs
parents: 30
diff changeset
   287
    if(!mCurrentModel || !mThumbnailFetcher)
30
hgs
parents:
diff changeset
   288
    {
hgs
parents:
diff changeset
   289
        return;
hgs
parents:
diff changeset
   290
    }
hgs
parents:
diff changeset
   291
hgs
parents:
diff changeset
   292
    if(mCurrentBackgroundFetchCount >= THUMBNAIL_CACHE_SIZE)
hgs
parents:
diff changeset
   293
    {
hgs
parents:
diff changeset
   294
        return;
hgs
parents:
diff changeset
   295
    }
hgs
parents:
diff changeset
   296
    
34
hgs
parents: 30
diff changeset
   297
    int maxIndex = mCurrentModel->rowCount();
30
hgs
parents:
diff changeset
   298
    if(maxIndex == 0)
hgs
parents:
diff changeset
   299
    {
hgs
parents:
diff changeset
   300
        return;
hgs
parents:
diff changeset
   301
    }
hgs
parents:
diff changeset
   302
hgs
parents:
diff changeset
   303
    // Delta to UI index where fetch has been done already.  
hgs
parents:
diff changeset
   304
    int currentDelta = mCurrentBackgroundFetchCount/2;
hgs
parents:
diff changeset
   305
    
hgs
parents:
diff changeset
   306
    // How many will be fetched.  
hgs
parents:
diff changeset
   307
    const int fetchAmount = THUMBNAIL_BACKGROUND_FETCH_AMOUNT/2;
hgs
parents:
diff changeset
   308
hgs
parents:
diff changeset
   309
    QList<QModelIndex> indexes;
hgs
parents:
diff changeset
   310
34
hgs
parents: 30
diff changeset
   311
    // Items after the current fetch index.
hgs
parents: 30
diff changeset
   312
    int startIndex = mCurrentFetchIndex+currentDelta;
hgs
parents: 30
diff changeset
   313
    int endIndex = mCurrentFetchIndex+currentDelta+fetchAmount;
30
hgs
parents:
diff changeset
   314
    getModelIndexes(indexes, startIndex, endIndex);
hgs
parents:
diff changeset
   315
34
hgs
parents: 30
diff changeset
   316
    // Items before the current fetch index.
hgs
parents: 30
diff changeset
   317
    startIndex = mCurrentFetchIndex-currentDelta-fetchAmount;
hgs
parents: 30
diff changeset
   318
    endIndex = mCurrentFetchIndex-currentDelta;
30
hgs
parents:
diff changeset
   319
    getModelIndexes(indexes, startIndex, endIndex);
34
hgs
parents: 30
diff changeset
   320
    
30
hgs
parents:
diff changeset
   321
    mCurrentBackgroundFetchCount += THUMBNAIL_BACKGROUND_FETCH_AMOUNT;
hgs
parents:
diff changeset
   322
hgs
parents:
diff changeset
   323
    int fetchesStarted = startFetchingThumbnails(indexes, BACKGROUND_FETCH_PRIORITY);
hgs
parents:
diff changeset
   324
    
hgs
parents:
diff changeset
   325
    // No thumbnails to fetch, start again.
hgs
parents:
diff changeset
   326
    if(fetchesStarted == 0)
hgs
parents:
diff changeset
   327
    {
hgs
parents:
diff changeset
   328
        continueBackgroundFetch();
hgs
parents:
diff changeset
   329
    }
hgs
parents:
diff changeset
   330
}
hgs
parents:
diff changeset
   331
hgs
parents:
diff changeset
   332
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   333
// VideoThumbnailDataPrivate::getModelIndexes()
hgs
parents:
diff changeset
   334
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   335
//
hgs
parents:
diff changeset
   336
void VideoThumbnailDataPrivate::getModelIndexes(QList<QModelIndex> &indexes, int startIndex, int endIndex)
hgs
parents:
diff changeset
   337
{
hgs
parents:
diff changeset
   338
    QModelIndex index;
hgs
parents:
diff changeset
   339
    for(int i = startIndex; i < endIndex; i++)
hgs
parents:
diff changeset
   340
    {
hgs
parents:
diff changeset
   341
        if(i >= 0)
hgs
parents:
diff changeset
   342
        {
34
hgs
parents: 30
diff changeset
   343
            index = mCurrentModel->index(i, 0);
30
hgs
parents:
diff changeset
   344
            if(index.isValid())
hgs
parents:
diff changeset
   345
            {
hgs
parents:
diff changeset
   346
                indexes.append(index);
hgs
parents:
diff changeset
   347
            }
hgs
parents:
diff changeset
   348
        }
hgs
parents:
diff changeset
   349
    }
hgs
parents:
diff changeset
   350
}
hgs
parents:
diff changeset
   351
hgs
parents:
diff changeset
   352
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   353
// VideoThumbnailDataPrivate::thumbnailReadySlot()
hgs
parents:
diff changeset
   354
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   355
//
34
hgs
parents: 30
diff changeset
   356
void VideoThumbnailDataPrivate::thumbnailReadySlot(QPixmap tnData, void *internal, int error)
30
hgs
parents:
diff changeset
   357
{
hgs
parents:
diff changeset
   358
    TMPXItemId mediaId(0, 0);
hgs
parents:
diff changeset
   359
    if(internal)
hgs
parents:
diff changeset
   360
    {
hgs
parents:
diff changeset
   361
        mediaId = *(static_cast<TMPXItemId*>(internal));
hgs
parents:
diff changeset
   362
        delete internal;
hgs
parents:
diff changeset
   363
    }
hgs
parents:
diff changeset
   364
    else
hgs
parents:
diff changeset
   365
    {
hgs
parents:
diff changeset
   366
        return;
hgs
parents:
diff changeset
   367
    }
hgs
parents:
diff changeset
   368
hgs
parents:
diff changeset
   369
    if(!error && !tnData.isNull())
hgs
parents:
diff changeset
   370
    {
hgs
parents:
diff changeset
   371
        mThumbnailData.insert(mediaId, new QIcon(tnData));
hgs
parents:
diff changeset
   372
        
hgs
parents:
diff changeset
   373
        // Gather list of media ids and emit thumbnailReady signals in larger set
hgs
parents:
diff changeset
   374
        // when timer goes off.
hgs
parents:
diff changeset
   375
        if(mTbnReportTimer && !mTbnReportTimer->isActive())
hgs
parents:
diff changeset
   376
        {
hgs
parents:
diff changeset
   377
            mTbnReportTimer->setSingleShot(true);
hgs
parents:
diff changeset
   378
            mTbnReportTimer->start(THUMBNAIL_READY_SIGNAL_TIMEOUT);
hgs
parents:
diff changeset
   379
        }
hgs
parents:
diff changeset
   380
hgs
parents:
diff changeset
   381
        // Save the media id for the signal.  
hgs
parents:
diff changeset
   382
        mReadyThumbnailMediaIds.append(mediaId);
hgs
parents:
diff changeset
   383
    }
hgs
parents:
diff changeset
   384
}
hgs
parents:
diff changeset
   385
hgs
parents:
diff changeset
   386
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   387
// VideoThumbnailDataPrivate::reportThumbnailsReadySlot()
hgs
parents:
diff changeset
   388
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   389
//
hgs
parents:
diff changeset
   390
void VideoThumbnailDataPrivate::reportThumbnailsReadySlot()
hgs
parents:
diff changeset
   391
{
hgs
parents:
diff changeset
   392
    emit thumbnailsFetched(mReadyThumbnailMediaIds);
hgs
parents:
diff changeset
   393
    mReadyThumbnailMediaIds.clear();
hgs
parents:
diff changeset
   394
}
hgs
parents:
diff changeset
   395
hgs
parents:
diff changeset
   396
// -----------------------------------------------------------------------------
34
hgs
parents: 30
diff changeset
   397
// VideoThumbnailDataPrivate::allThumbnailsFetchedSlot()
30
hgs
parents:
diff changeset
   398
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   399
//
34
hgs
parents: 30
diff changeset
   400
void VideoThumbnailDataPrivate::allThumbnailsFetchedSlot()
30
hgs
parents:
diff changeset
   401
{
34
hgs
parents: 30
diff changeset
   402
    continueBackgroundFetch();
30
hgs
parents:
diff changeset
   403
}
hgs
parents:
diff changeset
   404
hgs
parents:
diff changeset
   405
// -----------------------------------------------------------------------------
34
hgs
parents: 30
diff changeset
   406
// VideoThumbnailDataPrivate::modelChangedSlot()
30
hgs
parents:
diff changeset
   407
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   408
//
34
hgs
parents: 30
diff changeset
   409
void VideoThumbnailDataPrivate::modelChangedSlot()
30
hgs
parents:
diff changeset
   410
{
34
hgs
parents: 30
diff changeset
   411
    startBackgroundFetching(mCurrentModel, mCurrentFetchIndex);
30
hgs
parents:
diff changeset
   412
}
hgs
parents:
diff changeset
   413
hgs
parents:
diff changeset
   414
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   415
// VideoThumbnailDataPrivate::defaultThumbnail()
hgs
parents:
diff changeset
   416
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   417
//
hgs
parents:
diff changeset
   418
const QIcon* VideoThumbnailDataPrivate::defaultThumbnail(TMPXItemId mediaId)
hgs
parents:
diff changeset
   419
{
35
hgs
parents: 34
diff changeset
   420
    const TMPXItemId defaultIdVideo(KMaxTUint32-1, KVcxMvcMediaTypeVideo);
hgs
parents: 34
diff changeset
   421
    const TMPXItemId defaultIdAlbum(KMaxTUint32-1, KVcxMvcMediaTypeAlbum);
hgs
parents: 34
diff changeset
   422
    const TMPXItemId defaultIdDownloads(KVcxMvcCategoryIdDownloads, KVcxMvcMediaTypeCategory);
hgs
parents: 34
diff changeset
   423
    const TMPXItemId defaultIdCaptured(KVcxMvcCategoryIdCaptured, KVcxMvcMediaTypeCategory);
hgs
parents: 34
diff changeset
   424
hgs
parents: 34
diff changeset
   425
    // Default thumbnail for video
34
hgs
parents: 30
diff changeset
   426
    if(mediaId.iId2 == KVcxMvcMediaTypeVideo) 
30
hgs
parents:
diff changeset
   427
    {
35
hgs
parents: 34
diff changeset
   428
        if(!mDefaultThumbnails.contains(defaultIdVideo))
hgs
parents: 34
diff changeset
   429
        {
hgs
parents: 34
diff changeset
   430
            mDefaultThumbnails[defaultIdVideo] = HbIcon(":/icons/default_thumbnail_video.svg");
hgs
parents: 34
diff changeset
   431
        }
hgs
parents: 34
diff changeset
   432
        return &mDefaultThumbnails[defaultIdVideo].qicon();
30
hgs
parents:
diff changeset
   433
    }
hgs
parents:
diff changeset
   434
    else
hgs
parents:
diff changeset
   435
    {
35
hgs
parents: 34
diff changeset
   436
        // Default thumbnail for user defined album.
hgs
parents: 34
diff changeset
   437
        if(mediaId.iId2 == KVcxMvcMediaTypeAlbum)
hgs
parents: 34
diff changeset
   438
        {
hgs
parents: 34
diff changeset
   439
            if(!mDefaultThumbnails.contains(defaultIdAlbum))
hgs
parents: 34
diff changeset
   440
            {
hgs
parents: 34
diff changeset
   441
                mDefaultThumbnails[defaultIdAlbum] = HbIcon(":/icons/default_thumbnail_collection.svg");
hgs
parents: 34
diff changeset
   442
            }
hgs
parents: 34
diff changeset
   443
            return &mDefaultThumbnails[defaultIdAlbum].qicon();
hgs
parents: 34
diff changeset
   444
        }
hgs
parents: 34
diff changeset
   445
hgs
parents: 34
diff changeset
   446
        // Thumbnails for default collections.
hgs
parents: 34
diff changeset
   447
        switch(mediaId.iId1)
hgs
parents: 34
diff changeset
   448
        {
hgs
parents: 34
diff changeset
   449
            case KVcxMvcCategoryIdDownloads:
hgs
parents: 34
diff changeset
   450
            {
hgs
parents: 34
diff changeset
   451
                if(!mDefaultThumbnails.contains(defaultIdDownloads))
hgs
parents: 34
diff changeset
   452
                {
hgs
parents: 34
diff changeset
   453
                    mDefaultThumbnails[defaultIdDownloads] = HbIcon("qtg_large_video_download");
hgs
parents: 34
diff changeset
   454
                }
hgs
parents: 34
diff changeset
   455
                return &mDefaultThumbnails[defaultIdDownloads].qicon();
hgs
parents: 34
diff changeset
   456
            }
hgs
parents: 34
diff changeset
   457
            
hgs
parents: 34
diff changeset
   458
            case KVcxMvcCategoryIdCaptured:
hgs
parents: 34
diff changeset
   459
            {
hgs
parents: 34
diff changeset
   460
                if(!mDefaultThumbnails.contains(defaultIdCaptured))
hgs
parents: 34
diff changeset
   461
                {
hgs
parents: 34
diff changeset
   462
                    mDefaultThumbnails[defaultIdCaptured] = HbIcon("qtg_large_video_capture");
hgs
parents: 34
diff changeset
   463
                }
hgs
parents: 34
diff changeset
   464
                return &mDefaultThumbnails[defaultIdCaptured].qicon();
hgs
parents: 34
diff changeset
   465
            }
hgs
parents: 34
diff changeset
   466
hgs
parents: 34
diff changeset
   467
            default:
hgs
parents: 34
diff changeset
   468
            {
hgs
parents: 34
diff changeset
   469
                if(!mDefaultThumbnails.contains(defaultIdAlbum))
hgs
parents: 34
diff changeset
   470
                {
hgs
parents: 34
diff changeset
   471
                    mDefaultThumbnails[defaultIdAlbum] = HbIcon(":/icons/default_thumbnail_collection.svg");
hgs
parents: 34
diff changeset
   472
                }
hgs
parents: 34
diff changeset
   473
                return &mDefaultThumbnails[defaultIdAlbum].qicon();
hgs
parents: 34
diff changeset
   474
            }
hgs
parents: 34
diff changeset
   475
        }
30
hgs
parents:
diff changeset
   476
    }
hgs
parents:
diff changeset
   477
}
hgs
parents:
diff changeset
   478
hgs
parents:
diff changeset
   479
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   480
// VideoThumbnailDataPrivate::removeThumbnail()
hgs
parents:
diff changeset
   481
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   482
//
hgs
parents:
diff changeset
   483
bool VideoThumbnailDataPrivate::removeThumbnail(TMPXItemId mediaId)
hgs
parents:
diff changeset
   484
{
hgs
parents:
diff changeset
   485
    return mThumbnailData.remove(mediaId);
hgs
parents:
diff changeset
   486
}
hgs
parents:
diff changeset
   487
hgs
parents:
diff changeset
   488
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   489
// VideoThumbnailDataPrivate::enableBackgroundFetching()
hgs
parents:
diff changeset
   490
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   491
//
hgs
parents:
diff changeset
   492
void VideoThumbnailDataPrivate::enableBackgroundFetching(bool enable)
hgs
parents:
diff changeset
   493
{
hgs
parents:
diff changeset
   494
    mBackgroundFetchingEnabled = enable;
34
hgs
parents: 30
diff changeset
   495
    startBackgroundFetching(mCurrentModel, 0);
hgs
parents: 30
diff changeset
   496
}
hgs
parents: 30
diff changeset
   497
hgs
parents: 30
diff changeset
   498
// -----------------------------------------------------------------------------
hgs
parents: 30
diff changeset
   499
// VideoThumbnailDataPrivate::enableThumbnailCreation()
hgs
parents: 30
diff changeset
   500
// -----------------------------------------------------------------------------
hgs
parents: 30
diff changeset
   501
//
hgs
parents: 30
diff changeset
   502
void VideoThumbnailDataPrivate::enableThumbnailCreation(bool enable)
hgs
parents: 30
diff changeset
   503
{
hgs
parents: 30
diff changeset
   504
    if(mThumbnailFetcher)
hgs
parents: 30
diff changeset
   505
        mThumbnailFetcher->enableThumbnailCreation(enable);
30
hgs
parents:
diff changeset
   506
}
hgs
parents:
diff changeset
   507
hgs
parents:
diff changeset
   508
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   509
// VideoThumbnailDataPrivate::freeThumbnailData()
hgs
parents:
diff changeset
   510
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   511
//
hgs
parents:
diff changeset
   512
void VideoThumbnailDataPrivate::freeThumbnailData()
hgs
parents:
diff changeset
   513
{
hgs
parents:
diff changeset
   514
    // Stop timers.
hgs
parents:
diff changeset
   515
    if(mBgFetchTimer)
hgs
parents:
diff changeset
   516
        mBgFetchTimer->stop();
hgs
parents:
diff changeset
   517
    
hgs
parents:
diff changeset
   518
    if(mTbnReportTimer)
hgs
parents:
diff changeset
   519
        mTbnReportTimer->stop();
hgs
parents:
diff changeset
   520
34
hgs
parents: 30
diff changeset
   521
    if(mThumbnailFetcher)
hgs
parents: 30
diff changeset
   522
        mThumbnailFetcher->cancelFetches();
hgs
parents: 30
diff changeset
   523
    
30
hgs
parents:
diff changeset
   524
    // Clear data.
hgs
parents:
diff changeset
   525
    mReadyThumbnailMediaIds.clear();
hgs
parents:
diff changeset
   526
    mThumbnailData.clear();
35
hgs
parents: 34
diff changeset
   527
    mDefaultThumbnails.clear();
30
hgs
parents:
diff changeset
   528
}
hgs
parents:
diff changeset
   529
hgs
parents:
diff changeset
   530
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   531
// VideoThumbnailDataPrivate::startBackgroundFetching()
hgs
parents:
diff changeset
   532
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   533
//
34
hgs
parents: 30
diff changeset
   534
void VideoThumbnailDataPrivate::startBackgroundFetching(VideoSortFilterProxyModel *model, int fetchIndex)
30
hgs
parents:
diff changeset
   535
{
34
hgs
parents: 30
diff changeset
   536
    if(!mBackgroundFetchingEnabled || !mThumbnailFetcher)
30
hgs
parents:
diff changeset
   537
        return;
34
hgs
parents: 30
diff changeset
   538
    
hgs
parents: 30
diff changeset
   539
    mThumbnailFetcher->cancelFetches();
hgs
parents: 30
diff changeset
   540
    
hgs
parents: 30
diff changeset
   541
    // If model is null, we continue using the current one. 
hgs
parents: 30
diff changeset
   542
    if(model)
hgs
parents: 30
diff changeset
   543
        mCurrentModel = model;
hgs
parents: 30
diff changeset
   544
    
30
hgs
parents:
diff changeset
   545
    mCurrentFetchIndex = fetchIndex;
hgs
parents:
diff changeset
   546
    mCurrentBackgroundFetchCount = 0;
hgs
parents:
diff changeset
   547
    doBackgroundFetching();
hgs
parents:
diff changeset
   548
}
hgs
parents:
diff changeset
   549
hgs
parents:
diff changeset
   550
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   551
// VideoThumbnailDataPrivate::continueBackgroundFetch()
hgs
parents:
diff changeset
   552
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   553
//
hgs
parents:
diff changeset
   554
void VideoThumbnailDataPrivate::continueBackgroundFetch()
hgs
parents:
diff changeset
   555
{
hgs
parents:
diff changeset
   556
    if(!mBackgroundFetchingEnabled)
hgs
parents:
diff changeset
   557
        return;
hgs
parents:
diff changeset
   558
hgs
parents:
diff changeset
   559
    if(mBgFetchTimer)
hgs
parents:
diff changeset
   560
    {
hgs
parents:
diff changeset
   561
        mBgFetchTimer->stop();
hgs
parents:
diff changeset
   562
        mBgFetchTimer->setSingleShot(true);
hgs
parents:
diff changeset
   563
        mBgFetchTimer->start(THUMBNAIL_BACKGROUND_TIMEOUT);
hgs
parents:
diff changeset
   564
    }
hgs
parents:
diff changeset
   565
}
hgs
parents:
diff changeset
   566
hgs
parents:
diff changeset
   567
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   568
// VideoThumbnailDataPrivate::aboutToQuitSlot()
hgs
parents:
diff changeset
   569
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   570
//
hgs
parents:
diff changeset
   571
void VideoThumbnailDataPrivate::aboutToQuitSlot()
hgs
parents:
diff changeset
   572
{
hgs
parents:
diff changeset
   573
    cleanup();
hgs
parents:
diff changeset
   574
}
hgs
parents:
diff changeset
   575
hgs
parents:
diff changeset
   576
// End of file