homescreenapp/stateplugins/hsmenuworkerstateplugin/src/hsarrangestate.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 19 Mar 2010 09:27:44 +0200
changeset 35 f9ce957a272c
child 36 cdae8c6c3876
permissions -rw-r--r--
Revision: 201007 Kit: 201011

/*
 * 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 <QDebug>
#include <hblistwidget.h>
#include <hbdialog.h>
#include <hblabel.h>
#include <hbaction.h>
#include <hsmenuservice.h>
#include <hblistwidgetitem.h>
#include <hbinstance.h>

#include "hsarrangestate.h"
#include "hsmenuevent.h"
#include "hsmenuitemmodel.h"

/*!
 \class HsArrangeState
 \ingroup group_hsmenustateplugin
 \brief Application Library State.
 State responsible for arrange collection's entries.
 */

/*!
 Constructor
 \param parent owner
 \retval void
 */
HsArrangeState::HsArrangeState(QState *parent) :
    QState(parent), mDialog(0), mEntriesList(0), mItemModel(0)
{
    construct();
}

/*!
 Destructor
 \retval void
 */
HsArrangeState::~HsArrangeState()
{
    if (mEntriesList) {
        delete mEntriesList;
    }
    if (mDialog) {
        delete mDialog;
    }
    if (mItemModel) {
        delete mItemModel;
    }
}

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void HsArrangeState::construct()
{
    HSMENUTEST_FUNC_ENTRY("HsArrangeState::construct");
    setObjectName("homescreen.nokia.com/state/arrangestate");
    connect(this, SIGNAL(exited()),SLOT(stateExited()));
    HSMENUTEST_FUNC_EXIT("HsArrangeState::construct");
}

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void HsArrangeState::save()
{
    qDebug("HsArrangeState::save()");
    HSMENUTEST_FUNC_ENTRY("HsArrangeState::save");

    getArrangedEntriesIds();
    if (mArrangedCollIdList.count() == mCollIdList.count()) {
        for (int i(0); i < mArrangedCollIdList.count(); i++) {
            if (mArrangedCollIdList.at(i) != mCollIdList.at(i)) {
                HsMenuService::organizeCollection(
                    HsMenuService::allCollectionsId(), mArrangedCollIdList);
                break;
            }
        }
    }

    HSMENUTEST_FUNC_EXIT("HsArrangeState::save");
}

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
#ifdef COVERAGE_MEASUREMENT
#pragma CTC SKIP
#endif //COVERAGE_MEASUREMENT
void HsArrangeState::onEntry(QEvent *event)
{
    qDebug("HsArrangeState::onEntry()");
    HSMENUTEST_FUNC_ENTRY("HsArrangeState::onEntry");
    QState::onEntry(event);
    HsMenuEvent *menuEvent = static_cast<HsMenuEvent *>(event);
    QVariantMap data = menuEvent->data();

    mTopItemId = data.value(itemIdKey()).toInt();

    mItemModel = HsMenuService::getAllCollectionsModel();

    mEntriesList = new HbListWidget();
    fulfillEntriesList();

    mEntriesList->scrollTo(mTopModelIndex,
                           HbAbstractItemView::PositionAtTop);
    mEntriesList->setArrangeMode(true);

    mDialog = new HbDialog();
    mDialog->setDismissPolicy(HbPopup::NoDismiss);
    mDialog->setTimeout(HbPopup::NoTimeout);

    mDialog->setPreferredSize(
        HbInstance::instance()->allMainWindows().at(0)->size());

    HbLabel *label = new HbLabel(hbTrId("txt_applib_title_arrange"));
    mDialog->setHeadingWidget(label);
    mDialog->setContentWidget(mEntriesList);

    mDialog->setPrimaryAction(new HbAction(hbTrId("txt_common_button_ok"),
                                           mDialog));

    HbAction *result = mDialog->exec();
    mEntriesList->setArrangeMode(false);
    if (result == mDialog->primaryAction()) {
        save();
    }
    delete result;
    result = NULL;

    HSMENUTEST_FUNC_EXIT("HsArrangeState::onEntry");
}
#ifdef COVERAGE_MEASUREMENT
#pragma CTC ENDSKIP
#endif //COVERAGE_MEASUREMENT
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void HsArrangeState::stateExited()
{
    HSMENUTEST_FUNC_ENTRY("HsArrangeState::stateExited");

    mDialog->setHeadingWidget(0); //delete label
    mDialog->setContentWidget(0); //delete mEntriesList
    mEntriesList = NULL;
    delete mDialog;
    mDialog = NULL;
    delete mItemModel;
    mItemModel = NULL;

    mArrangedCollIdList.clear();
    mCollIdList.clear();

    HSMENUTEST_FUNC_EXIT("HsArrangeState::stateExited");
    qDebug("HsArrangeState::stateExited()");
}

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void HsArrangeState::fulfillEntriesList()
{
    qDebug() << "HsArrangeState::fulfillEntriesList";

    mTopModelIndex = QModelIndex();
    for (int i(0); i < mItemModel->rowCount(); i++) {
        QModelIndex idx = mItemModel->index(i);
        HbListWidgetItem *widgetItem = new HbListWidgetItem();
        int itemId = mItemModel->data(idx, CaItemModel::IdRole).toInt();
        widgetItem->setData(mItemModel->data(idx, CaItemModel::IdRole),
                            CaItemModel::IdRole);
        mCollIdList.append(itemId);
        widgetItem->setData(mItemModel->data(idx, Qt::DisplayRole),
                            Qt::DisplayRole);
        widgetItem->setData(mItemModel->data(idx, Qt::DecorationRole),
                            Qt::DecorationRole);

        mEntriesList->addItem(widgetItem);
        if (mTopItemId == itemId) {
            mEntriesList->indexCount();
            mEntriesList->setCurrentItem(widgetItem);
            mTopModelIndex = mEntriesList->currentIndex();
        }
    }
}

// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
//
void HsArrangeState::getArrangedEntriesIds()
{
    for (int i(0); i < mEntriesList->count(); i++) {
        HbListWidgetItem *widgetItem = mEntriesList->item(i);
        QVariant entryId = widgetItem->data(CaItemModel::IdRole);
        mArrangedCollIdList.append(entryId.toInt());
    }
}