videoplayback/videoplaybackview/controlsrc/videoplaybackfiledetailswidget.cpp
author hgs
Tue, 05 Oct 2010 09:26:49 +0300
changeset 66 adb51f74b890
parent 63 4707a0db12f6
permissions -rw-r--r--
201039

/*
* 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:  Implementation of VideoPlaybackFileDetailsWidget
*
*/

// Version : %version:  30 %


#include <QDir>
#include <QDateTime>
#include <QFileInfo>

#include <hbglobal.h>
#include <hblistwidgetitem.h>
#include <hbratingslider.h>
#include <hblistwidget.h>
#include <hblistviewitem.h>
#include <hbextendedlocale.h>
#include <hbanchorlayout.h>

#include "mpxvideo_debug.h"
#include "videoplaybackdocumentloader.h"
#include "videoplaybackfiledetailswidget.h"
#include "videoplaybackdocumentloader.h"
#include "videoplaybackcontrolscontroller.h"

const float KILOBYTE = 1024 ;

// -------------------------------------------------------------------------------------------------
// VideoPlaybackFileDetailsWidget::VideoPlaybackFileDetailsWidget
// -------------------------------------------------------------------------------------------------
//
VideoPlaybackFileDetailsWidget::VideoPlaybackFileDetailsWidget(
        VideoPlaybackControlsController* controller )
    : mController( controller )
    , mListWidget( 0 )
    , mFileDetailsUpdated( false )
{
    MPX_ENTER_EXIT(_L("VideoPlaybackFileDetailsWidget::VideoPlaybackFileDetailsWidget()"));
}

// -------------------------------------------------------------------------------------------------
// VideoPlaybackFileDetailsWidget::~VideoPlaybackFileDetailsWidget
// -------------------------------------------------------------------------------------------------
//
VideoPlaybackFileDetailsWidget::~VideoPlaybackFileDetailsWidget()
{
    MPX_ENTER_EXIT(_L("VideoPlaybackFileDetailsWidget::~VideoPlaybackFileDetailsWidget()"));
}

// -------------------------------------------------------------------------------------------------
// VideoPlaybackFileDetailsWidget::updateWithFileDetails
// -------------------------------------------------------------------------------------------------
//
void VideoPlaybackFileDetailsWidget::updateWithFileDetails(
        VideoPlaybackViewFileDetails* details )
{
    VideoPlaybackDocumentLoader *loader = mController->layoutLoader();

    if ( loader )
    {
        //
        // load fileDetails widget
        //
        QGraphicsWidget *widget = loader->findWidget( QString( "fileDetails" ) );

        //
        // cast fileDetails widget to HbListWidget
        //
        mListWidget = qobject_cast<HbListWidget*>( widget );

        //
        // set the min/max number of lines in the second row
        //
        HbListViewItem *prototype = mListWidget->listItemPrototype();
        prototype->setSecondaryTextRowCount( 1, 30 );

        //
        // Title
        //
        makeTitleItem( details );

        if ( ! mFileDetailsUpdated )
        {
            HbExtendedLocale locale = HbExtendedLocale::system();

            mFileDetailsUpdated = true;

            //
            // File name & File path
            //
            // prevent exposure of private paths and show only :
            // (a) for standalone video player not when is launched from another app
            // (b) for local playback ony not for streaming video
            //
            if ( !mController->isService() )
            {
                QFileInfo fileInfo( details->mClipName );

                // File name
                QString filename = fileInfo.completeBaseName();
                addItemToListWidget( hbTrId( "txt_videos_list_file_name" ), filename );

                // File path
                QString path = fileInfo.absoluteFilePath();
                addItemToListWidget( hbTrId( "txt_videos_list_file_path" ), path );
            }

            //
            // Description
            //
            addItemToListWidget(
                    hbTrId( "txt_videos_list_description" ), details->mDescription );

            //
            // Duration
            //
            makeDurationItem( details );

            //
            // Date/Time
            //
            makeDateTimeItem( details );

            //
            // Location
            //
            addItemToListWidget( hbTrId( "txt_videos_list_location" ), details->mLocation );

            //
            // Author
            //
            addItemToListWidget( hbTrId( "txt_videos_list_author" ), details->mArtist );

            //
            // Copyright
            //
            addItemToListWidget( hbTrId( "txt_videos_list_copyright" ), details->mCopyright );

            //
            // Language
            //
            addItemToListWidget( hbTrId( "txt_videos_list_language" ), details->mLanguage );

            //
            // Keywords
            //
            addItemToListWidget( hbTrId( "txt_videos_list_keywords" ), details->mKeywords );

            //
            // Size
            //
            makeSizeItem( details );

            //
            // Resolution
            //
            if ( details->mVideoEnabled )
            {
                QString resolution = hbTrId( "txt_videos_list_l1l2" )
                       .arg( locale.toString( details->mVideoWidth ) )
                       .arg( locale.toString( details->mVideoHeight ) );
                addItemToListWidget( hbTrId( "txt_videos_list_resolution" ), resolution );
            }

            //
            // Format
            //
            addItemToListWidget( hbTrId( "txt_videos_list_format" ), details->mMimeType );

            //
            // Bitrate
            //
            makeBitRateItem( details );

            //
            // Folder
            //
            if ( details->mPlaybackMode == EMPXVideoLocal ||
                 details->mPlaybackMode == EMPXVideoProgressiveDownload)
            {
                QFileInfo fileInfo( details->mClipName );
                QString folder = fileInfo.dir().dirName();
                addItemToListWidget( hbTrId( "txt_videos_list_collection_name" ), folder );
            }
        }

        //
        // Set the rect size dynamically based on the view mode
        //
        QGraphicsWidget *content = loader->findWidget( QString( "content" ) );
        HbAnchorLayout *layout = static_cast<HbAnchorLayout*>( content->layout() );

        if ( layout )
        {
            QGraphicsWidget *titleLayout = loader->findWidget( QString( "titleLayout" ) );
            QRectF titleRect = titleLayout->geometry();

            switch ( mController->viewMode() )
            {
                case EDetailsView:
                {
                    layout->setAnchor( titleLayout, Hb::BottomEdge, this, Hb::TopEdge, 0 );
                    layout->setAnchor( layout, Hb::BottomEdge, this, Hb::BottomEdge, 0 );

                    break;
                }
                case EAudioOnlyView:
                {
                    QGraphicsWidget *controlLayout = loader->findWidget( QString( "controlBarLayout" ) );
                    QRectF controlRect = controlLayout->geometry();

                    layout->setAnchor(
                            this, Hb::TopEdge, titleLayout,
                            Hb::BottomEdge, titleRect.bottom() - titleRect.top() );

                    layout->setAnchor(
                            this, Hb::BottomEdge,
                            layout, Hb::BottomEdge, layout->geometry().height() - controlRect.top() );

                    break;
                }
            }
        }
    }
}

