diff -r 87476091b3f5 -r 1db7cc813a4e homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsaddmodeproxymodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/homescreenapp/stateplugins/hsapplibrarystateplugin/src/hsaddmodeproxymodel.cpp Fri Aug 06 13:36:36 2010 +0300 @@ -0,0 +1,188 @@ +/* + * 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: Proxy model for view in add to homescreen mode. + * + */ + +#include +#include + +#include "hscontentservice.h" +#include "hsaddmodeproxymodel.h" +#include "hsmenuitemmodel.h" +#include "hsapplibstateutils.h" + +/*! + \class HsAddModeProxyModel + \ingroup group_hsmenustateplugin + \brief Proxy Model for add to homescreen mode. + Filtering cwrt widgets to not displaing them in add mode when they are alredy present on HS. + \lib ?library + \see QSortFilterProxyModel + */ + +/*! + Constructor. + \param parent parent for object. + */ +HsAddModeProxyModel::HsAddModeProxyModel(QObject *parent) : + QSortFilterProxyModel(parent), + mCwrtWidgetCache(), + mQuery() +{ + initilizeCwrtWidgetCache(); + invalidateFilter(); + connect(HsContentService::instance(), + SIGNAL(widgetAdded(const QString &, const QVariantHash &)), + this, SLOT(updateCacheOnAddWidget(const QString&, const QVariantHash&))); + connect(HsContentService::instance(), + SIGNAL(widgetRemoved(const QString &, const QVariantHash &)), + this, SLOT(updateCacheOnRemoveWidget(const QString&, const QVariantHash&))); + // create notifier for a cwrt widgets with query created in initilizeCwrtWidgetCache + CaNotifierFilter filter(mQuery); + mNotifier.reset(CaService::instance()->createNotifier(filter)); + connect(mNotifier.data(), + SIGNAL(entryChanged(const CaEntry&, ChangeType)), + this, + SLOT(updateEntryStatus(const CaEntry&, ChangeType))); +} + +/* + Destructor. + */ +HsAddModeProxyModel::~HsAddModeProxyModel() +{ +} + +void HsAddModeProxyModel::initilizeCwrtWidgetCache() +{ + QStringList entryTypeNames; + entryTypeNames.append(applicationTypeName()); + mQuery.setEntryTypeNames(entryTypeNames); + mQuery.setAttribute(swTypeKey(), HS_CWRT_APP_TYPE); + mQuery.setAttribute(widgetUriAttributeName(), + HS_WIDGET_URI_ATTRIBUTE_CWRT_VALUE); + QList< QSharedPointer > entries = + CaService::instance()->getEntries(mQuery); + foreach (QSharedPointer entry, entries) { + QVariantHash preferences; + QMap attributes = entry->attributes(); + QMapIterator i(attributes); + while (i.hasNext()) { + i.next(); + QString key(i.key()); + QString value(i.value()); + if (key.contains(widgetParam())) { + preferences.insert(key.remove(widgetParam()),value); + } + } + int count(0); + HsContentService::instance()->widgets( + HS_WIDGET_URI_ATTRIBUTE_CWRT_VALUE,preferences,count); + mCwrtWidgetCache.insert(entry->id(), count > 0); + } + +} + +/*! + Return entryid for given Cwrt with mini view widget. + \param uri of a widget. + \param preferences widget preferences. + \retval int entry id or 0 for not cwrt with mini view widgets. + */ +int HsAddModeProxyModel::findCwrtWidgetEntryId(const QVariantHash &preferences) +{ + int result = 0; + CaQuery query; + QStringList entryTypeNames; + query.setEntryTypeNames(entryTypeNames); + query.setAttribute(swTypeKey(), HS_CWRT_APP_TYPE); + query.setAttribute(widgetUriAttributeName(), + HS_WIDGET_URI_ATTRIBUTE_CWRT_VALUE); + foreach (QString key, preferences.keys()) { + query.setAttribute(widgetParam()+key, + preferences.value(key).toString()); + } + QList< QSharedPointer > entries = + CaService::instance()->getEntries(query); + if( entries.count() > 0 ) + { + result = entries[0]->id(); + } + return result; +} + +/* + Slot called when widget is added to homescreen. + If widget is removed we checkhow many instance of this widget is left on HS. + \param uri of a widget. + \param preferences widget preferences. + */ +void HsAddModeProxyModel::updateCacheOnAddWidget(const QString &uri, + const QVariantHash &preferences){ + if (uri == HS_WIDGET_URI_ATTRIBUTE_CWRT_VALUE) { + int entryId = findCwrtWidgetEntryId(preferences); + if (!mCwrtWidgetCache.value(entryId) ) { + mCwrtWidgetCache.insert(entryId,true); + invalidateFilter(); + } + } +} + +/* + Slot called when widget is removed from homescreen. + If widget is removed we checkhow many instance of this widget is left on HS. + \param uri of a widget. + \param preferences widget preferences. +*/ +void HsAddModeProxyModel::updateCacheOnRemoveWidget(const QString &uri, + const QVariantHash &preferences) +{ + if (uri == HS_WIDGET_URI_ATTRIBUTE_CWRT_VALUE) { + int entryId = findCwrtWidgetEntryId(preferences); + if (mCwrtWidgetCache.value(entryId)) { + mCwrtWidgetCache.insert(entryId,false); + invalidateFilter(); + } + } +} + +/* + Reimplementated from QSortFilterProxyModel. + \param source_row row in source model. + \param source_parent source parent index. + */ +bool HsAddModeProxyModel::filterAcceptsRow(int source_row, + const QModelIndex &source_parent) const +{ + QVariant entryId = sourceModel()->data( + sourceModel()->index(source_row,0,source_parent), + CaItemModel::IdRole); + return !mCwrtWidgetCache.value(entryId.toInt()); +} + +/* + Update cache if some cwrt widgets were install/uninstal/update or on mmc card. + \param entry changed entry. + \param changeType the type of the change. + */ +void HsAddModeProxyModel::updateEntryStatus(const CaEntry &entry, ChangeType changeType) +{ + if (changeType == RemoveChangeType) { + mCwrtWidgetCache.remove(entry.id()); + } else { + mCwrtWidgetCache.insert(entry.id(), + HsAppLibStateUtils::isCWRTWidgetOnHomeScreen(&entry)); + } +}