videocollection/videocollectionview/src/videolistselectiondialog.cpp
author hgs
Thu, 01 Apr 2010 22:38:49 +0300
changeset 30 4f111d64a341
child 34 bbb98528c666
permissions -rw-r--r--
201005
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
30
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2008 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:   videolist selection dialog implementation
hgs
parents:
diff changeset
    15
* 
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include <QGraphicsItem>
hgs
parents:
diff changeset
    19
#include <hblabel.h>
hgs
parents:
diff changeset
    20
#include <hbcheckbox.h>
hgs
parents:
diff changeset
    21
#include <hbaction.h>
hgs
parents:
diff changeset
    22
#include <hbstackedwidget.h>
hgs
parents:
diff changeset
    23
#include <hbdeviceprofile.h>
hgs
parents:
diff changeset
    24
#include "videocollectionuiloader.h"
hgs
parents:
diff changeset
    25
#include "videolistwidget.h"
hgs
parents:
diff changeset
    26
#include "videosortfilterproxymodel.h"
hgs
parents:
diff changeset
    27
#include "videolistselectiondialog.h"
hgs
parents:
diff changeset
    28
hgs
parents:
diff changeset
    29
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    30
// VideoListSelectionDialog
hgs
parents:
diff changeset
    31
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    32
//
hgs
parents:
diff changeset
    33
VideoListSelectionDialog::VideoListSelectionDialog(VideoCollectionUiLoader *uiLoader,
hgs
parents:
diff changeset
    34
                                                   QGraphicsItem *parent) : 
hgs
parents:
diff changeset
    35
HbDialog(parent),
hgs
parents:
diff changeset
    36
mUiLoader(uiLoader),
hgs
parents:
diff changeset
    37
mVideoList(0),
hgs
parents:
diff changeset
    38
mHeading(0),
hgs
parents:
diff changeset
    39
mItemCount(0),
hgs
parents:
diff changeset
    40
mCheckBox(0),
hgs
parents:
diff changeset
    41
mListContainer(0),
hgs
parents:
diff changeset
    42
mForcedCheck(false)
hgs
parents:
diff changeset
    43
{
hgs
parents:
diff changeset
    44
    setDismissPolicy(HbDialog::NoDismiss);
hgs
parents:
diff changeset
    45
    setTimeout(HbDialog::NoTimeout);
hgs
parents:
diff changeset
    46
}
hgs
parents:
diff changeset
    47
hgs
parents:
diff changeset
    48
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    49
// ~VideoListSelectionDialog
hgs
parents:
diff changeset
    50
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    51
//
hgs
parents:
diff changeset
    52
VideoListSelectionDialog::~VideoListSelectionDialog() 
hgs
parents:
diff changeset
    53
{
hgs
parents:
diff changeset
    54
    // NOP
hgs
parents:
diff changeset
    55
}
hgs
parents:
diff changeset
    56
hgs
parents:
diff changeset
    57
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    58
// getSelection
hgs
parents:
diff changeset
    59
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    60
//
hgs
parents:
diff changeset
    61
const QItemSelection& VideoListSelectionDialog::getSelection() const
hgs
parents:
diff changeset
    62
{
hgs
parents:
diff changeset
    63
    return mSelection;
hgs
parents:
diff changeset
    64
}
hgs
parents:
diff changeset
    65
hgs
parents:
diff changeset
    66
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    67
// setContent
hgs
parents:
diff changeset
    68
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    69
//
hgs
parents:
diff changeset
    70