// -------------------------------------------------------------------------------------------------
// VideoPlaybackFileDetailsWidget::makeTitleItem
// -------------------------------------------------------------------------------------------------
//
void VideoPlaybackFileDetailsWidget::makeTitleItem( VideoPlaybackViewFileDetails* details )
{
    MPX_DEBUG(_L("VideoPlaybackFileDetailsWidget::makeTitleItem()"));

    //
    // Title should be the first item in file details list
    //
    if ( mController->viewMode() == EAudioOnlyView )
    {
        //
        // show the title for audio-only view
        //
        if ( mListWidget->count() == 0 || ! mListWidget->item( 0 )->text().contains( "Title", Qt::CaseInsensitive ) )
        {
            QString title = details->mTitle;

            if ( title.count() == 0 )
            {
                //
                // If title is not available, show clip name
                //
                QFileInfo fileInfo( details->mClipName );
                title = fileInfo.completeBaseName();
            }

            //
            // populate Title and its associated text
            //
            HbListWidgetItem* listWidgetItem = new HbListWidgetItem();
            listWidgetItem->setText( hbTrId( "txt_videos_list_title" ) );
            listWidgetItem->setSecondaryText( title );
            mListWidget->insertItem( 0, listWidgetItem );
        }
    }
    else if ( mListWidget->count() &&
              mListWidget->item( 0 )->text().contains( "Title", Qt::CaseInsensitive ) )
    {
        //
        // title is displayed under the status pane for video clips,
        // so hide the title for this details view
        //
        delete mListWidget->takeItem ( 0 );
    }
}

// -------------------------------------------------------------------------------------------------
// VideoPlaybackFileDetailsWidget::makeSizeItem
// -------------------------------------------------------------------------------------------------
//
void VideoPlaybackFileDetailsWidget::makeSizeItem( VideoPlaybackViewFileDetails* details )
{
    if ( details->mPlaybackMode == EMPXVideoLocal ||
         details->mPlaybackMode == EMPXVideoProgressiveDownload )
    {
        QFileInfo fileInfo( details->mClipName );

        //
        // to prevent overflow, get an unsigned value of file size
        //
        ulong fileSize = fileInfo.size();

        //
        // convert file size to KB, MB, GB accordingly
        //
        if ( fileSize > 0 )
        {
            HbExtendedLocale locale = HbExtendedLocale::system();

            QString scale;

            //
            // cast for later conversion with floating point
            //
            float size = (float) fileSize;

            if ( size > KILOBYTE )
            {
                size /= KILOBYTE;
                scale = hbTrId( "txt_videos_list_l1_kb" );
            }

            if ( size > KILOBYTE )
            {
                size /= KILOBYTE;
                scale = hbTrId( "txt_videos_list_l1_mb" );
            }

            if ( size > KILOBYTE )
            {
                size /= KILOBYTE;
                scale = hbTrId( "txt_videos_list_l1_gb" );
            }

            int temp = size * 10;
            size = (float)temp / 10;

            addItemToListWidget(
                    hbTrId( "txt_videos_list_file_size" ), scale.arg( locale.toString( size ) ) );
        }
    }
}

