diff -r 1a6714c53019 -r cce62ebc198e radioapp/radiowidgets/src/radiohistoryview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/radioapp/radiowidgets/src/radiohistoryview.cpp Tue Aug 31 15:15:02 2010 +0300 @@ -0,0 +1,341 @@ +/* +* 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 + +// User includes +#include "radiohistoryview.h" +#include "radiowindow.h" +#include "radiologger.h" +#include "radiouiloader.h" +#include "radiouiengine.h" +#include "radiohistorymodel.h" +#include "radiohistoryitem.h" + +// BEGIN TEMPORARY TEST CODE CODE +#include +#include "radiostationmodel.h" + +struct Song +{ + const char* mArtist; + const char* mTitle; +}; +const Song KRecognizedSongs[] = { + { "Red Hot Chili Peppers", "Under The Bridge" }, + { "Queens Of The Stone Age", "No One Knows" }, + { "The Presidents of the United States of America", "Dune Buggy" }, + { "System of a Down", "Aerials" }, + { "The White Stripes", "Seven Nation Army" }, + { "Alice In Chains", "When The Sun Rose Again" }, + { "Bullet For My Valentine", "Tears Don't Fall" } +}; +const int KSongsCount = sizeof( KRecognizedSongs ) / sizeof( KRecognizedSongs[0] ); +// END TEMPORARY TEST CODE CODE + +/*! + * + */ +RadioHistoryView::RadioHistoryView() : + RadioViewBase(), + mHistoryList( 0 ), + mAllSongsButton( 0 ), + mTaggedSongsButton( 0 ), + mSelectedItem( new RadioHistoryItem() ), + mCurrentRow( -1 ), + mSongIndex( 0 ) +{ +} + +/*! + * + */ +RadioHistoryView::~RadioHistoryView() +{ +} + +/*! + * + */ +void RadioHistoryView::setNonTaggedIcon( const HbIcon& nonTaggedIcon ) +{ + mNonTaggedIcon = nonTaggedIcon; + mNonTaggedIcon.setColor( Qt::white ); +} + +/*! + * + */ +HbIcon RadioHistoryView::nonTaggedIcon() const +{ + return mNonTaggedIcon; +} + +/*! + * + */ +void RadioHistoryView::setTaggedIcon( const HbIcon& taggedIcon ) +{ + mTaggedIcon = taggedIcon; +} + +/*! + * + */ +HbIcon RadioHistoryView::taggedIcon() const +{ + return mTaggedIcon; +} + +/*! + * Private slot + * + */ +void RadioHistoryView::updateViewMode() +{ + QString section = DOCML::HV_SECTION_HISTORY_MODE; + bool showTagged = false; + + if ( sender() == mTaggedSongsButton ) { + section = DOCML::HV_SECTION_FAVORITE_MODE; + showTagged = true; + } + + loadSection( DOCML::FILE_HISTORYVIEW, section ); + historyModel().setShowTagged( showTagged ); + + updateVisibilities(); +} + +/*! + * Private slot + * + */ +void RadioHistoryView::clearList() +{ + const bool showingTagged = mTaggedSongsButton->isChecked(); + askQuestion( hbTrId( showingTagged ? "txt_rad_info_clear_tagged_songs_list" : + "txt_rad_info_clear_recently_played_songs_list" ) ); +} + +/*! + * Private slot + * + */ +void RadioHistoryView::updateVisibilities() +{ + const int itemCount = mUiEngine->historyModel().rowCount(); + loadSection( DOCML::FILE_HISTORYVIEW, itemCount ? DOCML::HV_SECTION_SHOW_LIST : DOCML::HV_SECTION_HIDE_LIST ); +} + +/*! + * Private slot + * + */ +void RadioHistoryView::showContextMenu( const QModelIndex& index ) +{ + *mSelectedItem = historyModel().itemAtIndex( index ); + mCurrentRow = index.row(); + + HbMenu* menu = mUiLoader->findObject( DOCML::HV_NAME_CONTEXT_MENU ); + + if ( HbAction* tagAction = mUiLoader->findObject( DOCML::HV_NAME_CONTEXT_TAG ) ) { + if ( mSelectedItem->isTagged() ) { + tagAction->setText( hbTrId( "txt_rad_menu_remove_tag" ) ); + } else { + tagAction->setText( hbTrId( "txt_rad_menu_tag_song" ) ); + } + } + + if ( HbAction* searchAction = mUiLoader->findObject( DOCML::HV_NAME_CONTEXT_SEARCH ) ) { + //TODO: Add support for other music store + searchAction->setVisible( false ); + } + + HbAbstractViewItem* item = mHistoryList->itemByIndex( index ); + QPointF coords = item->pos(); + coords.setY( mHistoryList->contentWidget()->pos().y() + coords.y() ); + menu->setPreferredPos( QPointF( size().width() / 2 - menu->size().width() / 2, coords.y() + menu->size().height() / 2 ) ); + + menu->show(); +} + +/*! + * Private slot + * + */ +void RadioHistoryView::handleLongPress( HbAbstractViewItem* item ) +{ + showContextMenu( item->modelIndex() ); +} + +/*! + * Private slot + * + */ +void RadioHistoryView::toggleTagging() +{ + historyModel().toggleTagging( *mSelectedItem, mCurrentRow ); + mSelectedItem->reset(); + mCurrentRow = -1; + updateVisibilities(); +} + +/*! + * Private slot + * + */ +void RadioHistoryView::openOviStore() +{ + QString msg = "To be implemented: Open ovi store. Artist: %1, Title: %2"; + HbMessageBox::information( msg.arg( mSelectedItem->artist() ).arg( mSelectedItem->title() ) ); + mUiEngine->openMusicStore( *mSelectedItem ); +} + +/*! + * Private slot + * + */ +void RadioHistoryView::openOtherStore() +{ + mUiEngine->openMusicStore( *mSelectedItem, RadioUiEngine::OtherStore ); +} + +/*! + * Private slot + * TEMPORARY TEST CODE + */ +void RadioHistoryView::addSongs() +{ + for ( int i = 0; i < KSongsCount; ++i ) { + QTimer::singleShot( 1000 + i * 1500, this, SLOT(addOneSong()) ); + } +} + +/*! + * Private slot + * TEMPORARY TEST CODE + */ +void RadioHistoryView::addOneSong() +{ + Song song = KRecognizedSongs[mSongIndex++]; + mSongIndex %= KSongsCount; + + RadioStation station = mUiEngine->stationModel().currentStation(); + mUiEngine->historyModel().addItem( song.mArtist, song.mTitle, station ); +} + +/*! + * \reimp + * + */ +void RadioHistoryView::init() +{ + LOG_METHOD; + loadSection( DOCML::FILE_HISTORYVIEW, DOCML::SECTION_LAZY_LOAD ); + + RadioHistoryModel* historyModel = &mUiEngine->historyModel(); + historyModel->setShowDetails( mOrientation == Qt::Horizontal ); + + if ( !mNonTaggedIcon.isNull() && !mTaggedIcon.isNull() ) { + historyModel->setIcons( mNonTaggedIcon.qicon(), mTaggedIcon.qicon() ); + } + + mHistoryList = mUiLoader->findObject( DOCML::HV_NAME_HISTORY_LIST ); + mHistoryList->setScrollingStyle( HbListView::PanOrFlick ); + mHistoryList->setModel( historyModel ); + mHistoryList->setSelectionMode( HbListView::NoSelection ); + mHistoryList->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); + //TODO: Uncomment after MCL wk28 release to improve scrolling FPS rate + //mHistoryList->setItemPixmapCacheEnabled( true ); + + mAllSongsButton = mUiLoader->findObject( DOCML::HV_NAME_ALL_SONGS_BUTTON ); + mTaggedSongsButton = mUiLoader->findObject( DOCML::HV_NAME_TAGGED_SONGS_BUTTON ); + + if ( HbAction* clearListAction = mUiLoader->findObject( DOCML::HV_NAME_CLEAR_LIST_ACTION ) ) { + Radio::connect( clearListAction, SIGNAL(triggered()), + this, SLOT(clearList()) ); + } + + Radio::connect( mTaggedSongsButton, SIGNAL(triggered()), + this, SLOT(updateViewMode()) ); + Radio::connect( mAllSongsButton, SIGNAL(triggered()), + this, SLOT(updateViewMode()) ); + Radio::connect( historyModel, SIGNAL(itemAdded()), + this, SLOT(updateVisibilities()) ); + Radio::connect( mHistoryList, SIGNAL(activated(QModelIndex)), + this, SLOT(showContextMenu(QModelIndex)) ); + Radio::connect( mHistoryList, SIGNAL(longPressed(HbAbstractViewItem*,QPointF)), + this, SLOT(handleLongPress(HbAbstractViewItem*)) ); + + connectCommonMenuItem( MenuItem::Exit ); + connectCommonMenuItem( MenuItem::UseLoudspeaker ); + + // Context menu actions + connectXmlElement( DOCML::HV_NAME_TOGGLE_TAG_ACTION, SIGNAL(triggered()), + this, SLOT(toggleTagging()) ); + connectXmlElement( DOCML::HV_NAME_OVI_STORE_ACTION, SIGNAL(triggered()), + this, SLOT(openOviStore()) ); + connectXmlElement( DOCML::HV_NAME_OTHER_STORE_ACTION, SIGNAL(triggered()), + this, SLOT(openOtherStore()) ); + initBackAction(); + + updateViewMode(); + + // BEGIN TEMPORARY TEST CODE + if ( HbAction* addSongsAction = mUiLoader->findObject( "hv:add_songs_action" ) ) { + Radio::connect( addSongsAction, SIGNAL(triggered()), + this, SLOT(addSongs()) ); + } + // END TEMPORARY TEST CODE +} + +/*! + * \reimp + * + */ +void RadioHistoryView::setOrientation() +{ + if ( mUiEngine ) { + RadioHistoryModel& model = mUiEngine->historyModel(); + model.setShowDetails( mOrientation == Qt::Horizontal ); + } +} + +/*! + * \reimp + * + */ +void RadioHistoryView::userAccepted() +{ + const bool removeTagged = mTaggedSongsButton->isChecked(); + mUiEngine->historyModel().removeAll( removeTagged ); + updateVisibilities(); +} + +/*! + * + */ +RadioHistoryModel& RadioHistoryView::historyModel() const +{ + return *static_cast( mHistoryList->model() ); +}