mpviewplugins/mpplaybackviewplugin/src/mpplaybackwidget.cpp
branchRCL_3
changeset 52 14979e23cb5e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mpviewplugins/mpplaybackviewplugin/src/mpplaybackwidget.cpp	Tue Aug 31 15:12:29 2010 +0300
@@ -0,0 +1,274 @@
+/*
+* 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: Playback widget for Music Player playback view.
+*
+*/
+
+#include <QTime>
+
+#include <hbprogressslider.h>
+#include <hbinstance.h>
+#include <hblabel.h>
+#include <hbfontspec.h>
+#include <hbstackedlayout.h>
+
+#include "mpplaybackwidget.h"
+#include "mpplaybackdata.h"
+#include "mpalbumcoverwidget.h"
+#include "mpplaybackdocumentloader.h"
+#include "mptrace.h"
+
+const unsigned int KMicroSecToMiliSec( 1000 );
+
+/*!
+    \class MpPlaybackWidget
+    \brief Music Player playback widget.
+
+    This widget displays playback information on the playback view.
+*/
+
+/*!
+    \fn void setPlaybackPosition(int value)
+
+    This signal is emitted when the user drags the progressbar to a new
+    position, \a value indicates the position.
+ */
+
+/*!
+ Constructs the collection view plugin.
+ */
+MpPlaybackWidget::MpPlaybackWidget(MpPlaybackData *data, QGraphicsItem *parent )
+    : HbWidget(parent),
+      mPlaybackData(data),
+      mDocumentLoader(0),
+      mProgreesBarDragging(false),
+      mDuration(0)
+{
+    TX_ENTRY
+    mLayout = new HbStackedLayout(this);
+    mLayout->setContentsMargins( 0.0, 0.0, 0.0, 0.0 );
+    mLayout->setMinimumSize( 0.0, 0.0 );
+    setLayout( mLayout );
+    bool widgetsOk = false;
+    mDocumentLoader = new MpPlaybackDocumentLoader();
+    HbMainWindow *mainWindow = hbInstance->allMainWindows()[0];
+
+    if ( mDocumentLoader ) {
+        mDocumentLoader->load( QString(":/playbackviewdocml/playbackwidget.docml"), &widgetsOk);
+    }
+    if ( widgetsOk ) {
+        QGraphicsWidget *tmpWidgetPtr;
+        tmpWidgetPtr = mDocumentLoader->findWidget(QString("playbackWidgetContainer"));
+        tmpWidgetPtr->setParentItem(this);
+        mLayout->addItem( qobject_cast<HbWidget*>( tmpWidgetPtr ) );
+        tmpWidgetPtr = mDocumentLoader->findWidget(QString("albumText"));
+        mAlbumName = qobject_cast<HbLabel*>(tmpWidgetPtr);
+        tmpWidgetPtr = mDocumentLoader->findWidget(QString("artistText"));
+        mArtistName = qobject_cast<HbLabel*>(tmpWidgetPtr);
+        tmpWidgetPtr = mDocumentLoader->findWidget(QString("songText"));
+        mSongTitle = qobject_cast<HbLabel*>(tmpWidgetPtr);
+        tmpWidgetPtr = mDocumentLoader->findWidget(QString("albumArt"));
+        mAlbumArt = qobject_cast<MpAlbumCoverWidget*>(tmpWidgetPtr);
+        mAlbumArt->setEnabled( false );
+        mAlbumArt->setDefaultIcon( HbIcon( "qtg_large_album_art" ) );
+        tmpWidgetPtr = mDocumentLoader->findWidget(QString("realAudio"));
+        mRealAudioIndicator = qobject_cast<HbLabel*>(tmpWidgetPtr);
+        tmpWidgetPtr = mDocumentLoader->findWidget(QString("repeatIcon"));
+        mRepeatIndicator = qobject_cast<HbLabel*>(tmpWidgetPtr);
+                
+        tmpWidgetPtr = mDocumentLoader->findWidget(QString("progressBar"));
+        mProgressBar = qobject_cast<HbProgressSlider*>(tmpWidgetPtr);
+
+        //TODO: move this to docml when supported.
+        mProgressBar->setMinMaxTextVisible(true);
+    }
+    else {
+        TX_LOG_ARGS("Error: invalid xml file.");
+        Q_ASSERT_X(widgetsOk, "MpPlaybackWidget", "invalid xml file - widget");
+    }
+
+    connect( mProgressBar, SIGNAL(sliderPressed()), this, SLOT(handleSliderPressed()) );
+    connect( mProgressBar, SIGNAL(sliderReleased()), this, SLOT(handleSliderReleased()) );
+    connect( mProgressBar, SIGNAL(sliderMoved(int)), this, SLOT(handleSliderMoved(int)) );
+
+    connect( mPlaybackData, SIGNAL(playbackInfoChanged()), this, SLOT(playbackInfoChanged()) );
+    connect( mPlaybackData, SIGNAL(durationChanged()), this, SLOT(durationChanged()) );
+    connect( mPlaybackData, SIGNAL(positionChanged()), this, SLOT(positionChanged()) );
+    connect( mPlaybackData, SIGNAL(albumArtReady()), this, SLOT(albumArtChanged()) );
+    
+    //Update to set initial conditions if playback has already started.
+    if ( mPlaybackData->playbackState() != MpPlaybackData::NotPlaying ) {
+        playbackInfoChanged();
+        durationChanged();
+        positionChanged();
+        albumArtChanged();
+    }
+    TX_EXIT
+}
+
+/*!
+ Constructs the collection view plugin.
+ */
+MpPlaybackWidget::~MpPlaybackWidget()
+{
+    TX_ENTRY
+    delete mDocumentLoader;
+    TX_EXIT
+}
+
+/*!
+ Handle Repeat changed.
+ */
+void MpPlaybackWidget::repeatChanged( bool value )
+{
+    mRepeatIndicator->setVisible( value );   
+}
+
+/*!
+ Slot to handle playback info changed.
+ */
+void MpPlaybackWidget::playbackInfoChanged( )
+{
+    TX_ENTRY
+    //Title
+    mSongTitle->setPlainText( mPlaybackData->title() );
+    // Artist
+    QString data = mPlaybackData->artist();
+    if ( !data.isEmpty() ) {
+        mArtistName->setPlainText( data );
+    }
+    else {
+        mArtistName->setPlainText( hbTrId( "txt_mus_other_unknown3" ) );
+    }
+    // Album
+    data = mPlaybackData->album();
+    if ( !data.isEmpty() ) {
+        mAlbumName->setPlainText( data );
+    }
+    else {
+        mAlbumName->setPlainText( hbTrId( "txt_mus_other_unknown4" ) );
+    }
+    // RealAudioIcon
+    mRealAudioIndicator->setVisible( mPlaybackData->realAudio() );
+    emit signalPlaybackInfoChanged();
+    TX_EXIT
+}
+
+/*!
+ Slot to handle playback duration changed.
+ */
+void MpPlaybackWidget::durationChanged()
+{
+    TX_ENTRY
+    mDuration = mPlaybackData->duration();
+    mDuration /= KMicroSecToMiliSec;
+
+    mProgressBar->setRange(0, mDuration);
+    mProgressBar->setProgressValue(0);
+    mProgressBar->setSliderValue(0);
+    mProgressBar->setEnabled(true);
+    TX_EXIT
+}
+
+/*!
+ Slot to handle playback position changed.
+ */
+void MpPlaybackWidget::positionChanged()
+{
+    TX_ENTRY
+    int position = mPlaybackData->position();
+    position /= KMicroSecToMiliSec;
+
+    if ( !mProgreesBarDragging ) {
+        mProgressBar->setProgressValue(position);
+        mProgressBar->setSliderValue(position);
+        mProgressBar->setMinText( formatDuration(position) );
+        mProgressBar->setMaxText( formatDuration(mDuration  - position) );
+    }
+    TX_EXIT
+}
+
+/*!
+ Slot to handle Album art changed.
+ */
+void MpPlaybackWidget::albumArtChanged( )
+{
+    TX_ENTRY
+    HbIcon icon;
+    mPlaybackData->albumArt( icon );
+    mAlbumArt->setIcon( icon );
+    mAlbumArt->setEnabled( true );
+    TX_EXIT
+}
+
+/*!
+ Slot to handle slider pressed.
+ */
+void MpPlaybackWidget::handleSliderPressed()
+{
+    TX_LOG
+    mProgreesBarDragging = true;
+}
+
+/*!
+ Slot to handle progressbar relesed.
+ */
+void MpPlaybackWidget::handleSliderReleased()
+{
+    TX_ENTRY
+    mProgreesBarDragging = false;
+    emit setPlaybackPosition( KMicroSecToMiliSec * mProgressBar->progressValue() );
+    TX_EXIT
+}
+
+
+/*!
+ Slot to handle progressbar moved.
+ */
+void MpPlaybackWidget::handleSliderMoved( int value )
+{
+    TX_ENTRY_ARGS( "value  =" << value )
+    mProgressBar->setProgressValue(value);
+    mProgressBar->setSliderValue(value);
+    mProgressBar->setMinText( formatDuration(value) );
+    mProgressBar->setMaxText( formatDuration(mDuration  - value) );
+    mProgressBar->setSliderToolTip( formatDuration(value) );
+    if ( !mProgreesBarDragging ) {
+        // Click on the progress bar, not a drag.
+        emit setPlaybackPosition( KMicroSecToMiliSec * value );
+    }
+    TX_EXIT
+}
+
+/*!
+ Returns the formated duration defined in \a seconds.
+ */
+QString MpPlaybackWidget::formatDuration( int seconds )
+{
+    TX_ENTRY
+    QTime z(0,0,0,0);
+    QTime duration;
+    duration = z.addSecs( seconds );
+    int hour = seconds / 3600;
+    if ( hour == 0 ) {
+        TX_EXIT
+        return duration.toString( "mm:ss" );
+    }
+    else {
+        TX_EXIT
+        return duration.toString( "hh:mm:ss" );
+    }
+}
+
+