|
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: Music Player details view. |
|
15 * |
|
16 */ |
|
17 #include <QWebSettings> |
|
18 #include <QGraphicsWidget> |
|
19 #include <QGraphicsLayoutItem> |
|
20 #include <QUrl> |
|
21 #include <QDomElement> |
|
22 #include <QList> |
|
23 #include <QFile> |
|
24 #include <QGraphicsLinearLayout> |
|
25 #include <QSizeF> |
|
26 #include <QDesktopServices> |
|
27 |
|
28 |
|
29 #include <hbinstance.h> |
|
30 #include <hbmainwindow.h> |
|
31 #include <hbaction.h> |
|
32 #include <hblabel.h> |
|
33 #include <hbgroupbox.h> |
|
34 #include <hbdocumentloader.h> |
|
35 #include <hbwidget.h> |
|
36 #include <hbpushbutton.h> |
|
37 #include <hbpopup.h> |
|
38 #include <hbdialog.h> |
|
39 #include <hblistwidget.h> |
|
40 #include <hblistwidgetitem.h> |
|
41 #include <hblistviewitem.h> |
|
42 #include <hbprogressbar.h> |
|
43 |
|
44 #include "mpdetailsview.h" |
|
45 #include "mpenginefactory.h" |
|
46 #include "mpcommondefs.h" |
|
47 #include "mpsongdata.h" |
|
48 #include "mpsettingsmanager.h" |
|
49 #include "mpquerymanager.h" |
|
50 #include "mptrace.h" |
|
51 |
|
52 |
|
53 const int KOneKiloByteInBytes = 1024; |
|
54 const int KOneMegabyteInBytes = 1048576; |
|
55 const int KOneGigaByteInBytes = 134217728; |
|
56 |
|
57 /*! |
|
58 Constructor |
|
59 */ |
|
60 MpDetailsView::MpDetailsView() |
|
61 : mMpEngine( 0 ), |
|
62 mSongData( 0 ), |
|
63 mActivated( false ), |
|
64 mSoftKeyBack( 0 ), |
|
65 mSongText( 0 ), |
|
66 mAlbumText( 0 ), |
|
67 mArtistText( 0 ), |
|
68 mAlbumArt( 0 ), |
|
69 mSongDetailsGroupBox(0), |
|
70 mInspireMeGroupBox(0), |
|
71 mDocumentLoader( 0 ), |
|
72 mDetailList(0), |
|
73 mInspireList(0), |
|
74 mInspireMeProgressBar(0), |
|
75 mMpQueryManager( 0 ), |
|
76 mInspireMeQueryOngoing( false ), |
|
77 mInspireMeQueryRendered( false ) |
|
78 { |
|
79 TX_ENTRY |
|
80 bool widgetsOk = false; |
|
81 HbMainWindow *mainWindow = hbInstance->allMainWindows()[0]; |
|
82 mDocumentLoader = new HbDocumentLoader(); |
|
83 |
|
84 TX_LOG_ARGS("Document loader created") |
|
85 if(!mDocumentLoader) { |
|
86 TX_LOG_ARGS( "MpDetailsView() Error: HbDocumentLoader not constructed" ); |
|
87 return; |
|
88 } |
|
89 |
|
90 TX_LOG_ARGS("Loading :/mpdetailsviewdocml/mpdetailsview.docml") |
|
91 mDocumentLoader->load( QString(":/mpdetailsviewdocml/mpdetailsview.docml"), &widgetsOk ); |
|
92 if(!widgetsOk) { |
|
93 TX_LOG_ARGS( "MpDetailsView() Error: invalid mpdetailsview.docml" ); |
|
94 return; |
|
95 } |
|
96 |
|
97 TX_LOG_ARGS("Loaded :/mpdetailsviewdocml/mpdetailsview.docml") |
|
98 QGraphicsWidget *widget = 0; |
|
99 |
|
100 widget = mDocumentLoader->findWidget( QString("content") ); |
|
101 TX_LOG_ARGS( "MpDetailsView() mDocumentLoader->findWidget for <content>: " << (int)(widget) ); |
|
102 setWidget( qobject_cast<HbWidget *>(widget) ); |
|
103 |
|
104 widget = mDocumentLoader->findWidget( QString("trackTitle") ); |
|
105 mSongText = qobject_cast<HbLabel *>(widget); |
|
106 TX_LOG_ARGS("MpDetailsView() <trackTitle> widget found mSongText: " << (int)(mSongText) ); |
|
107 |
|
108 widget = mDocumentLoader->findWidget( QString("artist") ); |
|
109 mArtistText = qobject_cast<HbLabel *>(widget); |
|
110 TX_LOG_ARGS("MpDetailsView() <artist> widget found mArtistText: " << (int)(mArtistText) ); |
|
111 |
|
112 widget = mDocumentLoader->findWidget( QString("albumName") ); |
|
113 mAlbumText = qobject_cast<HbLabel *>(widget); |
|
114 TX_LOG_ARGS("MpDetailsView() <albumName> widget found mAlbumText: " << (int)(mAlbumText) ); |
|
115 |
|
116 widget = mDocumentLoader->findWidget( QString("albumArt") ); |
|
117 mAlbumArt = qobject_cast<HbLabel *>(widget); |
|
118 TX_LOG_ARGS("MpDetailsView() <albumArt> widget found mAlbumArt: " << (int)(mAlbumArt) ); |
|
119 |
|
120 widget = mDocumentLoader->findWidget( QString("songDetails") ); |
|
121 mSongDetailsGroupBox = qobject_cast<HbGroupBox *>(widget); |
|
122 TX_LOG_ARGS("MpDetailsView() <songDetails> widget found mSongDetailsGroupBox: " << (int)(mSongDetailsGroupBox) ); |
|
123 |
|
124 widget = mDocumentLoader->findWidget( QString("songDetailsListWidget") ); |
|
125 mDetailList = qobject_cast<HbListWidget *>(widget); |
|
126 TX_LOG_ARGS("MpDetailsView() <songDetailsListWidget> widget found mDetailList: " << (int)(mDetailList) ); |
|
127 |
|
128 widget = mDocumentLoader->findWidget( QString("inspireMeGroupBox") ); |
|
129 mInspireMeGroupBox = qobject_cast<HbGroupBox *>(widget); |
|
130 TX_LOG_ARGS("MpDetailsView() <inspireMeGroupBox> widget found mInspireMeGroupBox: " << (int)(mInspireMeGroupBox) ); |
|
131 |
|
132 widget = mDocumentLoader->findWidget( QString("inspireListWidget") ); |
|
133 mInspireList = qobject_cast<HbListWidget *>(widget); |
|
134 TX_LOG_ARGS("MpDetailsView() <inspireListWidget> widget found mInspireList: " << (int)(mInspireList) ); |
|
135 |
|
136 widget = mDocumentLoader->findWidget( QString("inspireMeProgressBar") ); |
|
137 mInspireMeProgressBar = qobject_cast<HbProgressBar *>(widget); |
|
138 TX_LOG_ARGS("MpDetailsView() <inspireMeProgressBar> widget found mInspireMeProgressBar: " << (int)(mInspireMeProgressBar) ); |
|
139 |
|
140 // load section HideInspireMe if no ovi store suport |
|
141 bool loadingSectionOk = false; |
|
142 mDocumentLoader->load( QString(":/mpdetailsviewdocml/mpdetailsview.docml"), QString( "ShowInspireMe" ), &loadingSectionOk ); |
|
143 if( loadingSectionOk ) { |
|
144 TX_LOG_ARGS( "Loading ShowInspireMe section is successful." ); |
|
145 } |
|
146 else { |
|
147 TX_LOG_ARGS( "Loading ShowInspireMe section fails." ); |
|
148 } |
|
149 |
|
150 TX_EXIT |
|
151 } |
|
152 |
|
153 /*! |
|
154 Destructs the details view. |
|
155 */ |
|
156 MpDetailsView::~MpDetailsView() |
|
157 { |
|
158 TX_ENTRY |
|
159 saveGroupBoxStates(); |
|
160 delete mSoftKeyBack; |
|
161 delete mDocumentLoader; |
|
162 delete mMpQueryManager; |
|
163 |
|
164 TX_EXIT |
|
165 } |
|
166 |
|
167 |
|
168 /*! |
|
169 Initializes the details view. Allocates all resources needed by the view. |
|
170 */ |
|
171 void MpDetailsView::initializeView() |
|
172 { |
|
173 TX_ENTRY |
|
174 |
|
175 mSoftKeyBack = new HbAction( Hb::BackNaviAction, this ); |
|
176 |
|
177 mMpEngine = MpEngineFactory::sharedEngine(); |
|
178 mSongData = mMpEngine->songData(); |
|
179 mMpQueryManager = new MpQueryManager(); |
|
180 |
|
181 connect( mSoftKeyBack, SIGNAL( triggered() ), this, SLOT( back() ) ); |
|
182 connect( mSongData, SIGNAL( albumArtReady() ), this, SLOT( albumArtChanged() ) ); |
|
183 connect( mSongData, SIGNAL( playbackInfoChanged() ), this, SLOT( handlePlaybackInfoChanged() ) ); |
|
184 connect( mSongData, SIGNAL( songDetailInfoChanged() ), this, SLOT( songDetailInfoChanged() ) ); |
|
185 connect( mDetailList, SIGNAL( pressed( HbListWidgetItem * ) ), this, SLOT( handleListItemSelected( HbListWidgetItem * ) ) ); |
|
186 connect( mSongDetailsGroupBox, SIGNAL( toggled( bool ) ), this, SLOT( handleDetailsGroupBoxToggled( bool ) ) ); |
|
187 connect( mInspireMeGroupBox, SIGNAL( toggled( bool ) ), this, SLOT( handleInspireMeGroupBoxToggled( bool ) ) ); |
|
188 connect( mMpQueryManager, SIGNAL(inspireMeItemsMetadataRetrieved()), this, SLOT(renderInspireMeMetadata())); |
|
189 connect( mMpQueryManager, SIGNAL(inspireMeItemAlbumArtReady()), this, SLOT(renderInspireMeAlbumArts())); |
|
190 connect( mMpQueryManager, SIGNAL(localMusicStoreRetrieved(bool)), this, SLOT(queryInspireMe(bool)), Qt::QueuedConnection); |
|
191 connect( mMpQueryManager, SIGNAL(localMusicStoreRetrievalError()), this, SLOT(abortInspireMeProcess())); |
|
192 connect( mMpQueryManager, SIGNAL(inspireMeItemsRetrievalError()), this, SLOT(queryLocalMusicStore()), Qt::QueuedConnection); |
|
193 |
|
194 TX_EXIT |
|
195 } |
|
196 |
|
197 void MpDetailsView::queryLocalMusicStore() |
|
198 { |
|
199 TX_ENTRY |
|
200 mMpQueryManager->reset(); |
|
201 mMpQueryManager->queryLocalMusicStore(); |
|
202 TX_EXIT |
|
203 } |
|
204 |
|
205 /*! |
|
206 Activates the details view. |
|
207 */ |
|
208 void MpDetailsView::activateView() |
|
209 { |
|
210 TX_ENTRY |
|
211 setNavigationAction( mSoftKeyBack ); |
|
212 |
|
213 mActivated = true; |
|
214 TX_LOG_ARGS( "InspireMeVal: " << MpSettingsManager::inspireMe() ); |
|
215 TX_LOG_ARGS( "SongDetailsGbVal: " << MpSettingsManager::songDetailsGb() ); |
|
216 mInspireMeGroupBox->setCollapsed(!MpSettingsManager::inspireMe()); |
|
217 mSongDetailsGroupBox->setCollapsed(!MpSettingsManager::songDetailsGb()); |
|
218 TX_EXIT |
|
219 } |
|
220 |
|
221 /*! |
|
222 Deactivates the details view. |
|
223 */ |
|
224 void MpDetailsView::deactivateView() |
|
225 { |
|
226 TX_ENTRY |
|
227 saveGroupBoxStates(); |
|
228 setNavigationAction( 0 ); |
|
229 mActivated = false; |
|
230 TX_EXIT |
|
231 } |
|
232 |
|
233 void MpDetailsView::saveGroupBoxStates() |
|
234 { |
|
235 TX_ENTRY |
|
236 if (mInspireMeGroupBox->isCollapsed() ) { |
|
237 MpSettingsManager::setInspireMe(false); |
|
238 } |
|
239 else { |
|
240 MpSettingsManager::setInspireMe(true); |
|
241 } |
|
242 |
|
243 if (mSongDetailsGroupBox->isCollapsed() ) { |
|
244 MpSettingsManager::setSongDetailsGb(false); |
|
245 } |
|
246 else { |
|
247 MpSettingsManager::setSongDetailsGb(true); |
|
248 } |
|
249 TX_EXIT |
|
250 } |
|
251 |
|
252 /*! |
|
253 Slot to handle back command from softkey. |
|
254 */ |
|
255 void MpDetailsView::back() |
|
256 { |
|
257 TX_ENTRY |
|
258 emit command( MpCommon::ActivatePreviousView ); |
|
259 TX_EXIT |
|
260 } |
|
261 |
|
262 /*! |
|
263 Slot to handle Album art changed. |
|
264 */ |
|
265 void MpDetailsView::albumArtChanged( ) |
|
266 { |
|
267 TX_ENTRY |
|
268 HbIcon icon; |
|
269 mSongData->albumArt( icon ); |
|
270 mAlbumArt->setIcon( icon ); |
|
271 TX_EXIT |
|
272 } |
|
273 |
|
274 /*! |
|
275 Slot to handle network error. |
|
276 */ |
|
277 void MpDetailsView::abortInspireMeProcess( ) |
|
278 { |
|
279 TX_ENTRY |
|
280 mInspireMeProgressBar->hide(); |
|
281 mInspireMeGroupBox->setCollapsed( true ); |
|
282 mInspireMeQueryOngoing = false; |
|
283 mInspireMeQueryRendered = false; |
|
284 // ensure that we dont get callbacks from previous queries. Especially true, |
|
285 // if details view is actived with a quick song change again |
|
286 mMpQueryManager->reset(); |
|
287 mInspireList->clear(); |
|
288 TX_EXIT |
|
289 } |
|
290 |
|
291 /*! |
|
292 Render inspireme groupbox after album arts downloaded |
|
293 */ |
|
294 void MpDetailsView::renderInspireMeMetadata() |
|
295 { |
|
296 TX_ENTRY |
|
297 mInspireMeQueryOngoing = false; |
|
298 mInspireMeQueryRendered = true; |
|
299 mInspireMeProgressBar->hide(); |
|
300 if( mMpQueryManager->recommendationsCount() ) { |
|
301 TX_LOG_ARGS( "There are recommendations." ) |
|
302 // we have recommendations |
|
303 for ( int i = 0; i < mMpQueryManager->recommendationsCount(); ++i ) { |
|
304 // configure the layout properties |
|
305 if(!mInspireList->count()) { |
|
306 // we havent configured the prototype before |
|
307 HbListViewItem *prototype = mInspireList->listItemPrototype(); |
|
308 prototype->setGraphicsSize( HbListViewItem::LargeIcon ); |
|
309 } |
|
310 // create the item |
|
311 HbListWidgetItem *inspireMeItem = new HbListWidgetItem(); |
|
312 inspireMeItem->setIcon( mMpQueryManager->recommendedAlbumArt( i )); |
|
313 inspireMeItem->setText( mMpQueryManager->recommendedSong( i ) ); |
|
314 inspireMeItem->setSecondaryText( mMpQueryManager->recommendedArtist( i ) ); |
|
315 mInspireList->addItem( inspireMeItem ); |
|
316 } |
|
317 } |
|
318 else { |
|
319 TX_LOG_ARGS( "There are NO recommendations" ) |
|
320 // we dont have recommendations |
|
321 // we havent configured the prototype before |
|
322 HbListViewItem *prototype = mInspireList->listItemPrototype(); |
|
323 const int maxTextRowCount = 20; |
|
324 const int minTextRowCount = 1; |
|
325 prototype->setSecondaryTextRowCount(minTextRowCount,maxTextRowCount); |
|
326 |
|
327 HbListWidgetItem *inspireMeItem = new HbListWidgetItem(); |
|
328 inspireMeItem->setSecondaryText( hbTrId( "txt_mus_dblist_val_there_are_no_recommendations" ) ); |
|
329 mInspireList->addItem( inspireMeItem ); |
|
330 } |
|
331 |
|
332 TX_EXIT |
|
333 } |
|
334 |
|
335 void MpDetailsView::renderInspireMeAlbumArts() |
|
336 { |
|
337 TX_ENTRY |
|
338 for( int i = 0; i < mInspireList->count(); ++i) { |
|
339 mInspireList->item(i)->setIcon( mMpQueryManager->recommendedAlbumArt( i ) ); |
|
340 } |
|
341 TX_EXIT |
|
342 } |
|
343 |
|
344 bool MpDetailsView::isMetadata() const |
|
345 { |
|
346 bool result = ( ( !mSongData->album().isEmpty() ) || |
|
347 ( !mSongData->artist().isEmpty() ) ); |
|
348 TX_LOG_ARGS( "Inspire Me Query metadata available:" << result ); |
|
349 return result; |
|
350 } |
|
351 |
|
352 /*! |
|
353 Slot to handle basic song information |
|
354 */ |
|
355 void MpDetailsView::handlePlaybackInfoChanged() |
|
356 { |
|
357 TX_ENTRY |
|
358 // ensure that we dont get callbacks from previous queries. Especially true, |
|
359 // if details view is actived with a quick song change again |
|
360 mMpQueryManager->reset(); |
|
361 mInspireList->clear(); |
|
362 mInspireMeQueryRendered = false; |
|
363 |
|
364 // Clear the song data link until new query has been made. |
|
365 mSongData->setLink( "" ); |
|
366 |
|
367 if ( !mSongData->title().isEmpty () ) { |
|
368 mSongText->setPlainText( mSongData->title() ); |
|
369 } |
|
370 else { |
|
371 mSongText->setPlainText( mSongData->fileName() ); |
|
372 } |
|
373 |
|
374 if ( !mSongData->album().isEmpty () ) { |
|
375 mAlbumText->setPlainText( mSongData->album() ); |
|
376 } |
|
377 else { |
|
378 mAlbumText->setPlainText( hbTrId( "txt_mus_other_unknown7") ); |
|
379 } |
|
380 |
|
381 if ( !mSongData->artist().isEmpty() ) { |
|
382 mArtistText->setPlainText( mSongData->artist() ); |
|
383 } |
|
384 else { |
|
385 mArtistText->setPlainText( hbTrId( "txt_mus_other_unknown6") ); |
|
386 } |
|
387 |
|
388 if(!mInspireMeGroupBox->isCollapsed()) { |
|
389 startInspireMe(); |
|
390 } |
|
391 TX_EXIT |
|
392 } |
|
393 |
|
394 void MpDetailsView::startInspireMe() |
|
395 { |
|
396 TX_ENTRY |
|
397 if(isMetadata()) { |
|
398 // show progress bar, start store query or inspire me query process |
|
399 mInspireMeProgressBar->show(); |
|
400 mInspireMeQueryOngoing = true; |
|
401 if( mMpQueryManager->isLocalMusicStore() ) { |
|
402 mMpQueryManager->queryInspireMeItems(mSongData->artist(),mSongData->album(),mSongData->title()); |
|
403 } |
|
404 else { |
|
405 // no local store information present |
|
406 mMpQueryManager->queryLocalMusicStore(); |
|
407 } |
|
408 } |
|
409 else { |
|
410 // no metadata. show no recommendations |
|
411 renderInspireMeMetadata(); |
|
412 } |
|
413 TX_EXIT |
|
414 } |
|
415 |
|
416 /*! |
|
417 Slot to handle detail song information |
|
418 */ |
|
419 void MpDetailsView::songDetailInfoChanged() |
|
420 { |
|
421 TX_ENTRY |
|
422 mDetailList->clear(); |
|
423 |
|
424 if ( !mSongData->albumTrack().isNull() ) { |
|
425 HbListWidgetItem *item = new HbListWidgetItem(); |
|
426 item->setText( hbTrId( "txt_mus_dblist_song_number" ) ); |
|
427 item->setSecondaryText( mSongData->albumTrack() ); |
|
428 item->setEnabled( false ); |
|
429 mDetailList->addItem( item ); |
|
430 } |
|
431 |
|
432 if ( !mSongData->year().isNull() ) { |
|
433 HbListWidgetItem *item = new HbListWidgetItem(); |
|
434 item->setText( hbTrId( "txt_mus_dblist_year" ) ); |
|
435 item->setSecondaryText( mSongData->year() ); |
|
436 item->setEnabled( false ); |
|
437 mDetailList->addItem( item ); |
|
438 } |
|
439 |
|
440 if ( !mSongData->genre().isNull() ) { |
|
441 HbListWidgetItem *item = new HbListWidgetItem(); |
|
442 item->setText( hbTrId( "txt_mus_dblist_genre" ) ); |
|
443 item->setSecondaryText( mSongData->genre() ); |
|
444 item->setEnabled( false ); |
|
445 mDetailList->addItem( item ); |
|
446 } |
|
447 |
|
448 if ( !mSongData->composer().isNull() ) { |
|
449 HbListWidgetItem *item = new HbListWidgetItem(); |
|
450 item->setText( hbTrId( "txt_mus_dblist_composer" ) ); |
|
451 item->setSecondaryText( mSongData->composer() ); |
|
452 item->setEnabled( false ); |
|
453 mDetailList->addItem( item ); |
|
454 } |
|
455 |
|
456 if ( !mSongData->fileName().isNull() ) { |
|
457 HbListWidgetItem *item = new HbListWidgetItem(); |
|
458 item->setText( hbTrId( "txt_mus_dblist_file_name" ) ); |
|
459 item->setSecondaryText( mSongData->fileName() ); |
|
460 item->setEnabled( false ); |
|
461 mDetailList->addItem( item ); |
|
462 } |
|
463 |
|
464 if ( !mSongData->mimeType().isNull() ) { |
|
465 HbListWidgetItem *item = new HbListWidgetItem(); |
|
466 item->setText( hbTrId( "txt_mus_dblist_format" ) ); |
|
467 item->setSecondaryText( mSongData->mimeType() ); |
|
468 item->setEnabled( false ); |
|
469 mDetailList->addItem( item ); |
|
470 } |
|
471 |
|
472 if ( !mSongData->duration().isNull() ) { |
|
473 HbListWidgetItem *item = new HbListWidgetItem(); |
|
474 item->setText( hbTrId( "txt_mus_dblist_duration" ) ); |
|
475 item->setSecondaryText( mSongData->duration() ); |
|
476 item->setEnabled( false ); |
|
477 mDetailList->addItem( item ); |
|
478 } |
|
479 |
|
480 if ( !mSongData->bitRate().isNull() ) { |
|
481 HbListWidgetItem *item = new HbListWidgetItem(); |
|
482 item->setText( hbTrId( "txt_mus_dblist_bitrate" ) ); |
|
483 bool ok = false; |
|
484 int bitRate = mSongData->bitRate().toInt(&ok); |
|
485 TX_LOG_ARGS("Warning: If zero, bitrate is not read correctly. It wont show up in details" << ok); |
|
486 if(ok) { |
|
487 item->setSecondaryText( hbTrId("txt_mus_dblist_bitrate_val_ln_kbps", bitRate) ); |
|
488 } |
|
489 item->setEnabled( false ); |
|
490 mDetailList->addItem( item ); |
|
491 } |
|
492 |
|
493 if ( !mSongData->sampleRate().isNull() ) { |
|
494 HbListWidgetItem *item = new HbListWidgetItem(); |
|
495 item->setText( hbTrId( "txt_mus_dblist_sampling_rate" ) ); |
|
496 bool ok = false; |
|
497 int samplingRate = mSongData->sampleRate().toInt(&ok); |
|
498 TX_LOG_ARGS("Warning: If zero, sampling rate is not read correctly. It wont show up in details" << ok); |
|
499 if(ok) { |
|
500 item->setSecondaryText( hbTrId("txt_mus_dblist_sampling_rate_val_ln_hz", samplingRate) ); |
|
501 } |
|
502 item->setEnabled( false ); |
|
503 mDetailList->addItem( item ); |
|
504 } |
|
505 |
|
506 if ( !mSongData->size().isNull() ) { |
|
507 HbListWidgetItem *item = new HbListWidgetItem(); |
|
508 item->setText( hbTrId( "txt_mus_dblist_size" ) ); |
|
509 bool ok = false; |
|
510 long size = mSongData->size().toLong(&ok); // in bytes |
|
511 TX_LOG_ARGS("WARNING: If zero, Cant get song data size right. You wont see the size in details groupbox correctly" << ok ); |
|
512 if( size < KOneKiloByteInBytes) { |
|
513 // under 1 KB |
|
514 item->setSecondaryText( hbTrId("txt_mus_dblist_size_val_ln_b", size) ); |
|
515 } |
|
516 else if( size < KOneMegabyteInBytes ) { |
|
517 // under 1 MB |
|
518 size /= KOneKiloByteInBytes; // turn size into KB |
|
519 item->setSecondaryText( hbTrId("txt_mus_dblist_size_val_ln_kb", size) ); |
|
520 } |
|
521 else if( size < KOneGigaByteInBytes ) { |
|
522 // under 1 GB |
|
523 size /= KOneMegabyteInBytes; // turn size to MB |
|
524 item->setSecondaryText( hbTrId("txt_mus_dblist_size_val_ln_mb", size) ); |
|
525 } |
|
526 else { |
|
527 // 1 GB or higher |
|
528 size /= KOneGigaByteInBytes; // turn size to GB |
|
529 item->setSecondaryText( hbTrId("txt_mus_dblist_size_val_ln_gb", size) ); |
|
530 } |
|
531 item->setEnabled( false ); |
|
532 mDetailList->addItem( item ); |
|
533 } |
|
534 |
|
535 if ( !mSongData->modified().isNull() ) { |
|
536 HbListWidgetItem *item = new HbListWidgetItem(); |
|
537 item->setText( hbTrId( "txt_mus_dblist_modified" ) ); |
|
538 item->setSecondaryText( mSongData->modified() ); |
|
539 item->setEnabled( false ); |
|
540 mDetailList->addItem( item ); |
|
541 } |
|
542 |
|
543 if ( !mSongData->copyright().isNull() ) { |
|
544 HbListWidgetItem *item = new HbListWidgetItem(); |
|
545 item->setText( hbTrId( "txt_mus_dblist_copyright" ) ); |
|
546 item->setSecondaryText( mSongData->copyright() ); |
|
547 item->setEnabled( false ); |
|
548 mDetailList->addItem( item ); |
|
549 } |
|
550 |
|
551 if ( !mSongData->musicURL().isNull() ) { |
|
552 HbListWidgetItem *item = new HbListWidgetItem(); |
|
553 item->setText( hbTrId( "txt_mus_dblist_web_site" ) ); |
|
554 item->setSecondaryText( mSongData->musicURL() ); |
|
555 item->setEnabled( true ); |
|
556 mDetailList->addItem( item ); |
|
557 } |
|
558 |
|
559 if ( mSongData->isDrmProtected() ) { |
|
560 HbListWidgetItem *item = new HbListWidgetItem(); |
|
561 item->setText( hbTrId( "txt_mus_dblist_licences" ) ); |
|
562 item->setSecondaryText( hbTrId( "txt_mus_dblist_licences_val_click_for_details" ) ); |
|
563 item->setEnabled( true ); |
|
564 mDetailList->addItem( item ); |
|
565 } |
|
566 |
|
567 TX_EXIT |
|
568 } |
|
569 |
|
570 void MpDetailsView::handleDetailsGroupBoxToggled(bool /*state*/) |
|
571 { |
|
572 TX_ENTRY |
|
573 if ( !mSongDetailsGroupBox->isCollapsed() ) { |
|
574 mInspireMeGroupBox->setCollapsed( true ); |
|
575 } |
|
576 TX_EXIT |
|
577 } |
|
578 |
|
579 void MpDetailsView::handleInspireMeGroupBoxToggled(bool /*state*/) |
|
580 { |
|
581 TX_ENTRY |
|
582 if ( !mInspireMeGroupBox->isCollapsed() ) { |
|
583 TX_LOG_ARGS( "InspireMe is expanded." ) |
|
584 mSongDetailsGroupBox->setCollapsed( true ); |
|
585 if ( mInspireMeQueryOngoing ) { |
|
586 TX_LOG_ARGS( "Query is ongoing " ) |
|
587 mInspireMeProgressBar->show(); |
|
588 } |
|
589 else { |
|
590 TX_LOG_ARGS( "Query is NOT ongoing " ) |
|
591 if ( mInspireMeQueryRendered ) { |
|
592 TX_LOG_ARGS( "InspireMe is rendered already. " ) |
|
593 mInspireMeProgressBar->hide(); |
|
594 } |
|
595 else { |
|
596 startInspireMe(); |
|
597 } |
|
598 } |
|
599 } |
|
600 else { |
|
601 TX_LOG_ARGS( "InspireMe is collapsed." ) |
|
602 mInspireMeProgressBar->hide(); |
|
603 } |
|
604 TX_EXIT |
|
605 } |
|
606 |
|
607 /*! |
|
608 Slot to call when URL item in song details is pressed |
|
609 */ |
|
610 void MpDetailsView::handleListItemSelected( HbListWidgetItem *item) |
|
611 { |
|
612 TX_ENTRY_ARGS( "URL: " << item->secondaryText() ); |
|
613 QDesktopServices::openUrl( item->secondaryText() ); |
|
614 TX_EXIT |
|
615 } |
|
616 |
|
617 /*! |
|
618 Slot to call when MusicStore Info is Received |
|
619 */ |
|
620 void MpDetailsView::queryInspireMe(bool storeUpdated) |
|
621 { |
|
622 TX_ENTRY |
|
623 // we asked query manager to update its local store information |
|
624 // if that store info didnt change (i.e. from empty string to "fi" or |
|
625 // from "bad old store" to "good new store") then we dont need to pursue a query |
|
626 if( storeUpdated ) { |
|
627 mMpQueryManager->queryInspireMeItems(mSongData->artist(),mSongData->album(),mSongData->title()); |
|
628 mInspireMeQueryOngoing = true; |
|
629 } |
|
630 else { |
|
631 mInspireMeQueryOngoing = false; |
|
632 mInspireMeProgressBar->hide(); |
|
633 } |
|
634 TX_EXIT |
|
635 } |
|
636 |