// -------------------------------------------------------------------------------------------------
// VideoPlaybackFileDetailsWidget::makeBitRateItem
// -------------------------------------------------------------------------------------------------
//
void VideoPlaybackFileDetailsWidget::makeBitRateItem( VideoPlaybackViewFileDetails* details  )
{
    if ( details->mBitRate > 0 )
    {
        HbExtendedLocale locale = HbExtendedLocale::system();

        float bitrate = details->mBitRate;

        QString scale = hbTrId( "txt_videos_list_l1_kbps" );

        if ( bitrate > KILOBYTE )
        {
             bitrate /= KILOBYTE;
        }

        if ( bitrate > KILOBYTE )
        {
             bitrate /= KILOBYTE;
             scale = hbTrId( "txt_videos_list_l1_mbps" );
        }

        int temp = bitrate * 10;
        bitrate = (float)temp / 10;

        addItemToListWidget(
                hbTrId( "txt_videos_list_bitrate" ), scale.arg( locale.toString( bitrate ) ) );
    }
}

// -------------------------------------------------------------------------------------------------
// VideoPlaybackFileDetailsWidget::addItemToListWidget
// -------------------------------------------------------------------------------------------------
//
void VideoPlaybackFileDetailsWidget::addItemToListWidget( QString item, QString text  )
{
    MPX_ENTER_EXIT(_L("VideoPlaybackFileDetailsWidget::addItemToListWidget"));

    if ( text.count() > 0 )
    {
        MPX_DEBUG(_L("VideoPlaybackFileDetailsWidget::addItemToListWidget( %s %s )"),
		    item.data(), text.data() );

        HbListWidgetItem* listWidgetItem = new HbListWidgetItem();
        listWidgetItem->setText( item );
        listWidgetItem->setSecondaryText( text );

        mListWidget->addItem( listWidgetItem );
    }
}

// -------------------------------------------------------------------------------------------------
// VideoPlaybackFileDetailsWidget::makeDateTimeItem
// -------------------------------------------------------------------------------------------------
//
void VideoPlaybackFileDetailsWidget::makeDateTimeItem( VideoPlaybackViewFileDetails* details )
{
    MPX_ENTER_EXIT(_L("VideoPlaybackFileDetailsWidget::makeDateTimeItem"));

    //
    // attempt to get 'created' and 'last modified' date/time from metadata first,
    // if it's not available, then get it from the file system
    //

    if ( details->mPlaybackMode == EMPXVideoLocal ||
         details->mPlaybackMode == EMPXVideoProgressiveDownload )
    {
        QDateTime dateTime;
        QFileInfo fileInfo( details->mClipName );
        HbExtendedLocale locale = HbExtendedLocale::system();

        //
        // Date created
        //
        if ( details->mCreationTime > 0 )
        {
            dateTime.setTime_t( details->mCreationTime );
        }
        else
        {
            dateTime = fileInfo.created();
        }

        //
        // convert 'created' date/time to proper string format
        // according to its current locale
        //
        QString date = locale.format( dateTime.date(), r_qtn_date_usual );
        QString time = locale.format( dateTime.time(), r_qtn_time_long_with_zero );
        addItemToListWidget( hbTrId( "txt_videos_list_date" ), date + "  " + time );

        //
        // Date modified
        //
        if ( details->mModificationTime > 0 )
        {
            dateTime.setTime_t( details->mModificationTime );
        }
        else
        {
            dateTime = fileInfo.lastModified();
        }

        //
        // convert 'last modified' date/time to proper string format
        // according to its current locale
        //
        date = locale.format( dateTime.date(), r_qtn_date_usual );
        time = locale.format( dateTime.time(), r_qtn_time_long_with_zero );
        addItemToListWidget( hbTrId( "txt_videos_list_modified" ), date + "  " + time );
    }
}

// -------------------------------------------------------------------------------------------------
// VideoPlaybackFileDetailsWidget::makeDurationItem
// -------------------------------------------------------------------------------------------------
//
void VideoPlaybackFileDetailsWidget::makeDurationItem( VideoPlaybackViewFileDetails* details )
{
    MPX_ENTER_EXIT(_L("VideoPlaybackFileDetailsWidget::makeDurationItem"));

    if ( details->mPlaybackMode != EMPXVideoLiveStreaming && details->mDuration > 0 )
    {
        HbExtendedLocale locale = HbExtendedLocale::system();
        QString hourString, minString, secString;

        int value = (qreal)details->mDuration / (qreal)KPbMilliMultiplier;

        int hours = value / 3600;
        value = value % 3600;
        int mins = value / 60;
        value = value % 60;
        int secs = value;

        //
        // Put "0" if it is less than 10 (0:00:03)
        //
        hourString = locale.toString( hours );

        if ( mins < 10 )
        {
            minString = locale.toString( 0 );
        }
        minString.append( locale.toString( mins ) );

        if ( secs < 10 )
        {
            secString = locale.toString( 0 );
        }
        secString.append( locale.toString( secs ) );

        addItemToListWidget(
                hbTrId( "txt_videos_list_duration" ),
                hbTrId( "txt_videos_list_l1l2l3" )
                .arg( hourString ).arg( minString ).arg( secString ) );
    }
}

//End of file