|
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: Implementation of VideoPlaybackFileDetailsWidget |
|
15 * |
|
16 */ |
|
17 |
|
18 // Version : %version: 28 % |
|
19 |
|
20 |
|
21 #include <QDir> |
|
22 #include <QDateTime> |
|
23 #include <QFileInfo> |
|
24 |
|
25 #include <hbglobal.h> |
|
26 #include <hblistwidgetitem.h> |
|
27 #include <hbratingslider.h> |
|
28 #include <hblistwidget.h> |
|
29 #include <hblistviewitem.h> |
|
30 #include <hbextendedlocale.h> |
|
31 #include <hbanchorlayout.h> |
|
32 |
|
33 #include "mpxvideo_debug.h" |
|
34 #include "videoplaybackdocumentloader.h" |
|
35 #include "videoplaybackfiledetailswidget.h" |
|
36 #include "videoplaybackdocumentloader.h" |
|
37 #include "videoplaybackcontrolscontroller.h" |
|
38 |
|
39 const float KILOBYTE = 1024 ; |
|
40 |
|
41 // ------------------------------------------------------------------------------------------------- |
|
42 // VideoPlaybackFileDetailsWidget::VideoPlaybackFileDetailsWidget |
|
43 // ------------------------------------------------------------------------------------------------- |
|
44 // |
|
45 VideoPlaybackFileDetailsWidget::VideoPlaybackFileDetailsWidget( |
|
46 VideoPlaybackControlsController* controller ) |
|
47 : mController( controller ) |
|
48 , mListWidget( 0 ) |
|
49 , mFileDetailsUpdated( false ) |
|
50 { |
|
51 MPX_ENTER_EXIT(_L("VideoPlaybackFileDetailsWidget::VideoPlaybackFileDetailsWidget()")); |
|
52 } |
|
53 |
|
54 // ------------------------------------------------------------------------------------------------- |
|
55 // VideoPlaybackFileDetailsWidget::~VideoPlaybackFileDetailsWidget |
|
56 // ------------------------------------------------------------------------------------------------- |
|
57 // |
|
58 VideoPlaybackFileDetailsWidget::~VideoPlaybackFileDetailsWidget() |
|
59 { |
|
60 MPX_ENTER_EXIT(_L("VideoPlaybackFileDetailsWidget::~VideoPlaybackFileDetailsWidget()")); |
|
61 } |
|
62 |
|
63 // ------------------------------------------------------------------------------------------------- |
|
64 // VideoPlaybackFileDetailsWidget::updateWithFileDetails |
|
65 // ------------------------------------------------------------------------------------------------- |
|
66 // |
|
67 void VideoPlaybackFileDetailsWidget::updateWithFileDetails( |
|
68 VideoPlaybackViewFileDetails* details ) |
|
69 { |
|
70 VideoPlaybackDocumentLoader *loader = mController->layoutLoader(); |
|
71 |
|
72 if ( loader ) |
|
73 { |
|
74 // |
|
75 // load fileDetails widget |
|
76 // |
|
77 QGraphicsWidget *widget = loader->findWidget( QString( "fileDetails" ) ); |
|
78 |
|
79 // |
|
80 // cast fileDetails widget to HbListWidget |
|
81 // |
|
82 mListWidget = qobject_cast<HbListWidget*>( widget ); |
|
83 |
|
84 // |
|
85 // set the min/max number of lines in the second row |
|
86 // |
|
87 HbListViewItem *prototype = mListWidget->listItemPrototype(); |
|
88 prototype->setSecondaryTextRowCount( 1, 30 ); |
|
89 |
|
90 // |
|
91 // Title |
|
92 // |
|
93 makeTitleItem( details ); |
|
94 |
|
95 if ( ! mFileDetailsUpdated ) |
|
96 { |
|
97 HbExtendedLocale locale = HbExtendedLocale::system(); |
|
98 |
|
99 mFileDetailsUpdated = true; |
|
100 |
|
101 // |
|
102 // Description |
|
103 // |
|
104 addItemToListWidget( |
|
105 hbTrId( "txt_videos_list_description" ), details->mDescription ); |
|
106 |
|
107 // |
|
108 // Duration |
|
109 // |
|
110 makeDurationItem( details ); |
|
111 |
|
112 // |
|
113 // Date/Time |
|
114 // |
|
115 makeDateTimeItem( details ); |
|
116 |
|
117 // |
|
118 // Location |
|
119 // |
|
120 addItemToListWidget( hbTrId( "txt_videos_list_location" ), details->mLocation ); |
|
121 |
|
122 // |
|
123 // Author |
|
124 // |
|
125 addItemToListWidget( hbTrId( "txt_videos_list_author" ), details->mArtist ); |
|
126 |
|
127 // |
|
128 // Copyright |
|
129 // |
|
130 addItemToListWidget( hbTrId( "txt_videos_list_copyright" ), details->mCopyright ); |
|
131 |
|
132 // |
|
133 // Language |
|
134 // |
|
135 addItemToListWidget( hbTrId( "txt_videos_list_language" ), details->mLanguage ); |
|
136 |
|
137 // |
|
138 // Keywords |
|
139 // |
|
140 addItemToListWidget( hbTrId( "txt_videos_list_keywords" ), details->mKeywords ); |
|
141 |
|
142 // |
|
143 // Size |
|
144 // |
|
145 makeSizeItem( details ); |
|
146 |
|
147 // |
|
148 // Resolution |
|
149 // |
|
150 if ( details->mVideoEnabled ) |
|
151 { |
|
152 QString resolution = hbTrId( "txt_videos_list_l1l2" ) |
|
153 .arg( locale.toString( details->mVideoWidth ) ) |
|
154 .arg( locale.toString( details->mVideoHeight ) ); |
|
155 addItemToListWidget( hbTrId( "txt_videos_list_resolution" ), resolution ); |
|
156 } |
|
157 |
|
158 // |
|
159 // Format |
|
160 // |
|
161 addItemToListWidget( hbTrId( "txt_videos_list_format" ), details->mMimeType ); |
|
162 |
|
163 // |
|
164 // Bitrate |
|
165 // |
|
166 makeBitRateItem( details ); |
|
167 |
|
168 // |
|
169 // Folder |
|
170 // |
|
171 if ( details->mPlaybackMode == EMPXVideoLocal || |
|
172 details->mPlaybackMode == EMPXVideoProgressiveDownload) |
|
173 { |
|
174 QFileInfo fileInfo( details->mClipName ); |
|
175 QString folder = fileInfo.dir().dirName(); |
|
176 addItemToListWidget( hbTrId( "txt_videos_list_collection_name" ), folder ); |
|
177 } |
|
178 } |
|
179 |
|
180 // |
|
181 // Set the rect size dynamically based on the view mode |
|
182 // |
|
183 QGraphicsWidget *content = loader->findWidget( QString( "content" ) ); |
|
184 HbAnchorLayout *layout = static_cast<HbAnchorLayout*>( content->layout() ); |
|
185 |
|
186 if ( layout ) |
|
187 { |
|
188 QGraphicsWidget *titleLayout = loader->findWidget( QString( "titleLayout" ) ); |
|
189 QRectF titleRect = titleLayout->geometry(); |
|
190 |
|
191 switch ( mController->viewMode() ) |
|
192 { |
|
193 case EDetailsView: |
|
194 { |
|
195 layout->setAnchor( titleLayout, Hb::BottomEdge, this, Hb::TopEdge, 0 ); |
|
196 layout->setAnchor( layout, Hb::BottomEdge, this, Hb::BottomEdge, 0 ); |
|
197 |
|
198 break; |
|
199 } |
|
200 case EAudioOnlyView: |
|
201 { |
|
202 QGraphicsWidget *controlLayout = loader->findWidget( QString( "controlBarLayout" ) ); |
|
203 QRectF controlRect = controlLayout->geometry(); |
|
204 |
|
205 layout->setAnchor( |
|
206 this, Hb::TopEdge, titleLayout, |
|
207 Hb::BottomEdge, titleRect.bottom() - titleRect.top() ); |
|
208 |
|
209 layout->setAnchor( |
|
210 this, Hb::BottomEdge, |
|
211 layout, Hb::BottomEdge, layout->geometry().height() - controlRect.top() ); |
|
212 |
|
213 break; |
|
214 } |
|
215 } |
|
216 } |
|
217 } |
|
218 } |
|
219 |
|
220 // ------------------------------------------------------------------------------------------------- |
|
221 // VideoPlaybackFileDetailsWidget::makeTitleItem |
|
222 // ------------------------------------------------------------------------------------------------- |
|
223 // |
|
224 void VideoPlaybackFileDetailsWidget::makeTitleItem( VideoPlaybackViewFileDetails* details ) |
|
225 { |
|
226 MPX_DEBUG(_L("VideoPlaybackFileDetailsWidget::makeTitleItem()")); |
|
227 |
|
228 // |
|
229 // Title should be the first item in file details list |
|
230 // |
|
231 if ( mController->viewMode() == EAudioOnlyView ) |
|
232 { |
|
233 // |
|
234 // show the title for audio-only view |
|
235 // |
|
236 if ( mListWidget->count() == 0 || ! mListWidget->item( 0 )->text().contains( "Title", Qt::CaseInsensitive ) ) |
|
237 { |
|
238 QString title = details->mTitle; |
|
239 |
|
240 if ( title.count() == 0 ) |
|
241 { |
|
242 // |
|
243 // If title is not available, show clip name |
|
244 // |
|
245 QFileInfo fileInfo( details->mClipName ); |
|
246 title = fileInfo.completeBaseName(); |
|
247 } |
|
248 |
|
249 // |
|
250 // populate Title and its associated text |
|
251 // |
|
252 HbListWidgetItem* listWidgetItem = new HbListWidgetItem(); |
|
253 listWidgetItem->setText( hbTrId( "txt_videos_list_title" ) ); |
|
254 listWidgetItem->setSecondaryText( title ); |
|
255 mListWidget->insertItem( 0, listWidgetItem ); |
|
256 } |
|
257 } |
|
258 else if ( mListWidget->count() && |
|
259 mListWidget->item( 0 )->text().contains( "Title", Qt::CaseInsensitive ) ) |
|
260 { |
|
261 // |
|
262 // title is displayed under the status pane for video clips, |
|
263 // so hide the title for this details view |
|
264 // |
|
265 delete mListWidget->takeItem ( 0 ); |
|
266 } |
|
267 } |
|
268 |
|
269 // ------------------------------------------------------------------------------------------------- |
|
270 // VideoPlaybackFileDetailsWidget::makeSizeItem |
|
271 // ------------------------------------------------------------------------------------------------- |
|
272 // |
|
273 void VideoPlaybackFileDetailsWidget::makeSizeItem( VideoPlaybackViewFileDetails* details ) |
|
274 { |
|
275 if ( details->mPlaybackMode == EMPXVideoLocal || |
|
276 details->mPlaybackMode == EMPXVideoProgressiveDownload ) |
|
277 { |
|
278 QFileInfo fileInfo( details->mClipName ); |
|
279 |
|
280 // |
|
281 // to prevent overflow, get an unsigned value of file size |
|
282 // |
|
283 ulong fileSize = fileInfo.size(); |
|
284 |
|
285 // |
|
286 // convert file size to KB, MB, GB accordingly |
|
287 // |
|
288 if ( fileSize > 0 ) |
|
289 { |
|
290 HbExtendedLocale locale = HbExtendedLocale::system(); |
|
291 |
|
292 QString scale; |
|
293 |
|
294 // |
|
295 // cast for later conversion with floating point |
|
296 // |
|
297 float size = (float) fileSize; |
|
298 |
|
299 if ( size > KILOBYTE ) |
|
300 { |
|
301 size /= KILOBYTE; |
|
302 scale = hbTrId( "txt_videos_list_l1_kb" ); |
|
303 } |
|
304 |
|
305 if ( size > KILOBYTE ) |
|
306 { |
|
307 size /= KILOBYTE; |
|
308 scale = hbTrId( "txt_videos_list_l1_mb" ); |
|
309 } |
|
310 |
|
311 if ( size > KILOBYTE ) |
|
312 { |
|
313 size /= KILOBYTE; |
|
314 scale = hbTrId( "txt_videos_list_l1_gb" ); |
|
315 } |
|
316 |
|
317 int temp = size * 10; |
|
318 size = (float)temp / 10; |
|
319 |
|
320 addItemToListWidget( |
|
321 hbTrId( "txt_videos_list_file_size" ), scale.arg( locale.toString( size ) ) ); |
|
322 } |
|
323 } |
|
324 } |
|
325 |
|
326 // ------------------------------------------------------------------------------------------------- |
|
327 // VideoPlaybackFileDetailsWidget::makeBitRateItem |
|
328 // ------------------------------------------------------------------------------------------------- |
|
329 // |
|
330 void VideoPlaybackFileDetailsWidget::makeBitRateItem( VideoPlaybackViewFileDetails* details ) |
|
331 { |
|
332 if ( details->mBitRate > 0 ) |
|
333 { |
|
334 HbExtendedLocale locale = HbExtendedLocale::system(); |
|
335 |
|
336 float bitrate = details->mBitRate; |
|
337 |
|
338 QString scale = hbTrId( "txt_videos_list_l1_kbps" ); |
|
339 |
|
340 if ( bitrate > KILOBYTE ) |
|
341 { |
|
342 bitrate /= KILOBYTE; |
|
343 } |
|
344 |
|
345 if ( bitrate > KILOBYTE ) |
|
346 { |
|
347 bitrate /= KILOBYTE; |
|
348 scale = hbTrId( "txt_videos_list_l1_mbps" ); |
|
349 } |
|
350 |
|
351 int temp = bitrate * 10; |
|
352 bitrate = (float)temp / 10; |
|
353 |
|
354 addItemToListWidget( |
|
355 hbTrId( "txt_videos_list_bitrate" ), scale.arg( locale.toString( bitrate ) ) ); |
|
356 } |
|
357 } |
|
358 |
|
359 // ------------------------------------------------------------------------------------------------- |
|
360 // VideoPlaybackFileDetailsWidget::addItemToListWidget |
|
361 // ------------------------------------------------------------------------------------------------- |
|
362 // |
|
363 void VideoPlaybackFileDetailsWidget::addItemToListWidget( QString item, QString text ) |
|
364 { |
|
365 MPX_ENTER_EXIT(_L("VideoPlaybackFileDetailsWidget::addItemToListWidget")); |
|
366 |
|
367 if ( text.count() > 0 ) |
|
368 { |
|
369 MPX_DEBUG(_L("VideoPlaybackFileDetailsWidget::addItemToListWidget( %s %s )"), |
|
370 item.data(), text.data() ); |
|
371 |
|
372 HbListWidgetItem* listWidgetItem = new HbListWidgetItem(); |
|
373 listWidgetItem->setText( item ); |
|
374 listWidgetItem->setSecondaryText( text ); |
|
375 |
|
376 mListWidget->addItem( listWidgetItem ); |
|
377 } |
|
378 } |
|
379 |
|
380 // ------------------------------------------------------------------------------------------------- |
|
381 // VideoPlaybackFileDetailsWidget::makeDateTimeItem |
|
382 // ------------------------------------------------------------------------------------------------- |
|
383 // |
|
384 void VideoPlaybackFileDetailsWidget::makeDateTimeItem( VideoPlaybackViewFileDetails* details ) |
|
385 { |
|
386 MPX_ENTER_EXIT(_L("VideoPlaybackFileDetailsWidget::makeDateTimeItem")); |
|
387 |
|
388 // |
|
389 // attempt to get 'created' and 'last modified' date/time from metadata first, |
|
390 // if it's not available, then get it from the file system |
|
391 // |
|
392 |
|
393 if ( details->mPlaybackMode == EMPXVideoLocal || |
|
394 details->mPlaybackMode == EMPXVideoProgressiveDownload ) |
|
395 { |
|
396 QDateTime dateTime; |
|
397 QFileInfo fileInfo( details->mClipName ); |
|
398 HbExtendedLocale locale = HbExtendedLocale::system(); |
|
399 |
|
400 // |
|
401 // Date created |
|
402 // |
|
403 if ( details->mCreationTime > 0 ) |
|
404 { |
|
405 dateTime.setTime_t( details->mCreationTime ); |
|
406 } |
|
407 else |
|
408 { |
|
409 dateTime = fileInfo.created(); |
|
410 } |
|
411 |
|
412 // |
|
413 // convert 'created' date/time to proper string format |
|
414 // according to its current locale |
|
415 // |
|
416 QString date = locale.format( dateTime.date(), r_qtn_date_usual ); |
|
417 QString time = locale.format( dateTime.time(), r_qtn_time_long_with_zero ); |
|
418 addItemToListWidget( hbTrId( "txt_videos_list_date" ), date + " " + time ); |
|
419 |
|
420 // |
|
421 // Date modified |
|
422 // |
|
423 if ( details->mModificationTime > 0 ) |
|
424 { |
|
425 dateTime.setTime_t( details->mModificationTime ); |
|
426 } |
|
427 else |
|
428 { |
|
429 dateTime = fileInfo.lastModified(); |
|
430 } |
|
431 |
|
432 // |
|
433 // convert 'last modified' date/time to proper string format |
|
434 // according to its current locale |
|
435 // |
|
436 date = locale.format( dateTime.date(), r_qtn_date_usual ); |
|
437 time = locale.format( dateTime.time(), r_qtn_time_long_with_zero ); |
|
438 addItemToListWidget( hbTrId( "txt_videos_list_modified" ), date + " " + time ); |
|
439 } |
|
440 } |
|
441 |
|
442 // ------------------------------------------------------------------------------------------------- |
|
443 // VideoPlaybackFileDetailsWidget::makeDurationItem |
|
444 // ------------------------------------------------------------------------------------------------- |
|
445 // |
|
446 void VideoPlaybackFileDetailsWidget::makeDurationItem( VideoPlaybackViewFileDetails* details ) |
|
447 { |
|
448 MPX_ENTER_EXIT(_L("VideoPlaybackFileDetailsWidget::makeDurationItem")); |
|
449 |
|
450 if ( details->mPlaybackMode != EMPXVideoLiveStreaming && details->mDuration > 0 ) |
|
451 { |
|
452 HbExtendedLocale locale = HbExtendedLocale::system(); |
|
453 QString hourString, minString, secString; |
|
454 |
|
455 int value = (qreal)details->mDuration / (qreal)KPbMilliMultiplier; |
|
456 |
|
457 int hours = value / 3600; |
|
458 value = value % 3600; |
|
459 int mins = value / 60; |
|
460 value = value % 60; |
|
461 int secs = value; |
|
462 |
|
463 // |
|
464 // Put "0" if it is less than 10 (0:00:03) |
|
465 // |
|
466 hourString = locale.toString( hours ); |
|
467 |
|
468 if ( mins < 10 ) |
|
469 { |
|
470 minString = locale.toString( 0 ); |
|
471 } |
|
472 minString.append( locale.toString( mins ) ); |
|
473 |
|
474 if ( secs < 10 ) |
|
475 { |
|
476 secString = locale.toString( 0 ); |
|
477 } |
|
478 secString.append( locale.toString( secs ) ); |
|
479 |
|
480 addItemToListWidget( |
|
481 hbTrId( "txt_videos_list_duration" ), |
|
482 hbTrId( "txt_videos_list_l1l2l3" ) |
|
483 .arg( hourString ).arg( minString ).arg( secString ) ); |
|
484 } |
|
485 } |
|
486 |
|
487 //End of file |