radioapp/radiowidgets/src/radiomainview.cpp
changeset 28 075425b8d9a4
parent 19 afea38384506
child 32 189d20c34778
child 34 bc10a61bd7d3
--- a/radioapp/radiowidgets/src/radiomainview.cpp	Fri Jun 04 10:21:36 2010 +0100
+++ b/radioapp/radiowidgets/src/radiomainview.cpp	Fri Jun 11 13:38:32 2010 +0300
@@ -20,6 +20,8 @@
 #include <HbLabel>
 #include <HbPushButton>
 #include <HbAction>
+#include <HbMenu>
+#include <QApplication>
 
 // User includes
 #include "radiowindow.h"
@@ -29,7 +31,7 @@
 #include "radiologger.h"
 #include "radiostationcarousel.h"
 #include "radiouiloader.h"
-#include "radiouiutilities.h"
+#include "radioutil.h"
 #include "radiostationmodel.h"
 #include "radiofrequencyscanner.h"
 
@@ -41,7 +43,9 @@
 RadioMainView::RadioMainView() :
     RadioViewBase( false ),
     mCarousel( NULL ),
-    mFrequencyStrip( NULL )
+    mFrequencyStrip( NULL ),
+    mSkippingAction( NULL ),
+    mAlternateSkipping( false )
 {
 }
 
@@ -63,6 +67,12 @@
     } else {
         loadSection( DOCML::FILE_MAINVIEW, DOCML::MV_SECTION_NORMAL );
         mFrequencyScanner.take();
+
+        const bool firsTimeStart = mUiEngine->isFirstTimeStart();
+        const int rowCount = mUiEngine->stationModel().rowCount();
+        if ( firsTimeStart && rowCount != 0 ) {
+            mUiEngine->setFirstTimeStartPerformed( true );
+        }
     }
 }
 
