ui/views/detailsview/src/glxdetailsview.cpp
author hgs
Fri, 28 May 2010 21:11:54 +0530
changeset 43 72396548277c
parent 40 112f0ac2d1f0
child 44 aa2fa096cbfb
permissions -rw-r--r--
201021

/*
 * 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:   ?Description
 *
 */

//--------------------------------------------------------------------------------------------------------------------------------------------
#include <QModelIndex>
#include <qdatetime.h>

//--------------------------------------------------------------------------------------------------------------------------------------------
#include <hblabel.h>
#include <hbdataform.h>
#include <hbinstance.h>
#include <hbiconitem.h>
#include <hblineedit.h>
#include <hbdataformmodel.h>
#include <hbdataformmodelitem.h>
#include <hbdataformviewitem.h>

//--------------------------------------------------------------------------------------------------------------------------------------------
#include "glxviewids.h"
#include "glxicondefs.h" //Contains the icon names/Ids
#include "glxmodelparm.h"
#include "glxdetailsview.h"
#include "glxfavmediamodel.h"
#include <glxcommandhandlers.hrh>
#include "glxdetailscustomicon.h"
#include "glxdetailscustomwidgets.h"
#include <glxcollectionpluginalbums.hrh>


#include "OstTraceDefinitions.h"
#ifdef OST_TRACE_COMPILER_IN_USE
#include "glxdetailsviewTraces.h"
#endif


//SIZE OF THE IMAGE , LAYOUTS TEAM NEED TO GIVER THE SIZE IN UNITS
#define GLX_IMAGE_SIZE 215 

//--------------------------------------------------------------------------------------------------------------------------------------------
//GlxDetailsView
//--------------------------------------------------------------------------------------------------------------------------------------------
GlxDetailsView::GlxDetailsView(HbMainWindow *window) :  
    GlxView ( GLX_DETAILSVIEW_ID),
    mDetailsIcon(NULL),
    mFavIcon(NULL),
    mModel(NULL),
    mFavModel(NULL),
    mDetailModel(NULL),
    mWindow(window), 
    mDataForm(NULL),     
    mCustomPrototype(NULL),
    mSelIndex(0),
    mDateLabelItem(NULL),
    mImageLabelitem(NULL),
    mCommentsLabelitem(NULL)
        {
    OstTraceFunctionEntry0( GLXDETAILSVIEW_GLXDETAILSVIEW_ENTRY );    
    setContentFullScreen( true );//for smooth transtion between grid to full screen and vice versa
    OstTraceFunctionExit0( GLXDETAILSVIEW_GLXDETAILSVIEW_EXIT );
        }

//--------------------------------------------------------------------------------------------------------------------------------------------
//activate
//--------------------------------------------------------------------------------------------------------------------------------------------
void GlxDetailsView::activate()
    {
    OstTraceFunctionEntry0( GLXDETAILSVIEW_ACTIVATE_ENTRY );
    setFormData();    
    connect(mWindow, SIGNAL(orientationChanged(Qt::Orientation)), this, SLOT(updateLayout(Qt::Orientation)));
    connect(mFavIcon,SIGNAL(updateFavourites()),this ,SLOT(updateFavourites()));
    OstTraceFunctionExit0( GLXDETAILSVIEW_ACTIVATE_EXIT );
    }

//--------------------------------------------------------------------------------------------------------------------------------------------
//initializeView
//--------------------------------------------------------------------------------------------------------------------------------------------
void GlxDetailsView::initializeView(QAbstractItemModel *model)
    {   
    OstTraceFunctionEntry0( GLXDETAILSVIEW_INITIALIZEVIEW_ENTRY );

    //To show the thumbnail 
    if ( mDataForm == NULL) {
    mDataForm = new HbDataForm(this);
    mDetailModel = new HbDataFormModel();

    //custom prototype
    mCustomPrototype = new GlxDetailsCustomWidgets(mDataForm);           
    QList <HbAbstractViewItem*> protos = mDataForm->itemPrototypes();
    protos.append(mCustomPrototype);
    mDataForm->setItemPrototypes(protos);

    //Add the Widgets according to the mime type
    addWidgets();
    }   

    if( mDetailsIcon == NULL) {
    mDetailsIcon = new HbIconItem(this);
    mFavIcon = new GlxDetailsCustomIcon(this);
    }

    //Set the Model
    mModel = model;
    initializeNewModel();

    //Set the Layout Correspondingly.
    updateLayout(mWindow->orientation());

    //Shows the Image 
    showImage(); 
    OstTraceFunctionExit0( GLXDETAILSVIEW_INITIALIZEVIEW_EXIT );
    }

