radioapp/radiowidgets/src/radiocarouselitem.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 11 Jun 2010 13:38:32 +0300
changeset 28 075425b8d9a4
child 32 189d20c34778
child 34 bc10a61bd7d3
permissions -rw-r--r--
Revision: 201021 Kit: 2010123

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

// System includes
#include <HbStyleLoader>
#include <HbPushButton>
#include <HbAnchorLayout>
#include <HbMessageBox>

// User includes
#include "radiocarouselitem.h"
#include "radiostation.h"
#include "radiostationcarousel.h"
#include "radiouiengine.h"
#include "radiofadinglabel.h"
#include "radiostationmodel.h"
#include "radiologger.h"

//static const char* FILE_PATH_WIDGETML   = ":/layout/radiostationitem.widgetml";
//static const char* FILE_PATH_CSS        = ":/layout/radiostationitem.css";
static const char* GENRE_LABEL            = "tv:genre_label";
static const char* NAME_LABEL             = "tv:name_label";
static const char* RADIOTEXT_LABEL        = "tv:radiotext_label";
static const char* URL_LABEL              = "tv:url_label";
//static const char* FAVORITE_BUTTON      = "favorite_button";

const char* SEEKING_TEXT = "txt_rad_list_tuning";
const char* CONNECT_HEADSET_TEXT = "txt_rad_list_connect_wireless_antenna_headset_with";

/*!
 *
 */
RadioCarouselItem::RadioCarouselItem( RadioStationCarousel& carousel ) :
    HbWidget( &carousel ),
    mCarousel( carousel ),
    mData( new Data() )
{
    mData->mStation.reset( new RadioStation() );

    mData->mIconButton.reset( new HbPushButton( this ) );
    QPixmap background( QSize( 70, 70 ) );
    background.fill( Qt::transparent );
    mData->mIconButton->setBackground( HbIcon( background ) );
    mData->mIconButton->setIcon( mCarousel.nonFavoriteIcon() );

    Radio::connect( mData->mIconButton.data(),  SIGNAL(clicked()),
                    &mCarousel,                 SLOT(toggleFavorite()));

    mData->mNameLabel.reset( new RadioFadingLabel( this ) );
    mData->mNameLabel->setAlignment( Qt::AlignCenter );
    mData->mNameLabel->setObjectName( NAME_LABEL );
    HbFontSpec spec = mData->mNameLabel->fontSpec();
    spec.setRole( HbFontSpec::Primary );
    spec.setTextHeight( 40 );
    mData->mNameLabel->setFontSpec( spec );

    spec.setRole( HbFontSpec::Secondary );

    mData->mGenreLabel.reset( new RadioFadingLabel( this ) );
    mData->mGenreLabel->setAlignment( Qt::AlignCenter );
    mData->mGenreLabel->setObjectName( GENRE_LABEL );
    mData->mGenreLabel->setTextColor( Qt::white );

    mData->mRadiotextLabel.reset( new RadioFadingLabel( this ) );
    mData->mRadiotextLabel->setAlignment( Qt::AlignCenter );
    mData->mRadiotextLabel->setObjectName( RADIOTEXT_LABEL );
    mData->mRadiotextLabel->setTextWrapping( Hb::TextWordWrap );
//        mRadiotextLabel->setFadingEnabled( true );    TODO
//        mRadiotextLabel->setFontSpec( spec );
    mData->mRadiotextLabel->setTextColor( Qt::white );

    mData->mUrlLabel.reset( new RadioFadingLabel( this ) );
    mData->mUrlLabel->setAlignment( Qt::AlignCenter );
    mData->mUrlLabel->setObjectName( URL_LABEL );
    mData->mUrlLabel->setTextColor( Qt::white );

    mData->mLayout = new HbAnchorLayout();
    HbAnchorLayout* layout = mData->mLayout;

    HbPushButton* iconButton = mData->mIconButton.data();
    RadioFadingLabel* nameLabel = mData->mNameLabel.data();
    RadioFadingLabel* genreLabel = mData->mGenreLabel.data();
    RadioFadingLabel* urlLabel = mData->mUrlLabel.data();
    RadioFadingLabel* radiotextLabel = mData->mRadiotextLabel.data();

    layout->setAnchor( layout, Hb::TopEdge, iconButton, Hb::TopEdge, 20.0 );
    layout->setAnchor( layout, Hb::LeftEdge, iconButton, Hb::LeftEdge, 20.0 );

    layout->setAnchor( iconButton, Hb::CenterVEdge, genreLabel, Hb::CenterVEdge, 0.0 );
    layout->setAnchor( iconButton, Hb::RightEdge, genreLabel, Hb::LeftEdge, 20.0 );
    layout->setAnchor( layout, Hb::RightEdge, genreLabel, Hb::RightEdge, -70.0 );

    layout->setAnchor( genreLabel, Hb::BottomEdge, nameLabel, Hb::TopEdge, 0.0 );
    layout->setAnchor( layout, Hb::LeftEdge, nameLabel, Hb::LeftEdge, 10.0 );
    layout->setAnchor( layout, Hb::RightEdge, nameLabel, Hb::RightEdge, -10.0 );

    layout->setAnchor( nameLabel, Hb::BottomEdge, radiotextLabel, Hb::TopEdge, 10.0 );
    layout->setAnchor( layout, Hb::LeftEdge, radiotextLabel, Hb::LeftEdge, 10.0 );
    layout->setAnchor( layout, Hb::RightEdge, radiotextLabel, Hb::RightEdge, -10.0 );

    layout->setAnchor( radiotextLabel, Hb::BottomEdge, urlLabel, Hb::TopEdge, 10.0 );
    layout->setAnchor( layout, Hb::LeftEdge, urlLabel, Hb::LeftEdge, 10.0 );
    layout->setAnchor( layout, Hb::RightEdge, urlLabel, Hb::RightEdge, -10.0 );
    layout->setAnchor( layout, Hb::BottomEdge, urlLabel, Hb::BottomEdge, -10.0 );

    setLayout( layout );
}