void VideoListSelectionDialog::setContent(const QString &title, VideoListWidget *videoList)
hgs
parents:
diff changeset
    71
{
hgs
parents:
diff changeset
    72
    mSelection.clear();
hgs
parents:
diff changeset
    73
    if(!videoList || title.isEmpty())
hgs
parents:
diff changeset
    74
    {
hgs
parents:
diff changeset
    75
        mVideoList = 0;
hgs
parents:
diff changeset
    76
        return;
hgs
parents:
diff changeset
    77
    }
hgs
parents:
diff changeset
    78
    
hgs
parents:
diff changeset
    79
    mVideoList = videoList; 
hgs
parents:
diff changeset
    80
    if(!mHeading)
hgs
parents:
diff changeset
    81
    {
hgs
parents:
diff changeset
    82
        mHeading = mUiLoader->findWidget<HbLabel>(DOCML_NAME_DLG_HEADINGLBL);
hgs
parents:
diff changeset
    83
    }
hgs
parents:
diff changeset
    84
    mHeading->setPlainText(title);
hgs
parents:
diff changeset
    85
    if(!mItemCount)
hgs
parents:
diff changeset
    86
    {
hgs
parents:
diff changeset
    87
        mItemCount = mUiLoader->findWidget<HbLabel>(DOCML_NAME_LBL_SELECTION);
hgs
parents:
diff changeset
    88
        mItemCount->setAlignment(Qt::AlignRight);
hgs
parents:
diff changeset
    89
    }
hgs
parents:
diff changeset
    90
    mItemCount->setPlainText(tr("0/%1").arg(mVideoList->getModel().rowCount()));   
hgs
parents:
diff changeset
    91
    
hgs
parents:
diff changeset
    92
    if(!mCheckBox)
hgs
parents:
diff changeset
    93
    {
hgs
parents:
diff changeset
    94
        mCheckBox = mUiLoader->findWidget<HbCheckBox >(DOCML_NAME_MARKALL);
hgs
parents:
diff changeset
    95
    }
hgs
parents:
diff changeset
    96
    mCheckBox->setChecked(false);
hgs
parents:
diff changeset
    97
    
hgs
parents:
diff changeset
    98
    if(!primaryAction())
hgs
parents:
diff changeset
    99
    {
hgs
parents:
diff changeset
   100
        setPrimaryAction(new HbAction(tr("OK"), this));
hgs
parents:
diff changeset
   101
    }
hgs
parents:
diff changeset
   102
    primaryAction()->setDisabled(true);
hgs
parents:
diff changeset
   103
    if(!secondaryAction())
hgs
parents:
diff changeset
   104
    {
hgs
parents:
diff changeset
   105
        setSecondaryAction(new HbAction(tr("Cancel"), this));
hgs
parents:
diff changeset
   106
    }
hgs
parents:
diff changeset
   107
 
hgs
parents:
diff changeset
   108
}
hgs
parents:
diff changeset
   109
hgs
parents:
diff changeset
   110
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   111
// exec
hgs
parents:
diff changeset
   112
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   113
//
hgs
parents:
diff changeset
   114
HbAction* VideoListSelectionDialog::exec()
hgs
parents:
diff changeset
   115
{
hgs
parents:
diff changeset
   116
    mSelection.clear();
hgs
parents:
diff changeset
   117
    if(!mVideoList)
hgs
parents:
diff changeset
   118
    {
hgs
parents:
diff changeset
   119
        return 0;
hgs
parents:
diff changeset
   120
    }
hgs
parents:
diff changeset
   121
   
hgs
parents:
diff changeset
   122
    // setup content of the popup    
hgs
parents:
diff changeset
   123
    mVideoList->setSelectionMode(HbAbstractItemView::MultiSelection);   
hgs
parents:
diff changeset
   124
    
hgs
parents:
diff changeset
   125
    // clear parent layout item from our widget to be able to insert it
hgs
parents:
diff changeset
   126
    // to the stackedWidget child   
hgs
parents:
diff changeset
   127
    QGraphicsLayoutItem *currenParentLayout = mVideoList->parentLayoutItem();
hgs
parents:
diff changeset
   128
    QGraphicsItem *currentParentItem = mVideoList->parentItem();            
hgs
parents:
diff changeset
   129
    mVideoList->setParentLayoutItem(0);    
hgs
parents:
diff changeset
   130
    
hgs
parents:
diff changeset
   131
    if(!mListContainer)
hgs
parents:
diff changeset
   132
    {
hgs
parents:
diff changeset
   133
        mListContainer = mUiLoader->findWidget<HbStackedWidget>(DOCML_NAME_LIST_CONTAINER);
hgs
parents:
diff changeset
   134
    }
hgs
parents:
diff changeset
   135
    mListContainer->addWidget(mVideoList);
hgs
parents:
diff changeset
   136
hgs
parents:
diff changeset
   137
    connectSignals();
hgs
parents:
diff changeset
   138
    
hgs
parents:
diff changeset
   139
    // Launch popup syncronously
hgs
parents:
diff changeset
   140
    bool accepted = false;
hgs
parents:
diff changeset
   141
    HbDialog::exec() == primaryAction() ? accepted = true : accepted = false;
hgs
parents:
diff changeset
   142
    
hgs
parents:
diff changeset
   143
    disconnectSignals();
hgs
parents:
diff changeset
   144
 
hgs
parents:
diff changeset
   145
    // remove out widget from stacked before poptup is to be destroyed to make sure 
hgs
parents:
diff changeset
   146
    // our widget does not get deleted
hgs
parents:
diff changeset
   147
    mListContainer->removeAt(0);
hgs
parents:
diff changeset
   148
    
hgs
parents:
diff changeset
   149
    // restore widget's original parent and layout.
hgs
parents:
diff changeset
   150
    mVideoList->setParentItem(currentParentItem);
hgs
parents:
diff changeset
   151
    mVideoList->setParentLayoutItem(currenParentLayout);
hgs
parents:
diff changeset
   152
hgs
parents:
diff changeset
   153
    mVideoList->setSelectionMode(HbAbstractItemView::NoSelection); 
hgs
parents:
diff changeset
   154
    
hgs
parents:
diff changeset
   155
    currentParentItem->setVisible(true);
hgs
parents:
diff changeset
   156
    mVideoList->setVisible(true);
hgs
parents:
diff changeset
   157
    
hgs
parents:
diff changeset
   158
    if(!accepted)
hgs
parents:
diff changeset
   159
    {
hgs
parents:
diff changeset
   160
        mSelection.clear();
hgs
parents:
diff changeset
   161
        return secondaryAction();
hgs
parents:
diff changeset
   162
    }
hgs
parents:
diff changeset
   163
    return primaryAction();
hgs
parents:
diff changeset
   164
        
hgs
parents:
diff changeset
   165
}
hgs
parents:
diff changeset
   166