//--------------------------------------------------------------------------------------------------------------------------------------------
//resetView
//--------------------------------------------------------------------------------------------------------------------------------------------
void GlxDetailsView::resetView()
    {
    OstTrace0( TRACE_NORMAL, GLXDETAILSVIEW_RESETVIEW, "GlxDetailsView::resetView" );   
    }

//--------------------------------------------------------------------------------------------------------------------------------------------
//deActivate
//--------------------------------------------------------------------------------------------------------------------------------------------
void GlxDetailsView::deActivate()
    { 
    OstTraceFunctionEntry0( GLXDETAILSVIEW_DEACTIVATE_ENTRY );
    cleanUp();      
    OstTraceFunctionExit0( GLXDETAILSVIEW_DEACTIVATE_EXIT );
    }

//--------------------------------------------------------------------------------------------------------------------------------------------
//cleanUp
//--------------------------------------------------------------------------------------------------------------------------------------------
void GlxDetailsView::cleanUp()
    {
    clearCurrentModel();

    //clear the connections
    if(mWindow) {
    disconnect(mWindow, SIGNAL(orientationChanged(Qt::Orientation)), this, SLOT(updateLayout(Qt::Orientation)));
    }

    if(mFavModel) {
    disconnect( mFavModel, SIGNAL( dataChanged(QModelIndex,QModelIndex) ), this, SLOT( dataChanged(QModelIndex,QModelIndex) ) );
    }

    if(mFavIcon) {
    disconnect(mFavIcon,SIGNAL(updateFavourites()),this ,SLOT(updateFavourites()));
    }

    delete mFavModel;
    mFavModel = NULL;

    delete mFavIcon;
    mFavIcon = NULL;

    delete mDetailsIcon;
    mDetailsIcon = NULL;    
    }  

//--------------------------------------------------------------------------------------------------------------------------------------------
//~GlxDetailsView
//--------------------------------------------------------------------------------------------------------------------------------------------
GlxDetailsView::~GlxDetailsView()
    {
    OstTrace0( TRACE_IMPORTANT, GLXDETAILSVIEW_GLXDETAILSVIEW, "GlxDetailsView::~GlxDetailsView" );

    cleanUp();     

    if(mDetailModel) {
      delete mDetailModel;
      mDataForm->setModel(0);
    }

    if(mDataForm) {
    delete mDataForm;
    mDataForm = NULL;
    }       
    }

//--------------------------------------------------------------------------------------------------------------------------------------------
//addWidgets
//--------------------------------------------------------------------------------------------------------------------------------------------
void GlxDetailsView::addWidgets()
    {
    OstTrace0( TRACE_NORMAL, GLXDETAILSVIEW_ADDWIDGETS, "GlxDetailsView::addWidgets create Form" );

    //----------------------------START OF CREATION OF WIDGETS---------------------------------//
    // To add new widgets in the details view, add it here.

    //---------------------------IMAGE NAME LABEL --------------------------------------------//
    OstTrace0( TRACE_NORMAL, DUP1_GLXDETAILSVIEW_ADDWIDGETS, "GlxDetailsView::addWidgets create Image Label" );
    mImageLabelitem = mDetailModel->appendDataFormItem(HbDataFormModelItem::TextItem, QString("Name"), NULL);

    //---------------------------DATE LABEL --------------------------------------------//
    OstTrace0( TRACE_NORMAL, DUP2_GLXDETAILSVIEW_ADDWIDGETS, "GlxDetailsView::addWidgets date label" );
    mDateLabelItem = mDetailModel->appendDataFormItem((HbDataFormModelItem::DataItemType)(DateLabelItem), QString("Date"), NULL);


    //----------------------------COMMENTS TEXT ITEM---------------------------------------------//
    OstTrace0( TRACE_NORMAL, DUP5_GLXDETAILSVIEW_ADDWIDGETS, "GlxDetailsView::addWidgets comment text" );
    mCommentsLabelitem = mDetailModel->appendDataFormItem(HbDataFormModelItem::TextItem, QString("Description"), NULL);

    //----------------------------END OF CREATION OF WIDGETS-------------------------------------//

    //Set the model to the Data Form
    mDataForm->setModel(mDetailModel);
    }

