radioapp/radiowidgets/src/radiostationsview.cpp
changeset 13 46974bebc798
child 14 63aabac4416d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/radioapp/radiowidgets/src/radiostationsview.cpp	Fri Mar 19 09:29:04 2010 +0200
@@ -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 <hblistview.h>
+#include <hbabstractviewitem.h>
+#include <hbpushbutton.h>
+#include <hbeffect.h>
+#include <hbaction.h>
+
+// User includes
+#include "radiostationsview.h"
+#include "radiologger.h"
+#include "radiomainwindow.h"
+
+#include "radiolocalization.h"
+#include "radiouiengine.h"
+#include "radiobannerlabel.h"
+#include "radiofrequencyscanner.h"
+#include "radiocontextmenu.h"
+#include "radioxmluiloader.h"
+#include "radiostationmodel.h"
+#include "radiostationfiltermodel.h"
+
+/*!
+ *
+ */
+RadioStationsView::RadioStationsView( RadioXmlUiLoader* uiLoader ) :
+    RadioViewBase( uiLoader, false ),
+    mStationsList( 0 ),
+    mHeadingBanner( 0 ),
+    mFavoritesButton( 0 ),
+    mLocalStationsButton( 0 )
+{
+}
+
+/*!
+ *
+ */
+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::listItemClicked( const QModelIndex& index )
+{
+    LOG_TIMESTAMP( "Channel change started" );
+    QModelIndex sourceIndex = mFilterModel->mapToSource( index );
+    RadioStation station = mModel->stationAt( sourceIndex.row() );
+    RADIO_ASSERT( station.isValid(), "FMRadio", "invalid RadioStation");
+    mMainWindow->uiEngine().tunePreset( station.presetIndex() );
+}
+
+/*!
+ * Private slot
+ *
+ */
+void RadioStationsView::listItemLongPressed( HbAbstractViewItem* item, const QPointF& coords )
+{
+    QModelIndex sourceIndex = mFilterModel->mapToSource( item->modelIndex() );
+    RadioStation station = mModel->stationAt( sourceIndex.row() );
+    RADIO_ASSERT( station.isValid() , "FMRadio", "invalid RadioStation");
+
+    //TODO: Remove this. This is a temporary workaround for an Orbit bug in HbMenu
+//    RadioContextMenu* menu = new RadioContextMenu( mMainWindow->uiEngine() );
+//    menu->init( station, QPointF( size().width() / 2, coords.y() ) );
+
+    RadioContextMenu* menu = mUiLoader->findObject<RadioContextMenu>( DOCML_NAME_CONTEXT_MENU );
+    menu->init( station, *mUiLoader );
+    menu->setPos( QPointF( size().width() / 2 - menu->size().width() / 2, coords.y() - menu->size().height() / 2 ) );
+    menu->exec();
+}
+
+/*!
+ * Private slot
+ *
+ */
+void RadioStationsView::updateHeadsetStatus( bool connected )
+{
+    Q_UNUSED( connected );
+    updateControlVisibilities();
+}
+
+/*!
+ * Private slot
+ *
+ */
+void RadioStationsView::updateCurrentStation()
+{
+    mFilterModel->invalidate();
+}
+
+/*!
+ * Private slot
+ *
+ */
+
+void RadioStationsView::deckButtonPressed()
+{
+    if ( sender() == mFavoritesButton ) {
+        mHeadingBanner->setPlainText( TRANSLATE( KHeadingTextFavorites ));
+    } else {
+        mHeadingBanner->setPlainText( TRANSLATE( KHeadingTextLocalStations ));
+    }
+
+    const bool showFavorites = mFavoritesButton->isChecked();
+    mFilterModel->setTypeFilter( showFavorites ? RadioStation::Favorite
+                                               : RadioStation::LocalStation );
+
+    updateControlVisibilities();
+}
+
+/*!
+ * Private slot
+ *
+ */
+void RadioStationsView::startScanAndSavePresets()
+{
+    RadioFrequencyScanner* scanner = new RadioFrequencyScanner( mMainWindow->uiEngine(), this );
+    scanner->startScanning();
+    connectAndTest( scanner,    SIGNAL(frequencyScannerFinished()),
+                    this,       SLOT(updateControlVisibilities()) );
+}
+
+/*!
+ * Private slot
+ *
+ */
+void RadioStationsView::updateControlVisibilities()
+{
+    LOG_SLOT_CALLER;
+    const bool listEmpty = mModel->rowCount() == 0;
+    const bool localStationsMode = !mFavoritesButton->isChecked();
+    if ( HbPushButton* button = mUiLoader->findWidget<HbPushButton>( DOCML_NAME_SCANBUTTON ) )
+    {
+#ifdef USE_DEBUGGING_CONTROLS
+        button->setVisible( listEmpty && localStationsMode );
+#else
+        button->setVisible( false );
+#endif
+    }
+
+    mScanStationsAction->setVisible( mMainWindow->uiEngine().isAntennaAttached()
+                                     && localStationsMode
+                                     && !mMainWindow->uiEngine().isScanning() );
+    mRemoveAllPresetsAction->setVisible( !listEmpty && localStationsMode );
+}
+
+/*!
+ * From RadioViewBase
+ *
+ */
+void RadioStationsView::init( RadioMainWindow* aMainWindow, RadioStationModel* aModel )
+{
+    LOG_METHOD;
+    mMainWindow = aMainWindow;
+    mModel = aModel;
+
+    RadioUiEngine* engine = &mMainWindow->uiEngine();
+
+    mFilterModel = engine->createNewFilterModel( this );
+    mFilterModel->setTypeFilter( RadioStation::LocalStation );
+
+    if ( !mFavoriteIcon.isNull() && !mNowPlayingIcon.isNull() ) {
+        mModel->setIcons( mFavoriteIcon.qicon(), mNowPlayingIcon.qicon() );
+    }
+    mModel->setDetail( RadioStationModel::ShowIcons | RadioStationModel::ShowGenre );
+
+    mStationsList           = mUiLoader->findObject<HbListView>( DOCML_NAME_STATIONSLIST );
+    mHeadingBanner          = mUiLoader->findWidget<RadioBannerLabel>( DOCML_NAME_HEADINGBANNER );
+    mFavoritesButton        = mUiLoader->findObject<HbAction>( DOCML_NAME_FAVORITESBUTTON );
+    mLocalStationsButton    = mUiLoader->findObject<HbAction>( DOCML_NAME_LOCALSBUTTON );
+
+    connectAndTest( engine,                 SIGNAL(headsetStatusChanged(bool)),
+                    this,                   SLOT(updateHeadsetStatus(bool)) );
+    connectAndTest( mModel,                 SIGNAL(rowsInserted(QModelIndex,int,int)),
+                    this,                   SLOT(updateControlVisibilities() ) );
+    connectAndTest( mModel,                 SIGNAL(rowsRemoved(QModelIndex,int,int)),
+                    this,                   SLOT(updateControlVisibilities()) );
+    connectAndTest( mModel,                 SIGNAL(modelReset() ),
+                    this,                   SLOT(updateControlVisibilities() ) );
+    connectAndTest( mFavoritesButton,       SIGNAL(triggered() ),
+                    this,                   SLOT(deckButtonPressed() ) );
+    connectAndTest( mLocalStationsButton,   SIGNAL(triggered() ),
+                    this,                   SLOT(deckButtonPressed() ) );
+
+    connectAndTest( engine, SIGNAL(tunedToFrequency(uint,int)), this, SLOT(updateCurrentStation()) );
+
+    // "Go to tuning view" menu item
+    connectViewChangeMenuItem( DOCML_NAME_TUNINGVIEWACTION, SLOT(activateTuningView()) );
+
+    // "Go to wizard view" menu item
+#ifdef USE_DEBUGGING_CONTROLS
+    connectViewChangeMenuItem( DOCML_NAME_WIZARDVIEWACTION, SLOT(activateWizardView()) );
+#else
+    mUiLoader->findObject<HbAction>( DOCML_NAME_WIZARDVIEWACTION )->setVisible( false );
+#endif // USE_DEBUGGING_CONTROLS
+
+    // "Scan local stations" menu item
+    mScanStationsAction = mUiLoader->findObject<HbAction>( DOCML_NAME_SCANSTATIONSACTION );
+
+    // "Remove all presets" menu item
+    mRemoveAllPresetsAction = mUiLoader->findObject<HbAction>( DOCML_NAME_REMOVESTATIONSACTION );
+
+    connectCommonMenuItem( MenuItem::UseLoudspeaker );
+
+    // Connect the "Remove all presets" menu item
+    connectXmlElement( DOCML_NAME_REMOVESTATIONSACTION, SIGNAL(triggered()), mModel, SLOT(removeAll()) );
+
+    initListView();
+}
+
+/*!
+ * \reimp
+ */
+void RadioStationsView::showEvent( QShowEvent* event )
+{
+    RadioViewBase::showEvent( event );
+    mModel->setDetail( RadioStationModel::ShowIcons | RadioStationModel::ShowGenre );
+    updateControlVisibilities();
+    updateHeading();
+}
+
+/*!
+ *
+ */
+void RadioStationsView::initListView()
+{
+    mStationsList->setScrollingStyle( HbListView::PanOrFlick );
+    mStationsList->setModel( mFilterModel );
+    mStationsList->setSelectionMode( HbListView::NoSelection );
+    mStationsList->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
+}
+
+/*!
+ *
+ */
+void RadioStationsView::updateHeading()
+{
+    mHeadingBanner->setPlainText( mFavoritesButton->isChecked() ? TRANSLATE( KHeadingTextFavorites )
+                                                                : TRANSLATE( KHeadingTextLocalStations ) );
+}