|
1 /* |
|
2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). |
|
3 * All rights reserved. |
|
4 * This component and the accompanying materials are made available |
|
5 * under the terms of "Eclipse Public License v1.0" |
|
6 * which accompanies this distribution, and is available |
|
7 * at the URL "http://www.eclipse.org/legal/epl-v10.html". |
|
8 * |
|
9 * Initial Contributors: |
|
10 * Nokia Corporation - initial contribution. |
|
11 * |
|
12 * Contributors: |
|
13 * |
|
14 * Description: Playback widget for Music Player playback view. |
|
15 * |
|
16 */ |
|
17 |
|
18 #include <QTime> |
|
19 |
|
20 #include <hbprogressslider.h> |
|
21 #include <hbinstance.h> |
|
22 #include <hblabel.h> |
|
23 #include <hbfontspec.h> |
|
24 #include <hbstackedlayout.h> |
|
25 |
|
26 #include "mpplaybackwidget.h" |
|
27 #include "mpplaybackdata.h" |
|
28 #include "mpalbumcoverwidget.h" |
|
29 #include "mpplaybackdocumentloader.h" |
|
30 #include "mptrace.h" |
|
31 |
|
32 const unsigned int KMicroSecToMiliSec( 1000 ); |
|
33 |
|
34 /*! |
|
35 \class MpPlaybackWidget |
|
36 \brief Music Player playback widget. |
|
37 |
|
38 This widget displays playback information on the playback view. |
|
39 */ |
|
40 |
|
41 /*! |
|
42 \fn void setPlaybackPosition(int value) |
|
43 |
|
44 This signal is emitted when the user drags the progressbar to a new |
|
45 position, \a value indicates the position. |
|
46 */ |
|
47 |
|
48 /*! |
|
49 Constructs the collection view plugin. |
|
50 */ |
|
51 MpPlaybackWidget::MpPlaybackWidget(MpPlaybackData *data, QGraphicsItem *parent ) |
|
52 : HbWidget(parent), |
|
53 mPlaybackData(data), |
|
54 mDocumentLoader(0), |
|
55 mProgreesBarDragging(false), |
|
56 mDuration(0) |
|
57 { |
|
58 TX_ENTRY |
|
59 mLayout = new HbStackedLayout(this); |
|
60 mLayout->setContentsMargins( 0.0, 0.0, 0.0, 0.0 ); |
|
61 mLayout->setMinimumSize( 0.0, 0.0 ); |
|
62 setLayout( mLayout ); |
|
63 bool widgetsOk = false; |
|
64 mDocumentLoader = new MpPlaybackDocumentLoader(); |
|
65 HbMainWindow *mainWindow = hbInstance->allMainWindows()[0]; |
|
66 |
|
67 if ( mDocumentLoader ) { |
|
68 mDocumentLoader->load( QString(":/playbackviewdocml/playbackwidget.docml"), &widgetsOk); |
|
69 } |
|
70 if ( widgetsOk ) { |
|
71 QGraphicsWidget *tmpWidgetPtr; |
|
72 tmpWidgetPtr = mDocumentLoader->findWidget(QString("playbackWidgetContainer")); |
|
73 tmpWidgetPtr->setParentItem(this); |
|
74 mLayout->addItem( qobject_cast<HbWidget*>( tmpWidgetPtr ) ); |
|
75 tmpWidgetPtr = mDocumentLoader->findWidget(QString("albumText")); |
|
76 mAlbumName = qobject_cast<HbLabel*>(tmpWidgetPtr); |
|
77 tmpWidgetPtr = mDocumentLoader->findWidget(QString("artistText")); |
|
78 mArtistName = qobject_cast<HbLabel*>(tmpWidgetPtr); |
|
79 tmpWidgetPtr = mDocumentLoader->findWidget(QString("songText")); |
|
80 mSongTitle = qobject_cast<HbLabel*>(tmpWidgetPtr); |
|
81 tmpWidgetPtr = mDocumentLoader->findWidget(QString("albumArt")); |
|
82 mAlbumArt = qobject_cast<MpAlbumCoverWidget*>(tmpWidgetPtr); |
|
83 mAlbumArt->setEnabled( false ); |
|
84 mAlbumArt->setDefaultIcon( HbIcon( "qtg_large_album_art" ) ); |
|
85 tmpWidgetPtr = mDocumentLoader->findWidget(QString("realAudio")); |
|
86 mRealAudioIndicator = qobject_cast<HbLabel*>(tmpWidgetPtr); |
|
87 tmpWidgetPtr = mDocumentLoader->findWidget(QString("repeatIcon")); |
|
88 mRepeatIndicator = qobject_cast<HbLabel*>(tmpWidgetPtr); |
|
89 |
|
90 tmpWidgetPtr = mDocumentLoader->findWidget(QString("progressBar")); |
|
91 mProgressBar = qobject_cast<HbProgressSlider*>(tmpWidgetPtr); |
|
92 |
|
93 //TODO: move this to docml when supported. |
|
94 mProgressBar->setMinMaxTextVisible(true); |
|
95 } |
|
96 else { |
|
97 TX_LOG_ARGS("Error: invalid xml file."); |
|
98 Q_ASSERT_X(widgetsOk, "MpPlaybackWidget", "invalid xml file - widget"); |
|
99 } |
|
100 |
|
101 connect( mProgressBar, SIGNAL(sliderPressed()), this, SLOT(handleSliderPressed()) ); |
|
102 connect( mProgressBar, SIGNAL(sliderReleased()), this, SLOT(handleSliderReleased()) ); |
|
103 connect( mProgressBar, SIGNAL(sliderMoved(int)), this, SLOT(handleSliderMoved(int)) ); |
|
104 |
|
105 connect( mPlaybackData, SIGNAL(playbackInfoChanged()), this, SLOT(playbackInfoChanged()) ); |
|
106 connect( mPlaybackData, SIGNAL(durationChanged()), this, SLOT(durationChanged()) ); |
|
107 connect( mPlaybackData, SIGNAL(positionChanged()), this, SLOT(positionChanged()) ); |
|
108 connect( mPlaybackData, SIGNAL(albumArtReady()), this, SLOT(albumArtChanged()) ); |
|
109 |
|
110 //Update to set initial conditions if playback has already started. |
|
111 if ( mPlaybackData->playbackState() != MpPlaybackData::NotPlaying ) { |
|
112 playbackInfoChanged(); |
|
113 durationChanged(); |
|
114 positionChanged(); |
|
115 albumArtChanged(); |
|
116 } |
|
117 TX_EXIT |
|
118 } |
|
119 |
|
120 /*! |
|
121 Constructs the collection view plugin. |
|
122 */ |
|
123 MpPlaybackWidget::~MpPlaybackWidget() |
|
124 { |
|
125 TX_ENTRY |
|
126 delete mDocumentLoader; |
|
127 TX_EXIT |
|
128 } |
|
129 |
|
130 /*! |
|
131 Handle Repeat changed. |
|
132 */ |
|
133 void MpPlaybackWidget::repeatChanged( bool value ) |
|
134 { |
|
135 mRepeatIndicator->setVisible( value ); |
|
136 } |
|
137 |
|
138 /*! |
|
139 Slot to handle playback info changed. |
|
140 */ |
|
141 void MpPlaybackWidget::playbackInfoChanged( ) |
|
142 { |
|
143 TX_ENTRY |
|
144 //Title |
|
145 mSongTitle->setPlainText( mPlaybackData->title() ); |
|
146 // Artist |
|
147 QString data = mPlaybackData->artist(); |
|
148 if ( !data.isEmpty() ) { |
|
149 mArtistName->setPlainText( data ); |
|
150 } |
|
151 else { |
|
152 mArtistName->setPlainText( hbTrId( "txt_mus_other_unknown3" ) ); |
|
153 } |
|
154 // Album |
|
155 data = mPlaybackData->album(); |
|
156 if ( !data.isEmpty() ) { |
|
157 mAlbumName->setPlainText( data ); |
|
158 } |
|
159 else { |
|
160 mAlbumName->setPlainText( hbTrId( "txt_mus_other_unknown4" ) ); |
|
161 } |
|
162 // RealAudioIcon |
|
163 mRealAudioIndicator->setVisible( mPlaybackData->realAudio() ); |
|
164 emit signalPlaybackInfoChanged(); |
|
165 TX_EXIT |
|
166 } |
|
167 |
|
168 /*! |
|
169 Slot to handle playback duration changed. |
|
170 */ |
|
171 void MpPlaybackWidget::durationChanged() |
|
172 { |
|
173 TX_ENTRY |
|
174 mDuration = mPlaybackData->duration(); |
|
175 mDuration /= KMicroSecToMiliSec; |
|
176 |
|
177 mProgressBar->setRange(0, mDuration); |
|
178 mProgressBar->setProgressValue(0); |
|
179 mProgressBar->setSliderValue(0); |
|
180 mProgressBar->setEnabled(true); |
|
181 TX_EXIT |
|
182 } |
|
183 |
|
184 /*! |
|
185 Slot to handle playback position changed. |
|
186 */ |
|
187 void MpPlaybackWidget::positionChanged() |
|
188 { |
|
189 TX_ENTRY |
|
190 int position = mPlaybackData->position(); |
|
191 position /= KMicroSecToMiliSec; |
|
192 |
|
193 if ( !mProgreesBarDragging ) { |
|
194 mProgressBar->setProgressValue(position); |
|
195 mProgressBar->setSliderValue(position); |
|
196 mProgressBar->setMinText( formatDuration(position) ); |
|
197 mProgressBar->setMaxText( formatDuration(mDuration - position) ); |
|
198 } |
|
199 TX_EXIT |
|
200 } |
|
201 |
|
202 /*! |
|
203 Slot to handle Album art changed. |
|
204 */ |
|
205 void MpPlaybackWidget::albumArtChanged( ) |
|
206 { |
|
207 TX_ENTRY |
|
208 HbIcon icon; |
|
209 mPlaybackData->albumArt( icon ); |
|
210 mAlbumArt->setIcon( icon ); |
|
211 mAlbumArt->setEnabled( true ); |
|
212 TX_EXIT |
|
213 } |
|
214 |
|
215 /*! |
|
216 Slot to handle slider pressed. |
|
217 */ |
|
218 void MpPlaybackWidget::handleSliderPressed() |
|
219 { |
|
220 TX_LOG |
|
221 mProgreesBarDragging = true; |
|
222 } |
|
223 |
|
224 /*! |
|
225 Slot to handle progressbar relesed. |
|
226 */ |
|
227 void MpPlaybackWidget::handleSliderReleased() |
|
228 { |
|
229 TX_ENTRY |
|
230 mProgreesBarDragging = false; |
|
231 emit setPlaybackPosition( KMicroSecToMiliSec * mProgressBar->progressValue() ); |
|
232 TX_EXIT |
|
233 } |
|
234 |
|
235 |
|
236 /*! |
|
237 Slot to handle progressbar moved. |
|
238 */ |
|
239 void MpPlaybackWidget::handleSliderMoved( int value ) |
|
240 { |
|
241 TX_ENTRY_ARGS( "value =" << value ) |
|
242 mProgressBar->setProgressValue(value); |
|
243 mProgressBar->setSliderValue(value); |
|
244 mProgressBar->setMinText( formatDuration(value) ); |
|
245 mProgressBar->setMaxText( formatDuration(mDuration - value) ); |
|
246 mProgressBar->setSliderToolTip( formatDuration(value) ); |
|
247 if ( !mProgreesBarDragging ) { |
|
248 // Click on the progress bar, not a drag. |
|
249 emit setPlaybackPosition( KMicroSecToMiliSec * value ); |
|
250 } |
|
251 TX_EXIT |
|
252 } |
|
253 |
|
254 /*! |
|
255 Returns the formated duration defined in \a seconds. |
|
256 */ |
|
257 QString MpPlaybackWidget::formatDuration( int seconds ) |
|
258 { |
|
259 TX_ENTRY |
|
260 QTime z(0,0,0,0); |
|
261 QTime duration; |
|
262 duration = z.addSecs( seconds ); |
|
263 int hour = seconds / 3600; |
|
264 if ( hour == 0 ) { |
|
265 TX_EXIT |
|
266 return duration.toString( "mm:ss" ); |
|
267 } |
|
268 else { |
|
269 TX_EXIT |
|
270 return duration.toString( "hh:mm:ss" ); |
|
271 } |
|
272 } |
|
273 |
|
274 |