mpengine/src/mpprogressdialoghandler.cpp
author hgs
Fri, 28 May 2010 19:46:01 -0500
changeset 36 a0afa279b8fe
parent 35 fdb31ab341af
permissions -rw-r--r--
201021

/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description: Music Player Progress Dialogs Hanlder.
*
*/

#include <hbprogressdialog.h>
#include <hblabel.h>
#include <hbfontspec.h>
#include <hbnotificationdialog.h>
#include <hbmessagebox.h>

#include "mpprogressdialoghandler.h"
#include "mpmpxcollectionframeworkwrapper.h"
#include "mpmpxharvesterframeworkwrapper.h"
#include "mptrace.h"

/*!
    \class MpProgressDialogHandler
    \brief Music Player Progress Dialogs Handler.

    This class controls the asynchronous operation of all progress 
    dialogs used by Music Player
*/

/*!
 Constructs the dialog handler.
 */
MpProgressDialogHandler::MpProgressDialogHandler( MpMpxCollectionFrameworkWrapper *cwrapper, MpMpxHarvesterFrameworkWrapper *hwrapper,  QObject *parent )
    : QObject( parent ),
      mMpxCollectionWrapper(cwrapper),
      mMpxHarvesterWrapper(hwrapper),
      mOutStandingProgressNote(0),
      mDeleting(false),
      mScanning(false)
{
    TX_ENTRY
    connect( mMpxCollectionWrapper, SIGNAL(deleteStarted( TCollectionContext, TInt )), this, SLOT(handleDeleteStarted( TCollectionContext, TInt )) );
    connect( mMpxCollectionWrapper, SIGNAL(songsDeleted( bool )), this, SLOT(handleDeleteEnded( bool )) );
    connect( mMpxCollectionWrapper, SIGNAL( openAddSongsWaitDialog() ), this, SLOT(handleAddSongs() ));
    connect( mMpxCollectionWrapper, SIGNAL( playlistSaved( bool ) ), this, SLOT(handleAddSongsFinished( bool ) ));
    connect( mMpxHarvesterWrapper, SIGNAL(scanStarted()), this, SLOT(handleScanStarted()) );
    connect( mMpxHarvesterWrapper, SIGNAL(scanEnded( int, int )), this, SLOT(handleScanEnded( int, int )) );
    connect( mMpxHarvesterWrapper, SIGNAL(scanCountChanged(int)), this, SLOT(handleScanCountChanged(int)) );
    TX_EXIT
}

/*!
 Destructs the dialog handler.
 */
MpProgressDialogHandler::~MpProgressDialogHandler()
{
    TX_LOG
}

/*!
 Initiates song scanning.
 */
void MpProgressDialogHandler::scan()
{
    if ( !mScanning ) {
        mScanning = true;
        mMpxHarvesterWrapper->scan();
    }
}

/*!
 Returns true if scanning is ongoing.
 */
bool MpProgressDialogHandler::isScanning()
{
    return mScanning;
}

/*!
 Initiates song deleting.
 */
void MpProgressDialogHandler::deleteSongs( QList<int> &selection )
{
    TX_ENTRY
    if ( !mDeleting ) {
        mDeleting = true;
        mMpxCollectionWrapper->deleteSongs( selection );
    }
    TX_EXIT
}

/*!
 Slot called upon cancels ongoing request, if any.
 */
void MpProgressDialogHandler::cancelRequest()
{
    TX_ENTRY
        mMpxCollectionWrapper->cancelRequest();
    TX_EXIT
}

/*!
 Slot called upon notification from MPX FW Wrapper indicating start of
 deleting process.
 */