//--------------------------------------------------------------------------------------------------------------------------------------------
//setFavModel
//--------------------------------------------------------------------------------------------------------------------------------------------
void GlxDetailsView::setFavModel()
    {
    GlxModelParm modelParm;

    QString imagePath = (mModel->data(mModel->index(mModel->data(mModel->index(0,0),GlxFocusIndexRole).value<int>(),0),GlxUriRole)).value<QString>();

    if(mFavModel == NULL) {
    modelParm.setCollection( KGlxCollectionPluginFavoritesAlbumId );
    modelParm.setContextMode(GlxContextFavorite);
    modelParm.setPath(imagePath);
    mFavModel = new GlxFavMediaModel( modelParm );
    }
    QString imageName = imagePath.section('\\',-1);
    connect( mFavModel, SIGNAL( dataChanged(QModelIndex,QModelIndex) ), this, SLOT( dataChanged(QModelIndex,QModelIndex) ) );   
    }

//--------------------------------------------------------------------------------------------------------------------------------------------
//setModel
//--------------------------------------------------------------------------------------------------------------------------------------------
void GlxDetailsView::setModel(QAbstractItemModel *model)
    {
    OstTrace0( TRACE_NORMAL, GLXDETAILSVIEW_SETMODEL, "GlxDetailsView::setModel" );
    if ( mModel == model ) {
    return ;
    }
    clearCurrentModel();
    mModel = model;
    initializeNewModel();
    }

//--------------------------------------------------------------------------------------------------------------------------------------------
//getAnimationItem
//--------------------------------------------------------------------------------------------------------------------------------------------
QGraphicsItem * GlxDetailsView::getAnimationItem(GlxEffect transtionEffect)
    {
    OstTrace0( TRACE_NORMAL, GLXDETAILSVIEW_GETANIMATIONITEM, "GlxDetailsView::getAnimationItem" );
    if ( transtionEffect == FULLSCREEN_TO_DETAIL
            || transtionEffect == DETAIL_TO_FULLSCREEN ) {
    return this;
    }
    return NULL;    
    }

//--------------------------------------------------------------------------------------------------------------------------------------------
//updateLayout
//--------------------------------------------------------------------------------------------------------------------------------------------
void GlxDetailsView::updateLayout(Qt::Orientation orient)
    {
    OstTrace1( TRACE_NORMAL, GLXDETAILSVIEW_UPDATELAYOUT, "GlxDetailsView::updateLayout;orient=%d", orient );

    qreal IconPosX = 0.0;
    qreal IconPosY = 0.0;
    qreal FavIconPosX = 0.0;
    qreal FavIconPosY = 0.0;
    qreal DataFormX = 0.0;
    qreal DataFormY = 0.0;
    qreal DataFormWidth = 0.0;
    qreal DataFormHeight = 0.0;


    qreal screenWidth = 0.0;
    qreal screenHeight = 0.0;
    qreal leftMargin = 0.0;
    qreal bottomMargin = 0.0;
    qreal screenMargin = 0.0;
    qreal favIconSize = 0.0;
    qreal chromeHeight = 0.0;
    qreal middleVerticalMargin = 0.0;

    style()->parameter("hb-param-screen-width", screenWidth);
    style()->parameter("hb-param-screen-height", screenHeight);

    style()->parameter("hb-param-margin-gene-middle-vertical", middleVerticalMargin);
    style()->parameter("hb-param-margin-gene-left", leftMargin);
    style()->parameter("hb-param-margin-gene-bottom", bottomMargin);
    style()->parameter("hb-param-margin-gene-screen", screenMargin);

    style()->parameter("hb-param-graphic-size-primary-small", favIconSize);
    style()->parameter("hb-param-widget-chrome-height", chromeHeight);


    if(orient == Qt::Horizontal)
        {
    OstTrace0( TRACE_NORMAL, DUP1_GLXDETAILSVIEW_UPDATELAYOUT, "GlxDetailsView::updateLayout HORIZONTAL" );
    setGeometry(0,0,640,360);
    IconPosX    = screenMargin;
    IconPosY    = (screenMargin + chromeHeight);
    FavIconPosX = (IconPosX + GLX_IMAGE_SIZE - (favIconSize +10));
    FavIconPosY = (IconPosY + GLX_IMAGE_SIZE - (favIconSize + 10));
    DataFormX =  screenMargin + GLX_IMAGE_SIZE + leftMargin ;
    DataFormY =  screenMargin + chromeHeight ;

    //This Commented code should be un commented , once the screen width and height size issue is solved and also
    //the dataform issue of wrapping issue is solved
    // DataFormWidth =  screenWidth(640) - DataFormX  - screenMargin ;
    // DataFormHeight = screenHeight(360) - DataFormY - screenMargin ;
    DataFormWidth = screenWidth - (screenMargin  + screenMargin) ;
    DataFormHeight = screenHeight - DataFormY;

        }
    else
        {
    OstTrace0( TRACE_NORMAL, DUP2_GLXDETAILSVIEW_UPDATELAYOUT, "GlxDetailsView::updateLayout VERTICAL" );
    setGeometry(0,0,screenWidth,screenHeight);
    IconPosX    = (screenWidth/2) - (GLX_IMAGE_SIZE/2);
    IconPosY    = (screenMargin + chromeHeight);
    FavIconPosX = (IconPosX + GLX_IMAGE_SIZE - (favIconSize +10));
    FavIconPosY = (IconPosY + GLX_IMAGE_SIZE - (favIconSize +10));
    DataFormX =  screenMargin;
    DataFormY =  IconPosY + GLX_IMAGE_SIZE + middleVerticalMargin + bottomMargin ;
    DataFormWidth = screenWidth - (screenMargin  + screenMargin) ;
    DataFormHeight = screenHeight - DataFormY;
        }

    mDetailsIcon->setPos(IconPosX,IconPosY);
    //The Numerical should be updated once we get the parameters size from the layouts.
    mFavIcon->setItemGeometry(QRect(FavIconPosX-2 ,FavIconPosY-2 ,favIconSize+12,favIconSize + 12)) ;
    //Place the FavIcon with respect to the Widget.
    mFavIcon->setItemPos(2 ,2 );
    mDataForm->setGeometry(DataFormX,DataFormY,DataFormWidth,DataFormHeight);    
    }

