mpviewplugins/mpplaybackviewplugin/src/mpplaybackview.cpp
branchRCL_3
changeset 52 14979e23cb5e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mpviewplugins/mpplaybackviewplugin/src/mpplaybackview.cpp	Tue Aug 31 15:12:29 2010 +0300
@@ -0,0 +1,608 @@
+/*
+* 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 Playback view.
+*
+*/
+
+#include <QPainter>
+#include <QtGui>
+
+#include <hbmenu.h>
+#include <hbinstance.h>
+#include <hbtoolbar.h>
+#include <hbtoolbutton.h>
+#include <hbaction.h>
+#include <hbicon.h>
+#include <hbmessagebox.h>
+
+#include "mpplaybackview.h"
+#include "mpplaybackwidget.h"
+#include "mpenginefactory.h"
+#include "mpplaybackdata.h"
+#include "mpsettingsmanager.h"
+#include "mpcommondefs.h"
+#include "mptrace.h"
+#include "mpequalizerwidget.h"
+
+
+/*!
+    \class MpPlaybackView
+    \brief Music Player playback view.
+
+    Playback view provides access to music playback in the device.
+    This class owns the menu and the toolbar. In addition, it is
+    responsible for creating UI widgets and the underlying engine
+    components and connecting them to work together.
+*/
+
+/*!
+    \fn void command( int command )
+
+    This signal is emitted when the view issues a \a command to the
+    application such as request to switch to a different view.
+ */
+
+/*!
+ Constructs the playback view.
+ */
+MpPlaybackView::MpPlaybackView()
+    : mMpEngine( 0 ),
+      mPlaybackData( 0 ),
+      mPlaybackWidget( 0 ),
+      mEqualizerWidget( 0 ),
+      mSoftKeyBack( 0 ),
+      mActivated( false ),
+      mPlayIcon( 0 ),
+      mPauseIcon( 0 ),
+      mShuffleOnIcon( 0 ),
+      mShuffleOffIcon( 0 ),
+      mTimer(0),
+      mSeeking(false)
+
+{
+    TX_LOG
+}
+
+/*!
+ Destructs the playback view.
+ */
+MpPlaybackView::~MpPlaybackView()
+{
+    TX_ENTRY
+    delete mSoftKeyBack;
+    delete mPlayIcon;
+    delete mPauseIcon;
+    delete mShuffleOnIcon;
+    delete mShuffleOffIcon;
+    delete mEqualizerWidget;
+    TX_EXIT
+}
+
+
+/*!
+ Initializes the playback view.
+ */
+void MpPlaybackView::initializeView()
+{
+    TX_ENTRY
+
+    mWindow = mainWindow();
+
+    mSoftKeyBack = new HbAction( Hb::BackNaviAction, this );
+    connect( mSoftKeyBack, SIGNAL( triggered() ), this, SLOT( back() ) );
+
+    mMpEngine = MpEngineFactory::sharedEngine();
+    connect( mMpEngine, SIGNAL( corruptedStop() ), this, SLOT(showCorruptedNote() ));
+    mPlaybackData = mMpEngine->playbackData();
+    connect( mPlaybackData, SIGNAL( playbackStateChanged() ),
+             this, SLOT( playbackStateChanged() ) );
+
+    mPlaybackWidget = new MpPlaybackWidget( mPlaybackData );
+    connect( mPlaybackWidget, SIGNAL( setPlaybackPosition( int ) ), mMpEngine, SLOT( setPosition( int ) ) );
+    //repeat should not be displayed on fetcher or embedded.
+    mRepeat = mViewMode == MpCommon::DefaultView ? MpSettingsManager::repeat() : false;
+    mPlaybackWidget->repeatChanged( mRepeat );
+    setWidget( mPlaybackWidget );
+    setupMenu();
+    setupToolbar();
+    
+    //Connect FF and RW buttons when view (toolbar) is ready
+    connect ( mWindow, SIGNAL( viewReady() ), this, SLOT( connectButtons() ) );
+    
+    if ( mViewMode == MpCommon::DefaultView ) {
+        // Observe changes in settings.
+        connect( MpSettingsManager::instance(), SIGNAL( shuffleChanged( bool ) ),
+                 this, SLOT( shuffleChanged( bool ) ) );
+        connect( MpSettingsManager::instance(), SIGNAL( repeatChanged( bool ) ),
+                 this, SLOT( repeatChanged( bool ) ) );
+        connect( mMpEngine, SIGNAL( libraryUpdated() ), this, SLOT( closeEqualizerDialog() ) );
+    }
+
+    TX_EXIT
+}
+
+/*!
+ Activates the playback view.
+ */
+void MpPlaybackView::activateView()
+{
+    TX_ENTRY
+    mActivated = true;
+    setNavigationAction( mSoftKeyBack );
+    TX_EXIT
+}
+
+/*!
+ Deactivates the playback view.
+ */
+void MpPlaybackView::deactivateView()
+{
+    TX_ENTRY
+    menu()->close();
+    setNavigationAction( 0 );
+    mActivated = false;
+    TX_EXIT
+}
+
+/*!
+ Gets the current status of the view in a form of string
+ */
+QString MpPlaybackView::playbackStatus()
+{
+    TX_ENTRY
+    QString currentStatus;
+    
+        switch ( mPlaybackData->playbackState() ) {
+            case MpPlaybackData::NotPlaying:
+                TX_LOG_ARGS( "playbackStatus: NotPlaying" )
+                currentStatus = "NotPlaying";
+                break;
+			case MpPlaybackData::Playing:
+                TX_LOG_ARGS( "playbackStatus: Playing" )
+                currentStatus = "Playing";
+                break;
+            case MpPlaybackData::Paused:
+                TX_LOG_ARGS( "playbackStatus: Paused" )
+                currentStatus ="Paused";
+                break;
+            case MpPlaybackData::Stopped:
+                TX_LOG_ARGS( "playbackStatus: Stopped" )
+                currentStatus = "Stopped";
+                break;
+            default:
+                break;
+        }
+    TX_EXIT
+    return currentStatus;
+    
+}
+
+/*!
+ Gets the current Shuffle setting value
+ */
+bool MpPlaybackView::shuffleEnabled()
+{
+    TX_ENTRY
+    return mShuffle;
+}
+
+/*!
+ Gets the current Repeat setting value
+ */
+bool MpPlaybackView::repeatEnabled()
+{
+    TX_ENTRY
+    return mRepeat;
+}
+
+/*!
+ Slot to be called to activate settings view.
+ */
+void MpPlaybackView::startSettingsView()
+{
+    TX_LOG
+    emit command( MpCommon::ActivateSettingsView );
+}
+
+/*!
+ Slot to handle back command from softkey.
+ */
+void MpPlaybackView::back()
+{
+    TX_ENTRY
+    // Stop the playback preview when returning to collection in fetch mode
+    switch ( mViewMode ) {
+        case MpCommon::EmbeddedView:
+            TX_LOG_ARGS( "MpCommon::EmbeddedView" )
+            mMpEngine->stop();
+            emit songSelected( "" );
+            break;
+        case MpCommon::FetchView:
+            TX_LOG_ARGS( "MpCommon::FetchView" )
+            mMpEngine->stop(); //Intentional fallthrough        
+        default: 
+            emit command( MpCommon::ActivateCollectionView );
+            break;
+    }
+    
+    TX_EXIT
+}
+
+/*!
+ Slot to be called to exit.
+ */
+void MpPlaybackView::exit()
+{
+    TX_ENTRY
+    emit command( MpCommon::Exit );
+    TX_EXIT
+}
+
+/*!
+ Slot to handle playback state changed.
+ */
+void MpPlaybackView::playbackStateChanged()
+{
+    TX_ENTRY
+    updatePlayPauseIcon();
+    if ( MpPlaybackData::Stopped == mPlaybackData->playbackState() && mViewMode == MpCommon::FetchView ) {
+          back();
+    }
+    TX_EXIT
+}
+
+/*!
+ Slot to handle flip action.
+ */
+void MpPlaybackView::flip()
+{
+    TX_ENTRY
+    mMpEngine->retrieveSongDetails();
+    emit command( MpCommon::ActivateDetailsView );
+    TX_EXIT
+}
+
+/*!
+ Slot to handle shuffle toggle.
+ */
+void MpPlaybackView::toggleShuffle()
+{
+    mMpEngine->setShuffle( !mShuffle );
+    MpSettingsManager::setShuffle( !mShuffle );
+}
+
+/*!
+ Slot to handle /a shuffle setting change.
+ */
+void MpPlaybackView::shuffleChanged( bool shuffle )
+{
+    mShuffle = shuffle;
+    mShuffleAction->setIcon( mShuffle ? *mShuffleOnIcon : *mShuffleOffIcon );
+}
+
+/*!
+ Slot to handle repeat toggle.
+ */
+void MpPlaybackView::toggleRepeat()
+{
+    mMpEngine->setRepeat( !mRepeat );
+    MpSettingsManager::setRepeat( !mRepeat );
+}
+
+/*!
+ Slot to handle /a repeat setting change.
+ */
+void MpPlaybackView::repeatChanged( bool repeat )
+{
+    mRepeat = repeat;
+    mRepeatAction->setText( mRepeat ?  hbTrId( "txt_mus_opt_repeat_off" ) : hbTrId( "txt_mus_opt_repeat_on" ) );
+    mPlaybackWidget->repeatChanged( repeat );
+}
+
+/*!
+ Slot called when a song is selected in fetch mode.
+ */
+void MpPlaybackView::handleSongSelected()
+{
+    TX_ENTRY
+    mMpEngine->stop();
+    emit songSelected( mPlaybackData->uri() );
+    TX_EXIT
+}
+
+/*!
+ setup the menu.
+ */
+void MpPlaybackView::setupMenu()
+{
+    TX_ENTRY
+    if ( mViewMode == MpCommon::DefaultView ) {
+        mRepeat = MpSettingsManager::repeat();
+        HbMenu* myMenu = new HbMenu();
+        connect( myMenu->addAction( hbTrId( "txt_mus_opt_equalizer" ) ), SIGNAL( triggered() ), this, SLOT( showEqualizerDialog() ) );
+        connect( myMenu->addAction( hbTrId( "txt_mus_opt_audio_effects" ) ), SIGNAL( triggered() ), this, SLOT( startSettingsView() ) );
+        mRepeatAction = myMenu->addAction( mRepeat ?  hbTrId( "txt_mus_opt_repeat_off" ) : hbTrId( "txt_mus_opt_repeat_on" ) );
+        connect( mRepeatAction , SIGNAL( triggered() ), this, SLOT( toggleRepeat() ) );
+        connect( myMenu->addAction( hbTrId( "txt_common_opt_exit" ) ), SIGNAL( triggered() ), this, SLOT( exit() ) );
+        setMenu( myMenu );
+    }
+    TX_EXIT
+}
+
+/*!
+ setup the toolbar.
+ */
+void MpPlaybackView::setupToolbar()
+{
+    TX_ENTRY
+    HbToolBar *myToolBar = toolBar();
+    myToolBar->setObjectName("PlaybackToolbar");
+    myToolBar->setOrientation( Qt::Horizontal );
+    QActionGroup *actionsGroup = new QActionGroup( myToolBar );
+
+    if ( mViewMode == MpCommon::DefaultView || mViewMode == MpCommon::EmbeddedView ) {
+        mShuffleOnIcon = new HbIcon( "qtg_mono_shuffle" );
+        mShuffleOffIcon = new HbIcon( "qtg_mono_shuffle_off" );
+        mShuffleAction = new HbAction( actionsGroup );
+        mShuffle = MpSettingsManager::shuffle();
+        mShuffleAction->setIcon( mShuffle ? *mShuffleOnIcon : *mShuffleOffIcon );
+        mShuffleAction->setCheckable( false );
+        
+        if ( mViewMode == MpCommon::DefaultView ) {
+            connect( mShuffleAction, SIGNAL( triggered( bool ) ),
+                         this, SLOT( toggleShuffle() ) );
+        }
+        else {
+            mShuffleAction->setEnabled( false );
+        }
+        
+        myToolBar->addAction( mShuffleAction );
+
+        HbAction *action = new HbAction( actionsGroup );
+        action->setIcon( HbIcon( "qtg_mono_seek_previous" ) );
+        action->setCheckable( false );
+        action->setObjectName("previous");
+        myToolBar->addAction( action );
+        
+        mPlayPauseAction = new HbAction( actionsGroup );
+        mPlayIcon = new HbIcon( "qtg_mono_play" );
+        mPauseIcon = new HbIcon( "qtg_mono_pause" );
+        updatePlayPauseIcon();
+        mPlayPauseAction->setCheckable( false );
+        connect( mPlayPauseAction, SIGNAL( triggered( bool ) ),
+                 mMpEngine, SLOT( playPause() ) );
+        myToolBar->addAction( mPlayPauseAction );
+
+        action = new HbAction( actionsGroup );
+        action->setIcon( HbIcon( "qtg_mono_seek_next" ) );
+        action->setCheckable( false );
+        action->setObjectName("next");
+        myToolBar->addAction( action );
+
+        HbIcon icon( "qtg_mono_info" );
+        action = new HbAction( actionsGroup );
+        action->setIcon( icon );
+        action->setCheckable( false );
+
+        connect( action, SIGNAL( triggered( bool ) ),
+                 this, SLOT( flip() ) );
+
+        myToolBar->addAction( action );
+    }
+    else {
+        // Fetch mode
+        HbAction *action = new HbAction( actionsGroup );
+        action->setIcon( HbIcon( "qtg_mono_tick" ) );
+        action->setCheckable( false );
+        connect( action, SIGNAL( triggered( bool ) ),
+                 this, SLOT( handleSongSelected() ) );
+        myToolBar->addAction( action );
+
+        mPlayPauseAction = new HbAction( actionsGroup );
+        mPlayIcon = new HbIcon( "qtg_mono_play" );
+        mPauseIcon = new HbIcon( "qtg_mono_pause" );
+        updatePlayPauseIcon();
+        mPlayPauseAction->setCheckable( false );
+        connect( mPlayPauseAction, SIGNAL( triggered( bool ) ),
+                 mMpEngine, SLOT( playPause() ) );
+        myToolBar->addAction( mPlayPauseAction );
+    }
+    
+    
+    TX_EXIT
+}
+
+/*!
+ Updates the play pause icon on the toolbar base on playback state.
+ */
+void MpPlaybackView::updatePlayPauseIcon()
+{
+    TX_ENTRY
+    switch ( mPlaybackData->playbackState() ) {
+        case MpPlaybackData::Playing:
+        case MpPlaybackData::NotPlaying:
+            TX_LOG_ARGS( "MpPlaybackData::Playing" )
+            mPlayPauseAction->setIcon( *mPauseIcon );
+            break;
+        case MpPlaybackData::Paused:
+        case MpPlaybackData::Stopped:
+            TX_LOG_ARGS( "MpPlaybackData::Paused" )
+            mPlayPauseAction->setIcon( *mPlayIcon );
+            break;
+
+        default:
+            break;
+    }
+    TX_EXIT
+}
+
+/*!
+ start rewind long press detection
+ */
+void MpPlaybackView::startRewindTimer()
+{
+    if(mTimer){
+        delete mTimer;
+        mTimer = 0;
+    }
+    mTimer = new QTimer(this);
+    mTimer->setSingleShot(true);
+    connect(mTimer, SIGNAL(timeout()), this, SLOT(startSeekRewind()));
+    mTimer->start(600);    
+}
+
+/*!
+ start fast forward long press detection
+ */
+void MpPlaybackView::startForwardTimer()
+{
+    if(mTimer){
+        delete mTimer;
+        mTimer = 0;
+    }
+    mTimer = new QTimer(this);
+    mTimer->setSingleShot(true);
+    connect(mTimer, SIGNAL(timeout()), this, SLOT(startSeekForward()));
+    mTimer->start(600);      
+}
+
+/*!
+ start backward seeking
+ */
+void MpPlaybackView::startSeekRewind()
+{
+    mMpEngine->startSeekBackward();
+    mSeeking = true;
+}
+
+/*!
+ start forward seeking
+ */
+void MpPlaybackView::startSeekForward()
+{
+    mMpEngine->startSeekForward();
+    mSeeking = true;
+}
+
+/*!
+ end backward seeking or skip backward
+ */
+void MpPlaybackView::endRewind()
+{
+    if(mTimer){
+        mTimer->stop();
+        delete mTimer;
+        mTimer = 0;
+    }
+    if( mSeeking ) {
+        mMpEngine->stopSeeking();
+    }
+    else {
+        mMpEngine->skipBackward();
+    }
+    mSeeking = false;
+}
+
+/*!
+ end forward seeking or skip forward
+ */
+void MpPlaybackView::endForward()
+{
+    if(mTimer){
+        mTimer->stop();
+        delete mTimer;
+        mTimer = 0;
+    }
+    if( mSeeking ) {
+        mMpEngine->stopSeeking();
+    }
+    else {
+        mMpEngine->skipForward();
+    }
+    mSeeking = false;
+}
+
+/*!
+ Slot to connect seek forward and backward toolbar buttons
+ */
+void MpPlaybackView::connectButtons()
+{
+    
+    HbToolBar *myToolBar = toolBar();
+    QGraphicsLayout *layout = myToolBar->layout();
+    if( layout ) {
+        int count = layout->count();
+        for ( int i = 0; i < count; i++ ) {
+            HbToolButton *button = dynamic_cast<HbToolButton *>( layout->itemAt(i) );
+            QString name = button->action()->objectName();
+            
+            if ( name == "previous" ) {
+                connect( button, SIGNAL( pressed() ),
+                         this, SLOT( startRewindTimer() ) );
+                connect( button, SIGNAL( released() ),
+                         this, SLOT( endRewind() ) );
+            }
+            if ( name == "next" ) {
+                connect( button, SIGNAL( pressed() ),
+                         this, SLOT( startForwardTimer() ) );
+                connect( button, SIGNAL( released() ),
+                         this, SLOT( endForward() ) );
+                disconnect ( mWindow, SIGNAL( viewReady() ), this, SLOT( connectButtons() ) );
+            }
+        }
+    }
+}
+
+/*!
+ Slot to be called to show corrupted message box.
+ */
+void MpPlaybackView::showCorruptedNote()
+{
+    mMpEngine->stop();
+    HbMessageBox *messageBox = new HbMessageBox( hbTrId( "txt_mus_info_unable_to_play_selection" ), HbMessageBox::MessageTypeWarning );
+    messageBox->setAttribute( Qt::WA_DeleteOnClose );
+    messageBox->setIcon( HbIcon( QString("qtg_small_fail") ) ); 
+    connect (messageBox, SIGNAL( aboutToClose() ), this, SLOT( back() ) );
+    messageBox->show();
+}
+
+/*!
+ Slot to be called to activate equalizer dialog.
+ */
+void MpPlaybackView::showEqualizerDialog()
+{
+    TX_ENTRY
+    if ( !mEqualizerWidget ){
+        mEqualizerWidget = new MpEqualizerWidget();
+        mEqualizerWidget->prepareDialog();
+    }
+	
+	mEqualizerWidget->show();
+
+    TX_EXIT
+}
+
+/*!
+ Slot to be called when library has been updated
+ */
+void MpPlaybackView::closeEqualizerDialog()
+{
+    TX_ENTRY
+    
+    if ( mEqualizerWidget ) {
+        mEqualizerWidget->close();
+    }
+    
+    TX_EXIT
+}