--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mpviewplugins/mpplaybackviewplugin/src/mpplaybackwidget.cpp Fri Mar 19 09:28:13 2010 +0200
@@ -0,0 +1,278 @@
+/*
+* 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 <hbdocumentloader.h>
+#include <hbstackedlayout.h>
+
+#include "mpplaybackwidget.h"
+#include "mpplaybackdata.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;
+ bool layoutOk = false;
+ mDocumentLoader = new HbDocumentLoader();
+ HbMainWindow *mainWindow = hbInstance->allMainWindows()[0];
+
+ if ( mDocumentLoader ) {
+ mDocumentLoader->load( QString(":/playbackviewdocml/playbackwidget.docml"), &widgetsOk);
+ layoutOk = loadLayout( mainWindow->orientation() );
+ }
+ if ( widgetsOk && layoutOk ) {
+ 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<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");
+ Q_ASSERT_X(layoutOk, "MpPlaybackWidget", "invalid xml file - layout");
+ }
+
+ connect( mainWindow, SIGNAL(orientationChanged(Qt::Orientation)),
+ this, SLOT(loadLayout(Qt::Orientation)) );
+
+ 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()) );
+
+ mCompositePixmap = QPixmap( 360, 360 );
+ mCompositePixmap.fill( Qt::transparent );
+
+ TX_EXIT
+}
+
+/*!
+ Constructs the collection view plugin.
+ */
+MpPlaybackWidget::~MpPlaybackWidget()
+{
+ TX_ENTRY
+ delete mDocumentLoader;
+ TX_EXIT
+}
+
+/*!
+ Slot to handle playback info changed.
+ */
+void MpPlaybackWidget::playbackInfoChanged( )
+{
+ TX_ENTRY
+ mSongTitle->setPlainText( mPlaybackData->title() );
+ mArtistName->setPlainText( mPlaybackData->artist() );
+ mAlbumName->setPlainText( mPlaybackData->album() );
+ 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
+ QPixmap pixmap;
+ mPlaybackData->albumArt( pixmap );
+ composeAlbumCover( pixmap );
+
+ QIcon qicon;
+ if ( !mCompositePixmap.isNull() ) {
+ qicon = QIcon( mCompositePixmap );
+ }
+ else {
+ qicon = QIcon( pixmap );
+ }
+ HbIcon icon( qicon );
+ mAlbumArt->setIcon( icon );
+ TX_EXIT
+}
+
+/*!
+ Orientation change. Load layout based on the \a orientation.
+ */
+bool MpPlaybackWidget::loadLayout( Qt::Orientation orientation )
+{
+ bool ret(false);
+ if ( orientation == Qt::Vertical ) {
+ mDocumentLoader->load(QString(":/playbackviewdocml/playbackwidget.docml"), "portrait", &ret);
+ }
+ else {
+ mDocumentLoader->load(QString(":/playbackviewdocml/playbackwidget.docml"), "landscape", & ret);
+ }
+ return ret;
+}
+
+/*!
+ 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) );
+ 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" );
+ }
+}
+
+/*!
+ Compose the album art.
+ */
+void MpPlaybackWidget::composeAlbumCover( QPixmap& albumart )
+{
+ TX_ENTRY
+ mCompositePixmap.fill( Qt::transparent );
+ QPainter painter(&mCompositePixmap);
+ painter.setCompositionMode(QPainter::CompositionMode_Clear);
+ painter.setCompositionMode(QPainter::CompositionMode_SourceOver);
+ painter.fillRect(mCompositePixmap.rect(), Qt::transparent);
+ painter.drawPixmap(QRect(0, 0,360,360), albumart);
+ TX_EXIT
+}