--- /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 <hbmenu.h>
+#include <hbtoolbar.h>
+#include <hbaction.h>
+#include <hblistview.h>
+#include <hbabstractviewitem.h>
+#include <hbscrollbar.h>
+#include <QTimer>
+
+#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<HbAction *>(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<HbToolBar *>(iLoader.findObject(ABSTRACT_LIST_VIEW_BASE_OBJECT_TOOLBAR));
+ QActionGroup *actionGroup = new QActionGroup(viewToolBar);
+ iCollectionsAction = qobject_cast<HbAction *>(iLoader.findObject(ABSTRACT_LIST_VIEW_BASE_OBJECT_COLLECTION_ACTION));
+ iCollectionsAction->setActionGroup(actionGroup);
+ iFavoritesAction = qobject_cast<HbAction *>(iLoader.findObject(ABSTRACT_LIST_VIEW_BASE_OBJECT_FAVORITE_ACTION));
+ iFavoritesAction->setActionGroup(actionGroup);
+ iGenresAction = qobject_cast<HbAction *>(iLoader.findObject(ABSTRACT_LIST_VIEW_BASE_OBJECT_GENRE_ACTION));
+ iGenresAction->setActionGroup(actionGroup);
+ iSearchAction = qobject_cast<HbAction *>(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<IrViewBannerLabel *>(iLoader.findWidget(ABSTRACT_LIST_VIEW_BASE_OBJECT_HEADINGTEXTLABEL));
+ QFont font;
+ font.setBold(true);
+ iHeadingLabel->setFont(font);
+
+ iBannerLabel = qobject_cast<IrNowPlayingBannerLabel *>(iLoader.findWidget(ABSTRACT_LIST_VIEW_BASE_OBJECT_PLAYINGBANNER));
+ iBannerLabel->setFont(font);
+
+ iListView = qobject_cast<HbListView *>(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<QAction*> actionList = iCollectionsAction->actionGroup()->actions();
+ for (QList<QAction*>::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();
+}
+