diff -r 1a6714c53019 -r cce62ebc198e radioapp/radiowidgets/src/radiostationsview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/radioapp/radiowidgets/src/radiostationsview.cpp Tue Aug 31 15:15:02 2010 +0300 @@ -0,0 +1,399 @@ +/* +* 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 +#include +#include +#include +#include +#include +#include +#include + +// User includes +#include "radiostationsview.h" +#include "radiologger.h" +#include "radiowindow.h" +#include "radiouiengine.h" +#include "radiofrequencyscanner.h" +#include "radiouiloader.h" +#include "radiostationmodel.h" +#include "radiostation.h" + +// Constants +const char* REGEX_SHOW_FAVORITES = "true"; +const char* REGEX_SHOW_ALL = ".+"; + +/*! + * + */ +RadioStationsView::RadioStationsView() : + RadioViewBase( false ), + mModel( 0 ), + mScanStationsAction( 0 ), + mClearListAction( 0 ), + mStationsList( 0 ), + mFavoritesButton( 0 ), + mLocalStationsButton( 0 ), + mSelectedStation( new RadioStation ), + mCurrentQuestion( NoQuestion ) +{ +} + +/*! + * + */ +RadioStationsView::~RadioStationsView() +{ +} + +/*! + * + */ +void RadioStationsView::setNowPlayingIcon( const HbIcon& nowPlayingIcon ) +{ + mNowPlayingIcon = nowPlayingIcon; +} + +/*! + * + */ +HbIcon RadioStationsView::nowPlayingIcon() const +{ + return mNowPlayingIcon; +} + +/*! + * + */ +void RadioStationsView::setFavoriteIcon( const HbIcon& favoriteIcon ) +{ + mFavoriteIcon = favoriteIcon; +} + +/*! + * + */ +HbIcon RadioStationsView::favoriteIcon() const +{ + return mFavoriteIcon; +} + +/*! + * Private slot + * + */ +void RadioStationsView::handleClick( const QModelIndex& index ) +{ + LOG_TIMESTAMP( "Channel change started" ); + QModelIndex sourceIndex = mFilterModel->mapToSource( index ); + *mSelectedStation = mModel->stationAt( sourceIndex.row() ); + mUiEngine->setFrequency( mSelectedStation->frequency(), TuneReason::StationsList ); +} + +/*! + * Private slot + * + */ +void RadioStationsView::handleLongPress( HbAbstractViewItem* item, const QPointF& coords ) +{ + Q_UNUSED( item ); + + HbMenu* menu = mUiLoader->findObject( DOCML::NAME_CONTEXT_MENU ); + + *mSelectedStation = mFilterModel->data( item->modelIndex(), RadioRole::RadioStationRole ).value(); + + HbAction* favoriteAction = mUiLoader->findObject( DOCML::NAME_CONTEXT_FAVORITE ); + + if ( mSelectedStation->isFavorite() ) { + favoriteAction->setText( hbTrId( "txt_rad_menu_remove_favourite" ) ); + } else { + favoriteAction->setText( hbTrId( "txt_rad_menu_add_to_favourites" ) ); + } + + HbAction* playAction = mUiLoader->findObject( DOCML::SV_NAME_PLAY_ACTION ); + + if ( mSelectedStation->frequency() == mUiEngine->currentFrequency() ) { + playAction->setVisible( false ); + } else { + playAction->setVisible( true ); + } + + menu->setPreferredPos( QPointF( size().width() / 2 - menu->size().width() / 2, coords.y() - menu->size().height() / 2 ) ); + menu->show(); +} + +/*! + * Private slot + * + */ +void RadioStationsView::updateAntennaStatus( bool connected ) +{ + Q_UNUSED( connected ); + updateVisibilities(); +} + +/*! + * Private slot + * + */ +void RadioStationsView::updateViewMode() +{ + QString section = DOCML::SV_SECTION_SHOW_ALL_STATIONS; + QString filter = REGEX_SHOW_ALL; + + if ( sender() == mFavoritesButton ) { + section = DOCML::SV_SECTION_SHOW_FAVORITES; + filter = REGEX_SHOW_FAVORITES; + } + + loadSection( DOCML::FILE_STATIONSVIEW, section ); + mFilterModel->setFilterRegExp( filter ); + + updateVisibilities(); +} + +/*! + * Private slot + * + */ +void RadioStationsView::startScanning() +{ + const int rowCount = mUiEngine->stationModel().rowCount(); + mCurrentQuestion = StartScanning; + if ( rowCount > 0 ) { + askQuestion( hbTrId( "txt_rad_info_all_stations_in_stations_list_will_be" ) ); + } else { + userAccepted(); + } +} + +/*! + * Private slot + * + */ +void RadioStationsView::finishScanning() +{ + updateVisibilities(); + mFrequencyScanner.take(); +} + +/*! + * Private slot + * + */ +void RadioStationsView::updateVisibilities() +{ + LOG_SLOT_CALLER; + bool listEmpty = mModel->rowCount() == 0; + const bool localStationsMode = !mFavoritesButton->isChecked(); + + if ( !localStationsMode ) { + listEmpty = mModel->favoriteCount() == 0; + } + + mClearListAction->setEnabled( !listEmpty ); + + const bool scanAvailable = mUiEngine->isAntennaAttached() && localStationsMode; + mScanStationsAction->setEnabled( scanAvailable ); + HbPushButton* scanButton = mUiLoader->findWidget( DOCML::SV_NAME_SCAN_BUTTON ); + scanButton->setEnabled( scanAvailable ); + + loadSection( DOCML::FILE_STATIONSVIEW, listEmpty ? DOCML::SV_SECTION_SHOW_SCAN_TEXT : DOCML::SV_SECTION_HIDE_SCAN_TEXT ); +} + +/*! + * Private slot + * + */ +void RadioStationsView::clearList() +{ + const bool favoriteMode = mFavoritesButton->isChecked(); + mCurrentQuestion = ClearList; + askQuestion( hbTrId( favoriteMode ? "txt_rad_info_clear_favourite_stations_list" + : "txt_rad_info_clear_all_stations_list" ) ); +} + +/*! + * Private slot + * + */ +void RadioStationsView::play() +{ + LOG("Play from context menu"); + mUiEngine->setFrequency( mSelectedStation->frequency(), TuneReason::StationsList ); +} + +/*! + * Private slot + * + */ +void RadioStationsView::rename() +{ + HbInputDialog* nameQuery = new HbInputDialog(); + nameQuery->setAttribute( Qt::WA_DeleteOnClose, true ); + nameQuery->setDismissPolicy( HbDialog::TapOutside ); + nameQuery->setPromptText( hbTrId( "txt_rad_dialog_new_name" ) ); + nameQuery->setInputMode( HbInputDialog::TextInput ); + nameQuery->setValue( mSelectedStation->name() ); + nameQuery->setObjectName( DOCML::NAME_INPUT_QUERY ); + nameQuery->open( this, SLOT(renameDone(HbAction*)) ); +} + +/*! + * Private slot + * + */ +void RadioStationsView::toggleFavorite() +{ + mModel->setFavoriteByPreset( mSelectedStation->presetIndex(), !mSelectedStation->isFavorite() ); +} + +/*! + * Private slot + * + */ +void RadioStationsView::deleteStation() +{ + mCurrentQuestion = DeleteStation; + askQuestion( hbTrId( "txt_rad_info_delete_station" ) ); +} + +/*! + * Private slot + * + */ +void RadioStationsView::renameDone( HbAction* action ) +{ + HbInputDialog* dlg = static_cast( sender() ); + + if( action ) { + mModel->renameStation( mSelectedStation->presetIndex(), dlg->value().toString() ); + } +} + +/*! + * From RadioViewBase + * + */ +void RadioStationsView::init() +{ + LOG_METHOD; + mModel = &mUiEngine->stationModel(); + + mFilterModel = new QSortFilterProxyModel( this ); + mFilterModel->setDynamicSortFilter( true ); + mFilterModel->setFilterRole( RadioRole::IsFavoriteRole ); + mFilterModel->setSourceModel( &mUiEngine->stationModel() ); + + loadSection( DOCML::FILE_STATIONSVIEW, DOCML::SV_SECTION_SHOW_ALL_STATIONS ); + + if ( !mFavoriteIcon.isNull() && !mNowPlayingIcon.isNull() ) { + mModel->setIcons( mFavoriteIcon.qicon(), mNowPlayingIcon.qicon() ); + } + mModel->setDetail( RadioStationModel::ShowIcons | RadioStationModel::ShowGenre ); + + mStationsList = mUiLoader->findObject( DOCML::SV_NAME_STATIONS_LIST ); + mFavoritesButton = mUiLoader->findObject( DOCML::SV_NAME_FAVORITES_BUTTON ); + mLocalStationsButton = mUiLoader->findObject( DOCML::SV_NAME_LOCALS_BUTTON ); + + Radio::connect( mUiEngine.data(), SIGNAL(antennaStatusChanged(bool)), + this, SLOT(updateAntennaStatus(bool)) ); + Radio::connect( mModel, SIGNAL(rowsInserted(QModelIndex,int,int)), + this, SLOT(updateVisibilities()) ); + Radio::connect( mModel, SIGNAL(rowsRemoved(QModelIndex,int,int)), + this, SLOT(updateVisibilities()) ); + Radio::connect( mModel, SIGNAL(modelReset()), + this, SLOT(updateVisibilities()) ); + Radio::connect( mFavoritesButton, SIGNAL(triggered()), + this, SLOT(updateViewMode()) ); + Radio::connect( mLocalStationsButton, SIGNAL(triggered() ), + this, SLOT(updateViewMode()) ); + Radio::connect( mStationsList, SIGNAL(activated(QModelIndex)), + this, SLOT(handleClick(QModelIndex)) ); + Radio::connect( mStationsList, SIGNAL(longPressed(HbAbstractViewItem*,QPointF)), + this, SLOT(handleLongPress(HbAbstractViewItem*,QPointF)) ); + + connectCommonMenuItem( MenuItem::Exit ); + connectXmlElement( DOCML::SV_NAME_SCAN_BUTTON, SIGNAL(clicked()), + this, SLOT(startScanning()) ); + + // Context menu actions + connectXmlElement( DOCML::SV_NAME_PLAY_ACTION, SIGNAL(triggered()), + this, SLOT(play()) ); + connectXmlElement( DOCML::SV_NAME_RENAME_ACTION, SIGNAL(triggered()), + this, SLOT(rename()) ); + connectXmlElement( DOCML::SV_NAME_FAVORITE_ACTION, SIGNAL(triggered()), + this, SLOT(toggleFavorite()) ); + connectXmlElement( DOCML::SV_NAME_DELETE_ACTION, SIGNAL(triggered()), + this, SLOT(deleteStation()) ); + + // "Scan local stations" menu item + mScanStationsAction = mUiLoader->findObject( DOCML::SV_NAME_SCAN_ACTION ); + Radio::connect( mScanStationsAction, SIGNAL(triggered() ), + this, SLOT(startScanning() ) ); + + // "Remove all presets" menu item + mClearListAction = mUiLoader->findObject( DOCML::SV_NAME_CLEAR_LIST_ACTION ); + Radio::connect( mClearListAction, SIGNAL(triggered() ), + this, SLOT(clearList() ) ); + + connectCommonMenuItem( MenuItem::UseLoudspeaker ); + + initListView(); + + initBackAction(); + + updateViewMode(); +} + +/*! + * \reimp + */ +void RadioStationsView::userAccepted() +{ + if ( mCurrentQuestion == StartScanning ) { + mFrequencyScanner.reset( new RadioFrequencyScanner( *mUiEngine, this ) ); + + Radio::connect( mFrequencyScanner.data(), SIGNAL(frequencyScannerFinished()), + this, SLOT(finishScanning()) ); + + mFrequencyScanner->startScanning(); + } else if ( mCurrentQuestion == ClearList ){ + const bool favoriteMode = mFavoritesButton->isChecked(); + mModel->removeAll( favoriteMode ? RadioStationModel::RemoveFavorites : RadioStationModel::RemoveAll ); + updateVisibilities(); + } else if ( mCurrentQuestion == DeleteStation ) { + mModel->removeStation( *mSelectedStation ); + } + + mCurrentQuestion = NoQuestion; +} + +/*! + * + */ +void RadioStationsView::initListView() +{ + mStationsList->setScrollingStyle( HbListView::PanOrFlick ); + mStationsList->setModel( mFilterModel ); + mStationsList->setSelectionMode( HbListView::NoSelection ); + mStationsList->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); + //TODO: Uncomment after MCL wk28 release to improve scrolling FPS rate + //mStationsList->setItemPixmapCacheEnabled( true ); +}