radioapp/radiowidgets/src/radiostationitem.cpp
changeset 24 6df133bd92e1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/radioapp/radiowidgets/src/radiostationitem.cpp	Fri Jun 04 10:21:36 2010 +0100
@@ -0,0 +1,284 @@
+/*
+* 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 "radiostationitem.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";
+
+/*!
+ *
+ */
+RadioStationItem::RadioStationItem( RadioStationCarousel& carousel ) :
+    HbAbstractViewItem( &carousel ),
+    mCarousel( carousel ),
+    mLayout( 0 ),
+    mNameLabel( 0 ),
+    mIconButton( 0 ),
+    mGenreLabel( 0 ),
+    mRadiotextLabel( 0 ),
+    mUrlLabel( 0 )
+{
+    setFlag( QGraphicsItem::ItemIsFocusable, true );
+}
+
+/*!
+ * From HbAbstractViewItem
+ *
+ */
+HbAbstractViewItem* RadioStationItem::createItem()
+{
+    RadioStationItem* item = new RadioStationItem( *this ); // Calls copy constructor
+//    item->setParent( &mCarousel );
+//    item->setParentItem( &mCarousel );
+//    item->setItemView( itemView() );
+//    item->updateChildItems();
+    return item;
+}
+
+/*!
+ * From HbAbstractViewItem
+ */
+void RadioStationItem::updateChildItems()
+{
+    if ( !mLayout )
+    {
+        mIconButton = new HbPushButton( this );
+        QPixmap background( QSize( 50, 50 ) );
+        background.fill( Qt::transparent );
+        mIconButton->setBackground( HbIcon( background ) );
+        mIconButton->setIcon( mCarousel.nonFavoriteIcon() );
+        mIconButton->setMaximumSize( 50, 50 );
+        connectAndTest( mIconButton, SIGNAL(clicked()), this, SLOT(toggleFavorite()));
+
+        mNameLabel = new RadioFadingLabel( this );
+        mNameLabel->setAlignment( Qt::AlignCenter );
+        mNameLabel->setObjectName( NAME_LABEL );
+        HbFontSpec spec = mNameLabel->fontSpec();
+        spec.setRole( HbFontSpec::Primary );
+        mNameLabel->setFontSpec( spec );
+
+        spec.setRole( HbFontSpec::Secondary );
+
+        mGenreLabel = new RadioFadingLabel( this );
+        mGenreLabel->setAlignment( Qt::AlignCenter );
+        mGenreLabel->setObjectName( GENRE_LABEL );
+        mGenreLabel->setTextColor( Qt::white );
+
+        mRadiotextLabel = new RadioFadingLabel( this );
+        mRadiotextLabel->setAlignment( Qt::AlignCenter );
+        mRadiotextLabel->setObjectName( RADIOTEXT_LABEL );
+        mRadiotextLabel->setTextWrapping( Hb::TextWordWrap );
+//        mRadiotextLabel->setFadingEnabled( true );    TODO
+//        mRadiotextLabel->setFontSpec( spec );
+        mRadiotextLabel->setTextColor( Qt::white );
+
+        mUrlLabel = new RadioFadingLabel( this );
+        mUrlLabel->setAlignment( Qt::AlignCenter );
+        mUrlLabel->setObjectName( URL_LABEL );
+        mUrlLabel->setTextColor( Qt::white );
+
+        mLayout = new HbAnchorLayout();
+
+        mLayout->setAnchor( mLayout, Hb::TopEdge, mIconButton, Hb::TopEdge, 20.0 );
+        mLayout->setAnchor( mLayout, Hb::LeftEdge, mIconButton, Hb::LeftEdge, 20.0 );
+
+        mLayout->setAnchor( mIconButton, Hb::CenterVEdge, mGenreLabel, Hb::CenterVEdge, 0.0 );
+        mLayout->setAnchor( mIconButton, Hb::RightEdge, mGenreLabel, Hb::LeftEdge, 20.0 );
+        mLayout->setAnchor( mLayout, Hb::RightEdge, mGenreLabel, Hb::RightEdge, -70.0 );
+
+        mLayout->setAnchor( mGenreLabel, Hb::BottomEdge, mNameLabel, Hb::TopEdge, 0.0 );
+        mLayout->setAnchor( mLayout, Hb::LeftEdge, mNameLabel, Hb::LeftEdge, 10.0 );
+        mLayout->setAnchor( mLayout, Hb::RightEdge, mNameLabel, Hb::RightEdge, -10.0 );
+
+        mLayout->setAnchor( mNameLabel, Hb::BottomEdge, mRadiotextLabel, Hb::TopEdge, 10.0 );
+        mLayout->setAnchor( mLayout, Hb::LeftEdge, mRadiotextLabel, Hb::LeftEdge, 10.0 );
+        mLayout->setAnchor( mLayout, Hb::RightEdge, mRadiotextLabel, Hb::RightEdge, -10.0 );
+
+        mLayout->setAnchor( mRadiotextLabel, Hb::BottomEdge, mUrlLabel, Hb::TopEdge, 10.0 );
+        mLayout->setAnchor( mLayout, Hb::LeftEdge, mUrlLabel, Hb::LeftEdge, 10.0 );
+        mLayout->setAnchor( mLayout, Hb::RightEdge, mUrlLabel, Hb::RightEdge, -10.0 );
+        mLayout->setAnchor( mLayout, Hb::BottomEdge, mUrlLabel, Hb::BottomEdge, -10.0 );
+
+        setLayout( mLayout );
+    }
+
+    update();
+}
+
+/*!
+ * Private slot
+ *
+ */
+void RadioStationItem::toggleFavorite()
+{
+    RadioUiEngine* uiEngine = carousel()->uiEngine();
+    if ( uiEngine ) {
+        uiEngine->stationModel().setData( modelIndex(), mFrequency, RadioStationModel::ToggleFavoriteRole );
+    }
+}
+
+/*!
+ *
+ */
+uint RadioStationItem::frequency() const
+{
+    return mFrequency;
+}
+
+/*!
+ *
+ */
+void RadioStationItem::update( const RadioStation* station )
+{
+    QModelIndex index = modelIndex();
+    if ( !( station && station->isValid() ) && !index.isValid() ) {
+        return;
+    }
+
+    RadioUiEngine* uiEngine = carousel()->uiEngine();
+    if ( !mCarousel.isInScanningMode() && uiEngine ) {
+        RadioStation tempStation = ( station && station->isValid() ) ? *station
+                        : index.data( RadioStationModel::RadioStationRole ).value<RadioStation>();
+
+        mNameLabel->setTextWithoutFading( nameOrFrequency( tempStation ) );
+
+        mGenreLabel->setText( uiEngine->genreToString( tempStation.genre(), GenreTarget::Carousel ) );
+
+        if ( !tempStation.radioText().isEmpty() ) {
+            mRadiotextLabel->setText( tempStation.radioText() );
+        } else if ( !tempStation.dynamicPsText().isEmpty() ) {
+            mRadiotextLabel->setText( tempStation.dynamicPsText() );
+        } else {
+            mRadiotextLabel->setText( "" );
+        }
+
+        mUrlLabel->setText( tempStation.url() );
+
+        mFrequency = tempStation.frequency();
+
+        updateFavoriteIcon( tempStation.isFavorite() );
+    }
+}
+
+/*!
+ *
+ */
+void RadioStationItem::setFrequency( uint frequency )
+{
+    LOG_FORMAT( "RadioStationItem::setFrequency: %d", frequency );
+
+    mNameLabel->setTextWithoutFading( parseFrequency( frequency ) );
+    mGenreLabel->setTextWithoutFading( "" );
+    mRadiotextLabel->setTextWithoutFading( "" );
+    mUrlLabel->setTextWithoutFading( "" );
+    mFrequency = frequency;
+    updateFavoriteIcon( false );
+}
+
+/*!
+ *
+ */
+void RadioStationItem::cleanRdsData()
+{
+    mNameLabel->setTextWithoutFading( "" );
+    mGenreLabel->setTextWithoutFading( "" );
+    mRadiotextLabel->setTextWithoutFading( "" );
+    mUrlLabel->setTextWithoutFading( "" );
+}
+
+/*!
+ *
+ */
+void RadioStationItem::handleLongPress( const QPointF& /*coords*/ )
+{
+    QString text = QString( "Selected frequency: %1" ).arg( mFrequency );
+//    HbMessageBox::information( text );
+}
+
+/*!
+ *
+ */
+void RadioStationItem::updateFavoriteIcon( bool isFavorite )
+{
+    if ( !mCarousel.isInScanningMode() ) {
+        if ( isFavorite ) {
+            mIconButton->setIcon( mCarousel.favoriteIcon() );
+        } else {
+            mIconButton->setIcon( mCarousel.nonFavoriteIcon() );
+        }
+    } else {
+        mIconButton->setIcon( HbIcon( "" ) );
+    }
+}
+
+/*!
+ *
+ */
+RadioStationCarousel* RadioStationItem::carousel()
+{
+    return static_cast<RadioStationCarousel*>( itemView() );
+}
+
+/*!
+ *
+ */
+QString RadioStationItem::parseFrequency( const uint frequency )
+{
+    //TODO: Frequency localization temporarily disabled
+    QString loc = "%L1 Mhz";// "txt_rad_list_l1_mhz_big" );
+    return loc.arg( RadioStation::parseFrequency( frequency ) );
+}
+
+/*!
+ *
+ */
+QString RadioStationItem::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;
+}