89 { |
91 { |
90 TX_ENTRY |
92 TX_ENTRY |
91 bool widgetsOk = false; |
93 bool widgetsOk = false; |
92 HbMainWindow *mainWindow = hbInstance->allMainWindows()[0]; |
94 HbMainWindow *mainWindow = hbInstance->allMainWindows()[0]; |
93 mDocumentLoader = new HbDocumentLoader(); |
95 mDocumentLoader = new HbDocumentLoader(); |
94 |
96 |
95 TX_LOG_ARGS("Document loader created") |
97 TX_LOG_ARGS("Document loader created") |
96 if(!mDocumentLoader) { |
98 if(!mDocumentLoader) { |
97 TX_LOG_ARGS( "MpDetailsView() Error: HbDocumentLoader not constructed" ); |
99 TX_LOG_ARGS( "MpDetailsView() Error: HbDocumentLoader not constructed" ); |
98 return; |
100 return; |
99 } |
101 } |
100 |
102 |
101 TX_LOG_ARGS("Loading :/mpdetailsviewdocml/mpdetailsview.docml") |
103 TX_LOG_ARGS("Loading :/mpdetailsviewdocml/mpdetailsview.docml") |
102 mDocumentLoader->load( QString(":/mpdetailsviewdocml/mpdetailsview.docml"), &widgetsOk ); |
104 mDocumentLoader->load( QString(":/mpdetailsviewdocml/mpdetailsview.docml"), &widgetsOk ); |
103 if(!widgetsOk) { |
105 if(!widgetsOk) { |
104 TX_LOG_ARGS( "MpDetailsView() Error: invalid mpdetailsview.docml" ); |
106 TX_LOG_ARGS( "MpDetailsView() Error: invalid mpdetailsview.docml" ); |
105 return; |
107 return; |
106 } |
108 } |
107 |
109 |
108 TX_LOG_ARGS("Loaded :/mpdetailsviewdocml/mpdetailsview.docml") |
110 TX_LOG_ARGS("Loaded :/mpdetailsviewdocml/mpdetailsview.docml") |
109 QGraphicsWidget *widget = 0; |
111 QGraphicsWidget *widget = 0; |
110 |
112 |
111 widget = mDocumentLoader->findWidget( QString("content") ); |
113 widget = mDocumentLoader->findWidget( QString("content") ); |
112 TX_LOG_ARGS( "MpDetailsView() mDocumentLoader->findWidget for <content>: " << (int)(widget) ); |
114 TX_LOG_ARGS( "MpDetailsView() mDocumentLoader->findWidget for <content>: " << (int)(widget) ); |
113 mContainer = qobject_cast<HbWidget *>(widget); |
115 setWidget( qobject_cast<HbWidget *>(widget) ); |
114 TX_LOG_ARGS("MpDetailsView() <content> widget found mContainer: " << (int)(mContainer)); |
|
115 setWidget( mContainer ); |
|
116 |
116 |
117 widget = mDocumentLoader->findWidget( QString("shareButton") ); |
117 widget = mDocumentLoader->findWidget( QString("shareButton") ); |
118 mShareButton = qobject_cast<HbPushButton *>(widget); |
118 mShareButton = qobject_cast<HbPushButton *>(widget); |
119 TX_LOG_ARGS("MpDetailsView() <shareButton> widget found mShareButton: " << (int)(mShareButton) ); |
119 TX_LOG_ARGS("MpDetailsView() <shareButton> widget found mShareButton: " << (int)(mShareButton) ); |
120 |
120 |
121 widget = mDocumentLoader->findWidget( QString("trackTitle") ); |
121 widget = mDocumentLoader->findWidget( QString("trackTitle") ); |
122 mSongText = qobject_cast<HbLabel *>(widget); |
122 mSongText = qobject_cast<HbLabel *>(widget); |
123 TX_LOG_ARGS("MpDetailsView() <trackTitle> widget found mSongText: " << (int)(mSongText) ); |
123 TX_LOG_ARGS("MpDetailsView() <trackTitle> widget found mSongText: " << (int)(mSongText) ); |
124 |
124 |
125 widget = mDocumentLoader->findWidget( QString("artist") ); |
125 widget = mDocumentLoader->findWidget( QString("artist") ); |
126 mArtistText = qobject_cast<HbLabel *>(widget); |
126 mArtistText = qobject_cast<HbLabel *>(widget); |
127 TX_LOG_ARGS("MpDetailsView() <artist> widget found mArtistText: " << (int)(mArtistText) ); |
127 TX_LOG_ARGS("MpDetailsView() <artist> widget found mArtistText: " << (int)(mArtistText) ); |
128 |
128 |
129 widget = mDocumentLoader->findWidget( QString("albumName") ); |
129 widget = mDocumentLoader->findWidget( QString("albumName") ); |
130 mAlbumText = qobject_cast<HbLabel *>(widget); |
130 mAlbumText = qobject_cast<HbLabel *>(widget); |
131 TX_LOG_ARGS("MpDetailsView() <albumName> widget found mAlbumText: " << (int)(mAlbumText) ); |
131 TX_LOG_ARGS("MpDetailsView() <albumName> widget found mAlbumText: " << (int)(mAlbumText) ); |
132 |
132 |
133 widget = mDocumentLoader->findWidget( QString("albumArt") ); |
133 widget = mDocumentLoader->findWidget( QString("albumArt") ); |
134 mAlbumArt = qobject_cast<HbLabel *>(widget); |
134 mAlbumArt = qobject_cast<HbLabel *>(widget); |
135 TX_LOG_ARGS("MpDetailsView() <albumArt> widget found mAlbumArt: " << (int)(mAlbumArt) ); |
135 TX_LOG_ARGS("MpDetailsView() <albumArt> widget found mAlbumArt: " << (int)(mAlbumArt) ); |
136 |
136 |
137 widget = mDocumentLoader->findWidget( QString("songDetails") ); |
137 widget = mDocumentLoader->findWidget( QString("songDetails") ); |
138 mSongDetailsGroupBox = qobject_cast<HbGroupBox *>(widget); |
138 mSongDetailsGroupBox = qobject_cast<HbGroupBox *>(widget); |
139 TX_LOG_ARGS("MpDetailsView() <songDetails> widget found mSongDetailsGroupBox: " << (int)(mSongDetailsGroupBox) ); |
139 TX_LOG_ARGS("MpDetailsView() <songDetails> widget found mSongDetailsGroupBox: " << (int)(mSongDetailsGroupBox) ); |
140 |
140 |
141 widget = mDocumentLoader->findWidget( QString("songDetailsListWidget") ); |
141 widget = mDocumentLoader->findWidget( QString("songDetailsListWidget") ); |
142 mDetailList = qobject_cast<HbListWidget *>(widget); |
142 mDetailList = qobject_cast<HbListWidget *>(widget); |
143 TX_LOG_ARGS("MpDetailsView() <songDetailsListWidget> widget found mDetailList: " << (int)(mDetailList) ); |
143 TX_LOG_ARGS("MpDetailsView() <songDetailsListWidget> widget found mDetailList: " << (int)(mDetailList) ); |
144 |
144 |
145 widget = mDocumentLoader->findWidget( QString("inspireMeGroupBox") ); |
145 widget = mDocumentLoader->findWidget( QString("inspireMeGroupBox") ); |
146 mInspireMeGroupBox = qobject_cast<HbGroupBox *>(widget); |
146 mInspireMeGroupBox = qobject_cast<HbGroupBox *>(widget); |
147 TX_LOG_ARGS("MpDetailsView() <inspireMeGroupBox> widget found mInspireMeGroupBox: " << (int)(mInspireMeGroupBox) ); |
147 TX_LOG_ARGS("MpDetailsView() <inspireMeGroupBox> widget found mInspireMeGroupBox: " << (int)(mInspireMeGroupBox) ); |
148 |
148 |
149 widget = mDocumentLoader->findWidget( QString("inspireListWidget") ); |
149 widget = mDocumentLoader->findWidget( QString("inspireListWidget") ); |
150 mInspireList = qobject_cast<HbListWidget *>(widget); |
150 mInspireList = qobject_cast<HbListWidget *>(widget); |
151 TX_LOG_ARGS("MpDetailsView() <inspireListWidget> widget found mInspireList: " << (int)(mInspireList) ); |
151 TX_LOG_ARGS("MpDetailsView() <inspireListWidget> widget found mInspireList: " << (int)(mInspireList) ); |
152 |
152 |
153 widget = mDocumentLoader->findWidget( QString("inspireMeProgressBar") ); |
153 widget = mDocumentLoader->findWidget( QString("inspireMeProgressBar") ); |
154 mInspireMeProgressBar = qobject_cast<HbProgressBar *>(widget); |
154 mInspireMeProgressBar = qobject_cast<HbProgressBar *>(widget); |
155 TX_LOG_ARGS("MpDetailsView() <inspireMeProgressBar> widget found mInspireMeProgressBar: " << (int)(mInspireMeProgressBar) ); |
155 TX_LOG_ARGS("MpDetailsView() <inspireMeProgressBar> widget found mInspireMeProgressBar: " << (int)(mInspireMeProgressBar) ); |
156 |
156 |
|
157 // load section HideInspireMe if no ovi store suport |
|
158 bool loadingSectionOk = false; |
|
159 mDocumentLoader->load( QString(":/mpdetailsviewdocml/mpdetailsview.docml"), QString( "ShowInspireMe" ), &loadingSectionOk ); |
|
160 if( loadingSectionOk ) { |
|
161 TX_LOG_ARGS( "Loading ShowInspireMe section is successful." ); |
|
162 } else { |
|
163 TX_LOG_ARGS( "Loading ShowInspireMe section fails." ); |
|
164 } |
|
165 |
157 TX_EXIT |
166 TX_EXIT |
158 } |
167 } |
159 |
168 |
160 /*! |
169 /*! |
161 Destructs the details view. |
170 Destructs the details view. |
162 */ |
171 */ |
163 MpDetailsView::~MpDetailsView() |
172 MpDetailsView::~MpDetailsView() |
164 { |
173 { |
165 TX_ENTRY |
174 TX_ENTRY |
166 if ( mSoftKeyBack ) { |
175 delete mSoftKeyBack; |
167 delete mSoftKeyBack; |
176 delete mDocumentLoader; |
168 } |
|
169 if ( mDocumentLoader ) { |
|
170 delete mDocumentLoader; |
|
171 } |
|
172 if( mThumbnailManager ) { |
|
173 delete mThumbnailManager; |
|
174 } |
|
175 delete mMpTranslator; |
177 delete mMpTranslator; |
176 delete mCommonTranslator; |
178 delete mCommonTranslator; |
177 delete mMpQueryManager; |
179 delete mMpQueryManager; |
178 |
180 |
179 #ifdef SHARE_FUNC_ENABLED |
181 #ifdef SHARE_FUNC_ENABLED |
206 translatorLoaded = mMpTranslator->load( path + "musicplayer_" + lang ); |
208 translatorLoaded = mMpTranslator->load( path + "musicplayer_" + lang ); |
207 TX_LOG_ARGS( "Loading translator ok=" << translatorLoaded ); |
209 TX_LOG_ARGS( "Loading translator ok=" << translatorLoaded ); |
208 if ( translatorLoaded ) { |
210 if ( translatorLoaded ) { |
209 qApp->installTranslator( mMpTranslator ); |
211 qApp->installTranslator( mMpTranslator ); |
210 } |
212 } |
211 |
213 |
212 // TODO: Hkn: Remove this once ELCE-844GBS is fixed |
214 mSoftKeyBack = new HbAction( Hb::BackNaviAction, this ); |
213 mInspireMeProgressBar->hide(); |
215 |
214 |
|
215 mWindow = mainWindow(); |
|
216 mSoftKeyBack = new HbAction( Hb::BackNaviAction, this ); |
|
217 |
|
218 mMpEngine = MpEngineFactory::sharedEngine(); |
216 mMpEngine = MpEngineFactory::sharedEngine(); |
219 mSongData = mMpEngine->songData(); |
217 mSongData = mMpEngine->songData(); |
220 |
218 |
221 // TODO: Remove this once Orbit bug ELCE-843HFJ is fixed |
|
222 mInspireList->setVerticalScrollBarPolicy(HbScrollArea::ScrollBarAlwaysOff); |
|
223 |
|
224 |
|
225 |
|
226 |
|
227 mThumbnailManager = new ThumbnailManager( this ); |
|
228 mThumbnailManager->setQualityPreference( ThumbnailManager::OptimizeForQuality ); |
|
229 mThumbnailManager->setThumbnailSize( ThumbnailManager::ThumbnailSmall ); |
|
230 QObject::connect( mThumbnailManager, SIGNAL( thumbnailReady( QPixmap , void * , int , int ) ), |
|
231 this, SLOT( thumbnailReady( QPixmap , void * , int , int ) ) ); |
|
232 // TODO: Use the album art in provided by 10.1 wk16 platform. Current one is in the binary |
|
233 mDefaultRecommendationAlbumArt = QPixmap( ":/mpdetailsviewicons/qtg_large_music_album.svg" ); |
|
234 |
|
235 // TODO: might need later |
219 // TODO: might need later |
236 setupMenu(); |
220 setupMenu(); |
237 mMpQueryManager = new MpQueryManager(); |
221 mMpQueryManager = new MpQueryManager(); |
238 |
222 |
239 connect( mSoftKeyBack, SIGNAL( triggered() ), this, SLOT( back() ) ); |
223 connect( mSoftKeyBack, SIGNAL( triggered() ), this, SLOT( back() ) ); |
240 connect( mSongData, SIGNAL( albumArtReady() ), this, SLOT( albumArtChanged() ) ); |
224 connect( mSongData, SIGNAL( albumArtReady() ), this, SLOT( albumArtChanged() ) ); |
241 connect( mSongData, SIGNAL( playbackInfoChanged() ), this, SLOT( handlePlaybackInfoChanged() ) ); |
225 connect( mSongData, SIGNAL( playbackInfoChanged() ), this, SLOT( handlePlaybackInfoChanged() ) ); |
242 connect( mSongData, SIGNAL( songDetailInfoChanged() ), this, SLOT( songDetailInfoChanged() ) ); |
226 connect( mSongData, SIGNAL( songDetailInfoChanged() ), this, SLOT( songDetailInfoChanged() ) ); |
|
227 connect( mSongDetailsGroupBox, SIGNAL( toggled( bool ) ), this, SLOT( handleDetailsGroupBoxToggled( bool ) ) ); |
|
228 connect( mInspireMeGroupBox, SIGNAL( toggled( bool ) ), this, SLOT( handleInspireMeGroupBoxToggled( bool ) ) ); |
243 connect( mMpQueryManager, SIGNAL( networkError() ), this ,SLOT( handleNetworkError() ) ); |
229 connect( mMpQueryManager, SIGNAL( networkError() ), this ,SLOT( handleNetworkError() ) ); |
244 connect( mMpQueryManager, SIGNAL(setAlbumArt(const QString &, const QString &) ), this ,SLOT(setAlbumArtUri(const QString &, const QString & ))); |
|
245 connect( mMpQueryManager, SIGNAL(searchUrlRetrieved(const QString&)), this, SLOT(updateSharedData(const QString&))); |
230 connect( mMpQueryManager, SIGNAL(searchUrlRetrieved(const QString&)), this, SLOT(updateSharedData(const QString&))); |
246 |
231 connect( mMpQueryManager, SIGNAL(recommendationAlbumArtsReady()), this, SLOT(RenderInspireMeGroupBox())); |
247 #ifdef SHARE_FUNC_ENABLED |
232 |
|
233 #ifdef SHARE_FUNC_ENABLED |
248 connect( mShareButton, SIGNAL( clicked() ), this, SLOT( share() ) ); |
234 connect( mShareButton, SIGNAL( clicked() ), this, SLOT( share() ) ); |
249 |
235 |
250 // Preload the share popup |
236 // Preload the share popup |
251 createShareDialog(); |
237 preloadShareDialog(); |
252 #endif |
238 #endif |
253 TX_EXIT |
239 TX_EXIT |
254 } |
240 } |
255 |
241 |
256 /*! |
242 /*! |
257 Activates the details view. |
243 Activates the details view. |
258 */ |
244 */ |
259 void MpDetailsView::activateView() |
245 void MpDetailsView::activateView() |
260 { |
246 { |
261 TX_ENTRY |
247 TX_ENTRY |
262 setNavigationAction( mSoftKeyBack ); |
248 setNavigationAction( mSoftKeyBack ); |
263 mMpEngine->retrieveSong(); |
249 mMpEngine->retrieveSong(); |
264 |
250 |
265 mActivated = true; |
251 mActivated = true; |
266 mInspireMeOpen = MpSettingsManager::inspireMe(); |
252 mInspireMeOpen = MpSettingsManager::inspireMe(); |
267 mSongDetailsGbOpen = MpSettingsManager::songDetailsGb(); |
253 mSongDetailsGbOpen = MpSettingsManager::songDetailsGb(); |
268 TX_LOG_ARGS( "InspireMeVal: " << mInspireMeOpen ); |
254 TX_LOG_ARGS( "InspireMeVal: " << mInspireMeOpen ); |
269 TX_LOG_ARGS( "SongDetailsGbVal: " << mSongDetailsGbOpen ); |
255 TX_LOG_ARGS( "SongDetailsGbVal: " << mSongDetailsGbOpen ); |
270 mInspireMeGroupBox->setCollapsed(!mInspireMeOpen); |
256 mInspireMeGroupBox->setCollapsed(!mInspireMeOpen); |
271 mSongDetailsGroupBox->setCollapsed(!mSongDetailsGbOpen); |
257 mSongDetailsGroupBox->setCollapsed(!mSongDetailsGbOpen); |
272 |
|
273 connect( mSongDetailsGroupBox, SIGNAL( toggled( bool ) ), this, SLOT( handleDetailsGroupBoxToggled( bool ) ) ); |
|
274 connect( mInspireMeGroupBox, SIGNAL( toggled( bool ) ), this, SLOT( handleInspireMeGroupBoxToggled( bool ) ) ); |
|
275 |
|
276 TX_EXIT |
258 TX_EXIT |
277 } |
259 } |
278 |
260 |
279 /*! |
261 /*! |
280 Deactivates the details view. |
262 Deactivates the details view. |
281 */ |
263 */ |
282 void MpDetailsView::deactivateView() |
264 void MpDetailsView::deactivateView() |
283 { |
265 { |
284 TX_ENTRY |
266 TX_ENTRY |
285 if (mInspireMeGroupBox->isCollapsed() ) { |
267 if (mInspireMeGroupBox->isCollapsed() ) { |
286 MpSettingsManager::setInspireMe(false); |
268 MpSettingsManager::setInspireMe(false); |
287 } else { |
269 } else { |
288 MpSettingsManager::setInspireMe(true); |
270 MpSettingsManager::setInspireMe(true); |
289 } |
271 } |
290 |
272 |
291 if (mSongDetailsGroupBox->isCollapsed() ) { |
273 if (mSongDetailsGroupBox->isCollapsed() ) { |
292 MpSettingsManager::setSongDetailsGb(false); |
274 MpSettingsManager::setSongDetailsGb(false); |
293 } else { |
275 } else { |
294 MpSettingsManager::setSongDetailsGb(true); |
276 MpSettingsManager::setSongDetailsGb(true); |
295 } |
277 } |
296 |
278 |
297 setNavigationAction( 0 ); |
279 setNavigationAction( 0 ); |
298 mActivated = false; |
280 mActivated = false; |
299 |
|
300 disconnect( mSongDetailsGroupBox, SIGNAL( toggled( bool ) ), this, SLOT( handleDetailsGroupBoxToggled( bool ) ) ); |
|
301 disconnect( mInspireMeGroupBox, SIGNAL( toggled( bool ) ), this, SLOT( handleInspireMeGroupBoxToggled( bool ) ) ); |
|
302 |
|
303 TX_EXIT |
281 TX_EXIT |
304 } |
282 } |
305 |
283 |
306 /*! |
284 /*! |
307 Setup the menu. |
285 Setup the menu. |
341 void MpDetailsView::handleNetworkError() |
319 void MpDetailsView::handleNetworkError() |
342 { |
320 { |
343 TX_ENTRY |
321 TX_ENTRY |
344 mInspireMeQueryOngoing = false; |
322 mInspireMeQueryOngoing = false; |
345 mInspireMeQueryRendered = false; |
323 mInspireMeQueryRendered = false; |
346 clearInspireMe(); |
324 clearInspireMe(); |
347 mInspireMeGroupBox->setCollapsed( true ); |
325 mInspireMeGroupBox->setCollapsed( true ); |
348 TX_EXIT |
326 TX_EXIT |
349 } |
327 } |
350 |
328 |
351 /*! |
329 /*! |
352 Sets recommendation album art |
|
353 */ |
|
354 void MpDetailsView::setAlbumArtUri( const QString &albumArtUri, const QString &albumArtName ) |
|
355 { |
|
356 TX_ENTRY_ARGS( "albumArtUri = " << albumArtUri ) |
|
357 TX_LOG_ARGS( "albumArtName = " << albumArtName ) |
|
358 if ( !albumArtUri.isEmpty() && !albumArtName.isEmpty() ) { |
|
359 int id = mThumbnailManager->getThumbnail( albumArtName, reinterpret_cast<void *>( const_cast<QString *>( &albumArtUri ) ) ); |
|
360 if ( id == KUndefined ) { |
|
361 // Request failed. Set default album art. |
|
362 mMpQueryManager->insertMapItem( albumArtUri, mDefaultRecommendationAlbumArt ); |
|
363 recommendationAlbumArtReady(); |
|
364 } |
|
365 } |
|
366 else { |
|
367 // No album art uri. Set default album art. |
|
368 mMpQueryManager->insertMapItem( albumArtUri, mDefaultRecommendationAlbumArt ); |
|
369 recommendationAlbumArtReady(); |
|
370 } |
|
371 TX_EXIT |
|
372 } |
|
373 |
|
374 /*! |
|
375 Render inspireme groupbox after album arts downloaded |
330 Render inspireme groupbox after album arts downloaded |
376 */ |
331 */ |
377 void MpDetailsView::RenderInspireMeGroupBox() |
332 void MpDetailsView::RenderInspireMeGroupBox() |
378 { |
333 { |
379 TX_ENTRY |
334 TX_ENTRY |
380 mInspireMeQueryOngoing = false; |
335 mInspireMeQueryOngoing = false; |
381 mInspireMeQueryRendered = true; |
336 mInspireMeQueryRendered = true; |
382 mInspireMeProgressBar->hide(); |
337 mInspireMeProgressBar->hide(); |
384 TX_LOG_ARGS( "There are recommendations." ) |
339 TX_LOG_ARGS( "There are recommendations." ) |
385 // we have recommendations |
340 // we have recommendations |
386 for ( int i = 0; i < KRecommendationCount; i++ ) { |
341 for ( int i = 0; i < KRecommendationCount; i++ ) { |
387 // configure the layout properties |
342 // configure the layout properties |
388 if(!mInspireList->count()) { |
343 if(!mInspireList->count()) { |
389 // we havent configured the prototype before |
344 // we havent configured the prototype before |
390 HbListViewItem *prototype = mInspireList->listItemPrototype(); |
345 HbListViewItem *prototype = mInspireList->listItemPrototype(); |
391 prototype->setGraphicsSize( HbListViewItem::LargeIcon ); |
346 prototype->setGraphicsSize( HbListViewItem::LargeIcon ); |
392 } |
347 } |
393 // create the item |
348 // create the item |
394 HbListWidgetItem *inspireMeItem = new HbListWidgetItem(); |
349 HbListWidgetItem *inspireMeItem = new HbListWidgetItem(); |
395 HbIcon icon( QIcon( mMpQueryManager->recommendationAlbumArtsMap().value(mMpQueryManager->recommendationAlbumArtsLink().at( i ) ) ) ); |
350 HbIcon icon( QIcon( mMpQueryManager->recommendationAlbumArtsMap().value(mMpQueryManager->recommendationAlbumArtsLink().at( i ) ) ) ); |
396 inspireMeItem->setIcon( icon ); |
351 inspireMeItem->setIcon( icon ); |
397 inspireMeItem->setText( mMpQueryManager->recommendationSongs().at( i ) ); |
352 inspireMeItem->setText( mMpQueryManager->recommendationSongs().at( i ) ); |
398 inspireMeItem->setSecondaryText( mMpQueryManager->recommendationArtists().at( i ) ); |
353 inspireMeItem->setSecondaryText( mMpQueryManager->recommendationArtists().at( i ) ); |
399 mInspireList->addItem( inspireMeItem ); |
354 mInspireList->addItem( inspireMeItem ); |
400 } |
355 } |
401 } |
356 } |
402 else { |
357 else { |
403 TX_LOG_ARGS( "There is NO recommendation." ) |
358 TX_LOG_ARGS( "There is NO recommendation." ) |
404 // we dont have recommendations |
359 // we dont have recommendations |
405 // we havent configured the prototype before |
360 // we havent configured the prototype before |
406 HbListViewItem *prototype = mInspireList->listItemPrototype(); |
361 HbListViewItem *prototype = mInspireList->listItemPrototype(); |
407 const int maxTextRowCount = 20; |
362 const int maxTextRowCount = 20; |
408 const int minTextRowCount = 1; |
363 const int minTextRowCount = 1; |
409 prototype->setSecondaryTextRowCount(minTextRowCount,maxTextRowCount); |
364 prototype->setSecondaryTextRowCount(minTextRowCount,maxTextRowCount); |
410 |
365 |
411 HbListWidgetItem *inspireMeItem = new HbListWidgetItem(); |
366 HbListWidgetItem *inspireMeItem = new HbListWidgetItem(); |
412 QString info(tr("There are no recommendations for this track, but you can always discover new music on Ovi")); |
367 QString info(tr("There are no recommendations for this track, but you can always discover new music on Ovi")); |
413 inspireMeItem->setText( QString( " " ) ); |
368 inspireMeItem->setText( QString( " " ) ); |
414 inspireMeItem->setSecondaryText( info ); |
369 inspireMeItem->setSecondaryText( info ); |
415 mInspireList->addItem( inspireMeItem ); |
370 mInspireList->addItem( inspireMeItem ); |
416 } |
371 } |
417 |
372 |
418 TX_EXIT |
373 TX_EXIT |
419 } |
374 } |
420 |
|
421 void MpDetailsView::recommendationAlbumArtReady() |
|
422 { |
|
423 TX_ENTRY_ARGS( "mAlbumArtsReadyCount = " << mMpQueryManager->albumArtsReadyCount() ) |
|
424 ( mMpQueryManager->albumArtsReadyCount() )++; |
|
425 if ( mMpQueryManager->albumArtsReadyCount() == KRecommendationCount ) { |
|
426 RenderInspireMeGroupBox(); |
|
427 } |
|
428 TX_EXIT |
|
429 } |
|
430 |
|
431 |
375 |
432 bool MpDetailsView::canQueryRecommendations() const |
376 bool MpDetailsView::canQueryRecommendations() const |
433 { |
377 { |
434 bool result = ( ( !mSongData->album().isEmpty() ) || |
378 bool result = ( ( !mSongData->album().isEmpty() ) || |
435 ( !mSongData->artist().isEmpty() ) ) && |
379 ( !mSongData->artist().isEmpty() ) ) && |
436 !( mInspireMeGroupBox->isCollapsed() ); |
380 !( mInspireMeGroupBox->isCollapsed() ); |
437 TX_LOG_ARGS( "Can query recommendations:" << result ); |
381 TX_LOG_ARGS( "Can query recommendations:" << result ); |
438 return result; |
382 return result; |
439 } |
383 } |
440 |
384 |
453 { |
397 { |
454 TX_ENTRY |
398 TX_ENTRY |
455 mMpQueryManager->clearNetworkReplies(); |
399 mMpQueryManager->clearNetworkReplies(); |
456 clearInspireMe(); |
400 clearInspireMe(); |
457 mInspireMeQueryRendered = false; |
401 mInspireMeQueryRendered = false; |
458 |
402 |
|
403 // Clear the song data link until new query has been made. |
|
404 mSongData->setLink( "" ); |
|
405 |
459 if ( !mSongData->title().isEmpty () ) { |
406 if ( !mSongData->title().isEmpty () ) { |
460 mSongText->setPlainText( mSongData->title() ); |
407 mSongText->setPlainText( mSongData->title() ); |
461 } else { |
408 } else { |
462 mSongText->setPlainText( mSongData->fileName() ); |
409 mSongText->setPlainText( mSongData->fileName() ); |
463 } |
410 } |
464 |
411 |
465 if ( !mSongData->album().isEmpty () ) { |
412 if ( !mSongData->album().isEmpty () ) { |
466 mAlbumText->setPlainText( mSongData->album() ); |
413 mAlbumText->setPlainText( mSongData->album() ); |
467 } else { |
414 } else { |
468 mAlbumText->setPlainText( tr( "Unknown ") ); |
415 mAlbumText->setPlainText( tr( "Unknown") ); |
469 } |
416 } |
470 |
417 |
471 if ( !mSongData->artist().isEmpty() ) { |
418 if ( !mSongData->artist().isEmpty() ) { |
472 mArtistText->setPlainText( mSongData->artist() ); |
419 mArtistText->setPlainText( mSongData->artist() ); |
473 } else { |
420 } else { |
474 mArtistText->setPlainText( tr( "Unknown ") ); |
421 mArtistText->setPlainText( tr( "Unknown") ); |
475 } |
422 } |
476 |
423 |
|
424 if (canQuerySharePlayerLink() ) { |
|
425 mMpQueryManager->queryLocalMusicStore(mSongData->artist(),mSongData->album(),mSongData->title()); |
|
426 } |
|
427 |
477 if (canQueryRecommendations()) { |
428 if (canQueryRecommendations()) { |
478 // start inspire me area progress bar |
429 // start inspire me area progress bar |
479 // TODO: currently, till we get to this callback from MPX the bar not shown |
430 // TODO: currently, till we get to this callback from MPX the bar not shown |
480 // TODO: check if inspireMe is ON, if not, dont show |
431 // TODO: check if inspireMe is ON, if not, dont show |
481 mInspireMeProgressBar->show(); |
432 mInspireMeProgressBar->show(); |
482 if (canQuerySharePlayerLink() ) { |
|
483 mMpQueryManager->queryLocalMusicStore(mSongData->artist(),mSongData->album(),mSongData->title()); |
|
484 } |
|
485 mMpQueryManager->queryInspireMeItems(mSongData->artist(),mSongData->album(),mSongData->title()); |
433 mMpQueryManager->queryInspireMeItems(mSongData->artist(),mSongData->album(),mSongData->title()); |
486 mInspireMeQueryOngoing = true; |
434 mInspireMeQueryOngoing = true; |
487 } |
435 } |
488 else { |
436 else { |
489 // metadata to query for inspire me items not available |
437 // metadata to query for inspire me items not available |
490 // show information note |
438 // show information note |
491 if (!mInspireMeGroupBox->isCollapsed()) |
439 if (!mInspireMeGroupBox->isCollapsed()) |
492 RenderInspireMeGroupBox(); |
440 RenderInspireMeGroupBox(); |
493 } |
441 } |
494 TX_EXIT |
442 TX_EXIT |
495 } |
443 } |
496 |
444 |
497 void MpDetailsView::clearInspireMe() |
445 void MpDetailsView::clearInspireMe() |
498 { |
446 { |
499 TX_ENTRY |
447 TX_ENTRY |
500 mInspireList->clear(); |
448 mInspireList->clear(); |
501 mMpQueryManager->clearRecommendations(); |
449 mMpQueryManager->clearRecommendations(); |
502 TX_EXIT |
450 TX_EXIT |
503 } |
451 } |
504 /*! |
452 /*! |
505 Slot to handle detail song information |
453 Slot to handle detail song information |
506 */ |
454 */ |
507 void MpDetailsView::songDetailInfoChanged() |
455 void MpDetailsView::songDetailInfoChanged() |
508 { |
456 { |
509 TX_ENTRY |
457 TX_ENTRY |
510 mDetailList->clear(); |
458 mDetailList->clear(); |
511 |
459 |
512 if ( !mSongData->albumTrack().isNull() ) { |
460 if ( !mSongData->albumTrack().isNull() ) { |
513 HbListWidgetItem *item = new HbListWidgetItem(); |
461 HbListWidgetItem *item = new HbListWidgetItem(); |
514 item->setText( tr( "Song number" ) ); |
462 item->setText( tr( "Song number" ) ); |
515 item->setSecondaryText( mSongData->albumTrack() ); |
463 item->setSecondaryText( mSongData->albumTrack() ); |
516 item->setEnabled( false ); |
464 item->setEnabled( false ); |
517 mDetailList->addItem( item ); |
465 mDetailList->addItem( item ); |
518 } |
466 } |
519 |
467 |
520 if ( !mSongData->year().isNull() ) { |
468 if ( !mSongData->year().isNull() ) { |
521 HbListWidgetItem *item = new HbListWidgetItem(); |
469 HbListWidgetItem *item = new HbListWidgetItem(); |
522 item->setText( tr( "Year" ) ); |
470 item->setText( tr( "Year" ) ); |
523 item->setSecondaryText( mSongData->year() ); |
471 item->setSecondaryText( mSongData->year() ); |
524 item->setEnabled( false ); |
472 item->setEnabled( false ); |
525 mDetailList->addItem( item ); |
473 mDetailList->addItem( item ); |
526 } |
474 } |
527 |
475 |
528 if ( !mSongData->genre().isNull() ) { |
476 if ( !mSongData->genre().isNull() ) { |
529 HbListWidgetItem *item = new HbListWidgetItem(); |
477 HbListWidgetItem *item = new HbListWidgetItem(); |
530 item->setText( tr( "Genre" ) ); |
478 item->setText( tr( "Genre" ) ); |
531 item->setSecondaryText( mSongData->genre() ); |
479 item->setSecondaryText( mSongData->genre() ); |
532 item->setEnabled( false ); |
480 item->setEnabled( false ); |
533 mDetailList->addItem( item ); |
481 mDetailList->addItem( item ); |
534 } |
482 } |
535 |
483 |
536 if ( !mSongData->composer().isNull() ) { |
484 if ( !mSongData->composer().isNull() ) { |
537 HbListWidgetItem *item = new HbListWidgetItem(); |
485 HbListWidgetItem *item = new HbListWidgetItem(); |
538 item->setText( tr( "Composer" ) ); |
486 item->setText( tr( "Composer" ) ); |
539 item->setSecondaryText( mSongData->composer() ); |
487 item->setSecondaryText( mSongData->composer() ); |
540 item->setEnabled( false ); |
488 item->setEnabled( false ); |
562 item->setText( tr( "Duration" ) ); |
510 item->setText( tr( "Duration" ) ); |
563 item->setSecondaryText( mSongData->duration() ); |
511 item->setSecondaryText( mSongData->duration() ); |
564 item->setEnabled( false ); |
512 item->setEnabled( false ); |
565 mDetailList->addItem( item ); |
513 mDetailList->addItem( item ); |
566 } |
514 } |
567 |
515 |
568 if ( !mSongData->bitRate().isNull() ) { |
516 if ( !mSongData->bitRate().isNull() ) { |
569 HbListWidgetItem *item = new HbListWidgetItem(); |
517 HbListWidgetItem *item = new HbListWidgetItem(); |
570 item->setText( tr( "Bitrate" ) ); |
518 item->setText( tr( "Bitrate" ) ); |
571 item->setSecondaryText( mSongData->bitRate().append( " Kbps" ) ); |
519 item->setSecondaryText( mSongData->bitRate().append( " Kbps" ) ); |
572 item->setEnabled( false ); |
520 item->setEnabled( false ); |
573 mDetailList->addItem( item ); |
521 mDetailList->addItem( item ); |
574 } |
522 } |
575 |
523 |
576 if ( !mSongData->sampleRate().isNull() ) { |
524 if ( !mSongData->sampleRate().isNull() ) { |
577 HbListWidgetItem *item = new HbListWidgetItem(); |
525 HbListWidgetItem *item = new HbListWidgetItem(); |
578 item->setText( tr( "Sampling rate" ) ); |
526 item->setText( tr( "Sampling rate" ) ); |
579 item->setSecondaryText( mSongData->sampleRate().append( " hz" ) ); |
527 item->setSecondaryText( mSongData->sampleRate().append( " hz" ) ); |
580 item->setEnabled( false ); |
528 item->setEnabled( false ); |
581 mDetailList->addItem( item ); |
529 mDetailList->addItem( item ); |
582 } |
530 } |
583 |
531 |
584 if ( !mSongData->size().isNull() ) { |
532 if ( !mSongData->size().isNull() ) { |
585 HbListWidgetItem *item = new HbListWidgetItem(); |
533 HbListWidgetItem *item = new HbListWidgetItem(); |
586 item->setText( tr( "Size" ) ); |
534 item->setText( tr( "Size" ) ); |
587 item->setSecondaryText( mSongData->size().append( " MB" ) ); |
535 item->setSecondaryText( mSongData->size().append( " MB" ) ); |
588 item->setEnabled( false ); |
536 item->setEnabled( false ); |
589 mDetailList->addItem( item ); |
537 mDetailList->addItem( item ); |
590 } |
538 } |
591 |
539 |
592 if ( !mSongData->modified().isNull() ) { |
540 if ( !mSongData->modified().isNull() ) { |
593 HbListWidgetItem *item = new HbListWidgetItem(); |
541 HbListWidgetItem *item = new HbListWidgetItem(); |
594 item->setText( tr( "Modified" ) ); |
542 item->setText( tr( "Modified" ) ); |
595 item->setSecondaryText( mSongData->modified() ); |
543 item->setSecondaryText( mSongData->modified() ); |
596 item->setEnabled( false ); |
544 item->setEnabled( false ); |
602 item->setText( tr( "Copyright" ) ); |
550 item->setText( tr( "Copyright" ) ); |
603 item->setSecondaryText( mSongData->copyright() ); |
551 item->setSecondaryText( mSongData->copyright() ); |
604 item->setEnabled( false ); |
552 item->setEnabled( false ); |
605 mDetailList->addItem( item ); |
553 mDetailList->addItem( item ); |
606 } |
554 } |
607 |
555 |
608 if ( !mSongData->musicURL().isNull() ) { |
556 if ( !mSongData->musicURL().isNull() ) { |
609 HbListWidgetItem *item = new HbListWidgetItem(); |
557 HbListWidgetItem *item = new HbListWidgetItem(); |
610 item->setText( tr( "Web site" ) ); |
558 item->setText( tr( "Web site" ) ); |
611 item->setSecondaryText( mSongData->musicURL() ); |
559 item->setSecondaryText( mSongData->musicURL() ); |
612 item->setEnabled( true ); |
560 item->setEnabled( true ); |
613 mDetailList->addItem( item ); |
561 mDetailList->addItem( item ); |
614 } |
562 } |
615 |
563 |
616 if ( mSongData->isDrmProtected() ) { |
564 if ( mSongData->isDrmProtected() ) { |
617 HbListWidgetItem *item = new HbListWidgetItem(); |
565 HbListWidgetItem *item = new HbListWidgetItem(); |
618 item->setText( tr( "Licences" ) ); |
566 item->setText( tr( "Licences" ) ); |
619 item->setSecondaryText( tr( "Click for details" ) ); |
567 item->setSecondaryText( tr( "Click for details" ) ); |
620 item->setEnabled( true ); |
568 item->setEnabled( true ); |
656 mInspireMeQueryOngoing = true; |
603 mInspireMeQueryOngoing = true; |
657 } else { |
604 } else { |
658 TX_LOG_ARGS( "InspireMe is NOT rendered yet and CANNOT query for recommendations either. " ) |
605 TX_LOG_ARGS( "InspireMe is NOT rendered yet and CANNOT query for recommendations either. " ) |
659 RenderInspireMeGroupBox(); |
606 RenderInspireMeGroupBox(); |
660 } |
607 } |
661 } |
608 } |
662 } |
609 } |
663 } else { |
610 } else { |
664 TX_LOG_ARGS( "InspireMe is collapsed." ) |
611 TX_LOG_ARGS( "InspireMe is collapsed." ) |
665 mInspireMeProgressBar->hide(); |
612 mInspireMeProgressBar->hide(); |
666 } |
613 } |
667 TX_EXIT |
614 TX_EXIT |
668 } |
615 } |
669 |
616 |
670 /*! |
|
671 Slot to handle the recommendation album art |
|
672 */ |
|
673 void MpDetailsView::thumbnailReady( |
|
674 const QPixmap& pixmap, |
|
675 void *data, |
|
676 int /*id*/, |
|
677 int error ) |
|
678 { |
|
679 TX_ENTRY |
|
680 // TODO: Hkn: use qobject_cast |
|
681 QString uri = *( reinterpret_cast<QString *>( data ) ); |
|
682 TX_LOG_ARGS( "Uri: " << uri ); |
|
683 |
|
684 if ( error == 0 ) { |
|
685 TX_LOG_ARGS( "album art link: " << uri ); |
|
686 mMpQueryManager->insertMapItem( uri, pixmap ); |
|
687 } else { |
|
688 mMpQueryManager->insertMapItem( uri, mDefaultRecommendationAlbumArt ); |
|
689 } |
|
690 recommendationAlbumArtReady(); |
|
691 TX_EXIT |
|
692 } |
|
693 |
|
694 #ifdef SHARE_FUNC_ENABLED |
617 #ifdef SHARE_FUNC_ENABLED |
695 /*! |
618 /*! |
696 Slot to be called when share button is clicked |
619 Slot to be called when share button is clicked |
697 */ |
620 */ |
698 void MpDetailsView::share() |
621 void MpDetailsView::share() |
699 { |
622 { |
700 TX_ENTRY |
623 TX_ENTRY |
701 createShareDialog(); |
624 createShareDialog(); |
702 if ( mSharePopup ) |
|
703 { |
|
704 mSharePopup->show(); |
|
705 } |
|
706 if (canQuerySharePlayerLink() ) |
625 if (canQuerySharePlayerLink() ) |
707 { |
626 { |
708 mMpQueryManager->queryLocalMusicStore(mSongData->artist(),mSongData->album(),mSongData->title() ); |
627 mMpQueryManager->queryLocalMusicStore(mSongData->artist(),mSongData->album(),mSongData->title() ); |
709 } |
628 } |
710 TX_EXIT |
629 TX_EXIT |
711 } |
630 } |
712 |
631 |
713 /*! |
632 /*! |
714 Method to create the share dialog on demand. |
633 Method to create the share dialog on demand. |
|
634 This will cause the share web view to be created and start loading. |
715 */ |
635 */ |
716 void MpDetailsView::createShareDialog() |
636 void MpDetailsView::createShareDialog() |
717 { |
637 { |
718 TX_ENTRY |
638 TX_ENTRY |
719 if ( !mSharePopup ) |
639 if ( !mSharePopup ) |
720 { |
640 { |
721 mSharePopup = new MpDetailsShareDialog(); |
641 mSharePopup = new MpDetailsShareDialog(); |
722 connect( mSharePopup, SIGNAL(closeShareDialog() ), this, SLOT( closeShareDialog() ) ); |
642 } |
723 mSharePopup->initialize( mSongData ); |
643 if ( !mSharePopup->isInitialized() ) |
724 } |
644 { |
|
645 connect( mSharePopup, SIGNAL( closeShareDialog() ), this, SLOT( closeShareDialog() ) ); |
|
646 mSharePopup->initialize( mSongData, tr( "Unknown" ) ); |
|
647 } |
|
648 TX_EXIT |
|
649 } |
|
650 |
|
651 /*! |
|
652 Method to create the share dialog on demand and preload publishing player files. |
|
653 This will construct the share dialog but it will still be in "uninitialized" state. |
|
654 */ |
|
655 void MpDetailsView::preloadShareDialog() |
|
656 { |
|
657 TX_ENTRY |
|
658 if ( !mSharePopup ) |
|
659 { |
|
660 mSharePopup = new MpDetailsShareDialog(); |
|
661 } |
|
662 mSharePopup->cachePublishingPlayerFiles(); |
725 TX_EXIT |
663 TX_EXIT |
726 } |
664 } |
727 |
665 |
728 /*! |
666 /*! |
729 Slot to be called when ok/close button in share dialog is pressed. |
667 Slot to be called when ok/close button in share dialog is pressed. |