hgs
parents:
diff changeset
   167
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   168
// markAllStateChanged
hgs
parents:
diff changeset
   169
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   170
//
hgs
parents:
diff changeset
   171
void VideoListSelectionDialog::markAllStateChangedSlot(int state)
hgs
parents:
diff changeset
   172
{
hgs
parents:
diff changeset
   173
    if(!mVideoList)
hgs
parents:
diff changeset
   174
    {
hgs
parents:
diff changeset
   175
        return;
hgs
parents:
diff changeset
   176
    }
hgs
parents:
diff changeset
   177
    
hgs
parents:
diff changeset
   178
    if(mForcedCheck)
hgs
parents:
diff changeset
   179
    {
hgs
parents:
diff changeset
   180
        return;
hgs
parents:
diff changeset
   181
    }
hgs
parents:
diff changeset
   182
    if( state == Qt::Checked)
hgs
parents:
diff changeset
   183
    {
hgs
parents:
diff changeset
   184
        mVideoList->selectAll();
hgs
parents:
diff changeset
   185
    }
hgs
parents:
diff changeset
   186
    else
hgs
parents:
diff changeset
   187
    {
hgs
parents:
diff changeset
   188
        mVideoList->clearSelection();
hgs
parents:
diff changeset
   189
    }   
hgs
parents:
diff changeset
   190
}
hgs
parents:
diff changeset
   191
hgs
parents:
diff changeset
   192
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   193
// selectionChangedSlot
hgs
parents:
diff changeset
   194
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   195
//
hgs
parents:
diff changeset
   196
void VideoListSelectionDialog::selectionChangedSlot(const QItemSelection &selected, const QItemSelection &deselected)
hgs
parents:
diff changeset
   197
{  
hgs
parents:
diff changeset
   198
    
hgs
parents:
diff changeset
   199
    if(!primaryAction())
hgs
parents:
diff changeset
   200
    {
hgs
parents:
diff changeset
   201
        return;
hgs
parents:
diff changeset
   202
    }
hgs
parents:
diff changeset
   203
    if(selected.indexes().count() > 0)
hgs
parents:
diff changeset
   204
    {
hgs
parents:
diff changeset
   205
        mSelection.merge(selected, QItemSelectionModel::Select);
hgs
parents:
diff changeset
   206
    }
hgs
parents:
diff changeset
   207
    
hgs
parents:
diff changeset
   208
    if(deselected.indexes().count() >  0)
hgs
parents:
diff changeset
   209
    {
hgs
parents:
diff changeset
   210
        mSelection.merge(deselected, QItemSelectionModel::Deselect);
hgs
parents:
diff changeset
   211
    }
hgs
parents:
diff changeset
   212
    
hgs
parents:
diff changeset
   213
    if(mSelection.indexes().count() > 0)
hgs
parents:
diff changeset
   214
    {
hgs
parents:
diff changeset
   215
        primaryAction()->setDisabled(false);
hgs
parents:
diff changeset
   216
    }
hgs
parents:
diff changeset
   217
    else
hgs
parents:
diff changeset
   218
    {
hgs
parents:
diff changeset
   219
        primaryAction()->setDisabled(true);
hgs
parents:
diff changeset
   220
    }    
hgs
parents:
diff changeset
   221
hgs
parents:
diff changeset
   222
    updateCounterSlot();
hgs
parents:
diff changeset
   223
}
hgs
parents:
diff changeset
   224
hgs
parents:
diff changeset
   225
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   226
// updateCounterSlot
hgs
parents:
diff changeset
   227
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   228
//
hgs
parents:
diff changeset
   229