//--------------------------------------------------------------------------------------------------------------------------------------------
//rowsRemoved
//--------------------------------------------------------------------------------------------------------------------------------------------
void GlxDetailsView::rowsRemoved(const QModelIndex &parent, int start, int end)
    {
    Q_UNUSED(parent);
    Q_UNUSED(start);
    Q_UNUSED(end);
    OstTrace0( TRACE_NORMAL, GLXDETAILSVIEW_ROWSREMOVED, "GlxDetailsView::rowsRemoved" );

    if ( mModel->rowCount() <= 0 ) {
    return emit actionTriggered( EGlxCmdEmptyData );
    }

    if ( start <= mSelIndex && end >= mSelIndex ) {
    return emit actionTriggered( EGlxCmdBack );
    }
    }

//--------------------------------------------------------------------------------------------------------------------------------------------
//showImage
//--------------------------------------------------------------------------------------------------------------------------------------------
void GlxDetailsView::showImage()
    {
    OstTrace0( TRACE_NORMAL, GLXDETAILSVIEW_SHOWIMAGE, "GlxDetailsView::showImage" );

    QVariant variant = mModel->data( mModel->index(0,0), GlxFocusIndexRole );    
    if ( variant.isValid() &&  variant.canConvert<int> () ) {
    mSelIndex = variant.value<int>();  
    }

    variant = mModel->data( mModel->index( mSelIndex ,0), GlxFsImageRole);
    if ( variant.isValid() &&  variant.canConvert<HbIcon> () )
        {
        QIcon itemIcon = variant.value<HbIcon>().qicon();
        QPixmap itemPixmap = itemIcon.pixmap(GLX_IMAGE_SIZE,GLX_IMAGE_SIZE);
        QSize sz(GLX_IMAGE_SIZE,GLX_IMAGE_SIZE);
        itemPixmap = itemPixmap.scaled(sz, Qt::IgnoreAspectRatio );
    
    
        HbIcon tmp = HbIcon( QIcon(itemPixmap)) ;
        mDetailsIcon->setSize(QSize(GLX_IMAGE_SIZE, GLX_IMAGE_SIZE));
        mDetailsIcon->setIcon(tmp);
        mFavIcon->setItemIcon(HbIcon("qtg_graf_ratingslider_unrated"));
    
        qreal favIconSize = 0.0;
        style()->parameter("hb-param-graphic-size-primary-small", favIconSize);
        mFavIcon->setItemSize(QSize(favIconSize+10, favIconSize+10));
        }        
    }