/*!
 *
 */
RadioCarouselItem::~RadioCarouselItem()
{
}

/*!
 *
 */
void RadioCarouselItem::setStation( const RadioStation& station )
{
    *mData->mStation = station;
    update();
}

/*!
 *
 */
void RadioCarouselItem::swapData( RadioCarouselItem& other )
{
    RadioCarouselItem::Data* tempData = mData.take();
    mData.reset( other.mData.data() );
    other.mData.reset( tempData );

    other.setLayout( other.mData->mLayout );
    setLayout( mData->mLayout );
}

/*!
 *
 */
uint RadioCarouselItem::frequency() const
{
    return mData->mStation->frequency();
}

/*!
 *
 */
void RadioCarouselItem::update( const RadioStation* station )
{
    if ( station ) {
        *mData->mStation = *station;
    }

    if ( mData->mStation->isValid() ) {
        mData->mNameLabel->setTextWithoutFading( mData->mStation->nameOrFrequencyMhz() );

//        mData->mGenreLabel->setText( "Rock Music" );
//        mData->mRadiotextLabel->setText( "This is a bit of radio text that should span many lines" );
//        mData->mUrlLabel->setText( "www.radiorock.fi" );

        mData->mGenreLabel->setText( mCarousel.uiEngine()->genreToString( mData->mStation->genre(), GenreTarget::Carousel ) );

        if ( !mData->mStation->radioText().isEmpty() ) {
            mData->mRadiotextLabel->setText( mData->mStation->radioText() );
        } else if ( !mData->mStation->dynamicPsText().isEmpty() ) {
            mData->mRadiotextLabel->setText( mData->mStation->dynamicPsText() );
        } else {
            mData->mRadiotextLabel->setText( "" );
        }

        mData->mUrlLabel->setText( mData->mStation->url() );

        updateFavoriteIcon( mData->mStation->isFavorite() );
    } else {
        cleanRdsData();
    }
}

/*!
 *
 */
void RadioCarouselItem::setFrequency( uint frequency )
{
//    LOG_FORMAT( "RadioCarouselItem::setFrequency: %d", frequency );

    if ( !mCarousel.mManualSeekMode ) {
        mData->mStation->setFrequency( frequency );
        mData->mNameLabel->setTextWithoutFading( parseFrequency( frequency ) );
        mData->mGenreLabel->setTextWithoutFading( "" );
        mData->mRadiotextLabel->setTextWithoutFading( "" );
        mData->mUrlLabel->setTextWithoutFading( "" );
        updateFavoriteIcon( false );
    } else {
        mData->mNameLabel->setTextWithoutFading( parseFrequency( frequency ) );
    }
}