@@ -73,67 +83,81 @@
 void RadioMainView::init()
 {
     LOG_METHOD;
-    mInitialized = true;
+    loadSection( DOCML::FILE_MAINVIEW, DOCML::SECTION_LAZY_LOAD );
     mCarousel = mUiLoader->findObject<RadioStationCarousel>( DOCML::MV_NAME_STATION_CAROUSEL );
-    mCarousel->init( *mUiLoader, &mMainWindow->uiEngine() );
+    mCarousel->init( *mUiLoader, mUiEngine.data() );
 
     // Note! UI connections are already made in the DocML file. Here we need to connect UI to engine
-    RadioUiEngine* engine = &mMainWindow->uiEngine();
     mFrequencyStrip = mUiLoader->findObject<RadioFrequencyStrip>( DOCML::MV_NAME_FREQUENCY_STRIP );
-    mFrequencyStrip->init( engine );
-
-    RadioStationModel* stationModel = &engine->stationModel();
+    mFrequencyStrip->init( mUiEngine.data(), *mUiLoader );
 
-    connectAndTest( mFrequencyStrip,            SIGNAL(frequencyChanged(uint,int)),
-                    this,                       SLOT(setFrequencyFromWidget(uint,int)) );
-    connectAndTest( mCarousel,                  SIGNAL(frequencyChanged(uint,int)),
-                    this,                       SLOT(setFrequencyFromWidget(uint,int)) );
-    connectAndTest( engine,                     SIGNAL(tunedToFrequency(uint,int)),
-                    this,                       SLOT(setFrequencyFromEngine(uint,int)) );
+    RadioStationModel* stationModel = &mUiEngine->stationModel();
 
-    connectAndTest( mFrequencyStrip,            SIGNAL(skipRequested(int)),
-                    this,                       SLOT(skip(int)) );
-    connectAndTest( mFrequencyStrip,            SIGNAL(seekRequested(int)),
-                    engine,                     SLOT(seekStation(int)) );
+    Radio::connect( mFrequencyStrip,            SIGNAL(frequencyChanged(uint,int,int)),
+                    this,                       SLOT(setFrequencyFromWidget(uint,int,int)) );
+    Radio::connect( mCarousel,                  SIGNAL(frequencyChanged(uint,int,int)),
+                    this,                       SLOT(setFrequencyFromWidget(uint,int,int)) );
+    Radio::connect( mUiEngine.data(),           SIGNAL(tunedToFrequency(uint,int)),
+                    this,                       SLOT(setFrequencyFromEngine(uint,int)) );
+    Radio::connect( mFrequencyStrip,            SIGNAL(manualSeekChanged(bool)),
+                    this,                       SLOT(setManualSeekMode(bool)) );
 
-    connectAndTest( stationModel,               SIGNAL(favoriteChanged(RadioStation)),
-                    mFrequencyStrip,            SLOT(updateFavorite(RadioStation)) );
+    Radio::connect( mFrequencyStrip,            SIGNAL(skipRequested(int)),
+                    this,                       SLOT(skip(int)) );
+    Radio::connect( mCarousel,                  SIGNAL(skipRequested(int)),
+                    this,                       SLOT(skip(int)) );
+    Radio::connect( mFrequencyStrip,            SIGNAL(seekRequested(int)),
+                    mUiEngine.data(),           SLOT(seekStation(int)) );
 
-    connectAndTest( engine,                     SIGNAL(seekingStarted(int)),
+    Radio::connect( mUiEngine.data(),           SIGNAL(seekingStarted(int)),
                     this,                       SLOT(seekingStarted()) );
-    connectAndTest( engine,                     SIGNAL(antennaStatusChanged(bool)),
-                    mCarousel,                  SLOT(updateAntennaStatus(bool)) );
-    connectAndTest( engine,                     SIGNAL(audioRouteChanged(bool)),
+    Radio::connect( mUiEngine.data(),           SIGNAL(antennaStatusChanged(bool)),
+                    this,                       SLOT(updateAntennaStatus(bool)) );
+    Radio::connect( mUiEngine.data(),           SIGNAL(audioRouteChanged(bool)),
                     this,                       SLOT(updateAudioRoute(bool)) );
 
-    HbPushButton* stationsButton = mUiLoader->findWidget<HbPushButton>( DOCML::MV_NAME_STATIONS_BUTTON );
-    connectAndTest( stationsButton,             SIGNAL(clicked()),
-                    mMainWindow,                SLOT(activateStationsView()) );
+    Radio::connect( stationModel,               SIGNAL(favoriteChanged(RadioStation)),
+                    this,                       SLOT(handleFavoriteChange(RadioStation)) );
+
+    connectXmlElement( DOCML::MV_NAME_STATIONS_BUTTON,  SIGNAL(clicked()),
+                       mMainWindow,                     SLOT(activateStationsView()) );
 
-    HbPushButton* scanButton = mUiLoader->findWidget<HbPushButton>( DOCML::MV_NAME_SCAN_BUTTON );
-    connectAndTest( scanButton,                 SIGNAL(clicked()),
-                    this,                       SLOT(toggleScanning()) );
+    connectXmlElement( DOCML::MV_NAME_SCAN_BUTTON,      SIGNAL(clicked()),
+                       this,                            SLOT(toggleScanning()) );
 
-    HbPushButton* loudspeakerButton = mUiLoader->findWidget<HbPushButton>( DOCML::MV_NAME_SPEAKER_BUTTON );
-    connectAndTest( loudspeakerButton,          SIGNAL(clicked()),
-                    engine,                     SLOT(toggleAudioRoute()) );
+    connectXmlElement( DOCML::MV_NAME_SPEAKER_BUTTON,   SIGNAL(clicked()),
+                       mUiEngine.data(),                SLOT(toggleAudioRoute()) );
+
+    connectCommonMenuItem( MenuItem::Exit );
 
     // "Play history" menu item
     connectViewChangeMenuItem( DOCML::MV_NAME_HISTORYVIEW_ACTION, SLOT(activateHistoryView()) );
 
-    updateAudioRoute( mMainWindow->uiEngine().isUsingLoudspeaker() );
+    //TODO: REMOVE. THIS IS TEMPORARY TEST CODE
+    toggleSkippingMode();
+    menu()->addAction( "Reset start count", this, SLOT(resetFirstTimeCount()) );
+    // END TEMPORARY TEST CODE
+
+    updateAudioRoute( mUiEngine->isUsingLoudspeaker() );
 
     // Add "back" navigation action to put the application to background
     HbAction* backAction = new HbAction( Hb::BackNaviAction, this );
-    connectAndTest( backAction,     SIGNAL(triggered()),
+#ifdef BUILD_WIN32
+    Radio::connect( backAction,     SIGNAL(triggered()),
+                    this,           SLOT(quit()) );
+#else
+    Radio::connect( backAction,     SIGNAL(triggered()),
                     mMainWindow,    SLOT(lower()) );
+#endif // BUILD_WIN32
     setNavigationAction( backAction );
 
-    const bool firsTimeStart = engine->isFirstTimeStart();
-    const int rowCount = engine->stationModel().rowCount();
+    const bool firsTimeStart = mUiEngine->isFirstTimeStart();
+    const int rowCount = mUiEngine->stationModel().rowCount();
     if ( firsTimeStart && rowCount == 0 ){
         QTimer::singleShot( 100, this, SLOT(toggleScanning()) );
     }
+
+    emit applicationReady();
 }
 
 /*!
@@ -143,6 +167,9 @@
 void RadioMainView::setOrientation()
 {
     loadSection( DOCML::FILE_MAINVIEW, mMainWindow->orientationSection() );
+    if ( mCarousel && mFrequencyStrip ) {
+        mCarousel->setFrequency( mFrequencyStrip->frequency(), TuneReason::Unspecified );
+    }
 }
 
 /*!
@@ -151,23 +178,41 @@
  */
 void RadioMainView::userAccepted()
 {
-    mFrequencyScanner.reset( new RadioFrequencyScanner( mMainWindow->uiEngine(), this ) );
+    mFrequencyScanner.reset( new RadioFrequencyScanner( *mUiEngine, this ) );
     mFrequencyScanner->startScanning();
 }
 
 /*!
+ * \reimp
+ *
+ */
+bool RadioMainView::eventFilter( QObject* watched, QEvent* event )
+{
+    if ( event->type() == QEvent::ApplicationDeactivate ) {
+        mFrequencyStrip->cancelManualSeek();
+    }
+
+    return RadioViewBase::eventFilter( watched, event );
+}
+
+/*!
  * Private slot
  */
-void RadioMainView::setFrequencyFromWidget( uint frequency, int reason )
+void RadioMainView::setFrequencyFromWidget( uint frequency, int reason, int direction )
 {
-    LOG_FORMAT( "RadioMainView::setFrequencyFromWidget: %u, reason = %d", frequency, reason );
-    if ( !RadioUiUtilities::isScannerAlive() ) {
+//    LOG_FORMAT( "RadioMainView::setFrequencyFromWidget: %u, reason = %d", frequency, reason );
+    if ( !RadioUtil::isScannerAlive() ) {
         if ( reason == TuneReason::FrequencyStrip ) {
-            mCarousel->setFrequency( frequency, reason );
-            mMainWindow->uiEngine().tuneWithDelay( frequency, reason );
+//            mCarousel->setFrequency( frequency, reason, direction );
+//            mUiEngine->tuneWithDelay( frequency, reason );
+        } else if ( reason == TuneReason::ManualSeekUpdate ) {
+            mCarousel->setFrequency( frequency, reason, RadioUtil::scrollDirection( direction ) );
+        } else if ( reason == TuneReason::ManualSeekTune ) {
+            LOG_FORMAT( "--------Manual seek tune: %u", frequency );
+            mUiEngine->setFrequency( frequency, reason );
         } else if ( reason == TuneReason::StationCarousel ) {
-            mFrequencyStrip->setFrequency( frequency, reason );
-            mMainWindow->uiEngine().tuneFrequency( frequency, reason );
+            mFrequencyStrip->setFrequency( frequency, reason, RadioUtil::scrollDirection( direction ) );
+            mUiEngine->setFrequency( frequency, reason );
         }
     }
 }
@@ -177,13 +222,14 @@
  */
 void RadioMainView::setFrequencyFromEngine( uint frequency, int reason )
 {
-    if ( !RadioUiUtilities::isScannerAlive() ) {
+    LOG_FORMAT( "RadioMainView::setFrequencyFromEngine reason: %d", reason );
+    if ( !RadioUtil::isScannerAlive() && !mFrequencyStrip->isInManualSeekMode() ) {
         mCarousel->clearInfoText();
         if ( reason != TuneReason::FrequencyStrip &&
              reason != TuneReason::StationCarousel &&
              reason != TuneReason::Skip ) {
-            mCarousel->setFrequency( frequency, reason );
-            mFrequencyStrip->setFrequency( frequency, reason );
+            mCarousel->setFrequency( frequency, reason, Scroll::Shortest );
+            mFrequencyStrip->setFrequency( frequency, reason, Scroll::Shortest );
         }
     }
 }
@@ -193,16 +239,48 @@
  */
 void RadioMainView::skip( int skipMode )
 {
-    if ( ( skipMode == StationSkip::PreviousFavorite || skipMode == StationSkip::NextFavorite ) &&
-        mMainWindow->uiEngine().stationModel().favoriteCount() == 0 ) {
-        mCarousel->setInfoText( CarouselInfoText::NoFavorites );
-    } else {
+//    if ( !mAlternateSkipping && ( skipMode == StationSkip::PreviousFavorite || skipMode == StationSkip::NextFavorite ) &&
+//        mUiEngine->stationModel().favoriteCount() == 0 ) {
+//        mCarousel->setInfoText( CarouselInfoText::NoFavorites );
+//    } else {
         const uint currentFrequency = mFrequencyStrip->frequency();
-        const uint frequency = mMainWindow->uiEngine().skipStation( static_cast<StationSkip::Mode>( skipMode ),
-                                                                    currentFrequency);
-        mCarousel->setFrequency( frequency, TuneReason::Skip );
-        mFrequencyStrip->setFrequency( frequency, TuneReason::Skip );
-    }
+        RadioStation station;
+        mUiEngine->stationModel().findFrequency( currentFrequency, station );
+
+        if ( mAlternateSkipping ) { //TODO: Remove. Temporary test code
+            if ( sender() == mFrequencyStrip ) {
+                if ( skipMode == StationSkip::NextFavorite ) {
+                    skipMode = StationSkip::Next;
+                } else if ( skipMode == StationSkip::PreviousFavorite ) {
+                    skipMode = StationSkip::Previous;
+                }
+            } else if ( sender() == mCarousel ) {
+                if ( skipMode == StationSkip::Next ) {
+                    skipMode = StationSkip::NextFavorite;
+                } else if ( skipMode == StationSkip::Previous ) {
+                    skipMode = StationSkip::PreviousFavorite;
+                }
+            }
+        }
+
+        const uint frequency = mUiEngine->skipStation( static_cast<StationSkip::Mode>( skipMode ),
+                                                                currentFrequency);
+
+        if ( currentFrequency != frequency || station.isFavorite() ) {
+            const Scroll::Direction direction = RadioUtil::scrollDirectionFromSkipMode( skipMode );
+            mCarousel->setFrequency( frequency, TuneReason::Skip, direction );
+            mFrequencyStrip->setFrequency( frequency, TuneReason::Skip, direction );
+        }
+//    }
+}
+
+/*!
+ * Private slot
+ */
+void RadioMainView::openStationsView()
+{
+    mFrequencyStrip->cancelManualSeek();
+    mMainWindow->activateStationsView();
 }
 
 /*!
@@ -210,10 +288,11 @@
  */
 void RadioMainView::toggleScanning()
 {
+    mFrequencyStrip->cancelManualSeek();
     if ( mFrequencyScanner ) {
         mFrequencyScanner->cancelScanning();
     } else {
-        const int rowCount =  mMainWindow->uiEngine().stationModel().rowCount();
+        const int rowCount =  mUiEngine->stationModel().rowCount();
         if ( rowCount > 0 ) {
             askQuestion( hbTrId( "txt_rad_info_all_stations_in_stations_list_will_be" ) );
         } else {
@@ -227,7 +306,7 @@
  */
 void RadioMainView::seekingStarted()
 {
-    if ( !RadioUiUtilities::isScannerAlive() ) {
+    if ( !RadioUtil::isScannerAlive() ) {
         mCarousel->setInfoText( CarouselInfoText::Seeking );
     }
 }
@@ -235,14 +314,83 @@
 /*!
  * Private slot
  */
+void RadioMainView::updateAntennaStatus( bool connected )
+{
+    if ( !connected ) {
+        mFrequencyStrip->cancelManualSeek();
+    }
+
+    HbPushButton* scanButton = mUiLoader->findWidget<HbPushButton>( DOCML::MV_NAME_SCAN_BUTTON );
+    scanButton->setEnabled( connected );
+    mCarousel->updateAntennaStatus( connected );
+}
+
+/*!
+ * Private slot
+ */
 void RadioMainView::updateAudioRoute( bool loudspeaker )
 {
     HbPushButton* loudspeakerButton = mUiLoader->findWidget<HbPushButton>( DOCML::MV_NAME_SPEAKER_BUTTON );
     if ( loudspeaker ) {
-        loudspeakerButton->setIcon( HbIcon( "qtg_mono_speaker_off.svg" ) );
+        loudspeakerButton->setIcon( HbIcon( "qtg_mono_speaker_off" ) );
         loudspeakerButton->setText( hbTrId( "txt_rad_button_deactivate_loudspeaker" ) );
     } else {
-        loudspeakerButton->setIcon( HbIcon( "qtg_mono_speaker.svg" ) );
+        loudspeakerButton->setIcon( HbIcon( "qtg_mono_speaker" ) );
         loudspeakerButton->setText( hbTrId( "txt_rad_button_activate_loudspeaker" ) );
     }
 }
+
+/*!
+ * Private slot
+ */
+void RadioMainView::setManualSeekMode( bool manualSeekActive )
+{
+    if ( manualSeekActive ) {
+        qApp->installEventFilter( this );
+    } else {
+        qApp->removeEventFilter( this );
+    }
+
+    mUiEngine->setManualSeekMode( manualSeekActive );
+
+    mCarousel->setManualSeekMode( manualSeekActive );
+}
+
+/*!
+ * Private slot
+ */
+void RadioMainView::handleFavoriteChange( const RadioStation& station )
+{
+    mFrequencyStrip->updateFavorite( station );
+    if ( station.isFavorite() ) {
+        RadioUtil::showDiscreetNote( "Station added to Favourites." );
+    } else {
+        RadioUtil::showDiscreetNote( "Station removed from Favourites." );
+    }
+}
+
+/*!
+ * Private slot
+ */
+void RadioMainView::toggleSkippingMode()
+{
+    if ( !mSkippingAction ) {
+        mSkippingAction = menu()->addAction( "", this, SLOT(toggleSkippingMode()) );
+    }
+
+    mAlternateSkipping = !mAlternateSkipping;
+    mCarousel->setAlternateSkippingMode( mAlternateSkipping );
+    if ( mAlternateSkipping ) {
+        mSkippingAction->setText( "Normal skipping mode" );
+    } else {
+        mSkippingAction->setText( "Alternate skipping mode" );
+    }
+}
+
+/*!
+ * Private slot
+ */
+void RadioMainView::resetFirstTimeCount()
+{
+    mUiEngine->setFirstTimeStartPerformed( false );
+}