//--------------------------------------------------------------------------------------------------------------------------------------------
//FillData
//--------------------------------------------------------------------------------------------------------------------------------------------
void GlxDetailsView::setFormData()
    {
    OstTrace0( TRACE_NORMAL, GLXDETAILSVIEW_SETFORMDATA, "GlxDetailsView::setFormData" );

    //create and set the Favourite Model
    setFavModel();

    //Call to set the Image Name
    setImageName();

    //Call to set the date in the from
    setDate();
    }

//--------------------------------------------------------------------------------------------------------------------------------------------
//setImageName
//--------------------------------------------------------------------------------------------------------------------------------------------
void GlxDetailsView::setImageName()
    {
    OstTraceFunctionEntry0( GLXDETAILSVIEW_SETIMAGENAME_ENTRY );

    QString imagePath = (mModel->data(mModel->index(mModel->data(mModel->index(0,0),GlxFocusIndexRole).value<int>(),0),GlxUriRole)).value<QString>();
    QString imageName = imagePath.section('\\',-1);

    mImageLabelitem->setContentWidgetData("text",imageName);
    OstTraceFunctionExit0( GLXDETAILSVIEW_SETIMAGENAME_EXIT );
    }

//--------------------------------------------------------------------------------------------------------------------------------------------
//setDate
//--------------------------------------------------------------------------------------------------------------------------------------------
void GlxDetailsView::setDate()
    {
    OstTraceFunctionEntry0( GLXDETAILSVIEW_SETDATE_ENTRY );

    QString datestring;
    QString str("dd.MM.yyyy");
    QDate date = (mModel->data(mModel->index(mModel->data(mModel->index(0,0),GlxFocusIndexRole).value<int>(),0),GlxDateRole)).value<QDate>();

    if(date.isNull() == FALSE )
        {
    OstTrace0( TRACE_NORMAL, GLXDETAILSVIEW_SETDATE, "GlxDetailsView::setDate is not NULL" );
    datestring = date.toString(str);
        }

    mDateLabelItem->setContentWidgetData("plainText",datestring);

    OstTraceFunctionExit0( GLXDETAILSVIEW_SETDATE_EXIT );
    }

//--------------------------------------------------------------------------------------------------------------------------------------------
//initializeNewModel
//--------------------------------------------------------------------------------------------------------------------------------------------
void GlxDetailsView::initializeNewModel()
    {
    OstTrace0( TRACE_NORMAL, GLXDETAILSVIEW_INITIALIZENEWMODEL, "GlxDetailsView::initializeNewModel" );

    if ( mModel ) {
    connect(mModel, SIGNAL(rowsRemoved(QModelIndex,int,int)), this, SLOT(rowsRemoved(QModelIndex,int,int)));
    }
    }

//--------------------------------------------------------------------------------------------------------------------------------------------
//clearCurrentModel
//--------------------------------------------------------------------------------------------------------------------------------------------
void GlxDetailsView::clearCurrentModel()
    {
    OstTrace0( TRACE_NORMAL, GLXDETAILSVIEW_CLEARCURRENTMODEL, "GlxDetailsView::clearCurrentModel" );

    if ( mModel ) {
    disconnect(mModel, SIGNAL(rowsRemoved(QModelIndex,int,int)), this, SLOT(rowsRemoved(QModelIndex,int,int)));
    mModel = NULL ;
    }    
    }

//--------------------------------------------------------------------------------------------------------------------------------------------
//dataChanged
//--------------------------------------------------------------------------------------------------------------------------------------------
void GlxDetailsView::dataChanged(QModelIndex startIndex, QModelIndex endIndex)
    {
    Q_UNUSED(endIndex);      
 
    QVariant variant = mFavModel->data( startIndex, GlxFavorites );
    if ( variant.isValid() &&  variant.canConvert<bool> () ) 
        {
        if(variant.value<bool>() )
            {  
             mFavIcon->setItemIcon(HbIcon(GLXICON_ADD_TO_FAV));
            }
        else 
            {
             mFavIcon->setItemIcon(HbIcon(GLXICON_REMOVE_FAV));
            }
        }
    }

//--------------------------------------------------------------------------------------------------------------------------------------------
//updateFavourites
//--------------------------------------------------------------------------------------------------------------------------------------------
void GlxDetailsView::updateFavourites()
    {
    QVariant variant = mFavModel->data(mFavModel->index(0,0), GlxFavorites );
    if ( variant.isValid() &&  variant.canConvert<bool> ())
        {
        if(variant.value<bool>() )
            {
             emit actionTriggered( EGlxCmdRemoveFromFav); 
            }
        else
            {
            emit actionTriggered(EGlxCmdAddToFav);
            }
        }
    }