diff -r 26a1709b9fec -r 14979e23cb5e mpviewplugins/mpplaybackviewplugin/src/mpplaybackwidget.cpp --- /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 + +#include +#include +#include +#include +#include + +#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( tmpWidgetPtr ) ); + tmpWidgetPtr = mDocumentLoader->findWidget(QString("albumText")); + mAlbumName = qobject_cast(tmpWidgetPtr); + tmpWidgetPtr = mDocumentLoader->findWidget(QString("artistText")); + mArtistName = qobject_cast(tmpWidgetPtr); + tmpWidgetPtr = mDocumentLoader->findWidget(QString("songText")); + mSongTitle = qobject_cast(tmpWidgetPtr); + tmpWidgetPtr = mDocumentLoader->findWidget(QString("albumArt")); + mAlbumArt = qobject_cast(tmpWidgetPtr); + mAlbumArt->setEnabled( false ); + mAlbumArt->setDefaultIcon( HbIcon( "qtg_large_album_art" ) ); + tmpWidgetPtr = mDocumentLoader->findWidget(QString("realAudio")); + mRealAudioIndicator = qobject_cast(tmpWidgetPtr); + tmpWidgetPtr = mDocumentLoader->findWidget(QString("repeatIcon")); + mRepeatIndicator = qobject_cast(tmpWidgetPtr); + + tmpWidgetPtr = mDocumentLoader->findWidget(QString("progressBar")); + mProgressBar = qobject_cast(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" ); + } +} + +