homescreenapp/stateplugins/hsapplibrarystateplugin/src/hscollectionstate.cpp
changeset 35 f9ce957a272c
child 36 cdae8c6c3876
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hscollectionstate.cpp	Fri Mar 19 09:27:44 2010 +0200
@@ -0,0 +1,435 @@
+/*
+ * 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: Menu collection state.
+ *
+ */
+
+#include <qstatemachine.h>
+#include <hbview.h>
+#include <hbaction.h>
+#include <hbabstractviewitem.h>
+#include <hsmenueventfactory.h>
+#include <hbmenu.h>
+#include <hbinstance.h>
+#include <hbsearchpanel.h>
+
+#include "hsmenuevent.h"
+#include "hsmenuservice.h"
+#include "hsmenuitemmodel.h"
+#include "hsmenuview.h"
+#include "cadefs.h"
+#include "caentry.h"
+#include "hscollectionstate.h"
+#include "hsaddappstocollectionstate.h"
+#include "hsapp_defs.h"
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+HsCollectionState::HsCollectionState(HsMenuView &menuView, QState *parent) :
+    QState(parent),
+    mSortAttribute(LatestOnTopHsSortAttribute),
+    mCollectionsSortAttribute(CustomHsSortAttribute),
+    mCollectionId(-1), mMenuView(menuView),
+    mCollectionModel(0), mOptions(0)
+{
+    construct();
+}
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+void HsCollectionState::construct()
+{
+    HSMENUTEST_FUNC_ENTRY("HsCollectionState::construct");
+    setObjectName(this->parent()->objectName() + "/collectionstate");
+
+    //new action for backstepping
+    mSecondarySoftkeyAction = new HbAction(Hb::BackAction, this);
+    connect(this, SIGNAL(entered()),SLOT(stateEntered()));
+    connect(this, SIGNAL(exited()),SLOT(stateExited()));
+    HSMENUTEST_FUNC_EXIT("HsCollectionState::construct");
+}
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+HsCollectionState::~HsCollectionState()
+{
+    delete mCollectionModel;
+}
+
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+void HsCollectionState::onEntry(QEvent *event)
+{
+    qDebug("HsCollectionState::onEntry()");
+    HSMENUTEST_FUNC_ENTRY("HsCollectionState::onEntry");
+    QState::onEntry(event);
+
+    if (event->type() == HsMenuEvent::eventType()) {
+        HsMenuEvent *menuEvent = static_cast<HsMenuEvent *>(event);
+        QVariantMap data = menuEvent->data();
+        mCollectionId = data.value(itemIdKey()).toInt();
+        mCollectionType = data.value(entryTypeNameKey()).toString();
+    }
+
+    HSMENUTEST_FUNC_EXIT("HsCollectionState::onEntry");
+}
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+void HsCollectionState::stateEntered()
+{
+    HSMENUTEST_FUNC_ENTRY("HsCollectionState::stateEntered");
+    if (!mCollectionModel) {
+        mCollectionModel = HsMenuService::getCollectionModel(mCollectionId,
+                           mSortAttribute, mCollectionType);
+    } else {
+        if (mCollectionType == collectionDownloadedTypeName()) {
+            mCollectionModel->setFlagsOn(RemovableEntryFlag | VisibleEntryFlag);
+        } else {
+            mCollectionModel->setFlagsOn(VisibleEntryFlag);
+        }
+
+        mCollectionModel->setParentId(mCollectionId);
+        mCollectionModel->setSort(
+            LatestOnTopHsSortAttribute);
+    }
+
+    mMenuView.setModel(mCollectionModel);
+    mMenuView.scrollTo(mCollectionModel->index(0),
+                       HbAbstractItemView::PositionAtTop);
+
+    mMenuView.setLabelVisible(true);
+    mMenuView.setLabel(
+        mCollectionModel->root().data(Qt::DisplayRole).toString());
+
+
+    if (!mOptions) {
+        mOptions = new HbMenu();
+
+        EntryFlags flags =
+            mCollectionModel->root().data(CaItemModel::FlagsRole).value<
+            EntryFlags> ();
+
+        if (flags & RemovableEntryFlag) {
+            mOptions->addAction(hbTrId("txt_applib_opt_add_content"), this,
+                                SLOT(addAppsAction()));
+        }
+
+        mOptions->addAction(hbTrId("txt_applib_opt_add_to_home_screen"),
+                            this, SLOT(addCollectionShortcutToHomeScreenAction()));
+
+        if (flags & RemovableEntryFlag) {
+            mOptions->addAction(
+                hbTrId("txt_common_opt_rename_item"),
+                this,
+                SLOT(renameAction()));
+            mOptions->addAction(
+                hbTrId("txt_common_opt_delete"),
+                this,
+                SLOT(deleteAction()));
+        }
+        if (mCollectionType == collectionDownloadedTypeName()) {
+            HbMenu *sortMenu = mOptions->addMenu(
+                                   hbTrId("txt_applib_opt_sort_by"));
+            //Grouped options are exclusive by default.
+            QActionGroup *sortGroup = new QActionGroup(mOptions);
+            sortGroup->addAction(
+                sortMenu->addAction(
+                    hbTrId("txt_applib_opt_sort_by_sub_latest_on_top"),
+                    this,
+                    SLOT(latestOnTopMenuAction())));
+            sortGroup->addAction(
+                sortMenu->addAction(
+                    hbTrId("txt_applib_opt_sort_by_sub_oldest_on_top"),
+                    this,
+                    SLOT(oldestOnTopMenuAction())));
+            foreach(QAction *action, sortMenu->actions()) {
+                action->setCheckable(true);
+            }
+            static const int defaultSortingPosition = 0;
+            sortGroup->actions().at(defaultSortingPosition)->setChecked(true);
+        }
+
+        mOptions->setParent(this);
+        mMenuView.view()->setMenu(mOptions);
+    }
+
+    HbMainWindow *hbMainWindow =
+        HbInstance::instance()->allMainWindows().value(0);
+    // add BackStepping action
+
+    hbMainWindow->addSoftKeyAction(Hb::SecondarySoftKey,
+                                   mSecondarySoftkeyAction);
+    makeConnect();
+    HSMENUTEST_FUNC_EXIT("HsCollectionState::stateEntered");
+}
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+void HsCollectionState::stateExited()
+{
+    HSMENUTEST_FUNC_ENTRY("HsCollectionState::stateExited");
+    makeDisconnect();
+
+    mOptions = NULL;
+
+    mMenuView.view()->setMenu(NULL);
+    mMenuView.setLabelVisible(false);
+
+    HbMainWindow *hbW = HbInstance::instance()->allMainWindows().value(0);
+    if (hbW) {
+        //remove BackStepping action
+        hbW->removeSoftKeyAction(Hb::SecondarySoftKey,
+                                 mSecondarySoftkeyAction);
+    }
+    HSMENUTEST_FUNC_EXIT("HsCollectionState::stateExited");
+    qDebug("CollectionState::stateExited()");
+}
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+void HsCollectionState::makeConnect()
+{
+    connect(mSecondarySoftkeyAction, SIGNAL(triggered()),
+            SLOT(backSteppingAction()));
+    connect(&mMenuView, SIGNAL(activated(QModelIndex)),
+            SLOT(listItemActivated(QModelIndex)));
+    connect(&mMenuView, SIGNAL(longPressed(HbAbstractViewItem *, QPointF)),
+            SLOT(listItemLongPressed(HbAbstractViewItem *, QPointF)));
+    connect(mCollectionModel, SIGNAL(modelReset()),SLOT(updateLabel()));
+}
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+void HsCollectionState::makeDisconnect()
+{
+    disconnect(mSecondarySoftkeyAction, SIGNAL(triggered()),
+               this, SLOT(backSteppingAction()));
+
+    disconnect(mCollectionModel, SIGNAL(modelReset()),
+               this, SLOT(updateLabel()));
+
+    disconnect(&mMenuView, SIGNAL(activated(QModelIndex)),
+               this, SLOT(listItemActivated(QModelIndex)));
+
+    disconnect(&mMenuView, SIGNAL(longPressed(HbAbstractViewItem *, QPointF)),
+               this, SLOT(listItemLongPressed(HbAbstractViewItem *, QPointF)));
+}
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+void HsCollectionState::listItemActivated(const QModelIndex &index)
+{
+    HSMENUTEST_FUNC_ENTRY("HsCollectionState::listItemActivated");
+
+    const CaEntry *entry = mCollectionModel->entry(index);
+
+    if (entry->entryTypeName() == widgetTypeName()) {
+        machine()->postEvent(
+            HsMenuEventFactory::createPreviewHSWidgetEvent(
+                entry->id(), entry->entryTypeName(), entry->attribute(
+                    widgetUriAttributeName()), entry->attribute(
+                    widgetLibraryAttributeName())));
+
+        const int itemId = index.data(CaItemModel::IdRole).toInt();
+        HsMenuService::touch(itemId);
+    } else {
+        QVariant data = mCollectionModel->data(index, CaItemModel::IdRole);
+        HsMenuService::executeAction(data.toInt());
+    }
+
+    mMenuView.setSearchPanelVisible(false);
+    HSMENUTEST_FUNC_EXIT("HsCollectionState::listItemActivated");
+}
+
+/*!
+ Handles long-item-pressed event in all apps view by showing context menu
+ \param item the event pertains to
+ \param position at which context menu is shown
+ \retval void
+ */
+void HsCollectionState::listItemLongPressed(HbAbstractViewItem *item,
+        const QPointF &coords)
+{
+    Q_UNUSED(item);
+    HSMENUTEST_FUNC_ENTRY("HsCollectionState::listItemLongPressed");
+    mMenuView.setSearchPanelVisible(false);
+    int itemId = item->modelIndex().data(CaItemModel::IdRole).toInt();
+    // create context menu
+    HbMenu *menu = new HbMenu();
+
+    HbAction *addShortcutAction = menu->addAction(hbTrId(
+                                      "txt_applib_menu_add_to_home_screen"));
+    HbAction *addToCollection = menu->addAction(hbTrId(
+                                    "txt_applib_menu_add_to_collection"));
+    HbAction *removeAction(NULL);
+    HbAction *uninstallAction(NULL);
+    // we do not add remove option in collection download menu
+    // check conditions and hide irrelevant menu items
+    if (mCollectionType != collectionDownloadedTypeName()) {
+        removeAction = menu->addAction(
+                           hbTrId("txt_applib_menu_remove_from_collection"));
+    }
+
+    EntryFlags flags = item->modelIndex().data(CaItemModel::FlagsRole).value<
+                       EntryFlags> ();
+
+    if ((flags & RemovableEntryFlag)) {
+        uninstallAction = menu->addAction(hbTrId("txt_common_menu_delete"));
+    }
+
+    // choose proper action
+    if (HbAction *selectedAction = menu->exec(coords)) {
+        if (selectedAction == addShortcutAction) {
+            addElementToHomeScreen(item->modelIndex());
+        } else if (selectedAction == addToCollection) {
+            machine()->postEvent(
+                HsMenuEventFactory::createAddAppsFromCallectionViewEvent(
+                    mCollectionId, itemId, mCollectionsSortAttribute));
+        } else if (selectedAction == uninstallAction) {
+            HsMenuService::executeAction(itemId, removeActionIdentifier());
+        } else if (selectedAction == removeAction) {
+            machine()->postEvent(
+                HsMenuEventFactory::createRemoveAppFromCollectionEvent(
+                    itemId, mCollectionId));
+        }
+    }
+    delete menu;
+    HSMENUTEST_FUNC_EXIT("HsCollectionState::listItemLongPressed");
+}
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+void HsCollectionState::addAppsAction()
+{
+    // Add applications
+    machine()->postEvent(
+        HsMenuEventFactory::createAddAppsFromCallectionViewEvent(
+            mCollectionId));
+}
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+void HsCollectionState::addCollectionShortcutToHomeScreenAction()
+{
+    machine()->postEvent(HsMenuEventFactory::createAddToHomeScreenEvent(
+                             mCollectionId));
+}
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+void HsCollectionState::renameAction()
+{
+    machine()->postEvent(HsMenuEventFactory::createRenameCollectionEvent(
+                             mCollectionId));
+}
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+void HsCollectionState::deleteAction()
+{
+    machine()->postEvent(HsMenuEventFactory::createDeleteCollectionEvent(
+                             mCollectionId));
+}
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+void HsCollectionState::backSteppingAction()
+{
+    machine()->postEvent(HsMenuEventFactory::createOpenAppLibraryEvent());
+}
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+void HsCollectionState::updateLabel()
+{
+    HSMENUTEST_FUNC_ENTRY("HsCollectionState::updateLabel");
+    if (mCollectionModel) {
+        mMenuView.setLabel(
+            mCollectionModel->root().data(Qt::DisplayRole).toString());
+    }
+    HSMENUTEST_FUNC_EXIT("HsCollectionState::updateLabel");
+}
+
+/*!
+  Triggers event so that a state adding to Home Screen is reached
+  \param index of an item to be added to homescreen
+  \retval void
+ */
+void HsCollectionState::addElementToHomeScreen(const QModelIndex &index)
+{
+    const CaEntry *entry = mCollectionModel->entry(index);
+
+    machine()->
+    postEvent(
+        HsMenuEventFactory::createAddToHomeScreenEvent(
+            entry->id(),
+            entry->entryTypeName(),
+            entry->attribute(widgetUriAttributeName()),
+            entry->attribute(widgetLibraryAttributeName())));
+}
+
+/*!
+  A Slot called when an action for sorting (latest
+  on top) is invoked for Downloaded collection.
+ */
+void HsCollectionState::latestOnTopMenuAction()
+{
+    mSortAttribute = LatestOnTopHsSortAttribute;
+    mCollectionModel->setSort(mSortAttribute);
+    emit sortOrderChanged(mSortAttribute);
+}
+
+/*!
+  A Slot called when an action for sorting (oldest
+  on top) is invoked for Downloaded collection.
+ */
+void HsCollectionState::oldestOnTopMenuAction()
+{
+    mSortAttribute = OldestOnTopHsSortAttribute;
+    mCollectionModel->setSort(mSortAttribute);
+    emit sortOrderChanged(mSortAttribute);
+}
+
+/*!
+  Slot for setting all collections sort order
+  \param sortOrder all collections sort order
+ */
+void HsCollectionState::collectionsSortOrder(
+    HsSortAttribute sortOrder)
+{
+    mCollectionsSortAttribute = sortOrder;
+}
+
+/*!
+  \fn void HsCollectionState::sortOrderChanged(SHsSortAttribute sortOrder);
+
+  This signal is emitted when sort order is changed to \a sortOrder.
+ */