void MpProgressDialogHandler::handleDeleteStarted(TCollectionContext context, TInt count)
{
    TX_ENTRY
    emit deleteStarted();
    HbProgressDialog *deleteProgressNote = new HbProgressDialog( HbProgressDialog::WaitDialog );
    connect( deleteProgressNote, SIGNAL( cancelled() ), this, SLOT( cancelRequest() ) );
    connect( deleteProgressNote, SIGNAL( aboutToClose() ), this, SLOT( outstandingPopupClosing() ) );
    deleteProgressNote->setModal( true );
    deleteProgressNote->setDismissPolicy( HbPopup::NoDismiss );
    if ( context == ECollectionContextPlaylistSongs ){
        if (count >= 100) {  //show progress dialog if removing more than 100 songs 
            deleteProgressNote->setText( hbTrId( "txt_mus_info_removing_songs" ) );
            setOutstandingPopup(deleteProgressNote);
            deleteProgressNote->show();
        }
    }
    else if (context != ECollectionContextPlaylists ){  //no progress dialog for delete playlist
        deleteProgressNote->setText( hbTrId( "txt_mus_info_deleting" ) );
        setOutstandingPopup(deleteProgressNote);
        deleteProgressNote->show();
    }
    TX_EXIT
}

/*!
 Slot called upon notification from MPX FW CollectionHelper indicating end of
 deleting process.
 */
void MpProgressDialogHandler::handleDeleteEnded( bool success )
{
    TX_ENTRY
    Q_UNUSED( success );
    HbProgressDialog *deleteProgressNote = qobject_cast<HbProgressDialog *>( mOutStandingProgressNote );
    emit songsDeleted( success );
    if ( deleteProgressNote ) {     
        deleteProgressNote->cancel();
    }
    mDeleting = false;
    TX_EXIT
}

/*!
 Slot called upon notification from MPX FW Wrapper indicating start of
 add songs process.
 */
void MpProgressDialogHandler::handleAddSongs()
{
    HbProgressDialog *addSongsWaitNote = new HbProgressDialog( HbProgressDialog::WaitDialog );
    connect( addSongsWaitNote, SIGNAL( cancelled() ), this, SLOT( cancelRequest() ) );
    connect( addSongsWaitNote, SIGNAL( aboutToClose() ), this, SLOT( outstandingPopupClosing() ) );
    addSongsWaitNote->setModal( true );
    addSongsWaitNote->setText( hbTrId( "txt_mus_info_adding_songs" ) );
    setOutstandingPopup( addSongsWaitNote );
    addSongsWaitNote->show();
    
    
}

/*!
 Slot called upon notification from MPX FW CollectionHelper indicating end of
 add songs process.
 */
void MpProgressDialogHandler::handleAddSongsFinished( bool success )
{
    Q_UNUSED(success);
    HbProgressDialog *addSongsWaitNote = qobject_cast<HbProgressDialog *>( mOutStandingProgressNote );
    if (addSongsWaitNote){
        addSongsWaitNote->cancel();
    }
}

/*!
 Cancels ongoing song scanning, if any.

 \sa scan()
 */
void MpProgressDialogHandler::cancelScan()
{
    if ( mScanning ) {
        mScanning = false;
        mMpxHarvesterWrapper->cancelScan();
    }
}

/*!
 Slot called upon notification from MPX Harvesting FW indicating start of
 scanning process.
 */
void MpProgressDialogHandler::handleScanStarted()
{
    HbProgressDialog *scanProgressNote = new HbProgressDialog( HbProgressDialog::WaitDialog );
    connect( scanProgressNote, SIGNAL( cancelled() ), this, SLOT( cancelScan() ) );
    connect( scanProgressNote, SIGNAL( aboutToClose() ), this, SLOT( outstandingPopupClosing() ) );
    
    scanProgressNote->setModal( true );
    HbLabel *title = new HbLabel( hbTrId( "txt_mus_title_refreshing" ) );
    title->setFontSpec(HbFontSpec(HbFontSpec::Primary));

    scanProgressNote->setHeadingWidget( title );
    scanProgressNote->setText( QString("") );
    setOutstandingPopup( scanProgressNote );
    scanProgressNote->show();
}

/*!
 Slot called upon notification from MPX Harvesting FW indicating end of
 scanning process.
 */
