radioapp/radiowidgets/src/radiostationsview.cpp
changeset 24 6df133bd92e1
child 28 075425b8d9a4
equal deleted inserted replaced
23:a2b50a479edf 24:6df133bd92e1
       
     1 /*
       
     2 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:
       
    15 *
       
    16 */
       
    17 
       
    18 // System includes
       
    19 #include <HbListView>
       
    20 #include <HbAbstractViewItem>
       
    21 #include <HbPushButton>
       
    22 #include <HbEffect>
       
    23 #include <HbAction>
       
    24 #include <HbInputDialog>
       
    25 #include <HbMenu>
       
    26 
       
    27 // User includes
       
    28 #include "radiostationsview.h"
       
    29 #include "radiologger.h"
       
    30 #include "radiowindow.h"
       
    31 #include "radiouiengine.h"
       
    32 #include "radiobannerlabel.h"
       
    33 #include "radiofrequencyscanner.h"
       
    34 #include "radiouiloader.h"
       
    35 #include "radiostationmodel.h"
       
    36 #include "radiostation.h"
       
    37 #include "radiostationfiltermodel.h"
       
    38 
       
    39 /*!
       
    40  *
       
    41  */
       
    42 RadioStationsView::RadioStationsView() :
       
    43     RadioViewBase( false ),
       
    44     mModel( 0 ),
       
    45     mFilterModel( 0 ),
       
    46     mScanStationsAction( 0 ),
       
    47     mClearListAction( 0 ),
       
    48     mStationsList( 0 ),
       
    49     mHeadingBanner( 0 ),
       
    50     mFavoritesButton( 0 ),
       
    51     mLocalStationsButton( 0 ),
       
    52     mSelectedStation( new RadioStation ),
       
    53     mCurrentQuestion( NoQuestion )
       
    54 {
       
    55 }
       
    56 
       
    57 /*!
       
    58  *
       
    59  */
       
    60 RadioStationsView::~RadioStationsView()
       
    61 {
       
    62 }
       
    63 
       
    64 /*!
       
    65  *
       
    66  */
       
    67 void RadioStationsView::setNowPlayingIcon( const HbIcon& nowPlayingIcon )
       
    68 {
       
    69     mNowPlayingIcon = nowPlayingIcon;
       
    70 }
       
    71 
       
    72 /*!
       
    73  *
       
    74  */
       
    75 HbIcon RadioStationsView::nowPlayingIcon() const
       
    76 {
       
    77     return mNowPlayingIcon;
       
    78 }
       
    79 
       
    80 /*!
       
    81  *
       
    82  */
       
    83 void RadioStationsView::setFavoriteIcon( const HbIcon& favoriteIcon )
       
    84 {
       
    85     mFavoriteIcon = favoriteIcon;
       
    86 }
       
    87 
       
    88 /*!
       
    89  *
       
    90  */
       
    91 HbIcon RadioStationsView::favoriteIcon() const
       
    92 {
       
    93     return mFavoriteIcon;
       
    94 }
       
    95 
       
    96 /*!
       
    97  * Private slot
       
    98  *
       
    99  */
       
   100 void RadioStationsView::listItemClicked( const QModelIndex& index )
       
   101 {
       
   102     LOG_TIMESTAMP( "Channel change started" );
       
   103     QModelIndex sourceIndex = mFilterModel->mapToSource( index );
       
   104     *mSelectedStation = mModel->stationAt( sourceIndex.row() );
       
   105     mMainWindow->uiEngine().tuneFrequency( mSelectedStation->frequency(), TuneReason::StationsList );
       
   106 }
       
   107 
       
   108 /*!
       
   109  * Private slot
       
   110  *
       
   111  */
       
   112 void RadioStationsView::listItemLongPressed( HbAbstractViewItem* item, const QPointF& coords )
       
   113 {
       
   114     Q_UNUSED( item );
       
   115 
       
   116     HbMenu* menu = mUiLoader->findObject<HbMenu>( DOCML::NAME_CONTEXT_MENU );
       
   117 
       
   118     *mSelectedStation = mFilterModel->data( item->modelIndex(), RadioStationModel::RadioStationRole ).value<RadioStation>();
       
   119 
       
   120     HbAction* favoriteAction = mUiLoader->findObject<HbAction>( DOCML::NAME_CONTEXT_FAVORITE );
       
   121     if ( mSelectedStation->isFavorite() ) {
       
   122         favoriteAction->setText( hbTrId( "txt_rad_menu_remove_favourite" ) );
       
   123     } else {
       
   124         favoriteAction->setText( hbTrId( "txt_rad_menu_add_to_favourites" ) );
       
   125     }
       
   126 
       
   127     menu->setPreferredPos( QPointF( size().width() / 2 - menu->size().width() / 2, coords.y() - menu->size().height() / 2 ) );
       
   128     menu->show();
       
   129 }
       
   130 
       
   131 /*!
       
   132  * Private slot
       
   133  *
       
   134  */
       
   135 void RadioStationsView::updateAntennaStatus( bool connected )
       
   136 {
       
   137     Q_UNUSED( connected );
       
   138     updateControlVisibilities();
       
   139 }
       
   140 
       
   141 /*!
       
   142  * Private slot
       
   143  *
       
   144  */
       
   145 void RadioStationsView::updateCurrentStation()
       
   146 {
       
   147     mFilterModel->invalidate();
       
   148 }
       
   149 
       
   150 /*!
       
   151  * Private slot
       
   152  *
       
   153  */
       
   154 void RadioStationsView::deckButtonPressed()
       
   155 {
       
   156     const bool showFavorites = mFavoritesButton->isChecked();
       
   157     if ( showFavorites ) {
       
   158         loadSection( DOCML::FILE_STATIONSVIEW, DOCML::SV_SECTION_SHOW_FAVORITES );
       
   159     } else {
       
   160         loadSection( DOCML::FILE_STATIONSVIEW, DOCML::SV_SECTION_SHOW_ALL_STATIONS );
       
   161     }
       
   162 
       
   163     mFilterModel->setTypeFilter( showFavorites ? RadioStation::Favorite
       
   164                                                : RadioStation::LocalStation );
       
   165 
       
   166     updateControlVisibilities();
       
   167 }
       
   168 
       
   169 /*!
       
   170  * Private slot
       
   171  *
       
   172  */
       
   173 void RadioStationsView::startScanning()
       
   174 {
       
   175     const int rowCount =  mMainWindow->uiEngine().stationModel().rowCount();
       
   176     mCurrentQuestion = StartScanning;
       
   177     if ( rowCount > 0 ) {
       
   178         askQuestion( hbTrId( "txt_rad_info_all_stations_in_stations_list_will_be" ) );
       
   179     } else {
       
   180         userAccepted();
       
   181     }
       
   182 }
       
   183 
       
   184 /*!
       
   185  * Private slot
       
   186  *
       
   187  */
       
   188 void RadioStationsView::finishScanning()
       
   189 {
       
   190     updateControlVisibilities();
       
   191     mFrequencyScanner.take();
       
   192 }
       
   193 
       
   194 /*!
       
   195  * Private slot
       
   196  *
       
   197  */
       
   198 void RadioStationsView::updateControlVisibilities()
       
   199 {
       
   200     LOG_SLOT_CALLER;
       
   201     bool listEmpty = mModel->rowCount() == 0;
       
   202     const bool localStationsMode = !mFavoritesButton->isChecked();
       
   203 
       
   204     if ( !localStationsMode ) {
       
   205         listEmpty = mModel->favoriteCount() == 0;
       
   206     }
       
   207 
       
   208     mClearListAction->setVisible( !listEmpty );
       
   209 
       
   210     const bool scanAvailable = mMainWindow->uiEngine().isAntennaAttached() && localStationsMode;
       
   211     mScanStationsAction->setVisible( scanAvailable );
       
   212     HbPushButton* scanButton = mUiLoader->findWidget<HbPushButton>( DOCML::SV_NAME_SCAN_BUTTON );
       
   213     scanButton->setEnabled( scanAvailable );
       
   214 
       
   215     loadSection( DOCML::FILE_STATIONSVIEW, listEmpty ? DOCML::SV_SECTION_SHOW_SCAN_TEXT : DOCML::SV_SECTION_HIDE_SCAN_TEXT );
       
   216 }
       
   217 
       
   218 /*!
       
   219  * Private slot
       
   220  *
       
   221  */
       
   222 void RadioStationsView::clearList()
       
   223 {
       
   224     const bool favoriteMode = mFavoritesButton->isChecked();
       
   225     mCurrentQuestion = ClearList;
       
   226     askQuestion( hbTrId( favoriteMode ? "txt_rad_info_clear_favourite_stations_list"
       
   227                                       : "txt_rad_info_clear_all_stations_list" ) );
       
   228 }
       
   229 
       
   230 /*!
       
   231  * Private slot
       
   232  *
       
   233  */
       
   234 void RadioStationsView::rename()
       
   235 {
       
   236     HbInputDialog* nameQuery = new HbInputDialog();
       
   237     nameQuery->setAttribute( Qt::WA_DeleteOnClose, true );
       
   238     nameQuery->setDismissPolicy( HbDialog::NoDismiss );
       
   239     nameQuery->setPromptText( hbTrId( "txt_rad_dialog_new_name" ) );
       
   240     nameQuery->setInputMode( HbInputDialog::TextInput );
       
   241     nameQuery->setValue( mSelectedStation->name() );
       
   242     nameQuery->setObjectName( DOCML::NAME_INPUT_QUERY );
       
   243     nameQuery->open( this, SLOT(renameDone(HbAction* )) );
       
   244 }
       
   245 
       
   246 /*!
       
   247  * Private slot
       
   248  *
       
   249  */
       
   250 void RadioStationsView::toggleFavorite()
       
   251 {
       
   252     mModel->setFavoriteByPreset( mSelectedStation->presetIndex(), !mSelectedStation->isFavorite() );
       
   253 }
       
   254 
       
   255 /*!
       
   256  * Private slot
       
   257  *
       
   258  */
       
   259 void RadioStationsView::deleteStation()
       
   260 {
       
   261     mCurrentQuestion = DeleteStation;
       
   262     askQuestion( hbTrId( "txt_rad_menu_delete_station" ) );
       
   263 }
       
   264 
       
   265 /*!
       
   266  * Private slot
       
   267  *
       
   268  */
       
   269 void RadioStationsView::renameDone( HbAction* action )
       
   270 {
       
   271     HbInputDialog* dlg = static_cast<HbInputDialog*>( sender() );
       
   272 
       
   273     if( action == dlg->primaryAction() ) {
       
   274         mModel->renameStation( mSelectedStation->presetIndex(), dlg->value().toString() );
       
   275     }
       
   276 }
       
   277 
       
   278 /*!
       
   279  * From RadioViewBase
       
   280  *
       
   281  */
       
   282 void RadioStationsView::init()
       
   283 {
       
   284     LOG_METHOD;
       
   285     mInitialized = true;
       
   286     mModel = &mMainWindow->uiEngine().stationModel();
       
   287 
       
   288     RadioUiEngine* engine = &mMainWindow->uiEngine();
       
   289 
       
   290     mFilterModel = engine->createNewFilterModel( this );
       
   291     mFilterModel->setTypeFilter( RadioStation::LocalStation );
       
   292 
       
   293     loadSection( DOCML::FILE_STATIONSVIEW, DOCML::SV_SECTION_SHOW_ALL_STATIONS );
       
   294 
       
   295     if ( !mFavoriteIcon.isNull() && !mNowPlayingIcon.isNull() ) {
       
   296         mModel->setIcons( mFavoriteIcon.qicon(), mNowPlayingIcon.qicon() );
       
   297     }
       
   298     mModel->setDetail( RadioStationModel::ShowIcons | RadioStationModel::ShowGenre );
       
   299 
       
   300     mStationsList           = mUiLoader->findObject<HbListView>( DOCML::SV_NAME_STATIONS_LIST );
       
   301     mHeadingBanner          = mUiLoader->findWidget<RadioBannerLabel>( DOCML::SV_NAME_HEADING_BANNER );
       
   302     mFavoritesButton        = mUiLoader->findObject<HbAction>( DOCML::SV_NAME_FAVORITES_BUTTON );
       
   303     mLocalStationsButton    = mUiLoader->findObject<HbAction>( DOCML::SV_NAME_LOCALS_BUTTON );
       
   304 
       
   305     connectAndTest( engine,                 SIGNAL(antennaStatusChanged(bool)),
       
   306                     this,                   SLOT(updateAntennaStatus(bool)) );
       
   307     connectAndTest( mModel,                 SIGNAL(rowsInserted(QModelIndex,int,int)),
       
   308                     this,                   SLOT(updateControlVisibilities() ) );
       
   309     connectAndTest( mModel,                 SIGNAL(rowsRemoved(QModelIndex,int,int)),
       
   310                     this,                   SLOT(updateControlVisibilities()) );
       
   311     connectAndTest( mModel,                 SIGNAL(modelReset() ),
       
   312                     this,                   SLOT(updateControlVisibilities() ) );
       
   313     connectAndTest( mFavoritesButton,       SIGNAL(triggered() ),
       
   314                     this,                   SLOT(deckButtonPressed() ) );
       
   315     connectAndTest( mLocalStationsButton,   SIGNAL(triggered() ),
       
   316                     this,                   SLOT(deckButtonPressed() ) );
       
   317 
       
   318     connectAndTest( engine, SIGNAL(tunedToFrequency(uint,int)), this, SLOT(updateCurrentStation()) );
       
   319 
       
   320     // "Scan local stations" menu item
       
   321     mScanStationsAction = mUiLoader->findObject<HbAction>( DOCML::SV_NAME_SCAN_ACTION );
       
   322     
       
   323     // "Remove all presets" menu item
       
   324     mClearListAction = mUiLoader->findObject<HbAction>( DOCML::SV_NAME_CLEAR_LIST_ACTION );
       
   325     connectAndTest( mClearListAction,   SIGNAL(triggered() ),
       
   326                     this,               SLOT(clearList() ) );
       
   327 
       
   328     connectCommonMenuItem( MenuItem::UseLoudspeaker );
       
   329 
       
   330     initListView();
       
   331     
       
   332     initBackAction();
       
   333 
       
   334     updateControlVisibilities();
       
   335 }
       
   336 
       
   337 /*!
       
   338  * \reimp
       
   339  */
       
   340 void RadioStationsView::userAccepted()
       
   341 {
       
   342     if ( mCurrentQuestion == StartScanning ) {
       
   343         mFrequencyScanner.reset( new RadioFrequencyScanner( mMainWindow->uiEngine(), this ) );
       
   344 
       
   345         connectAndTest( mFrequencyScanner.data(),   SIGNAL(frequencyScannerFinished()),
       
   346                         this,                       SLOT(finishScanning()) );
       
   347 
       
   348         mFrequencyScanner->startScanning();
       
   349     } else if ( mCurrentQuestion == ClearList ){
       
   350         const bool favoriteMode = mFavoritesButton->isChecked();
       
   351         mModel->removeAll( favoriteMode ? RadioStationModel::RemoveFavorites : RadioStationModel::RemoveAll );
       
   352         updateControlVisibilities();
       
   353     } else if ( mCurrentQuestion == DeleteStation ) {
       
   354         mModel->removeStation( mModel->currentStation() );
       
   355     }
       
   356 
       
   357     mCurrentQuestion = NoQuestion;
       
   358 }
       
   359 
       
   360 /*!
       
   361  * \reimp
       
   362  */
       
   363 void RadioStationsView::showEvent( QShowEvent* event )
       
   364 {
       
   365     RadioViewBase::showEvent( event );
       
   366 }
       
   367 
       
   368 /*!
       
   369  *
       
   370  */
       
   371 void RadioStationsView::initListView()
       
   372 {
       
   373     mStationsList->setScrollingStyle( HbListView::PanOrFlick );
       
   374     mStationsList->setModel( mFilterModel );
       
   375     mStationsList->setSelectionMode( HbListView::NoSelection );
       
   376     mStationsList->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
       
   377 }