diff -r 000000000000 -r 09774dfdd46b qtinternetradio/ui/src/irabstractlistviewbase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/qtinternetradio/ui/src/irabstractlistviewbase.cpp Mon Apr 19 14:01:53 2010 +0300 @@ -0,0 +1,385 @@ +/* +* 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: +* +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "irabstractviewmanager.h" +#include "irabstractlistviewbase.h" +#include "irbannerlabel.h" +#include "irplaycontroller.h" +#include "irapplication.h" +#include "irqmetadata.h" +#include "irqisdsdatastructure.h" +#include "irqisdsclient.h" +#include "irqenums.h" +#include "iruidefines.h" + + +IrAbstractListViewBase::IrAbstractListViewBase(IRApplication *aApplication, TIRViewId aViewId) + : IRBaseView(aApplication, aViewId), + iListView(NULL), + iBannerLabel(NULL), + iHeadingLabel(NULL), + iCollectionsAction(NULL), iFavoritesAction(NULL), + iGenresAction(NULL), iSearchAction(NULL),iConvertTimer(NULL), iEffectOnGoing(false) +{ + // Create widget hierarchy + setObjectName( ABSTRACT_LIST_VIEW_BASE_OBJECT_VIEW ); + + // List existing root elements - this allows us to refer to objects in the XML + // which are created outside the document. + QObjectList roots; + roots.append( this ); // abstractlistviewbase is referred in the XML document + iLoader.setObjectTree( roots ); + + // Load the XML file + iLoader.load(ABSTRACT_LIST_VIEW_BASE_LAYOUT_FILENAME); + + iLoader.load(ABSTRACT_LIST_VIEW_BASE_LAYOUT_FILENAME, ABSTRACT_LIST_VIEW_BASE_NO_PLAYINGBANNER_SECTION); + initEffects(); + initMenu(); + initContentWidget(); + initScrollBar(); + initToolBar(); + + connect(iListView, SIGNAL(activated(const QModelIndex&)), this, SLOT(clickItem(const QModelIndex&))); + connect(iListView, SIGNAL(longPressed(HbAbstractViewItem *,const QPointF&)), this, SLOT(listViewLongPressed(HbAbstractViewItem *,const QPointF&))); + connect(iBannerLabel, SIGNAL(pressed()), this, SLOT(gotoNowPlaying())); + connect(iPlayController, SIGNAL(metaDataAvailable(IRQMetaData*)), this, SLOT(metaDataAvailable(IRQMetaData*))); + connect(iPlayController, SIGNAL(playingStopped()), this, SLOT(removeBanner())); +} + +IrAbstractListViewBase::~IrAbstractListViewBase() +{ + HbEffect::remove(QString("viewItem"), QString(":/effect/effects_item_selecte.fxml"), QString("chosen") ); + HbEffect::remove(QString("viewItem"), QString(":/effect/effects_item_select_end.fxml"),QString("chosenEnd")); +} + +void IrAbstractListViewBase::initMenu() +{ + HbMenu *viewMenu = menu(); + connect(viewMenu, SIGNAL(aboutToShow()), this, SLOT(prepareMenu())); + + iOpenWebAddressAction = qobject_cast(iLoader.findObject(ABSTRACT_LIST_VIEW_BASE_OBJECT_OPEN_WEB_ADDRESS_ACTION)); + connect(iOpenWebAddressAction, SIGNAL(triggered()), this, SLOT(openWebAddress())); + + QObject *settings = iLoader.findObject(ABSTRACT_LIST_VIEW_BASE_OBJECT_SETTING_ACTION); + connect(settings, SIGNAL(triggered()), this, SLOT(launchSettingsView())); + + QObject *helpAction = iLoader.findObject(ABSTRACT_LIST_VIEW_BASE_OBJECT_HELP_ACTION); + connect(helpAction, SIGNAL(triggered()), this, SLOT(notReady())); + + QObject *exitAction = iLoader.findObject(ABSTRACT_LIST_VIEW_BASE_OBJECT_EXIT_ACTION); + connect(exitAction, SIGNAL(triggered()), iApplication, SIGNAL(quit())); +} + +void IrAbstractListViewBase::initToolBar() +{ + HbToolBar *viewToolBar = qobject_cast(iLoader.findObject(ABSTRACT_LIST_VIEW_BASE_OBJECT_TOOLBAR)); + QActionGroup *actionGroup = new QActionGroup(viewToolBar); + iCollectionsAction = qobject_cast(iLoader.findObject(ABSTRACT_LIST_VIEW_BASE_OBJECT_COLLECTION_ACTION)); + iCollectionsAction->setActionGroup(actionGroup); + iFavoritesAction = qobject_cast(iLoader.findObject(ABSTRACT_LIST_VIEW_BASE_OBJECT_FAVORITE_ACTION)); + iFavoritesAction->setActionGroup(actionGroup); + iGenresAction = qobject_cast(iLoader.findObject(ABSTRACT_LIST_VIEW_BASE_OBJECT_GENRE_ACTION)); + iGenresAction->setActionGroup(actionGroup); + iSearchAction = qobject_cast(iLoader.findObject(ABSTRACT_LIST_VIEW_BASE_OBJECT_SEARCH_ACTION)); + iSearchAction->setActionGroup(actionGroup); + + connect(iCollectionsAction, SIGNAL(triggered()), this, SLOT(collectionsActionClicked())); + connect(iFavoritesAction, SIGNAL(triggered()), this, SLOT(favoritesActionClicked())); + connect(iSearchAction, SIGNAL(triggered()), this, SLOT(searchActionClicked())); + connect(iGenresAction, SIGNAL(triggered()), iApplication, SLOT(loadGenre())); + + setCheckedAction(); +} + +void IrAbstractListViewBase::initContentWidget() +{ + iHeadingLabel = qobject_cast(iLoader.findWidget(ABSTRACT_LIST_VIEW_BASE_OBJECT_HEADINGTEXTLABEL)); + QFont font; + font.setBold(true); + iHeadingLabel->setFont(font); + + iBannerLabel = qobject_cast(iLoader.findWidget(ABSTRACT_LIST_VIEW_BASE_OBJECT_PLAYINGBANNER)); + iBannerLabel->setFont(font); + + iListView = qobject_cast(iLoader.findObject(ABSTRACT_LIST_VIEW_BASE_OBJECT_LISTVIEW)); +} + +void IrAbstractListViewBase::initScrollBar() +{ + iListView->setScrollingStyle( HbListView::PanOrFlick ); + HbScrollBar *scrollbar = iListView->verticalScrollBar(); + scrollbar->setVisible(true); + scrollbar->setInteractive(true); + iListView->setVerticalScrollBarPolicy(HbScrollArea::ScrollBarAsNeeded); +} + +void IrAbstractListViewBase::setCheckedAction() +{ + //default implementation + QList actionList = iCollectionsAction->actionGroup()->actions(); + for (QList::const_iterator it = actionList.begin(); it != actionList.end(); ++it) + { + (*it)->setChecked(false); + } +} + +void IrAbstractListViewBase::setHeadingText(const QString &aText) +{ + if (iHeadingLabel) + { + iHeadingLabel->setText(aText); + } +} + +QString IrAbstractListViewBase::getHeadingText() const +{ + if (iHeadingLabel) + { + return iHeadingLabel->text(); + } + return (""); +} + +void IrAbstractListViewBase::resetCurrentItem() +{ + +} + +void IrAbstractListViewBase::storeCurrentItem() +{ +} + +/* + * handle the signal of one item being selected. + * Default implementation is doing nothing. + */ +void IrAbstractListViewBase::handleItemSelected() +{ +} + +/* + * we call the functin when we handle the handleitemselect. + * The return value shows wether we need to connect to the + * network, true means we connect and false means do not + */ +void IrAbstractListViewBase::itemAboutToBeSelected(bool &aNeedNetwork) +{ + aNeedNetwork = true; +} + +TIRHandleResult IrAbstractListViewBase::handleCommand(TIRViewCommand aCommand, TIRViewCommandReason aReason) +{ + Q_UNUSED(aReason); + TIRHandleResult ret = EIR_DoDefault; + + switch (aCommand) + { + case EIR_ViewCommand_ACTIVATED: + updateView(); + iBannerLabel->startAnimation(); + break; + + case EIR_ViewCommand_DEACTIVATE: + storeCurrentItem(); + iBannerLabel->stopAnimation(); + ret = EIR_NoDefault; + break; + + default: + break; + } + + return ret; +} + +/* + * When a view is shown, update the view. + */ +void IrAbstractListViewBase::updateView() +{ + if (iPlayController->isPlaying()) + { + IRQMetaData *metaData = iPlayController->getMetaData(); + if (metaData && "" != metaData->getArtistSongName().trimmed() && + "-" != metaData->getArtistSongName().trimmed()) + { + //set the banner text as song name + addBanner(metaData->getArtistSongName()); + } + else + { + //set the banner text as station name + IRQPreset *nowPlayingPreset = iPlayController->getNowPlayingPreset(); + Q_ASSERT(nowPlayingPreset); + addBanner(nowPlayingPreset->name); + } + } + else + { + removeBanner(); + } + + setCheckedAction(); +} + +void IrAbstractListViewBase::collectionsActionClicked() +{ + getViewManager()->activateView(EIRView_MainView); +} + +void IrAbstractListViewBase::favoritesActionClicked() +{ + getViewManager()->activateView(EIRView_FavoritesView); +} + +void IrAbstractListViewBase::searchActionClicked() +{ + getViewManager()->activateView(EIRView_SearchView); +} + +void IrAbstractListViewBase::openWebAddress() +{ + getViewManager()->activateView(EIRView_OpenWebAddressView); +} + +/* + * dynamically set the text of menu item or remove menu item. + * Concrete classes can override this function if needed + */ +void IrAbstractListViewBase::prepareMenu() +{ +} + +void IrAbstractListViewBase::addBanner(const QString &aText) +{ + iLoader.load(ABSTRACT_LIST_VIEW_BASE_LAYOUT_FILENAME, ABSTRACT_LIST_VIEW_BASE_WITH_PLAYINGBANNER_SECTION); + iBannerLabel->setText(aText); + iBannerLabel->setLoopCount(-1); + +} + +void IrAbstractListViewBase::launchSettingsView() +{ + getViewManager()->activateView(EIRView_SettingsView); +} + +void IrAbstractListViewBase::metaDataAvailable(IRQMetaData* aMetaData) +{ + if (!aMetaData) + { + return; + } + + const QString artistSongName = aMetaData->getArtistSongName(); + if ("" != artistSongName.trimmed() && "-" != artistSongName.trimmed()) + { + addBanner(aMetaData->getArtistSongName()); + } + else + { + //set the banner text as station name + IRQPreset *nowPlayingPreset = iPlayController->getNowPlayingPreset(); + Q_ASSERT(nowPlayingPreset); + addBanner(nowPlayingPreset->name); + } +} + +void IrAbstractListViewBase::removeBanner() +{ + if (getViewManager()->currentView() == this) + { + iBannerLabel->stopAnimation(); + iLoader.load(ABSTRACT_LIST_VIEW_BASE_LAYOUT_FILENAME, ABSTRACT_LIST_VIEW_BASE_NO_PLAYINGBANNER_SECTION); + } +} + +void IrAbstractListViewBase::notReady() +{ + popupNote(tr("Not ready"), HbMessageBox::MessageTypeInformation ); +} + +void IrAbstractListViewBase::gotoNowPlaying() +{ + Q_ASSERT(iPlayController->isPlaying()); + + getViewManager()->activateView(EIRView_PlayingView); +} + +void IrAbstractListViewBase::listViewLongPressed(HbAbstractViewItem *aItem, const QPointF &aCoords) +{ + Q_UNUSED(aItem); + Q_UNUSED(aCoords); +} + +void IrAbstractListViewBase::clickItem(const QModelIndex &aIndex) +{ + if (!iEffectOnGoing) + { + HbAbstractViewItem *listViewItem = iListView->itemByIndex(aIndex); + iEffectOnGoing = true; + iChosenIndex = aIndex; + HbEffect::start(listViewItem, "viewItem", "chosen",this, "selectEffectComplete1"); + } +} + +void IrAbstractListViewBase::initEffects() +{ + HbEffect::add(QString("viewItem"), QString(":/effect/effects_item_select.fxml"), + QString("chosen") ); + HbEffect::add(QString("viewItem"), QString(":/effect/effects_item_select_end.fxml"),QString("chosenEnd")); +} + +void IrAbstractListViewBase::selectEffectComplete1(HbEffect::EffectStatus aStatus ) +{ + Q_UNUSED(aStatus); + HbAbstractViewItem *listViewItem = iListView->itemByIndex(iChosenIndex); + HbEffect::start(listViewItem, QString("viewItem"), QString("chosenEnd"),this, "selectEffectComplete2"); +} + +void IrAbstractListViewBase::selectEffectComplete2(HbEffect::EffectStatus aStatus ) +{ + Q_UNUSED(aStatus); + iEffectOnGoing = false; + clickAfterEffects(); +} + +void IrAbstractListViewBase::clickAfterEffects() +{ + bool needNetwork; + itemAboutToBeSelected(needNetwork); + if (needNetwork) + { + setUseNetworkReason(EIR_UseNetwork_SelectItem); + if (false == iApplication->verifyNetworkConnectivity()) + { + return; + } + setUseNetworkReason(EIR_UseNetwork_NoReason); + } + + handleItemSelected(); +} +