void MpProgressDialogHandler::handleScanEnded( int numItemsAdded, int error )
{
    HbProgressDialog *scanProgressNote = qobject_cast<HbProgressDialog *>( mOutStandingProgressNote );
    if (error == KErrDiskFull) {
        if ( scanProgressNote ) {     
            scanProgressNote->cancel();
        }
        QString diskfull;
        diskfull = hbTrId( "txt_mus_title_refresh_cancelled" );
        diskfull.append(" ");
        diskfull.append( hbTrId( "txt_mus_info_out_of_disk_space" ) );
        HbMessageBox *diskFullDialog = new HbMessageBox();
        setOutstandingPopup( diskFullDialog );
        diskFullDialog->setIcon( HbIcon( QString("qtg_small_fail") ) );
        diskFullDialog->setText( diskfull );
        diskFullDialog->setTimeout( HbPopup::NoTimeout);
        diskFullDialog->show();
        mScanning = false;
               
    }
    else{
        QString added;
        HbNotificationDialog *finishedDialog = new HbNotificationDialog();
        finishedDialog->setModal(true);
            
        added = hbTrId( "txt_mus_dpopinfo_ln_songs_added", numItemsAdded );
        finishedDialog->setText( added );
              
        if( error < 0) {
            if ( scanProgressNote ) {     
                scanProgressNote->cancel();
            }
            finishedDialog->setIcon( HbIcon( QString("qtg_small_fail") ) );
            finishedDialog->setTitle( hbTrId( "txt_mus_dpophead_refresh_cancelled" ) );
        }
        else if ( mScanning ) {
            if ( scanProgressNote ) {     
                scanProgressNote->cancel();
            }
            finishedDialog->setIcon( HbIcon( QString("qtg_large_ok") ) );
            finishedDialog->setTitle( hbTrId( "txt_mus_dpophead_refresh_complete" ) );
        }
        else {
            finishedDialog->setIcon( HbIcon( QString("qtg_small_fail") ) );
            finishedDialog->setTitle( hbTrId( "txt_mus_dpophead_refresh_cancelled" ) );
        }
        mScanning = false;
        setOutstandingPopup( finishedDialog );
        finishedDialog->show();
    }
}

/*!
 Slot called upon notification from MPX Harvesting FW indicating the number of
 songs scanned so far.
 */
void MpProgressDialogHandler::handleScanCountChanged(int count)
{
    HbProgressDialog *scanProgressNote = qobject_cast<HbProgressDialog *>( mOutStandingProgressNote );
    QString added;
    added = hbTrId( "txt_mus_info_ln_songs_added" , count );
    if ( scanProgressNote ) {
        scanProgressNote->setText( added );
    }
}

/*!
 Slot to be called when disk event is received from MPX framework.
 */
void MpProgressDialogHandler::handleDiskEvent( MpxDiskEvents event )
{
    Q_UNUSED( event );
    HbProgressDialog *progressNote = qobject_cast<HbProgressDialog *>( mOutStandingProgressNote );
    if ( progressNote ) {
        progressNote->cancel();
    }
    mScanning = false;
    mDeleting = false;
    TX_EXIT
}

/*!
 Slot to be called when mOutStandingProgressNote is about to close.
 */
void MpProgressDialogHandler::handleOutstandingPopupClosing()
{
    TX_ENTRY
    mOutStandingProgressNote = 0;
    TX_EXIT
}

/*!
 \internal
 sets \a popup as the current outstanding popup and cancels any other active popup.
 */
void MpProgressDialogHandler::setOutstandingPopup( HbPopup *popup )
{
    TX_ENTRY
    //Close previous popup
    if ( mOutStandingProgressNote ) {
        disconnect( mOutStandingProgressNote, SIGNAL( aboutToClose() ), this, SLOT( handleOutstandingPopupClosing() ) );
        mOutStandingProgressNote->close();
    }

    //Set new outstanding popup
    popup->setAttribute( Qt::WA_DeleteOnClose );
    connect( popup, SIGNAL( aboutToClose() ), this, SLOT( handleOutstandingPopupClosing() ) );
    mOutStandingProgressNote = popup;
    TX_EXIT
}