void VideoListSelectionDialog::updateCounterSlot()
hgs
parents:
diff changeset
   230
{
hgs
parents:
diff changeset
   231
    if(!mVideoList || !mItemCount)
hgs
parents:
diff changeset
   232
    {
hgs
parents:
diff changeset
   233
        return;
hgs
parents:
diff changeset
   234
    }
hgs
parents:
diff changeset
   235
    // orbit does not update HbLabel read from docml in case it isn't cleared first
hgs
parents:
diff changeset
   236
    int rowCount = mVideoList->getModel().rowCount();
hgs
parents:
diff changeset
   237
    int selectionCount = mSelection.indexes().count();
hgs
parents:
diff changeset
   238
    mItemCount->setPlainText(tr("%1/%2").arg(selectionCount).arg(rowCount));
hgs
parents:
diff changeset
   239
    
hgs
parents:
diff changeset
   240
    mForcedCheck = true;
hgs
parents:
diff changeset
   241
    if(selectionCount == rowCount && rowCount > 0)
hgs
parents:
diff changeset
   242
    {     
hgs
parents:
diff changeset
   243
        mCheckBox->setChecked(true);
hgs
parents:
diff changeset
   244
    }
hgs
parents:
diff changeset
   245
    else
hgs
parents:
diff changeset
   246
    {
hgs
parents:
diff changeset
   247
        mCheckBox->setChecked(false);
hgs
parents:
diff changeset
   248
    }
hgs
parents:
diff changeset
   249
    mForcedCheck = false;
hgs
parents:
diff changeset
   250
       
hgs
parents:
diff changeset
   251
}
hgs
parents:
diff changeset
   252
hgs
parents:
diff changeset
   253
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   254
// connectSignals
hgs
parents:
diff changeset
   255
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   256
//
hgs
parents:
diff changeset
   257
void VideoListSelectionDialog::connectSignals()
hgs
parents:
diff changeset
   258
{
hgs
parents:
diff changeset
   259
    // selection changes
hgs
parents:
diff changeset
   260
    connect(mVideoList->selectionModel(), SIGNAL(selectionChanged (const QItemSelection&, const QItemSelection&)),
hgs
parents:
diff changeset
   261
                        this, SLOT(selectionChangedSlot(const QItemSelection&, const QItemSelection &)));
hgs
parents:
diff changeset
   262
        
hgs
parents:
diff changeset
   263
    // model changes signals
hgs
parents:
diff changeset
   264
    connect(&(mVideoList->getModel()), SIGNAL(layoutChanged()), this, SLOT(updateCounterSlot()));    
hgs
parents:
diff changeset
   265
    connect(&(mVideoList->getModel()), SIGNAL(rowsInserted(const QModelIndex&, int, int)), this, SLOT(updateCounterSlot()));
hgs
parents:
diff changeset
   266
    connect(&(mVideoList->getModel()), SIGNAL(rowsRemoved(const QModelIndex&, int, int)), this, SLOT(updateCounterSlot()));
hgs
parents:
diff changeset
   267
    
hgs
parents:
diff changeset
   268
    // mark all state changes
hgs
parents:
diff changeset
   269
    connect(mCheckBox, SIGNAL(stateChanged(int)), this, SLOT(markAllStateChangedSlot(int)));
hgs
parents:
diff changeset
   270
 
hgs
parents:
diff changeset
   271
}
hgs
parents:
diff changeset
   272
 
hgs
parents:
diff changeset
   273
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   274
// disconnectSignals
hgs
parents:
diff changeset
   275
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   276
//
hgs
parents:
diff changeset
   277
void VideoListSelectionDialog::disconnectSignals()
hgs
parents:
diff changeset
   278
{
hgs
parents:
diff changeset
   279
    
hgs
parents:
diff changeset
   280
    disconnect(mVideoList->selectionModel(), SIGNAL(selectionChanged (const QItemSelection&, const QItemSelection&)),
hgs
parents:
diff changeset
   281
                            this, SLOT(selectionChangedSlot(const QItemSelection&, const QItemSelection &)));
hgs
parents:
diff changeset
   282
            
hgs
parents:
diff changeset
   283
    // model changes signals
hgs
parents:
diff changeset
   284
    disconnect(&(mVideoList->getModel()), SIGNAL(layoutChanged()), this, SLOT(updateCounterSlot()));    
hgs
parents:
diff changeset
   285
    disconnect(&(mVideoList->getModel()), SIGNAL(rowsInserted(const QModelIndex&, int, int)), this, SLOT(updateCounterSlot()));
hgs
parents:
diff changeset
   286
    disconnect(&(mVideoList->getModel()), SIGNAL(rowsRemoved(const QModelIndex&, int, int)), this, SLOT(updateCounterSlot()));
hgs
parents:
diff changeset
   287
    
hgs
parents:
diff changeset
   288
    // mark all state changes
hgs
parents:
diff changeset
   289
    disconnect(mCheckBox, SIGNAL(stateChanged(int)), this, SLOT(markAllStateChangedSlot(int)));
hgs
parents:
diff changeset
   290
    
hgs
parents:
diff changeset
   291
}
hgs
parents:
diff changeset
   292
hgs
parents:
diff changeset
   293