/*!
 *
 */
void RadioCarouselItem::cleanRdsData()
{
    if ( !mCarousel.mManualSeekMode ) {
        mData->mNameLabel->setTextWithoutFading( "" );
    }
    mData->mGenreLabel->setTextWithoutFading( "" );
    mData->mRadiotextLabel->setTextWithoutFading( "" );
    mData->mUrlLabel->setTextWithoutFading( "" );
    mData->mIconButton->setIcon( HbIcon( "" ) );
}

/*!
 *
 */
void RadioCarouselItem::handleLongPress( const QPointF& /*coords*/ )
{
//    QString text = QString( "Selected frequency: %1" ).arg( mFrequency );
//    HbMessageBox::information( text );
}

/*!
 *
 */
void RadioCarouselItem::setRadioText( const QString& text )
{
    mData->mRadiotextLabel->setHtml( text );
}

/*!
 *
 */
void RadioCarouselItem::setSeekLayout( bool seekLayout )
{
    HbFontSpec spec = mData->mNameLabel->fontSpec();
    mData->mSeekLayout = seekLayout;
    if ( seekLayout ) {
        cleanRdsData();
        spec.setTextHeight( 60 );
    } else {
        spec.setTextHeight( 40 );
    }
    mData->mNameLabel->setFontSpec( spec );
}

/*!
 *
 */
void RadioCarouselItem::setItemVisibility( ItemVisibility visibility )
{
    mData->mIconButton->setEnabled( true );
    if ( visibility == AllVisible ) {
        mData->mNameLabel->setVisible( true );
        mData->mGenreLabel->setVisible( true );
        mData->mRadiotextLabel->setVisible( true );
        mData->mUrlLabel->setVisible( true );
        mData->mIconButton->setVisible( true );
    } else if ( visibility == AllHidden ) {
        mData->mNameLabel->setVisible( false );
        mData->mGenreLabel->setVisible( false );
        mData->mRadiotextLabel->setVisible( false );
        mData->mUrlLabel->setVisible( false );
        mData->mIconButton->setVisible( false );
    } else if ( visibility == IconVisible ) {
        mData->mNameLabel->setVisible( false );
        mData->mGenreLabel->setVisible( false );
        mData->mRadiotextLabel->setVisible( false );
        mData->mUrlLabel->setVisible( false );
        mData->mIconButton->setVisible( true );
        mData->mIconButton->setEnabled( false );
    }
}

/*!
 *
 */
void RadioCarouselItem::setIconOpacity( qreal opacity )
{
    mData->mIconButton->setOpacity( opacity );
}

/*!
 *
 */
void RadioCarouselItem::updateFavoriteIcon( bool isFavorite )
{
    if ( !mData->mSeekLayout ) {
        if ( isFavorite ) {
            mData->mIconButton->setIcon( mCarousel.favoriteIcon() );
        } else {
            mData->mIconButton->setIcon( mCarousel.nonFavoriteIcon() );
        }
    } else {
        mData->mIconButton->setIcon( HbIcon( "" ) );
    }
}

/*!
 *
 */
QString RadioCarouselItem::parseFrequency( const uint frequency )
{
    QString loc = "%L1 MHz";// hbTrId( "txt_rad_list_l1_mhz_big" );
    return loc.arg( RadioStation::parseFrequency( frequency ) );
}

/*!
 *
 */
QString RadioCarouselItem::nameOrFrequency( const RadioStation& station, uint frequency )
{
    if ( frequency == 0 ) {
        frequency = station.frequency();
    }

    QString text = "";
    if ( station.isValid() && !station.name().isEmpty() ) {
        text = station.name();
    } else {
        text = parseFrequency( frequency );
    }

    return text;
}

/*!
 *
 */
RadioCarouselItem::Data::Data() :
    mLayout( NULL ),
    mSeekLayout( false )
{
}

/*!
 *
 */
RadioCarouselItem::Data::~Data()
{
}