# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1272882774 -10800 # Node ID e48454f237ca938654017e78b5080503eb18d1ec # Parent 89c329efa9800fe260f50a07eb7a8a7202722499 Revision: 201015 Kit: 201018 diff -r 89c329efa980 -r e48454f237ca bwins/ganeswidgetsu.def --- a/bwins/ganeswidgetsu.def Mon Apr 19 14:40:06 2010 +0300 +++ b/bwins/ganeswidgetsu.def Mon May 03 13:32:54 2010 +0300 @@ -59,7 +59,7 @@ ??0HgMediawall@@QAE@PAVQGraphicsItem@@@Z @ 58 NONAME ; HgMediawall::HgMediawall(class QGraphicsItem *) ?qt_metacast@HgGrid@@UAEPAXPBD@Z @ 59 NONAME ; void * HgGrid::qt_metacast(char const *) ?trUtf8@HgGrid@@SA?AVQString@@PBD0H@Z @ 60 NONAME ; class QString HgGrid::trUtf8(char const *, char const *, int) - ??0HgWidget@@IAE@PAVHbWidgetPrivate@@PAVQGraphicsItem@@@Z @ 61 NONAME ; HgWidget::HgWidget(class HbWidgetPrivate *, class QGraphicsItem *) + ??0HgWidget@@IAE@AAVHgWidgetPrivate@@PAVQGraphicsItem@@@Z @ 61 NONAME ; HgWidget::HgWidget(class HgWidgetPrivate &, class QGraphicsItem *) ?trUtf8@HgMediawall@@SA?AVQString@@PBD0H@Z @ 62 NONAME ; class QString HgMediawall::trUtf8(char const *, char const *, int) ?trUtf8@HgGrid@@SA?AVQString@@PBD0@Z @ 63 NONAME ; class QString HgGrid::trUtf8(char const *, char const *) ?tr@HgGrid@@SA?AVQString@@PBD0@Z @ 64 NONAME ; class QString HgGrid::tr(char const *, char const *) @@ -80,4 +80,18 @@ ?descriptionFontSpec@HgMediawall@@QBE?AVHbFontSpec@@XZ @ 79 NONAME ; class HbFontSpec HgMediawall::descriptionFontSpec(void) const ?setIndexFeedbackPolicy@HgWidget@@QAEXW4IndexFeedbackPolicy@1@@Z @ 80 NONAME ; void HgWidget::setIndexFeedbackPolicy(enum HgWidget::IndexFeedbackPolicy) ?indexFeedbackPolicy@HgWidget@@QBE?AW4IndexFeedbackPolicy@1@XZ @ 81 NONAME ; enum HgWidget::IndexFeedbackPolicy HgWidget::indexFeedbackPolicy(void) const + ?setDefaultImage@HgWidget@@QAEXVQImage@@@Z @ 82 NONAME ; void HgWidget::setDefaultImage(class QImage) + ??0HgWidget@@QAE@PAVQGraphicsItem@@@Z @ 83 NONAME ; HgWidget::HgWidget(class QGraphicsItem *) + ??0HgMediawall@@IAE@AAVHgMediawallPrivate@@PAVQGraphicsItem@@@Z @ 84 NONAME ; HgMediawall::HgMediawall(class HgMediawallPrivate &, class QGraphicsItem *) + ??0HgGrid@@IAE@W4Orientation@Qt@@AAVHgGridPrivate@@PAVQGraphicsItem@@@Z @ 85 NONAME ; HgGrid::HgGrid(enum Qt::Orientation, class HgGridPrivate &, class QGraphicsItem *) + ?setItemSizePolicy@HgWidget@@QAEXW4ItemSizePolicy@1@@Z @ 86 NONAME ; void HgWidget::setItemSizePolicy(enum HgWidget::ItemSizePolicy) + ?itemSizePolicy@HgWidget@@QBE?AW4ItemSizePolicy@1@XZ @ 87 NONAME ; enum HgWidget::ItemSizePolicy HgWidget::itemSizePolicy(void) const + ?setItemSize@HgWidget@@QAEXABVQSizeF@@@Z @ 88 NONAME ; void HgWidget::setItemSize(class QSizeF const &) + ?setItemSpacing@HgWidget@@QAEXABVQSizeF@@@Z @ 89 NONAME ; void HgWidget::setItemSpacing(class QSizeF const &) + ?itemSize@HgWidget@@QBE?AVQSizeF@@XZ @ 90 NONAME ; class QSizeF HgWidget::itemSize(void) const + ?itemSpacing@HgWidget@@QBE?AVQSizeF@@XZ @ 91 NONAME ; class QSizeF HgWidget::itemSpacing(void) const + ?enableReflections@HgMediawall@@QAEX_N@Z @ 92 NONAME ; void HgMediawall::enableReflections(bool) + ?frontItemPositionDelta@HgMediawall@@QBE?AVQPointF@@XZ @ 93 NONAME ; class QPointF HgMediawall::frontItemPositionDelta(void) const + ?reflectionsEnabled@HgMediawall@@QBE_NXZ @ 94 NONAME ; bool HgMediawall::reflectionsEnabled(void) const + ?setFrontItemPositionDelta@HgMediawall@@QAEXABVQPointF@@@Z @ 95 NONAME ; void HgMediawall::setFrontItemPositionDelta(class QPointF const &) diff -r 89c329efa980 -r e48454f237ca bwins/hgcacheproxymodelu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bwins/hgcacheproxymodelu.def Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,92 @@ +EXPORTS + ?headerData@HgCacheProxyModel@@UBE?AVQVariant@@HW4Orientation@Qt@@H@Z @ 1 NONAME ; class QVariant HgCacheProxyModel::headerData(int, enum Qt::Orientation, int) const + ?insertItem@HgDataProviderModel@@IAEXHU?$QPair@VQVariant@@H@@_N@Z @ 2 NONAME ; void HgDataProviderModel::insertItem(int, struct QPair, bool) + ?sortRole@HgCacheProxyModel@@QBEHXZ @ 3 NONAME ; int HgCacheProxyModel::sortRole(void) const + ?data@HgCacheProxyModel@@UBE?AVQVariant@@ABVQModelIndex@@H@Z @ 4 NONAME ; class QVariant HgCacheProxyModel::data(class QModelIndex const &, int) const + ?createIcon@HgDataProviderModel@@IAE?AVQVariant@@HVQPixmap@@@Z @ 5 NONAME ; class QVariant HgDataProviderModel::createIcon(int, class QPixmap) + ?parent@HgDataProviderModel@@UBE?AVQModelIndex@@ABV2@@Z @ 6 NONAME ; class QModelIndex HgDataProviderModel::parent(class QModelIndex const &) const + ?parent@HgCacheProxyModel@@UBE?AVQModelIndex@@ABV2@@Z @ 7 NONAME ; class QModelIndex HgCacheProxyModel::parent(class QModelIndex const &) const + ?buddy@HgCacheProxyModel@@UBE?AVQModelIndex@@ABV2@@Z @ 8 NONAME ; class QModelIndex HgCacheProxyModel::buddy(class QModelIndex const &) const + ?setDataProvider@HgCacheProxyModel@@QAEXPAVHgDataProviderModel@@HH@Z @ 9 NONAME ; void HgCacheProxyModel::setDataProvider(class HgDataProviderModel *, int, int) + ?containsRole@HgDataProviderModel@@IBE_NHH@Z @ 10 NONAME ; bool HgDataProviderModel::containsRole(int, int) const + ?itemData@HgDataProviderModel@@UBE?AV?$QMap@HVQVariant@@@@ABVQModelIndex@@@Z @ 11 NONAME ; class QMap HgDataProviderModel::itemData(class QModelIndex const &) const + ?release@HgDataProviderModel@@QAEXV?$QList@H@@_N@Z @ 12 NONAME ; void HgDataProviderModel::release(class QList, bool) + ?qt_metacast@HgDataProviderModel@@UAEPAXPBD@Z @ 13 NONAME ; void * HgDataProviderModel::qt_metacast(char const *) + ?resizeQPixmapPool@HgDataProviderModel@@QAEXH@Z @ 14 NONAME ; void HgDataProviderModel::resizeQPixmapPool(int) + ??0HgDataProviderModel@@QAE@PAVQObject@@@Z @ 15 NONAME ; HgDataProviderModel::HgDataProviderModel(class QObject *) + ?dropMimeData@HgCacheProxyModel@@UAE_NPBVQMimeData@@W4DropAction@Qt@@HHABVQModelIndex@@@Z @ 16 NONAME ; bool HgCacheProxyModel::dropMimeData(class QMimeData const *, enum Qt::DropAction, int, int, class QModelIndex const &) + ?columnCount@HgDataProviderModel@@UBEHABVQModelIndex@@@Z @ 17 NONAME ; int HgDataProviderModel::columnCount(class QModelIndex const &) const + ?columnCount@HgCacheProxyModel@@UBEHABVQModelIndex@@@Z @ 18 NONAME ; int HgCacheProxyModel::columnCount(class QModelIndex const &) const + ?tr@HgDataProviderModel@@SA?AVQString@@PBD0@Z @ 19 NONAME ; class QString HgDataProviderModel::tr(char const *, char const *) + ?update@HgDataProviderModel@@IAE_NHPAV?$QList@U?$QPair@VQVariant@@H@@@@_N@Z @ 20 NONAME ; bool HgDataProviderModel::update(int, class QList > *, bool) + ?registerObserver@HgDataProviderModel@@QAEXPAVHgDataProviderModelObserver@@@Z @ 21 NONAME ; void HgDataProviderModel::registerObserver(class HgDataProviderModelObserver *) + ??1HgCacheProxyModel@@UAE@XZ @ 22 NONAME ; HgCacheProxyModel::~HgCacheProxyModel(void) + ?doResetModel@HgDataProviderModel@@MAEXXZ @ 23 NONAME ; void HgDataProviderModel::doResetModel(void) + ?canFetchMore@HgCacheProxyModel@@UBE_NABVQModelIndex@@@Z @ 24 NONAME ; bool HgCacheProxyModel::canFetchMore(class QModelIndex const &) const + ?emitDataChanged@HgDataProviderModel@@IAEXHH_N@Z @ 25 NONAME ; void HgDataProviderModel::emitDataChanged(int, int, bool) + ?supportedDropActions@HgCacheProxyModel@@UBE?AV?$QFlags@W4DropAction@Qt@@@@XZ @ 26 NONAME ; class QFlags HgCacheProxyModel::supportedDropActions(void) const + ?staticMetaObject@HgDataProviderModel@@2UQMetaObject@@B @ 27 NONAME ; struct QMetaObject const HgDataProviderModel::staticMetaObject + ??0HgCacheProxyModel@@QAE@PAVQObject@@@Z @ 28 NONAME ; HgCacheProxyModel::HgCacheProxyModel(class QObject *) + ?updateIcon@HgDataProviderModel@@IAE_NHVQVariant@@_N@Z @ 29 NONAME ; bool HgDataProviderModel::updateIcon(int, class QVariant, bool) + ?index@HgDataProviderModel@@UBE?AVQModelIndex@@HHABV2@@Z @ 30 NONAME ; class QModelIndex HgDataProviderModel::index(int, int, class QModelIndex const &) const + ?sort@HgCacheProxyModel@@UAEXHW4SortOrder@Qt@@@Z @ 31 NONAME ; void HgCacheProxyModel::sort(int, enum Qt::SortOrder) + ?data@HgDataProviderModel@@UBE?AVQVariant@@ABVQModelIndex@@H@Z @ 32 NONAME ; class QVariant HgDataProviderModel::data(class QModelIndex const &, int) const + ?releasePixmap@HgDataProviderModel@@IAEXH@Z @ 33 NONAME ; void HgDataProviderModel::releasePixmap(int) + ?removeColumns@HgCacheProxyModel@@UAE_NHHABVQModelIndex@@@Z @ 34 NONAME ; bool HgCacheProxyModel::removeColumns(int, int, class QModelIndex const &) + ?insertRows@HgCacheProxyModel@@UAE_NHHABVQModelIndex@@@Z @ 35 NONAME ; bool HgCacheProxyModel::insertRows(int, int, class QModelIndex const &) + ?revert@HgCacheProxyModel@@UAEXXZ @ 36 NONAME ; void HgCacheProxyModel::revert(void) + ?insertItem@HgDataProviderModel@@IAEXHPAV?$QList@U?$QPair@VQVariant@@H@@@@_N@Z @ 37 NONAME ; void HgDataProviderModel::insertItem(int, class QList > *, bool) + ?setSortCaseSensitivity@HgCacheProxyModel@@QAEXW4CaseSensitivity@Qt@@@Z @ 38 NONAME ; void HgCacheProxyModel::setSortCaseSensitivity(enum Qt::CaseSensitivity) + ?itemData@HgCacheProxyModel@@UBE?AV?$QMap@HVQVariant@@@@ABVQModelIndex@@@Z @ 39 NONAME ; class QMap HgCacheProxyModel::itemData(class QModelIndex const &) const + ?dynamicSortFilter@HgCacheProxyModel@@QBE_NXZ @ 40 NONAME ; bool HgCacheProxyModel::dynamicSortFilter(void) const + ?data@HgDataProviderModel@@IBE?AVQVariant@@HH@Z @ 41 NONAME ; class QVariant HgDataProviderModel::data(int, int) const + ?rowCount@HgDataProviderModel@@UBEHABVQModelIndex@@@Z @ 42 NONAME ; int HgDataProviderModel::rowCount(class QModelIndex const &) const + ?submit@HgCacheProxyModel@@UAE_NXZ @ 43 NONAME ; bool HgCacheProxyModel::submit(void) + ?hasChildren@HgCacheProxyModel@@UBE_NABVQModelIndex@@@Z @ 44 NONAME ; bool HgCacheProxyModel::hasChildren(class QModelIndex const &) const + ?trUtf8@HgDataProviderModel@@SA?AVQString@@PBD0H@Z @ 45 NONAME ; class QString HgDataProviderModel::trUtf8(char const *, char const *, int) + ?tr@HgDataProviderModel@@SA?AVQString@@PBD0H@Z @ 46 NONAME ; class QString HgDataProviderModel::tr(char const *, char const *, int) + ?sortOrder@HgCacheProxyModel@@QBE?AW4SortOrder@Qt@@XZ @ 47 NONAME ; enum Qt::SortOrder HgCacheProxyModel::sortOrder(void) const + ?setSortLocaleAware@HgCacheProxyModel@@QAEX_N@Z @ 48 NONAME ; void HgCacheProxyModel::setSortLocaleAware(bool) + ?removeItem@HgDataProviderModel@@IAEXH@Z @ 49 NONAME ; void HgDataProviderModel::removeItem(int) + ?removeRows@HgCacheProxyModel@@UAE_NHHABVQModelIndex@@@Z @ 50 NONAME ; bool HgCacheProxyModel::removeRows(int, int, class QModelIndex const &) + ?getStaticMetaObject@HgDataProviderModel@@SAABUQMetaObject@@XZ @ 51 NONAME ; struct QMetaObject const & HgDataProviderModel::getStaticMetaObject(void) + ?clearCache@HgDataProviderModel@@IAEXXZ @ 52 NONAME ; void HgDataProviderModel::clearCache(void) + ?dataUpdated@HgCacheProxyModel@@UAEXHH@Z @ 53 NONAME ; void HgCacheProxyModel::dataUpdated(int, int) + ??1HgDataProviderModel@@UAE@XZ @ 54 NONAME ; HgDataProviderModel::~HgDataProviderModel(void) + ?isSortLocaleAware@HgCacheProxyModel@@QBE_NXZ @ 55 NONAME ; bool HgCacheProxyModel::isSortLocaleAware(void) const + ?fetchMore@HgCacheProxyModel@@UAEXABVQModelIndex@@@Z @ 56 NONAME ; void HgCacheProxyModel::fetchMore(class QModelIndex const &) + ?newItem@HgDataProviderModel@@IAEXU?$QPair@VQVariant@@H@@_N@Z @ 57 NONAME ; void HgDataProviderModel::newItem(struct QPair, bool) + ?setDynamicSortFilter@HgCacheProxyModel@@QAEX_N@Z @ 58 NONAME ; void HgCacheProxyModel::setDynamicSortFilter(bool) + ?isIndexValid@HgDataProviderModel@@IBE_NH@Z @ 59 NONAME ; bool HgDataProviderModel::isIndexValid(int) const + ?index@HgCacheProxyModel@@UBE?AVQModelIndex@@HHABV2@@Z @ 60 NONAME ; class QModelIndex HgCacheProxyModel::index(int, int, class QModelIndex const &) const + ?sortColumn@HgCacheProxyModel@@QBEHXZ @ 61 NONAME ; int HgCacheProxyModel::sortColumn(void) const + ?request@HgDataProviderModel@@QAEXV?$QList@H@@_N@Z @ 62 NONAME ; void HgDataProviderModel::request(class QList, bool) + ?removeItems@HgDataProviderModel@@IAEXHH@Z @ 63 NONAME ; void HgDataProviderModel::removeItems(int, int) + ?doInsertItem@HgDataProviderModel@@AAEXHPAV?$QList@U?$QPair@VQVariant@@H@@@@_N@Z @ 64 NONAME ; void HgDataProviderModel::doInsertItem(int, class QList > *, bool) + ?resizeCache@HgCacheProxyModel@@QAEXHH@Z @ 65 NONAME ; void HgCacheProxyModel::resizeCache(int, int) + ?count@HgDataProviderModel@@IBEHXZ @ 66 NONAME ; int HgDataProviderModel::count(void) const + ?request@HgCacheProxyModel@@UAEXHHW4HgRequestOrder@HgBufferManagerObserver@@@Z @ 67 NONAME ; void HgCacheProxyModel::request(int, int, enum HgBufferManagerObserver::HgRequestOrder) + ?mimeTypes@HgCacheProxyModel@@UBE?AVQStringList@@XZ @ 68 NONAME ; class QStringList HgCacheProxyModel::mimeTypes(void) const + ?sortCaseSensitivity@HgCacheProxyModel@@QBE?AW4CaseSensitivity@Qt@@XZ @ 69 NONAME ; enum Qt::CaseSensitivity HgCacheProxyModel::sortCaseSensitivity(void) const + ?setItemData@HgCacheProxyModel@@UAE_NABVQModelIndex@@ABV?$QMap@HVQVariant@@@@@Z @ 70 NONAME ; bool HgCacheProxyModel::setItemData(class QModelIndex const &, class QMap const &) + ?rowCount@HgCacheProxyModel@@UBEHABVQModelIndex@@@Z @ 71 NONAME ; int HgCacheProxyModel::rowCount(class QModelIndex const &) const + ?setData@HgCacheProxyModel@@UAE_NABVQModelIndex@@ABVQVariant@@H@Z @ 72 NONAME ; bool HgCacheProxyModel::setData(class QModelIndex const &, class QVariant const &, int) + ??_EHgDataProviderModel@@UAE@I@Z @ 73 NONAME ; HgDataProviderModel::~HgDataProviderModel(unsigned int) + ?mimeData@HgCacheProxyModel@@UBEPAVQMimeData@@ABV?$QList@VQModelIndex@@@@@Z @ 74 NONAME ; class QMimeData * HgCacheProxyModel::mimeData(class QList const &) const + ?newItem@HgDataProviderModel@@IAEXPAV?$QList@U?$QPair@VQVariant@@H@@@@_N@Z @ 75 NONAME ; void HgDataProviderModel::newItem(class QList > *, bool) + ?setHeaderData@HgCacheProxyModel@@UAE_NHW4Orientation@Qt@@ABVQVariant@@H@Z @ 76 NONAME ; bool HgCacheProxyModel::setHeaderData(int, enum Qt::Orientation, class QVariant const &, int) + ?update@HgDataProviderModel@@IAE_NHVQVariant@@H_N@Z @ 77 NONAME ; bool HgDataProviderModel::update(int, class QVariant, int, bool) + ?match@HgCacheProxyModel@@UBE?AV?$QList@VQModelIndex@@@@ABVQModelIndex@@HABVQVariant@@HV?$QFlags@W4MatchFlag@Qt@@@@@Z @ 78 NONAME ; class QList HgCacheProxyModel::match(class QModelIndex const &, int, class QVariant const &, int, class QFlags) const + ?release@HgCacheProxyModel@@UAEXHH@Z @ 79 NONAME ; void HgCacheProxyModel::release(int, int) + ?resetModel@HgDataProviderModel@@QAEXXZ @ 80 NONAME ; void HgDataProviderModel::resetModel(void) + ?span@HgCacheProxyModel@@UBE?AVQSize@@ABVQModelIndex@@@Z @ 81 NONAME ; class QSize HgCacheProxyModel::span(class QModelIndex const &) const + ?insertColumns@HgCacheProxyModel@@UAE_NHHABVQModelIndex@@@Z @ 82 NONAME ; bool HgCacheProxyModel::insertColumns(int, int, class QModelIndex const &) + ?metaObject@HgDataProviderModel@@UBEPBUQMetaObject@@XZ @ 83 NONAME ; struct QMetaObject const * HgDataProviderModel::metaObject(void) const + ?resetIcon@HgDataProviderModel@@IAEXH@Z @ 84 NONAME ; void HgDataProviderModel::resetIcon(int) + ?setSortRole@HgCacheProxyModel@@QAEXH@Z @ 85 NONAME ; void HgCacheProxyModel::setSortRole(int) + ?getPixmap@HgDataProviderModel@@AAEPAVQPixmap@@H@Z @ 86 NONAME ; class QPixmap * HgDataProviderModel::getPixmap(int) + ?trUtf8@HgDataProviderModel@@SA?AVQString@@PBD0@Z @ 87 NONAME ; class QString HgDataProviderModel::trUtf8(char const *, char const *) + ?flags@HgCacheProxyModel@@UBE?AV?$QFlags@W4ItemFlag@Qt@@@@ABVQModelIndex@@@Z @ 88 NONAME ; class QFlags HgCacheProxyModel::flags(class QModelIndex const &) const + ?qt_metacall@HgDataProviderModel@@UAEHW4Call@QMetaObject@@HPAPAX@Z @ 89 NONAME ; int HgDataProviderModel::qt_metacall(enum QMetaObject::Call, int, void * *) + ?DataProvider@HgCacheProxyModel@@QAEPAVHgDataProviderModel@@XZ @ 90 NONAME ; class HgDataProviderModel * HgCacheProxyModel::DataProvider(void) + diff -r 89c329efa980 -r e48454f237ca eabi/ganeswidgetsu.def --- a/eabi/ganeswidgetsu.def Mon Apr 19 14:40:06 2010 +0300 +++ b/eabi/ganeswidgetsu.def Mon May 03 13:32:54 2010 +0300 @@ -41,8 +41,8 @@ _ZN8HgWidget8setModelEP18QAbstractItemModel @ 40 NONAME _ZN8HgWidget9activatedERK11QModelIndex @ 41 NONAME _ZN8HgWidget9selectAllEv @ 42 NONAME - _ZN8HgWidgetC1EP15HbWidgetPrivateP13QGraphicsItem @ 43 NONAME - _ZN8HgWidgetC2EP15HbWidgetPrivateP13QGraphicsItem @ 44 NONAME + _ZN8HgWidgetC1ER15HgWidgetPrivateP13QGraphicsItem @ 43 NONAME + _ZN8HgWidgetC2ER15HgWidgetPrivateP13QGraphicsItem @ 44 NONAME _ZN8HgWidgetD0Ev @ 45 NONAME _ZN8HgWidgetD1Ev @ 46 NONAME _ZN8HgWidgetD2Ev @ 47 NONAME @@ -86,4 +86,21 @@ _ZNK11HgMediawall19descriptionPositionEv @ 85 NONAME _ZN8HgWidget22setIndexFeedbackPolicyENS_19IndexFeedbackPolicyE @ 86 NONAME _ZNK8HgWidget19indexFeedbackPolicyEv @ 87 NONAME + _ZN8HgWidget15setDefaultImageE6QImage @ 88 NONAME + _ZN11HgMediawallC1ER18HgMediawallPrivateP13QGraphicsItem @ 89 NONAME + _ZN11HgMediawallC2ER18HgMediawallPrivateP13QGraphicsItem @ 90 NONAME + _ZN6HgGridC1EN2Qt11OrientationER13HgGridPrivateP13QGraphicsItem @ 91 NONAME + _ZN6HgGridC2EN2Qt11OrientationER13HgGridPrivateP13QGraphicsItem @ 92 NONAME + _ZN8HgWidgetC1EP13QGraphicsItem @ 93 NONAME + _ZN8HgWidgetC2EP13QGraphicsItem @ 94 NONAME + _ZN8HgWidget11setItemSizeERK6QSizeF @ 95 NONAME + _ZN8HgWidget14setItemSpacingERK6QSizeF @ 96 NONAME + _ZN8HgWidget17setItemSizePolicyENS_14ItemSizePolicyE @ 97 NONAME + _ZNK8HgWidget11itemSpacingEv @ 98 NONAME + _ZNK8HgWidget14itemSizePolicyEv @ 99 NONAME + _ZNK8HgWidget8itemSizeEv @ 100 NONAME + _ZN11HgMediawall17enableReflectionsEb @ 101 NONAME + _ZN11HgMediawall25setFrontItemPositionDeltaERK7QPointF @ 102 NONAME + _ZNK11HgMediawall18reflectionsEnabledEv @ 103 NONAME + _ZNK11HgMediawall22frontItemPositionDeltaEv @ 104 NONAME diff -r 89c329efa980 -r e48454f237ca eabi/hgcacheproxymodelu.def --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/eabi/hgcacheproxymodelu.def Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,94 @@ +EXPORTS + _ZN17HgCacheProxyModel10insertRowsEiiRK11QModelIndex @ 1 NONAME + _ZN17HgCacheProxyModel10removeRowsEiiRK11QModelIndex @ 2 NONAME + _ZN17HgCacheProxyModel11dataUpdatedEii @ 3 NONAME + _ZN17HgCacheProxyModel11resizeCacheEii @ 4 NONAME + _ZN17HgCacheProxyModel11setItemDataERK11QModelIndexRK4QMapIi8QVariantE @ 5 NONAME + _ZN17HgCacheProxyModel11setSortRoleEi @ 6 NONAME + _ZN17HgCacheProxyModel12DataProviderEv @ 7 NONAME + _ZN17HgCacheProxyModel12dropMimeDataEPK9QMimeDataN2Qt10DropActionEiiRK11QModelIndex @ 8 NONAME + _ZN17HgCacheProxyModel13insertColumnsEiiRK11QModelIndex @ 9 NONAME + _ZN17HgCacheProxyModel13removeColumnsEiiRK11QModelIndex @ 10 NONAME + _ZN17HgCacheProxyModel13setHeaderDataEiN2Qt11OrientationERK8QVarianti @ 11 NONAME + _ZN17HgCacheProxyModel15setDataProviderEP19HgDataProviderModelii @ 12 NONAME + _ZN17HgCacheProxyModel18setSortLocaleAwareEb @ 13 NONAME + _ZN17HgCacheProxyModel20setDynamicSortFilterEb @ 14 NONAME + _ZN17HgCacheProxyModel22setSortCaseSensitivityEN2Qt15CaseSensitivityE @ 15 NONAME + _ZN17HgCacheProxyModel4sortEiN2Qt9SortOrderE @ 16 NONAME + _ZN17HgCacheProxyModel6revertEv @ 17 NONAME + _ZN17HgCacheProxyModel6submitEv @ 18 NONAME + _ZN17HgCacheProxyModel7releaseEii @ 19 NONAME + _ZN17HgCacheProxyModel7requestEiiN23HgBufferManagerObserver14HgRequestOrderE @ 20 NONAME + _ZN17HgCacheProxyModel7setDataERK11QModelIndexRK8QVarianti @ 21 NONAME + _ZN17HgCacheProxyModel9fetchMoreERK11QModelIndex @ 22 NONAME + _ZN17HgCacheProxyModelC1EP7QObject @ 23 NONAME + _ZN17HgCacheProxyModelC2EP7QObject @ 24 NONAME + _ZN17HgCacheProxyModelD0Ev @ 25 NONAME + _ZN17HgCacheProxyModelD1Ev @ 26 NONAME + _ZN17HgCacheProxyModelD2Ev @ 27 NONAME + _ZN19HgDataProviderModel10clearCacheEv @ 28 NONAME + _ZN19HgDataProviderModel10createIconEi7QPixmap @ 29 NONAME + _ZN19HgDataProviderModel10insertItemEi5QPairI8QVariantiEb @ 30 NONAME + _ZN19HgDataProviderModel10insertItemEiP5QListI5QPairI8QVariantiEEb @ 31 NONAME + _ZN19HgDataProviderModel10removeItemEi @ 32 NONAME + _ZN19HgDataProviderModel10resetModelEv @ 33 NONAME + _ZN19HgDataProviderModel10updateIconEi8QVariantb @ 34 NONAME + _ZN19HgDataProviderModel11qt_metacallEN11QMetaObject4CallEiPPv @ 35 NONAME + _ZN19HgDataProviderModel11qt_metacastEPKc @ 36 NONAME + _ZN19HgDataProviderModel11removeItemsEii @ 37 NONAME + _ZN19HgDataProviderModel12doInsertItemEiP5QListI5QPairI8QVariantiEEb @ 38 NONAME + _ZN19HgDataProviderModel13releasePixmapEi @ 39 NONAME + _ZN19HgDataProviderModel15emitDataChangedEiib @ 40 NONAME + _ZN19HgDataProviderModel16registerObserverEP27HgDataProviderModelObserver @ 41 NONAME + _ZN19HgDataProviderModel16staticMetaObjectE @ 42 NONAME DATA 16 + _ZN19HgDataProviderModel17resizeQPixmapPoolEi @ 43 NONAME + _ZN19HgDataProviderModel19getStaticMetaObjectEv @ 44 NONAME + _ZN19HgDataProviderModel6updateEi8QVariantib @ 45 NONAME + _ZN19HgDataProviderModel6updateEiP5QListI5QPairI8QVariantiEEb @ 46 NONAME + _ZN19HgDataProviderModel7newItemE5QPairI8QVariantiEb @ 47 NONAME + _ZN19HgDataProviderModel7newItemEP5QListI5QPairI8QVariantiEEb @ 48 NONAME + _ZN19HgDataProviderModel7releaseE5QListIiEb @ 49 NONAME + _ZN19HgDataProviderModel7requestE5QListIiEb @ 50 NONAME + _ZN19HgDataProviderModel9getPixmapEi @ 51 NONAME + _ZN19HgDataProviderModel9resetIconEi @ 52 NONAME + _ZN19HgDataProviderModelC2EP7QObject @ 53 NONAME + _ZN19HgDataProviderModelD0Ev @ 54 NONAME + _ZN19HgDataProviderModelD1Ev @ 55 NONAME + _ZN19HgDataProviderModelD2Ev @ 56 NONAME + _ZNK17HgCacheProxyModel10headerDataEiN2Qt11OrientationEi @ 57 NONAME + _ZNK17HgCacheProxyModel10sortColumnEv @ 58 NONAME + _ZNK17HgCacheProxyModel11columnCountERK11QModelIndex @ 59 NONAME + _ZNK17HgCacheProxyModel11hasChildrenERK11QModelIndex @ 60 NONAME + _ZNK17HgCacheProxyModel12canFetchMoreERK11QModelIndex @ 61 NONAME + _ZNK17HgCacheProxyModel17dynamicSortFilterEv @ 62 NONAME + _ZNK17HgCacheProxyModel17isSortLocaleAwareEv @ 63 NONAME + _ZNK17HgCacheProxyModel19sortCaseSensitivityEv @ 64 NONAME + _ZNK17HgCacheProxyModel20supportedDropActionsEv @ 65 NONAME + _ZNK17HgCacheProxyModel4dataERK11QModelIndexi @ 66 NONAME + _ZNK17HgCacheProxyModel4spanERK11QModelIndex @ 67 NONAME + _ZNK17HgCacheProxyModel5buddyERK11QModelIndex @ 68 NONAME + _ZNK17HgCacheProxyModel5flagsERK11QModelIndex @ 69 NONAME + _ZNK17HgCacheProxyModel5indexEiiRK11QModelIndex @ 70 NONAME + _ZNK17HgCacheProxyModel5matchERK11QModelIndexiRK8QVarianti6QFlagsIN2Qt9MatchFlagEE @ 71 NONAME + _ZNK17HgCacheProxyModel6parentERK11QModelIndex @ 72 NONAME + _ZNK17HgCacheProxyModel8itemDataERK11QModelIndex @ 73 NONAME + _ZNK17HgCacheProxyModel8mimeDataERK5QListI11QModelIndexE @ 74 NONAME + _ZNK17HgCacheProxyModel8rowCountERK11QModelIndex @ 75 NONAME + _ZNK17HgCacheProxyModel8sortRoleEv @ 76 NONAME + _ZNK17HgCacheProxyModel9mimeTypesEv @ 77 NONAME + _ZNK17HgCacheProxyModel9sortOrderEv @ 78 NONAME + _ZNK19HgDataProviderModel10metaObjectEv @ 79 NONAME + _ZNK19HgDataProviderModel11columnCountERK11QModelIndex @ 80 NONAME + _ZNK19HgDataProviderModel4dataERK11QModelIndexi @ 81 NONAME + _ZNK19HgDataProviderModel4dataEii @ 82 NONAME + _ZNK19HgDataProviderModel5countEv @ 83 NONAME + _ZNK19HgDataProviderModel5indexEiiRK11QModelIndex @ 84 NONAME + _ZNK19HgDataProviderModel6parentERK11QModelIndex @ 85 NONAME + _ZNK19HgDataProviderModel8itemDataERK11QModelIndex @ 86 NONAME + _ZNK19HgDataProviderModel8rowCountERK11QModelIndex @ 87 NONAME + _ZTI19HgDataProviderModel @ 88 NONAME + _ZTV19HgDataProviderModel @ 89 NONAME + _ZThn12_N17HgCacheProxyModel11dataUpdatedEii @ 90 NONAME + _ZThn8_N17HgCacheProxyModel7releaseEii @ 91 NONAME + _ZThn8_N17HgCacheProxyModel7requestEiiN23HgBufferManagerObserver14HgRequestOrderE @ 92 NONAME + diff -r 89c329efa980 -r e48454f237ca ganeswidgets/inc/HgContainer.h --- a/ganeswidgets/inc/HgContainer.h Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/inc/HgContainer.h Mon May 03 13:32:54 2010 +0300 @@ -79,6 +79,20 @@ void init(Qt::Orientation scrollDirection); + void setDefaultImage(QImage defaultImage); + + void setItemSizePolicy(HgWidget::ItemSizePolicy policy); + HgWidget::ItemSizePolicy itemSizePolicy() const; + + void setItemSize(const QSizeF& size); + QSizeF itemSize() const; + + void setItemSpacing(const QSizeF& size); + QSizeF itemSpacing() const; + + Qt::Orientation scrollDirection() const; + qreal scrollPosition() const; + signals: // emit this signal when scrolling. for example scrollbar can be connected to this signal. @@ -95,7 +109,6 @@ void redraw(); void updateLongPressVisualizer(); void updateByCurrentIndex(const QModelIndex ¤t); - void onScrollingEnded(); protected: // from HgMediaWallDataProvider @@ -116,13 +129,14 @@ virtual void gestureEvent(QGestureEvent *event); protected: - virtual HgMediaWallRenderer* createRenderer()=0; + virtual HgMediaWallRenderer* createRenderer(Qt::Orientation scrollDirection)=0; virtual qreal getCameraDistance(qreal springVelocity); virtual qreal getCameraRotationY(qreal springVelocity); virtual void handleTapAction(const QPointF& pos, HgWidgetItem* hitItem, int hitItemIndex); virtual void handleLongTapAction(const QPointF& pos, HgWidgetItem* hitItem, int hitItemIndex); virtual void onScrollPositionChanged(qreal pos); virtual void handleCurrentChanged(const QModelIndex ¤t); + virtual QRectF drawableRect() const; protected: @@ -139,15 +153,16 @@ void initSpringForScrollBar(); void initSpringForScrolling(); void boundSpring(); - void handlePanning(QPanGesture *gesture); - void handleTap(Qt::GestureState state, const QPointF &pos); - void handleLongTap(Qt::GestureState state, const QPointF &pos); - void handleItemAction(const QPointF &pos, ItemActionType action); + bool handlePanning(QPanGesture *gesture); + bool handleTap(Qt::GestureState state, const QPointF &pos); + bool handleLongTap(Qt::GestureState state, const QPointF &pos); + bool handleItemAction(const QPointF &pos, ItemActionType action); void selectItem(); void updateSelectedItem(); void unselectItem(); + bool hasItemAt(const QPointF& pos); HgWidgetItem* getItemAt(const QPointF& pos, int& index); void startLongPressWatcher(const QPointF& pos); void stopLongPressWatcher(); @@ -155,6 +170,10 @@ QTransform qtToVgTransform() const; QPointF mapQtToVg(const QPointF& p) const; + + virtual void updateItemSizeAndSpacing(); + virtual QSizeF getAutoItemSize() const; + virtual QSizeF getAutoItemSpacing() const; protected: // data @@ -194,7 +213,12 @@ QPointF mOffsetAtDragStart; QTime mLongTapDuration; bool mScrollBarPressed; - + + HgWidget::ItemSizePolicy mItemSizePolicy; + QSizeF mUserItemSize; + QSizeF mUserItemSpacing; + + Qt::Orientation mOrientation; }; #endif diff -r 89c329efa980 -r e48454f237ca ganeswidgets/inc/HgScrollBufferManager.h --- a/ganeswidgets/inc/HgScrollBufferManager.h Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/inc/HgScrollBufferManager.h Mon May 03 13:32:54 2010 +0300 @@ -22,6 +22,41 @@ #include #include +class UpdatePair +{ +public: + UpdatePair(int start, int count); + + int start() const; + int end() const; + + bool adjacent(int start, int count) const; + bool contains(const UpdatePair &other) const; + void extend(int start, int count); + void subtract(int start, int count); + + void shiftRight(int count); + void shiftLeft(int count); + + bool operator== (const UpdatePair &other) const; + bool operator< (const UpdatePair &other) const; + +private: + int mStart; + int mCount; +}; + +class UpdateBuffer : public QList +{ +public: + UpdateBuffer(); + + void add(int start, int count); + void remove(int start, int count); + void shiftRight(int startingFrom, int amount); + void shiftLeft(int startingFrom, int amount); +}; + class HgScrollBufferManager: public QObject { Q_OBJECT @@ -41,9 +76,11 @@ bool positionInsideBuffer(int position); - void removeItems(int start, int end, int totalCount); - void addItems(int start, int end, int totalCount); - void moveItems(int start, int end, int target, int totalCount); + void addItems(int start, int count); + void removeItems(int start, int end); + void moveItems(int start, int end, int target); + + void flushRequestBuffers(); void currentBuffer(int& bufferStart, int& bufferEnd); @@ -60,8 +97,14 @@ void init(); void asyncUpdate(); - bool isInsideBuffer(int pos); - bool isInsideBuffer(int start, int end); + + int changeBufferPosition(int newPos); + + void simpleAddItems(int start, int end); + void simpleRemoveItems(int start, int end); + + void appendRequestBuffer(int start, int end); + void appendReleaseBuffer(int start, int end); private: @@ -79,6 +122,9 @@ int mReleaseCount; QTimer mTimer; + UpdateBuffer mRequestBuffer; + UpdateBuffer mReleaseBuffer; + private: Q_DISABLE_COPY(HgScrollBufferManager) }; diff -r 89c329efa980 -r e48454f237ca ganeswidgets/inc/hgcoverflowcontainer.h --- a/ganeswidgets/inc/hgcoverflowcontainer.h Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/inc/hgcoverflowcontainer.h Mon May 03 13:32:54 2010 +0300 @@ -37,7 +37,7 @@ virtual void resizeEvent(QGraphicsSceneResizeEvent *event); // from HgContainer - virtual HgMediaWallRenderer* createRenderer(); + virtual HgMediaWallRenderer* createRenderer(Qt::Orientation scrollDirection); virtual qreal getCameraDistance(qreal springVelocity); virtual qreal getCameraRotationY(qreal springVelocity); virtual void handleTapAction(const QPointF& pos, HgWidgetItem* hitItem, int hitItemIndex); @@ -46,6 +46,11 @@ virtual void handleCurrentChanged(const QModelIndex & current); virtual void itemDataChanged(const int &firstIndex, const int &lastIndex); virtual void scrollToPosition(const QPointF& pos, bool animate); + virtual QRectF drawableRect() const; + + virtual QSizeF getAutoItemSize() const; + virtual QSizeF getAutoItemSpacing() const; + virtual void updateItemSizeAndSpacing(); void setTitlePosition(HgMediawall::LabelPosition position); HgMediawall::LabelPosition titlePosition() const; @@ -56,17 +61,33 @@ void setDescriptionFontSpec(const HbFontSpec &fontSpec); HbFontSpec descriptionFontSpec() const; + void setFrontItemPositionDelta(const QPointF& position); + QPointF frontItemPositionDelta() const; + + void enableReflections(bool enabled); + bool reflectionsEnabled() const; + +private: // From HgContainer + void setDefaultImage(QImage defaultImage); + private: + + void updateLabels(int itemIndex); + + void updatePositions(); + + void calculatePositions(); void positionLabels(); - void updateLabels(int itemIndex); private: HbLabel *mTitleLabel; HbLabel *mDescriptionLabel; HgMediawall::LabelPosition mTitlePosition; HgMediawall::LabelPosition mDescriptionPosition; - int mCenterIconTop; int mPrevPos; + qreal mAspectRatio; + QRectF mDrawableRect; + QSizeF mAutoSize; }; #endif diff -r 89c329efa980 -r e48454f237ca ganeswidgets/inc/hggridcontainer.h --- a/ganeswidgets/inc/hggridcontainer.h Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/inc/hggridcontainer.h Mon May 03 13:32:54 2010 +0300 @@ -40,11 +40,12 @@ virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); // from HgContainer - virtual HgMediaWallRenderer* createRenderer(); + virtual HgMediaWallRenderer* createRenderer(Qt::Orientation scrollDirection); virtual qreal getCameraDistance(qreal springVelocity); virtual qreal getCameraRotationY(qreal springVelocity); virtual void handleTapAction(const QPointF& pos, HgWidgetItem* hitItem, int hitItemIndex); virtual void handleLongTapAction(const QPointF& pos, HgWidgetItem* hitItem, int hitItemindex); + virtual void onScrollPositionChanged(qreal pos); }; diff -r 89c329efa980 -r e48454f237ca ganeswidgets/inc/hgimage.h --- a/ganeswidgets/inc/hgimage.h Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/inc/hgimage.h Mon May 03 13:32:54 2010 +0300 @@ -29,8 +29,11 @@ virtual ~HgImage() {} virtual void setAlpha(qreal alpha) { mAlpha = alpha; } virtual qreal alpha() const { return mAlpha; } - virtual void setImage(QImage& image)=0; + virtual void setImage(const QImage& image)=0; + virtual QImage getQImage() const=0; virtual void releaseImage()=0; + virtual int width() const = 0; + virtual int height() const = 0; private: qreal mAlpha; }; diff -r 89c329efa980 -r e48454f237ca ganeswidgets/inc/hgindexfeedback_p.h --- a/ganeswidgets/inc/hgindexfeedback_p.h Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/inc/hgindexfeedback_p.h Mon May 03 13:32:54 2010 +0300 @@ -32,7 +32,7 @@ class QItemSelectionModel; QT_END_NAMESPACE -class HgIndexFeedbackPrivate : public HbWidgetPrivate +class HgIndexFeedbackPrivate: public HbWidgetPrivate { Q_DECLARE_PUBLIC( HgIndexFeedback ) diff -r 89c329efa980 -r e48454f237ca ganeswidgets/inc/hgmediawall_p.h --- a/ganeswidgets/inc/hgmediawall_p.h Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/inc/hgmediawall_p.h Mon May 03 13:32:54 2010 +0300 @@ -32,7 +32,7 @@ HgMediawallPrivate(); virtual ~HgMediawallPrivate(); - void init(); + void init(Qt::Orientation orientation); void setTitlePosition(HgMediawall::LabelPosition position); HgMediawall::LabelPosition titlePosition() const; @@ -43,7 +43,7 @@ void setDescriptionFontSpec(const HbFontSpec &fontSpec); HbFontSpec descriptionFontSpec() const; -private: + HgCoverflowContainer *container(); const HgCoverflowContainer *container() const; }; diff -r 89c329efa980 -r e48454f237ca ganeswidgets/inc/hgmediawallrenderer.h --- a/ganeswidgets/inc/hgmediawallrenderer.h Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/inc/hgmediawallrenderer.h Mon May 03 13:32:54 2010 +0300 @@ -49,7 +49,8 @@ OpeningAnimationZoomOver }; - explicit HgMediaWallRenderer(HgMediaWallDataProvider* provider); + explicit HgMediaWallRenderer(HgMediaWallDataProvider* provider, + Qt::Orientation orientation, bool coverflowMode); virtual ~HgMediaWallRenderer(); @@ -114,8 +115,11 @@ HgQuadRenderer* getRenderer(); bool getItemPoints(int index, QPolygonF& points) const; + + QList getVisibleQuads() const; - QList getVisibleQuads() const; + void setFrontItemPosition(const QPointF& position); + QPointF frontItemPosition() const; signals: void renderingNeeded(); @@ -189,6 +193,7 @@ void setupIndicator(HgQuad* parent, HgQuad* indicator, const HgImage* indicatorImage, int itemIndex); bool initializeRenderer(QPainter* painter); + protected: @@ -262,6 +267,9 @@ ItemState mOpenedItemState; + QPointF mFrontItemPosition; + bool mFrontItemPositionSet; + private: Q_DISABLE_COPY(HgMediaWallRenderer) }; diff -r 89c329efa980 -r e48454f237ca ganeswidgets/inc/hgquadrenderer.h --- a/ganeswidgets/inc/hgquadrenderer.h Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/inc/hgquadrenderer.h Mon May 03 13:32:54 2010 +0300 @@ -19,6 +19,8 @@ #define HGQUADRENDERER_H #include +#include +#include class HgQuad; class QPointF; @@ -27,7 +29,6 @@ class QMatrix4x4; class QPolygonF; class HgImage; -class QImage; class HgImageFader; /** * @@ -97,12 +98,32 @@ * */ virtual QList getVisibleQuads(const QRectF& rect) const=0; + + virtual void setDefaultImage(QImage defaultImage); + + /** + * + */ + virtual void setTranslation(const QVector2D& translate); + + /** + * + */ + virtual HgQuad* getQuadByUserData(const QVariant& userData) const; + + /** + * + */ + virtual QImage getDefaultImage() const; + protected: HgQuadRenderer(int maxQuads); QList mQuads; qreal mMirroringPlaneY; HgImageFader* mImageFader; + QImage mDefaultImage; + QVector2D mTranslation; }; #endif diff -r 89c329efa980 -r e48454f237ca ganeswidgets/inc/hgvgimage.h --- a/ganeswidgets/inc/hgvgimage.h Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/inc/hgvgimage.h Mon May 03 13:32:54 2010 +0300 @@ -11,7 +11,7 @@ * * Contributors: * -* Description: +* Description: * */ @@ -37,20 +37,22 @@ int width() const; int height() const; - + VGImage image() const; - + int mirrorImageWidth() const; int mirrorImageHeight() const; - + VGImage mirrorImage() const; - - void setImage(QImage& image); + + void setImage(const QImage& image); void releaseImage(); + QImage getQImage() const; + void upload(bool mirror=false); - -private: + +private: VGImage mVgImage; VGImage mMirrorImage; QSize mMirrorSize; diff -r 89c329efa980 -r e48454f237ca ganeswidgets/inc/hgvgquadrenderer.h --- a/ganeswidgets/inc/hgvgquadrenderer.h Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/inc/hgvgquadrenderer.h Mon May 03 13:32:54 2010 +0300 @@ -46,11 +46,13 @@ virtual bool getQuadTranformedPoints(QPolygonF& points, int index) const; virtual HgImage* createNativeImage(); virtual QList getVisibleQuads(const QRectF& rect) const; - + virtual void setDefaultImage(QImage defaultImage); + // new functions HgVgImage* defaultImage(); QSize imageSize(bool mirror=false) const; HgImageFader* imageFader(); + private: QList mTransformedQuads; diff -r 89c329efa980 -r e48454f237ca ganeswidgets/inc/hgwidgetitem.h --- a/ganeswidgets/inc/hgwidgetitem.h Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/inc/hgwidgetitem.h Mon May 03 13:32:54 2010 +0300 @@ -32,27 +32,27 @@ { public: - HgWidgetItem(HgQuadRenderer* renderer); - HgWidgetItem( HgQuadRenderer* renderer, QImage image, QString title, QString description ); - virtual ~HgWidgetItem(); - - void setImage( QImage image ); - - void setTitle( QString title ); + HgWidgetItem(HgQuadRenderer *renderer); + HgWidgetItem(HgQuadRenderer *renderer, QImage image, QString title, QString description ); + virtual ~HgWidgetItem(); + + void setImage(const QImage &image); + + void setTitle(QString title); QString title() const; - + const HgImage* image() const; - + void setDescription( QString description ); QString description() const; - + void setModelIndex( const QModelIndex& index); QModelIndex modelIndex() const; - + bool validData() const; bool updateItemData(); void releaseItemData(); - + bool visibility() const; void setVisibility(bool visible); @@ -65,7 +65,7 @@ HgImage* mHgImage; HgQuadRenderer* mRenderer; bool mVisibility; - + Q_DISABLE_COPY(HgWidgetItem) }; diff -r 89c329efa980 -r e48454f237ca ganeswidgets/inc/hgwidgets_p.h --- a/ganeswidgets/inc/hgwidgets_p.h Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/inc/hgwidgets_p.h Mon May 03 13:32:54 2010 +0300 @@ -19,7 +19,6 @@ #define HGWIDGET_P_H #include -#include #include #include @@ -29,7 +28,7 @@ class QGraphicsLinearLayout; class HgIndexFeedback; -class HgWidgetPrivate : public HbWidgetPrivate +class HgWidgetPrivate { Q_DECLARE_PUBLIC(HgWidget) @@ -65,6 +64,18 @@ void setIndexFeedbackPolicy( HgWidget::IndexFeedbackPolicy policy); HgWidget::IndexFeedbackPolicy indexFeedbackPolicy() const; + void setDefaultImage(QImage defaultImage); + + void setItemSizePolicy(HgWidget::ItemSizePolicy policy); + HgWidget::ItemSizePolicy itemSizePolicy() const; + + void setItemSize(const QSizeF& size); + QSizeF itemSize() const; + + void setItemSpacing(const QSizeF& size); + QSizeF itemSpacing() const; + + HgWidget *q_ptr; private: @@ -99,8 +110,13 @@ void _q_moveRows(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationRow); + void _q_modelReset(); void _q_groovePressed(qreal value, Qt::Orientation orientation); + void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight); + + void initBufferManager(int itemCount); + protected: QGraphicsLinearLayout *mLayout; @@ -115,12 +131,13 @@ HbScrollBar *mScrollBar; HgWidget::ScrollBarPolicy mScrollBarPolicy; bool mAbleToScroll; - QTimer mScrollBarHideTimer; + QTimer* mScrollBarHideTimer; bool mHandleLongPress; bool mForeground; int mBufferSize; HgIndexFeedback *mIndexFeedback; + bool mStaticScrollDirection; }; #endif //HGWIDGET_p_H diff -r 89c329efa980 -r e48454f237ca ganeswidgets/src/HgContainer.cpp --- a/ganeswidgets/src/HgContainer.cpp Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/src/HgContainer.cpp Mon May 03 13:32:54 2010 +0300 @@ -57,10 +57,12 @@ mHitItemView(NULL), mLongPressVisualizer(NULL), mLongPressTimer(NULL), - mHitItemIndex(NULL) + mHitItemIndex(NULL), + mItemSizePolicy(HgWidget::ItemSizeUserDefined), + mOrientation(Qt::Vertical) { FUNC_LOG; - + grabGesture(Qt::PanGesture); grabGesture(Qt::TapGesture); grabGesture(Qt::TapAndHoldGesture); @@ -70,9 +72,7 @@ { FUNC_LOG; - for (QList::iterator i = mItems.begin(); i != mItems.end(); ++i) { - delete (*i); - } + qDeleteAll(mItems); mItems.clear(); delete mMarkImage; delete mRenderer; @@ -82,6 +82,7 @@ { FUNC_LOG; + qDeleteAll(mItems); mItems.clear(); for (int i=0; igetOrientation(); + return mOrientation; } void HgContainer::setOrientation(Qt::Orientation orientation, bool animate) { FUNC_LOG; - mRenderer->setOrientation(orientation, animate); + mOrientation = orientation; + mRenderer->setOrientation(orientation, false); } void HgContainer::scrollToPosition(qreal value, bool animate) @@ -241,8 +243,8 @@ { FUNC_LOG; - if (index.isValid()) { - scrollToPosition(QPointF(index.row(), index.column()), false); + if (index.isValid() && mRenderer->getRowCount() > 0) { + scrollToPosition(QPointF(index.row()/mRenderer->getRowCount(), 0), false); } } @@ -264,6 +266,7 @@ void HgContainer::addItems(int start, int end) { FUNC_LOG; + HANDLE_ERROR_NULL(mSelectionModel); int first = qBound(0, start, mItems.count()-1); int last = qBound(0, end, mItems.count()-1); @@ -271,11 +274,13 @@ HgWidgetItem* item = new HgWidgetItem(mQuadRenderer); mItems.insert(start, item); } + scrollTo(mSelectionModel->currentIndex()); } void HgContainer::removeItems(int start, int end) { FUNC_LOG; + HANDLE_ERROR_NULL(mSelectionModel); int first = qBound(0, start, mItems.count()-1); int last = qBound(0, end, mItems.count()-1); @@ -283,11 +288,13 @@ delete mItems.at(i); mItems.removeAt(i); } + scrollTo(mSelectionModel->currentIndex()); } void HgContainer::moveItems(int start, int end, int destination) { FUNC_LOG; + HANDLE_ERROR_NULL(mSelectionModel); int first = qBound(0, start, mItems.count()-1); int last = qBound(0, end, mItems.count()-1); @@ -304,6 +311,7 @@ } } // else do nothing + scrollTo(mSelectionModel->currentIndex()); } int HgContainer::imageCount() const @@ -337,14 +345,13 @@ void HgContainer::updateBySpringPosition() { - update(); - // spring works always in one dimension, that is, x coord. qreal pos = mSpring.pos().x(); onScrollPositionChanged(pos); emit scrollPositionChanged(pos, mAnimateUsingScrollBar); + update(); } void HgContainer::redraw() @@ -356,28 +363,35 @@ { Q_UNUSED(option) Q_UNUSED(widget) - if (mSpring.updatePositionIfNeeded()) { // spring works always in one dimension, that is, x coord. qreal pos = mSpring.pos().x(); onScrollPositionChanged(pos); - emit scrollPositionChanged(pos, mAnimateUsingScrollBar); + emit scrollPositionChanged(pos, true); } - + QRectF vp = painter->viewport(); - QRectF rts = mapRectToScene(rect()); + QRectF rts = mapRectToScene(drawableRect()); QRectF r; // transform rectangle to vg space & // rotate rendering according to orientation - if (mainWindow()->orientation() == Qt::Horizontal) { + if (mOrientation == Qt::Horizontal) { r = QRectF(vp.width()-(rts.height()+rts.top()), rts.left(), rts.height(), rts.width()); + + mRenderer->setRect(r); + mRenderer->setCameraRotationZ(-90); } else { r = QRectF(rts.left(), vp.height()-(rts.height()+rts.top()), rts.width(), rts.height()); mRenderer->setCameraRotationZ(0); + + mRenderer->setRect(r); + + if (!mSpring.isActive() && mSpring.pos().x() > worldWidth()) + boundSpring(); } // interpolate spring velocity towards zero, this is done @@ -393,10 +407,9 @@ // setup rendering and draw the current view mRenderer->setCameraDistance(getCameraDistance(springVel)); mRenderer->setCameraRotationY(getCameraRotationY(springVel)); - mRenderer->setRect(r); mRenderer->draw(mSpring.startPos(), mSpring.pos(), mSpring.endPos(), springVel, painter); - + } void HgContainer::resizeEvent(QGraphicsSceneResizeEvent *event) @@ -416,20 +429,35 @@ { FUNC_LOG; + bool eventHandled(false); // Event may contain more than one gesture type if (QGesture *gesture = event->gesture(Qt::TapAndHoldGesture)) { QTapAndHoldGesture *tapAndHold = static_cast(gesture); - handleLongTap(tapAndHold->state(), - mapFromScene(event->mapToGraphicsScene(tapAndHold->position()))); + if (handleLongTap(tapAndHold->state(), + mapFromScene(event->mapToGraphicsScene(tapAndHold->position())))) { + } } else if (QGesture *gesture = event->gesture(Qt::TapGesture)) { // Tap and hold is not working yet in HW, tap gesture is delivered instead QTapGesture *tap = static_cast(gesture); - handleTap(tap->state(), + eventHandled = handleTap(tap->state(), mapFromScene(event->mapToGraphicsScene(tap->position()))); } else if (QGesture *pan = event->gesture(Qt::PanGesture)) { - handlePanning(static_cast(pan)); + eventHandled = handlePanning(static_cast(pan)); + } + + if (eventHandled) { + event->accept(); + event->accept(Qt::TapAndHoldGesture); + event->accept(Qt::TapGesture); + event->accept(Qt::PanGesture); + } + else { + event->ignore(); + event->ignore(Qt::TapAndHoldGesture); + event->ignore(Qt::TapGesture); + event->ignore(Qt::PanGesture); } } @@ -437,12 +465,9 @@ { FUNC_LOG; - mRenderer = createRenderer(); - if (mRenderer->coverflowModeEnabled()) - mRenderer->setOrientation(Qt::Horizontal, false); - else - mRenderer->setOrientation(scrollDirection, false); - + mRenderer = createRenderer(scrollDirection); + mOrientation = scrollDirection; + mQuadRenderer = mRenderer->getRenderer(); QImage markImage(":/images/mark.svg"); @@ -454,9 +479,8 @@ if (mMarkImage) { mMarkImage->setImage(markImage); } - + connect(&mSpring, SIGNAL(updated()), SLOT(updateBySpringPosition())); - connect(&mSpring, SIGNAL(ended()), SLOT(onScrollingEnded())); connect(&mSpring, SIGNAL(ended()), SIGNAL(scrollingEnded())); connect(&mSpring, SIGNAL(started()), SIGNAL(scrollingStarted())); connect(mRenderer, SIGNAL(renderingNeeded()), SLOT(redraw())); @@ -500,7 +524,7 @@ } -void HgContainer::handlePanning(QPanGesture *gesture) +bool HgContainer::handlePanning(QPanGesture *gesture) { mAnimateUsingScrollBar = false; initSpringForScrolling(); @@ -509,7 +533,7 @@ qreal delta(0); qreal itemSide(0); - if (mRenderer->getOrientation() == mainWindow()->orientation()) { + if (mOrientation == mRenderer->getOrientation()) { delta = gesture->delta().y(); } else { @@ -544,6 +568,7 @@ if (qAbs(newPosition - mSpring.pos().x()) > 0.01f) { mSpring.gotoPos(QPointF(newPosition, 0)); + emit scrollPositionChanged(newPosition,true); update(); } } @@ -566,40 +591,54 @@ else if (gesture->state() == Qt::GestureCanceled) { boundSpring(); } + + return true; } - - -void HgContainer::handleTap(Qt::GestureState state, const QPointF &pos) +bool HgContainer::handleTap(Qt::GestureState state, const QPointF &pos) { FUNC_LOG; if (state == Qt::GestureStarted) { - mTapDuration.start(); - - startLongPressWatcher(pos); + if (hasItemAt(pos)) { + mTapDuration.start(); + startLongPressWatcher(pos); + return true; + } + return false; } else if (state == Qt::GestureCanceled) { stopLongPressWatcher(); + + if (hasItemAt(pos)) { + return true; + } + return false; } else if (state == Qt::GestureFinished) { + stopLongPressWatcher(); + return handleItemAction(pos, mTapDuration.elapsed() > KLongTapDuration ? LongTap : NormalTap); + } - stopLongPressWatcher(); - handleItemAction(pos, mTapDuration.elapsed() > KLongTapDuration ? LongTap : NormalTap); - } + return false; } -void HgContainer::handleLongTap(Qt::GestureState state, const QPointF &pos) +bool HgContainer::handleLongTap(Qt::GestureState state, const QPointF &pos) { FUNC_LOG; - mAnimateUsingScrollBar = false; - initSpringForScrolling(); + if (hasItemAt(pos)) { + mAnimateUsingScrollBar = false; + initSpringForScrolling(); - if (state == Qt::GestureFinished) { - handleItemAction(pos, LongTap); + if (state == Qt::GestureFinished) { + handleItemAction(pos, LongTap); + } + return true; } + + return false; } /*! @@ -608,25 +647,23 @@ Sets the item as the current item and in multiselection mode toggles the item selection status. */ -void HgContainer::handleItemAction(const QPointF &pos, ItemActionType action) +bool HgContainer::handleItemAction(const QPointF &pos, ItemActionType action) { FUNC_LOG; // If there is content, mSelectionModel must always exist - either default or client-provided - if (!mSelectionModel) return; + if (!mSelectionModel) return false; mHitItem = getItemAt(pos, mHitItemIndex); if (mHitItem) { int index = mHitItemIndex; - HgWidgetItem* item = itemByIndex(index); if (item && action != DoubleTap) { - mSelectionModel->setCurrentIndex(item->modelIndex(), QItemSelectionModel::Current); - if (action == LongTap) { INFO("Long tap:" << item->modelIndex().row()); + mSelectionModel->setCurrentIndex(item->modelIndex(), QItemSelectionModel::Current); if (!mRenderer->coverflowModeEnabled()) selectItem(); @@ -634,16 +671,19 @@ emit longPressed(item->modelIndex(), pos); } else if (mSelectionMode == HgWidget::MultiSelection) { + mSelectionModel->setCurrentIndex(item->modelIndex(), QItemSelectionModel::Current); INFO("Select:" << item->modelIndex().row()); mSelectionModel->select(item->modelIndex(), QItemSelectionModel::Toggle); update(); // It would be enough to update the item } else if (mSelectionMode == HgWidget::SingleSelection) { + mSelectionModel->setCurrentIndex(item->modelIndex(), QItemSelectionModel::Current); INFO("Select:" << item->modelIndex().row()); mSelectionModel->select(item->modelIndex(), QItemSelectionModel::ClearAndSelect); update(); // It would be enough to update the item } else if (mSelectionMode == HgWidget::ContiguousSelection) { + mSelectionModel->setCurrentIndex(item->modelIndex(), QItemSelectionModel::Current); QModelIndex newSelected = item->modelIndex(); QModelIndexList oldSelection = mSelectionModel->selectedIndexes(); INFO("Select:" << newSelected.row()); @@ -669,6 +709,7 @@ { if (qAbs(qreal(index) - mSpring.pos().x()) < 0.01f) { + mSelectionModel->setCurrentIndex(item->modelIndex(), QItemSelectionModel::Current); emit activated(item->modelIndex()); } else @@ -678,17 +719,20 @@ } else { + mSelectionModel->setCurrentIndex(item->modelIndex(), QItemSelectionModel::Current); selectItem(); emit activated(item->modelIndex()); } - } } + + return true; } else { INFO("No quad at pos:" << pos); unselectItem(); + return false; } } @@ -722,67 +766,58 @@ { FUNC_LOG; + // if screen is frequently updated no need to update now. + if (mSpring.isActive() || mDragged ) return; + // TODO FIX THIS FUNCTION!!!!!!!!!!!!!!!!!!!!!! int firstItemOnScreen = 0, lastItemOnScreen = 0; firstItemOnScreen = mSpring.pos().x(); firstItemOnScreen *= rowCount(); - // This code doesnt take into count if there is some empty space at the - // beginning or at the end of the widget - - int itemsOnScreen = 0; - if (mRenderer->getOrientation() == Qt::Vertical) { - itemsOnScreen = this->rect().height()/mRenderer->getImageSize().height(); - itemsOnScreen += rowCount(); - } - else { - // Doesnt work here. Use some magic for now. - itemsOnScreen = this->rect().width()/mRenderer->getImageSize().width(); - itemsOnScreen += 4; - } - itemsOnScreen *= rowCount(); + int itemsOnScreen = mRenderer->getVisibleQuads().count(); lastItemOnScreen = firstItemOnScreen+itemsOnScreen; - if ((firstIndex >= firstItemOnScreen && firstIndex <= lastItemOnScreen) || - (lastIndex >= firstItemOnScreen && lastIndex <= lastItemOnScreen)) { - update( this->rect() ); + if ((firstIndex >= firstItemOnScreen && firstIndex < lastItemOnScreen) || + (lastIndex >= firstItemOnScreen && lastIndex < lastItemOnScreen)) { + update(); } } void HgContainer::selectItem() { // TODO: replace this with own selection implementation - + if (mHitItemIndex < 0 && mHitItemIndex >= mItems.count()) + return; + if (mHitItemView) { delete mHitItemView; mHitItemView = NULL; } - + mHitItemView = new HbGridViewItem(this); mHitItemView->setVisible(false); + mHitItemView->setPos(QPointF(0,0)); + mHitItemView->setPressed(true, false); - QModelIndex modelIndex = mItems[mHitItemIndex]->modelIndex(); - const QAbstractItemModel* model = modelIndex.model(); - mHitItemView->resize(mRenderer->getImageSize().width() + 10, - mRenderer->getImageSize().height() + 10); - - QVariant iconVariant = model->data(modelIndex, Qt::DecorationRole); - mHitItemPixmap = iconVariant.value(); - HbIcon icon(mHitItemPixmap); - + const QImage& image = mItems[mHitItemIndex]->image()->getQImage(); + if (image.isNull()) + { + mHitItemView->setVisible(false); + return; + } + + QPixmap pixmap = QPixmap::fromImage(image); + HbIcon icon(pixmap.scaled(mRenderer->getImageSize().toSize(), Qt::IgnoreAspectRatio)); QGraphicsItem* item = mHitItemView->style()->createPrimitive(HbStyle::P_GridViewItem_icon, mHitItemView); HbIconItem *iconItem = static_cast(item); + iconItem->setAlignment(Qt::AlignCenter); + iconItem->setAspectRatioMode(Qt::IgnoreAspectRatio); iconItem->setIcon(icon); - iconItem->setAlignment(Qt::AlignCenter); - iconItem->setAspectRatioMode(Qt::KeepAspectRatio); - mHitItemView->setModelIndex(modelIndex); - mHitItemView->setPos(QPointF(-10,-10)); - mHitItemView->setPressed(true, false); - mHitItemView->updatePrimitives(); - + mHitItemView->resize(mRenderer->getImageSize().width(), + mRenderer->getImageSize().height()); } void HgContainer::updateSelectedItem() @@ -798,17 +833,11 @@ mHitItemView->setVisible(false); } - if (mHitItemPixmap.isNull()) - { - mHitItemView->setVisible(false); - return; - } - QPolygonF img; - img.append(QPointF(0,mHitItemPixmap.height())); - img.append(QPointF(mHitItemPixmap.width(),mHitItemPixmap.height())); - img.append(QPointF(mHitItemPixmap.width(),0)); - img.append(QPointF(0,0)); + img.append(QPointF(3,mHitItemView->boundingRect().height()-3)); + img.append(QPointF(mHitItemView->boundingRect().width()-3,mHitItemView->boundingRect().height()-3)); + img.append(QPointF(mHitItemView->boundingRect().width()-3,3)); + img.append(QPointF(3,3)); QTransform t; QTransform::quadToQuad(img, points, t); @@ -822,7 +851,6 @@ mHitItemIndex = -1; if (mHitItemView) { - mHitItemView->setPressed(false, false); mHitItemView->setVisible(false); } } @@ -830,9 +858,9 @@ void HgContainer::updateLongPressVisualizer() { int elapsed = mLongTapDuration.elapsed(); - + if (elapsed > 80) - { + { int frame = 100.0f * qreal(elapsed - 80) / qreal(KLongTapDuration - 80); mLongPressVisualizer->setFrame(frame); } @@ -843,6 +871,16 @@ handleCurrentChanged(current); } +bool HgContainer::hasItemAt(const QPointF& pos) +{ + int dummy; + HgWidgetItem *item = getItemAt(pos, dummy); + if (item) { + return item->modelIndex().isValid(); + } + return false; +} + HgWidgetItem* HgContainer::getItemAt(const QPointF& pos, int& index) { QPointF p = mapQtToVg(pos); @@ -891,16 +929,16 @@ QTransform HgContainer::qtToVgTransform() const { QTransform t; - if (mainWindow()->orientation() == Qt::Vertical) + if (mOrientation == Qt::Vertical) { - t.translate(0, rect().height()); + t.translate(0, drawableRect().bottom()); t.scale(1, -1); } else // horizontal { - t.translate(rect().height(), 0); + t.translate(drawableRect().bottom(), 0); t.scale(-1, 1); - t.translate(0, rect().width()); + t.translate(0, drawableRect().right()); t.rotate(-90, Qt::ZAxis); } return t; @@ -949,12 +987,83 @@ // By default do nothing } -void HgContainer::onScrollingEnded() +QRectF HgContainer::drawableRect() const +{ + return rect(); +} + +void HgContainer::setDefaultImage(QImage defaultImage) +{ + HgQuadRenderer *renderer = mRenderer->getRenderer(); + if (renderer) { + QImage scaled = defaultImage.scaled(mRenderer->getImageSize().toSize()); + renderer->setDefaultImage(scaled); + } +} + +void HgContainer::setItemSizePolicy(HgWidget::ItemSizePolicy policy) { -/* int index; - HgWidgetItem* item = getItemAt(rect().center(), index); - if (item && item->modelIndex() != mSelectionModel->currentIndex()) { - mSelectionModel->setCurrentIndex(item->modelIndex(), QItemSelectionModel::Current); - }*/ + if (policy != mItemSizePolicy) + { + mItemSizePolicy = policy; + + updateItemSizeAndSpacing(); + } +} + +HgWidget::ItemSizePolicy HgContainer::itemSizePolicy() const +{ + return mItemSizePolicy; +} + +void HgContainer::setItemSize(const QSizeF& size) +{ + mUserItemSize = size; + updateItemSizeAndSpacing(); +} + +QSizeF HgContainer::itemSize() const +{ + return mRenderer->getImageSize(); } +void HgContainer::setItemSpacing(const QSizeF& spacing) +{ + mUserItemSpacing = spacing; + updateItemSizeAndSpacing(); +} + +QSizeF HgContainer::itemSpacing() const +{ + return mRenderer->getSpacing(); +} + +void HgContainer::updateItemSizeAndSpacing() +{ + if (mItemSizePolicy == HgWidget::ItemSizeUserDefined) + { + mRenderer->setImageSize(mUserItemSize); + mRenderer->setSpacing(mUserItemSpacing); + } +} + +QSizeF HgContainer::getAutoItemSize() const +{ + return mUserItemSize; +} + +QSizeF HgContainer::getAutoItemSpacing() const +{ + return mUserItemSpacing; +} + +Qt::Orientation HgContainer::scrollDirection() const +{ + return mRenderer->getOrientation(); +} + +qreal HgContainer::scrollPosition() const +{ + return mSpring.pos().x(); +} + diff -r 89c329efa980 -r e48454f237ca ganeswidgets/src/HgScrollBufferManager.cpp --- a/ganeswidgets/src/HgScrollBufferManager.cpp Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/src/HgScrollBufferManager.cpp Mon May 03 13:32:54 2010 +0300 @@ -216,145 +216,368 @@ mTotalCount-1 : mBufferPosition+mBufferSize; } -void HgScrollBufferManager::removeItems(int start, int end, int totalCount) +void HgScrollBufferManager::addItems(int start, int end) { - int oldTotalCount = mTotalCount; - mTotalCount = totalCount; + FUNC_LOG; + + mTotalCount += (end-start+1); + int lastBufferItem = mBufferPosition+mBufferSize-1; - if (isInsideBuffer(start, end)) { - if (mTotalCount > mBufferSize && mBufferPosition+mBufferSize == oldTotalCount) { - // We are at the end of items, move buffer - int oldBufferPos = mBufferPosition; - mBufferPosition = qMax(0, totalCount-mBufferSize); + if (start < mBufferPosition) { + simpleAddItems(start, end); + // New items push the buffer forward, items inside the buffer do not change + } + // Check buffer higher limit + else if (start <= lastBufferItem && end > lastBufferItem) { + simpleAddItems(start, lastBufferItem); + // Items added after the buffer are ignored + } + else { + simpleAddItems(start, end); + } +} + +void HgScrollBufferManager::removeItems(int start, int end) +{ + FUNC_LOG; + + int lastBufferItem = mBufferPosition+mBufferSize-1; + int removedItemCount = end-start+1; - if (start < oldBufferPos) { // Removed items are partially inside buffer - emit requestItems(mBufferPosition, start-1); - } - else { - emit requestItems(mBufferPosition, oldBufferPos-1); - } - } - else { - int first = qBound(mBufferPosition, start, mBufferPosition+mBufferSize-1); - int last = qBound(mBufferPosition, end, mBufferPosition+mBufferSize-1); + if (mTotalCount < mBufferSize) { + // Do nothing + } + else if (start > lastBufferItem) { + // Do nothing + } + else if (end < mBufferPosition) { + mTotalCount = mTotalCount-removedItemCount; + simpleRemoveItems(start, end); + } + else if (start < mBufferPosition && end > lastBufferItem) { + mTotalCount = mTotalCount-removedItemCount; + mBufferPosition = qBound(0, mBufferPosition, mTotalCount-mBufferSize); + resetBuffer(mBufferPosition, mTotalCount); + } + // Check buffer higher limit + else if (start <= lastBufferItem && end > lastBufferItem) { + mTotalCount = mTotalCount-(end-lastBufferItem); + simpleRemoveItems(lastBufferItem+1, end); + mTotalCount = mTotalCount-(lastBufferItem-start+1); + simpleRemoveItems(start, lastBufferItem); + // Order does matter + mTotalCount = mTotalCount-(end-lastBufferItem); + simpleRemoveItems(lastBufferItem+1, end); + mTotalCount = mTotalCount-(lastBufferItem-start+1); + simpleRemoveItems(start, lastBufferItem); + } + // Check buffer lower limit + else if (start < mBufferPosition && end >= mBufferPosition) { + // Order does matter + mTotalCount = mTotalCount-(end-mBufferPosition+1); + simpleRemoveItems(mBufferPosition, end); + mTotalCount = mTotalCount-(mBufferPosition-start); + simpleRemoveItems(start, mBufferPosition-1); + } + else { + mTotalCount = mTotalCount-removedItemCount; + simpleRemoveItems(start, end); + } +} - // Requested from the end - emit requestItems(mBufferPosition+mBufferSize-(last-first+1), - qMin(mBufferPosition+mBufferSize-1, mTotalCount)); - } +void HgScrollBufferManager::moveItems(int start, int end, int target) +{ + int lastBufferItem = mBufferPosition+mBufferSize-1; + + INFO("Move" << start << "-" << end << "to" << target << ",buffer:" << mBufferPosition << "-" << lastBufferItem << "total count:" << mTotalCount); + + if (mTotalCount < mBufferSize) { + // Do nothing + } + else if (start < mBufferPosition && end > lastBufferItem) { + resetBuffer(mBufferPosition, mTotalCount); + } + else if (start > lastBufferItem && target > lastBufferItem) { + // Do nothing + } + else if (start > lastBufferItem && target < mBufferPosition) { + simpleAddItems(start, end); + } + else if (end < mBufferPosition && target < mBufferPosition) { + // Do nothing + } + else if (end < mBufferPosition && target > lastBufferItem) { + simpleRemoveItems(start, end); + } + else if (start >= mBufferPosition && end <= lastBufferItem && + target >= mBufferPosition && target <= lastBufferItem) { + // Do nothing + } + else { + // Rare and complicated use cases: reset the whole buffer + resetBuffer(mBufferPosition, mTotalCount); } } -void HgScrollBufferManager::addItems(int start, int end, int totalCount) +void HgScrollBufferManager::flushRequestBuffers() { - int oldTotalCount = mTotalCount; - mTotalCount = totalCount; + FUNC_LOG; + + qSort(mReleaseBuffer); + int releaseCount = mReleaseBuffer.count(); + int lastReleased = -1; + for (int i = 0; i < releaseCount; i++) { + UpdatePair update = mReleaseBuffer.at(i); + emit releaseItems(qMax(lastReleased+1, update.start()), update.end()); + lastReleased = update.end(); + } + mReleaseBuffer.clear(); - if (isInsideBuffer(start, end)) { - int first = start; - int last = end; + qSort(mRequestBuffer); + int requestCount = mRequestBuffer.count(); + int lastRequested = -1; + for (int i = 0; i < requestCount; i++) { + UpdatePair update = mRequestBuffer.at(i); + emit requestItems(qMax(lastRequested+1, update.start()), update.end()); + lastRequested = update.end(); + } + mRequestBuffer.clear(); +} + +int HgScrollBufferManager::changeBufferPosition(int newPos) +{ + FUNC_LOG; + INFO("Change buffer position to" << newPos << "total count:" << mTotalCount); + HANDLE_ERROR_BOOL((newPos >= 0)); + HANDLE_ERROR_BOOL((newPos+mBufferSize <= mTotalCount)); + + int bufferShift = newPos-mBufferPosition; + if (bufferShift > 0) { + mRequestBuffer.shiftRight(mBufferPosition, bufferShift); + mReleaseBuffer.shiftRight(mBufferPosition, bufferShift); + } + else if (bufferShift < 0) { + mRequestBuffer.shiftLeft(mBufferPosition, -bufferShift); + mReleaseBuffer.shiftLeft(mBufferPosition, -bufferShift); + } + mBufferPosition = newPos; + return bufferShift; +} - if (mTotalCount > mBufferSize && mBufferPosition+mBufferSize == oldTotalCount) { - // We are at the end of items, keep it that way - int oldBufferPos = mBufferPosition; - mBufferPosition = qMin(mBufferPosition+(end-start+1), totalCount-mBufferSize); +/** + This function manages only simple item additions: all items are either + outside the buffer or inside it. + Firs call prepare, then update model, then call fecth. +*/ +void HgScrollBufferManager::simpleAddItems(int start, int end) +{ + FUNC_LOG; + + int lastBufferItem = mBufferPosition+mBufferSize-1; + int numAddedItems = end-start+1; // [start, end] inclusive - if (oldBufferPos < mBufferPosition) { - // Release from the beginning - emit releaseItems(oldBufferPos, mBufferPosition-1); - } + if (mTotalCount < mBufferSize) { + appendRequestBuffer(start, numAddedItems); + } + else if (start > lastBufferItem) { + // Do nothing + } + else if (start <= mBufferPosition) { + changeBufferPosition(mBufferPosition+numAddedItems); + // No need to fetch items, the indexes just change + } + else { + // free from end + appendReleaseBuffer(lastBufferItem+1-numAddedItems, numAddedItems); + mReleaseBuffer.shiftRight(start, numAddedItems); + mRequestBuffer.shiftRight(start, numAddedItems); + appendRequestBuffer(start, numAddedItems); + } +} - // Added items may fall outside the buffer as the buffer is moved - if (isInsideBuffer(start, end)) { - first = qBound(mBufferPosition, start, mBufferPosition+mBufferSize-1); - last = qBound(mBufferPosition, end, mBufferPosition+mBufferSize-1); - emit requestItems(first, last); - } +/** + This function manages only simple item removals: all items are either + outside the buffer or inside it. + Firs call prepare, then update model, then call fecth. +*/ +void HgScrollBufferManager::simpleRemoveItems(int start, int end) +{ + FUNC_LOG; + + int lastBufferItem = mBufferPosition+mBufferSize-1; + int numRemovedItems = end-start+1; // [start, end] inclusive + + if (start > lastBufferItem) { + // Do nothing + } + else if (end < mBufferPosition) { + changeBufferPosition(qMax(0, mBufferPosition-numRemovedItems)); + // No need to fetch items, the indexes just change + } + else { + if (mTotalCount < mBufferPosition+mBufferSize) { + // Buffer is at the end of items + int bufferShift = changeBufferPosition(qMax(0, mTotalCount-mBufferSize)); + // Fetch from beginning + // Releasing removed items has been done outside this class + appendRequestBuffer(mBufferPosition, qAbs(bufferShift)); } else { - first = qBound(mBufferPosition, start, mBufferPosition+mBufferSize-1); - last = qBound(mBufferPosition, end, mBufferPosition+mBufferSize-1); - - if (mTotalCount > mBufferSize) { - // Release from the end - emit releaseItems(mBufferPosition+mBufferSize, - mBufferPosition+mBufferSize+(last-first+1)-1); - } - // If all the items fit in the buffer no need to release items - - emit requestItems(first, last); + // Fetch from end + appendRequestBuffer(lastBufferItem+1-numRemovedItems, numRemovedItems); } } } -void HgScrollBufferManager::moveItems(int start, int end, int target, int totalCount) +void HgScrollBufferManager::appendRequestBuffer(int start, int count) +{ + FUNC_LOG; + INFO("Request items" << start << ":" << count) + + mRequestBuffer.add(start, count); + mReleaseBuffer.remove(start, count); +} + +void HgScrollBufferManager::appendReleaseBuffer(int start, int count) +{ + FUNC_LOG; + INFO("Release items" << start << ":" << count) + + mReleaseBuffer.add(start, count); + mRequestBuffer.remove(start, count); +} + +UpdatePair::UpdatePair(int start, int count) : mStart(start), mCount(count) { - if (isInsideBuffer(start) && isInsideBuffer(end) && isInsideBuffer(target)) { - return; - } + HANDLE_ERROR_BOOL(mCount > 0); +} + +int UpdatePair::start() const +{ + return mStart; +} + +int UpdatePair::end() const +{ + return mStart+mCount-1; +} - if (!isInsideBuffer(start, end) && !isInsideBuffer(target)) { - return; - } +bool UpdatePair::adjacent(int start, int count) const +{ + if (start+count < mStart) return false; + if (start > mStart+mCount) return false; + return true; +} + +bool UpdatePair::contains(const UpdatePair &other) const +{ + if (other.mStart+other.mCount-1 < mStart) return false; + if (other.mStart > mStart+mCount-1) return false; + return true; +} - if (!isInsideBuffer(target)) { - if (isInsideBuffer(start) && isInsideBuffer(end)) { - if (mBufferPosition+mBufferSize == mTotalCount) { - // Fetch from beginning - emit requestItems(mBufferPosition, mBufferPosition+end-start); - } - else { - // Fetch from end - emit requestItems(mBufferPosition+mBufferSize-(end-start+1), - qMin(mBufferPosition+mBufferSize-1, mTotalCount)); - } +void UpdatePair::extend(int start, int count) +{ + int end = qMax(mStart+mCount, start+count); + mStart = qMin(mStart, start); + mCount = end-mStart; + INFO("Pair extended to:" << mStart << ":" << mCount); +} + +void UpdatePair::subtract(int start, int count) +{ + int end = qMin(mStart+mCount, start+count); + mStart = qMax(mStart, start); + mCount = end-mStart; + INFO("Pair reduced to:" << mStart << ":" << mCount); +} + +void UpdatePair::shiftRight(int count) +{ + mStart += count; + INFO("Pair shifted to:" << mStart << ":" << mCount); +} + +void UpdatePair::shiftLeft(int count) +{ + mStart -= count; + HANDLE_ERROR_BOOL((mStart >= 0)); + INFO("Pair shifted to:" << mStart << ":" << mCount); +} + +bool UpdatePair::operator== (const UpdatePair &other) const +{ + return mStart == other.mStart && mCount == other.mCount; +} + +bool UpdatePair::operator< (const UpdatePair &other) const +{ + return (mStart < other.mStart || mStart == other.mStart && mCount < other.mCount); +} + +UpdateBuffer::UpdateBuffer() +{ + FUNC_LOG; +} + +void UpdateBuffer::add(int start, int count) +{ + FUNC_LOG; + + int itemCount = this->count(); + for (int i = 0; i < itemCount; i++) { + if (at(i).contains(UpdatePair(start, count))) { + // It is already there + return; } - else if (isInsideBuffer(start) && end >= mBufferPosition+mBufferSize-1) { - emit requestItems(start, mBufferPosition+mBufferSize-1); - } - else if (start <= mBufferPosition && isInsideBuffer(end)) { - emit requestItems(mBufferPosition, end); - } - else { - emit requestItems(mBufferPosition, mBufferPosition+mBufferSize-1); + if (at(i).adjacent(start, count)) { + (*this)[i].extend(start, count); + return; } } + append(UpdatePair(start, count)); +} - if (isInsideBuffer(target)) { - // start-end may be partially inside buffer - if (!isInsideBuffer(start, end)) { - addItems(target, target+end-start, totalCount); +void UpdateBuffer::remove(int start, int count) +{ + FUNC_LOG; + + int itemCount = this->count(); + for (int i = itemCount-1; i >= 0; i--) { + UpdatePair pair = at(i); + UpdatePair comp = UpdatePair(start, count); + if (comp.contains(pair)) { + INFO("Removing pair" << pair.start() << "-" << pair.end()); + removeAt(i); } - else if (isInsideBuffer(start)) { - addItems(target+(mBufferPosition+mBufferSize-start), target+end-start, totalCount); + else if (pair.contains(comp)) { + // Subtraction from middle is not applicable in mediawall use cases + (*this)[i].subtract(start, count); } - else { // end is inside buffer - addItems(target, target+mBufferPosition-start-1, totalCount); + // Item may be present in multiple pairs. + } +} + +void UpdateBuffer::shiftRight(int startingFrom, int amount) +{ + FUNC_LOG; + + int itemCount = this->count(); + for (int i = 0; i < itemCount; i++) { + if (at(i).start() >= startingFrom) { + (*this)[i].shiftRight(amount); } } } -bool HgScrollBufferManager::isInsideBuffer(int pos) +void UpdateBuffer::shiftLeft(int startingFrom, int amount) { - return (pos >= mBufferPosition && pos < mBufferPosition+mBufferSize); -} - -bool HgScrollBufferManager::isInsideBuffer(int start, int end) -{ - INFO("Buffer:" << mBufferPosition << "-" << mBufferPosition+mBufferSize-1); - INFO("Change:" << start << "-" << end); + FUNC_LOG; - if (isInsideBuffer(start)) { - return true; - } - if (isInsideBuffer(end)) { - return true; + int itemCount = this->count(); + for (int i = 0; i < itemCount; i++) { + if (at(i).start() >= startingFrom) { + (*this)[i].shiftLeft(amount); + } } - if (start < mBufferPosition && end >= mBufferPosition+mBufferSize) { - return true; - } - - INFO("Buffer not affected"); - return false; } - diff -r 89c329efa980 -r e48454f237ca ganeswidgets/src/hgcoverflowcontainer.cpp --- a/ganeswidgets/src/hgcoverflowcontainer.cpp Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/src/hgcoverflowcontainer.cpp Mon May 03 13:32:54 2010 +0300 @@ -16,6 +16,7 @@ */ #include +#include #include #include #include "hgcoverflowcontainer.h" @@ -34,8 +35,9 @@ mDescriptionLabel(0), mTitlePosition(HgMediawall::PositionAboveImage), mDescriptionPosition(HgMediawall::PositionNone), - mCenterIconTop(0), - mPrevPos(-1) + mPrevPos(-1), + mAspectRatio(1), + mDrawableRect(rect()) { mTitleLabel = new HbLabel(this); mTitleLabel->setZValue(zValue()+1); @@ -46,6 +48,9 @@ mDescriptionLabel->setZValue(zValue()+1); mDescriptionLabel->setAlignment(Qt::AlignCenter); mDescriptionLabel->setVisible(false); + + mUserItemSize = QSize(250,250); + mUserItemSpacing = QSize(1,1); } HgCoverflowContainer::~HgCoverflowContainer() @@ -64,24 +69,18 @@ HbWidget::resizeEvent(event); - QSizeF s(size()); - qreal side = qMin(s.height()/1.8, s.width()/1.8); - INFO("Setting image size to:" << side << "," << side); - mRenderer->setImageSize(QSizeF(side, side)); - mCenterIconTop = (s.height()-side)/2; - - positionLabels(); + updatePositions(); } // from HgContainer -HgMediaWallRenderer* HgCoverflowContainer::createRenderer() +HgMediaWallRenderer* HgCoverflowContainer::createRenderer(Qt::Orientation scrollDirection) { - HgMediaWallRenderer* renderer = new HgMediaWallRenderer(this); - renderer->setImageSize(QSizeF(200, 200)); + HgMediaWallRenderer* renderer = new HgMediaWallRenderer(this, scrollDirection, true); + renderer->setImageSize(mUserItemSize); renderer->enableCoverflowMode(true); renderer->setRowCount(1, renderer->getImageSize(), false); renderer->enableReflections(true); - renderer->setSpacing(QSizeF(1,1)); + renderer->setSpacing(mUserItemSpacing); renderer->setFrontCoverElevationFactor(0.5); return renderer; } @@ -121,12 +120,16 @@ { HgContainer::onScrollPositionChanged(pos); - if (mPrevPos != (int)pos) { - mPrevPos = (int)pos; - HgWidgetItem* item = itemByIndex((int)pos); + qreal ipos = floorf(pos); + qreal frac = pos - ipos; + qreal p = frac > 0.5 ? ipos + 1.0f : ipos; + + if (mPrevPos != (int)p) { + mPrevPos = (int)p; + HgWidgetItem* item = itemByIndex((int)p); if (item && item->modelIndex() != mSelectionModel->currentIndex()) { mSelectionModel->setCurrentIndex(item->modelIndex(), QItemSelectionModel::Current); - } + } } } @@ -152,6 +155,15 @@ updateLabels(current); } } + + if (firstIndex == 0) { + // Take preferred aspect ratio from the first image + const HgImage *firstImage = image(0); + if (firstImage && firstImage->height() != 0) { + mAspectRatio = qMax((qreal)0.1, (qreal)firstImage->width()/firstImage->height()); // Don't let aspect ratio go to 0 + updatePositions(); + } + } } void HgCoverflowContainer::setTitlePosition(HgMediawall::LabelPosition position) @@ -160,7 +172,7 @@ if (mTitlePosition != position) { mTitlePosition = position; - positionLabels(); + updatePositions(); } } @@ -177,7 +189,7 @@ if (mDescriptionPosition != position) { mDescriptionPosition = position; - positionLabels(); + updatePositions(); } } @@ -195,7 +207,7 @@ if (!mTitleLabel) return; if (mTitleLabel->fontSpec() != fontSpec) { mTitleLabel->setFontSpec(fontSpec); - positionLabels(); + updatePositions(); } } @@ -214,7 +226,7 @@ if (!mDescriptionLabel) return; if (mDescriptionLabel->fontSpec() != fontSpec) { mDescriptionLabel->setFontSpec(fontSpec); - positionLabels(); + updatePositions(); } } @@ -226,6 +238,106 @@ return mDescriptionLabel->fontSpec(); } +void HgCoverflowContainer::calculatePositions() +{ + FUNC_LOG; + HANDLE_ERROR_NULL(mTitleLabel); + HANDLE_ERROR_NULL(mDescriptionLabel); + + int height = size().height(); + int width = size().width(); + int titleHeight = QFontMetrics(mTitleLabel->effectiveFontSpec().font()).height(); + int descriptionHeight = QFontMetrics(mDescriptionLabel->effectiveFontSpec().font()).height(); + qreal usableHeight = height-KLabelMargin; + if (mTitlePosition != HgMediawall::PositionNone) { + usableHeight -= (titleHeight+KLabelMargin); + } + if (mDescriptionPosition != HgMediawall::PositionNone) { + usableHeight -= (descriptionHeight+KLabelMargin); + } + + usableHeight *= 0.8; // Leave some space for the reflection + if (usableHeight <= 0) return; + + qreal usableWidth = width/2; + if (usableWidth <= 0) return; + + mDrawableRect = rect(); + QSizeF imageSize; + if (usableWidth/usableHeight > mAspectRatio) { + imageSize.setHeight(usableHeight); + imageSize.setWidth(mAspectRatio*usableHeight); + } + else { + imageSize.setWidth(usableWidth); + imageSize.setHeight(usableWidth/mAspectRatio); + mDrawableRect.setTop((usableHeight-imageSize.height())/2); + } + + QRectF titleGeometry(0, mDrawableRect.top()+KLabelMargin, width, titleHeight); + QRectF descriptionGeometry(0, mDrawableRect.top()+KLabelMargin, width, descriptionHeight); + + if (mTitlePosition == HgMediawall::PositionAboveImage && + mDescriptionPosition == HgMediawall::PositionAboveImage) { + // titleGeometry default is ok + descriptionGeometry.moveTop(titleGeometry.bottom()+KLabelMargin); + mDrawableRect.setTop(descriptionGeometry.bottom()+KLabelMargin); + } + else if (mTitlePosition == HgMediawall::PositionBelowImage && + mDescriptionPosition == HgMediawall::PositionBelowImage) { + titleGeometry.moveTop(mDrawableRect.top()+imageSize.height()+KLabelMargin); + descriptionGeometry.moveTop(titleGeometry.bottom()+KLabelMargin); + } + else { + if (mTitlePosition == HgMediawall::PositionAboveImage) { + // titleGeometry default is ok + mDrawableRect.setTop(titleGeometry.bottom()+KLabelMargin); + } + else if (mDescriptionPosition == HgMediawall::PositionAboveImage) { + // descriptionGeometry default is ok + mDrawableRect.setTop(descriptionGeometry.bottom()+KLabelMargin); + } + + if (mTitlePosition == HgMediawall::PositionBelowImage) { + titleGeometry.moveTop(mDrawableRect.top()+imageSize.height()+KLabelMargin); + } + else if (mDescriptionPosition == HgMediawall::PositionBelowImage) { + descriptionGeometry.moveTop(mDrawableRect.top()+imageSize.height()+KLabelMargin); + } + } + + INFO("Setting image size to:" << imageSize << "(total size:" << QSize(width, height) + << "usable size:" << QSizeF(usableWidth, usableHeight) << ", aspect ratio is:" << mAspectRatio << ")" << "Drawable rect:" << mDrawableRect); + mRenderer->setImageSize(imageSize); + mAutoSize = imageSize; + mDrawableRect.setHeight(imageSize.height()/0.8); + + if (mTitlePosition != HgMediawall::PositionNone) { + INFO("Title geometry:" << titleGeometry); + mTitleLabel->setGeometry(titleGeometry); + mTitleLabel->setVisible(true); + } + else { + mTitleLabel->setVisible(false); + } + if (mDescriptionPosition != HgMediawall::PositionNone) { + INFO("Description geometry:" << descriptionGeometry); + mDescriptionLabel->setGeometry(descriptionGeometry); + mDescriptionLabel->setVisible(true); + } + else { + mDescriptionLabel->setVisible(false); + } + + // This may be called before selection model is set. + if (mSelectionModel && mSelectionModel->currentIndex().isValid()) { + updateLabels(mSelectionModel->currentIndex().row()); + } + + mRenderer->setSpacing(QSizeF(1,1)); + +} + void HgCoverflowContainer::positionLabels() { FUNC_LOG; @@ -233,6 +345,8 @@ HANDLE_ERROR_NULL(mDescriptionLabel); HANDLE_ERROR_NULL(mSelectionModel); + int centerIconTop = (size().height() - mRenderer->getImageSize().height()) / 2; + int height = size().height(); int width = size().width(); int titleHeight = QFontMetrics(mTitleLabel->effectiveFontSpec().font()).height(); @@ -242,7 +356,7 @@ mDescriptionPosition == HgMediawall::PositionAboveImage) { mTitleLabel->setGeometry(QRectF( 0, - qMax(KLabelMargin, mCenterIconTop-2*KLabelMargin-titleHeight-descriptionHeight), + qMax(KLabelMargin, centerIconTop-2*KLabelMargin-titleHeight-descriptionHeight), width, titleHeight)); mDescriptionLabel->setGeometry(QRectF( 0, @@ -264,7 +378,7 @@ if (mTitlePosition == HgMediawall::PositionAboveImage) { mTitleLabel->setGeometry(QRectF( 0, - qMax(KLabelMargin, mCenterIconTop-KLabelMargin-titleHeight), + qMax(KLabelMargin, centerIconTop-KLabelMargin-titleHeight), width, titleHeight)); } else if (mTitlePosition == HgMediawall::PositionBelowImage) { @@ -277,7 +391,7 @@ if (mDescriptionPosition == HgMediawall::PositionAboveImage) { mDescriptionLabel->setGeometry(QRectF( 0, - qMax(KLabelMargin, mCenterIconTop-KLabelMargin-descriptionHeight), + qMax(KLabelMargin, centerIconTop-KLabelMargin-descriptionHeight), width, descriptionHeight)); } else if (mDescriptionPosition == HgMediawall::PositionBelowImage) { @@ -294,11 +408,12 @@ INFO("Title geometry:" << mTitleLabel->geometry() << "visible:" << mTitleLabel->isVisible()); INFO("Description geometry:" << mDescriptionLabel->geometry() << "visible:" << mDescriptionLabel->isVisible()); - if (mSelectionModel->currentIndex().isValid()) { + if ( mSelectionModel && mSelectionModel->currentIndex().isValid()) { updateLabels(mSelectionModel->currentIndex().row()); } } + void HgCoverflowContainer::updateLabels(int itemIndex) { FUNC_LOG; @@ -317,3 +432,75 @@ p.setX((int)pos.x()); HgContainer::scrollToPosition(p,animate); } + +QRectF HgCoverflowContainer::drawableRect() const +{ + if (mItemSizePolicy == HgWidget::ItemSizeAutomatic) + return mDrawableRect; + + return rect(); +} + +void HgCoverflowContainer::setDefaultImage(QImage defaultImage) +{ + HgContainer::setDefaultImage(defaultImage); + + if (!defaultImage.isNull()) { + mAspectRatio = qMax((qreal)0.1, (qreal)defaultImage.width()/defaultImage.height()); // Don't let aspect ratio go to 0 + updatePositions(); + } +} + +QSizeF HgCoverflowContainer::getAutoItemSize() const +{ + return mAutoSize; +} + +QSizeF HgCoverflowContainer::getAutoItemSpacing() const +{ + return QSizeF(1,1); +} + +void HgCoverflowContainer::updateItemSizeAndSpacing() +{ + HgContainer::updateItemSizeAndSpacing(); + + updatePositions(); +} + + +void HgCoverflowContainer::updatePositions() +{ + if (mItemSizePolicy == HgWidget::ItemSizeAutomatic) + calculatePositions(); + else + { + positionLabels(); + } +} + +void HgCoverflowContainer::setFrontItemPositionDelta(const QPointF& position) +{ + if (!mRenderer) + return; + + mRenderer->setFrontItemPosition(position); +} + +QPointF HgCoverflowContainer::frontItemPositionDelta() const +{ + return mRenderer ? mRenderer->frontItemPosition() : QPointF(); +} + +void HgCoverflowContainer::enableReflections(bool enabled) +{ + if (mRenderer) + mRenderer->enableReflections(enabled); +} + +bool HgCoverflowContainer::reflectionsEnabled() const +{ + return mRenderer ? mRenderer->reflectionsEnabled() : false; +} + + diff -r 89c329efa980 -r e48454f237ca ganeswidgets/src/hggrid.cpp --- a/ganeswidgets/src/hggrid.cpp Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/src/hggrid.cpp Mon May 03 13:32:54 2010 +0300 @@ -20,7 +20,7 @@ #include "hggridcontainer.h" HgGrid::HgGrid( Qt::Orientation scrollDirection, QGraphicsItem *parent ): - HgWidget(new HgGridPrivate, parent) + HgWidget( *new HgGridPrivate, parent ) { Q_D(HgGrid); d->q_ptr = this; @@ -28,6 +28,16 @@ d->init(scrollDirection); } +HgGrid::HgGrid( Qt::Orientation scrollDirection, HgGridPrivate &dd, QGraphicsItem *parent) : + HgWidget( dd, parent ) +{ + Q_D( HgGrid ); + d->q_ptr = this; + + d->init(scrollDirection); +} + + HgGrid::~HgGrid() { } diff -r 89c329efa980 -r e48454f237ca ganeswidgets/src/hggrid_p.cpp --- a/ganeswidgets/src/hggrid_p.cpp Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/src/hggrid_p.cpp Mon May 03 13:32:54 2010 +0300 @@ -20,7 +20,7 @@ static const int BUFFERSIZE(120); -HgGridPrivate::HgGridPrivate() +HgGridPrivate::HgGridPrivate() : HgWidgetPrivate() { } diff -r 89c329efa980 -r e48454f237ca ganeswidgets/src/hggridcontainer.cpp --- a/ganeswidgets/src/hggridcontainer.cpp Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/src/hggridcontainer.cpp Mon May 03 13:32:54 2010 +0300 @@ -41,7 +41,10 @@ HgGridContainer::HgGridContainer(QGraphicsItem *parent) : HgContainer(parent) { - + + mUserItemSize = QSize(120,120); + mUserItemSpacing = QSize(1,1); + } HgGridContainer::~HgGridContainer() @@ -56,15 +59,15 @@ updateSelectedItem(); } -HgMediaWallRenderer* HgGridContainer::createRenderer() +HgMediaWallRenderer* HgGridContainer::createRenderer(Qt::Orientation scrollDirection) { - HgMediaWallRenderer* renderer = new HgMediaWallRenderer(this); + HgMediaWallRenderer* renderer = new HgMediaWallRenderer(this, scrollDirection, false); renderer->enableCoverflowMode(false); - renderer->setImageSize(QSizeF(105, 80)); + renderer->setImageSize(mUserItemSize); renderer->setRowCount(3, renderer->getImageSize(), false); renderer->enableReflections(false); - renderer->setSpacing(QSizeF(1,1)); + renderer->setSpacing(mUserItemSpacing); renderer->setFrontCoverElevationFactor(0.5); return renderer; @@ -102,3 +105,18 @@ selectItem(); emit longPressed(hitItem->modelIndex(), pos); } + +void HgGridContainer::onScrollPositionChanged(qreal pos) +{ + HgContainer::onScrollPositionChanged(pos); + + if (pos < 0) return; + const int index = ((int)pos)*rowCount(); + if (index > itemCount()) return; + + HgWidgetItem* item = itemByIndex(index); + if (item && item->modelIndex() != mSelectionModel->currentIndex()) { + qDebug() << "CURRENT CHANGE" << QString::number(item->modelIndex().row()); + mSelectionModel->setCurrentIndex(item->modelIndex(), QItemSelectionModel::Current); + } +} diff -r 89c329efa980 -r e48454f237ca ganeswidgets/src/hgindexfeedback.cpp --- a/ganeswidgets/src/hgindexfeedback.cpp Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/src/hgindexfeedback.cpp Mon May 03 13:32:54 2010 +0300 @@ -59,13 +59,13 @@ */ HgIndexFeedback::HgIndexFeedback(QGraphicsItem *parent) : HbWidget( *new HgIndexFeedbackPrivate, parent, 0) - + { Q_D( HgIndexFeedback ); d->q_ptr = this; HbStyleLoader::registerFilePath(":/hgindexfeedback.css"); - + d->init(); } @@ -134,7 +134,7 @@ } d->connectModelToIndexFeedback(d->mWidget->selectionModel()); - + d->connectScrollBarToIndexFeedback(d->mWidget->scrollBar()); connect(d->mWidget, SIGNAL(destroyed(QObject*)), @@ -178,7 +178,7 @@ case HbStyle::P_IndexFeedback_popup_text: retVal = d->mTextItem; break; - + case HbStyle::P_IndexFeedback_popup_background: retVal = d->mPopupItem; break; @@ -203,12 +203,12 @@ if (ev->type() == QEvent::GraphicsSceneResize) { d->calculatePopupRects(); } - + return QGraphicsItem::sceneEventFilter(watched, ev); } /* - Rather than adding signals to HbScrollBar specifically to implement + Rather than adding signals to HbScrollBar specifically to implement index feedback, an event filter is used. Specifically, if a scrollbar which is interactive is pressed or released @@ -235,7 +235,7 @@ d->scrollBarReleased(); } break; - + case QEvent::GraphicsSceneResize: case QEvent::Resize: d->_q_hideIndexFeedbackNow(); @@ -276,14 +276,14 @@ case HgWidget::IndexFeedbackSingleCharacter: { fontSpec = HbFontSpec(HbFontSpec::Primary); - fontSpec.setTextPaneHeight(d->textHeight()); + fontSpec.setTextHeight(d->textHeight()); } break; - + case HgWidget::IndexFeedbackThreeCharacter: { fontSpec = HbFontSpec(HbFontSpec::Primary); - fontSpec.setTextPaneHeight(d->textHeight()); + fontSpec.setTextHeight(d->textHeight()); } break; @@ -292,7 +292,7 @@ fontSpec = HbFontSpec(HbFontSpec::Primary); qreal textPaneHeight = 0; style()->parameter(QLatin1String("hb-param-text-height-primary"), textPaneHeight); - fontSpec.setTextPaneHeight( textPaneHeight ); + fontSpec.setTextHeight( textPaneHeight ); } break; diff -r 89c329efa980 -r e48454f237ca ganeswidgets/src/hgindexfeedback_p.cpp --- a/ganeswidgets/src/hgindexfeedback_p.cpp Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/src/hgindexfeedback_p.cpp Mon May 03 13:32:54 2010 +0300 @@ -83,7 +83,8 @@ mThreeCharHeight(1.0), mThreeCharWidth(1.0), mStringOffset(0.0), - mWidget(0) + mWidget(0), + mScrollBarPressed(false) { } diff -r 89c329efa980 -r e48454f237ca ganeswidgets/src/hgmediawall.cpp --- a/ganeswidgets/src/hgmediawall.cpp Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/src/hgmediawall.cpp Mon May 03 13:32:54 2010 +0300 @@ -19,13 +19,22 @@ #include "hgmediawall_p.h" #include "hgwidgets_p.h" #include "hgcoverflowcontainer.h" +#include -HgMediawall::HgMediawall(QGraphicsItem *parent ): - HgWidget(new HgMediawallPrivate, parent) +HgMediawall::HgMediawall(QGraphicsItem *parent ) : + HgWidget( *new HgMediawallPrivate, parent ) { Q_D(HgMediawall); d->q_ptr = this; - d->init(); + d->init(mainWindow()->orientation()); +} + +HgMediawall::HgMediawall(HgMediawallPrivate &dd, QGraphicsItem *parent) : + HgWidget( dd, parent ) +{ + Q_D(HgMediawall); + d->q_ptr = this; + d->init(mainWindow()->orientation()); } HgMediawall::~HgMediawall() @@ -110,4 +119,40 @@ return d->descriptionFontSpec(); } +/*! + * Sets front item delta from the center of the widget. + */ +void HgMediawall::setFrontItemPositionDelta(const QPointF& position) +{ + Q_D(HgMediawall); + return d->container()->setFrontItemPositionDelta(position); +} + +/*! + * Gets current front items position delta. + */ +QPointF HgMediawall::frontItemPositionDelta() const +{ + Q_D(const HgMediawall); + return d->container()->frontItemPositionDelta(); +} + +/** + * Enables/disables reflections in the mediawall. + */ +void HgMediawall::enableReflections(bool enabled) +{ + Q_D(HgMediawall); + d->container()->enableReflections(enabled); +} + +/** + * Returns true if reflections are enabled. + */ +bool HgMediawall::reflectionsEnabled() const +{ + Q_D(const HgMediawall); + return d->container()->reflectionsEnabled(); +} + // EOF diff -r 89c329efa980 -r e48454f237ca ganeswidgets/src/hgmediawall_p.cpp --- a/ganeswidgets/src/hgmediawall_p.cpp Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/src/hgmediawall_p.cpp Mon May 03 13:32:54 2010 +0300 @@ -19,9 +19,10 @@ #include "hgcoverflowcontainer.h" #include "trace.h" -HgMediawallPrivate::HgMediawallPrivate() +HgMediawallPrivate::HgMediawallPrivate() : HgWidgetPrivate() { FUNC_LOG; + mStaticScrollDirection = true; } HgMediawallPrivate::~HgMediawallPrivate() @@ -29,14 +30,14 @@ FUNC_LOG; } -void HgMediawallPrivate::init() +void HgMediawallPrivate::init(Qt::Orientation orientation) { FUNC_LOG; Q_Q(HgMediawall); HgCoverflowContainer* container = new HgCoverflowContainer(q); // Mediawall supports only horizontal scrolling. - container->init(Qt::Horizontal); + container->init(orientation); HgWidgetPrivate::init(container); } diff -r 89c329efa980 -r e48454f237ca ganeswidgets/src/hgmediawallrenderer.cpp --- a/ganeswidgets/src/hgmediawallrenderer.cpp Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/src/hgmediawallrenderer.cpp Mon May 03 13:32:54 2010 +0300 @@ -35,7 +35,6 @@ #include #include -const Qt::Orientation KDefaultOrientation(Qt::Vertical); const qreal KPi = 3.1415926535897932384626433832795; static qreal lerp(qreal start, qreal end, qreal t) @@ -99,13 +98,14 @@ MyVectorAnimation mScaleAnimation; }; -HgMediaWallRenderer::HgMediaWallRenderer(HgMediaWallDataProvider* provider) : +HgMediaWallRenderer::HgMediaWallRenderer(HgMediaWallDataProvider* provider, + Qt::Orientation scrollDirection, bool coverflowMode) : mDataProvider(provider), mRenderer(NULL), mIndicatorRenderer(NULL), mRendererInitialized(false), - mOrientation(KDefaultOrientation), - mNextOrientation(KDefaultOrientation), + mOrientation(scrollDirection), + mNextOrientation(scrollDirection), mStateAnimationAlpha(0), mStateAnimationOnGoing(false), mAnimationAlpha(0), @@ -113,7 +113,7 @@ mOpenedItem(-1), mFlipAngle(qreal(360)), mZoomAmount(qreal(0.5)), - mCoverflowMode(false), + mCoverflowMode(coverflowMode), mRowCount(1), mNextRowCount(1), mStateAnimationDuration(300), @@ -127,12 +127,18 @@ mFrontCoverElevation(0.4), mReflectionsEnabled(true), mItemCountChanged(false), - mOpenedItemState(ItemClosed) + mOpenedItemState(ItemClosed), + mFrontItemPosition(0,0), + mFrontItemPositionSet(false) { createStateMachine(); mImageFader = new HgImageFader(); mRenderer = new HgVgQuadRenderer(256); mRendererInitialized = true; + if (mCoverflowMode) { + mOrientation = Qt::Horizontal; + mNextOrientation = mOrientation; + } } HgMediaWallRenderer::~HgMediaWallRenderer() @@ -369,6 +375,14 @@ void HgMediaWallRenderer::setOrientation(Qt::Orientation orientation, bool animate) { + // coverflow is always horizontal + if (mCoverflowMode) + { + mOrientation = Qt::Horizontal; + mNextOrientation = mOrientation; + return; + } + if (mOrientation != orientation) { mStateMachine->setAnimated(animate); @@ -390,6 +404,7 @@ void HgMediaWallRenderer::drawQuads(QPainter* painter) { + mRenderer->transformQuads(mViewMatrix, mProjMatrix, mRect); mRenderer->drawQuads(mRect, painter); @@ -530,11 +545,21 @@ mViewMatrix = view; mProjMatrix = proj; - - qreal mirrorPlaneY = getRowPosY(mRowCount-1)-mImageSize3D.height()/2; + + qreal mirrorPlaneY; + if (mCoverflowMode) + { + mirrorPlaneY = -mImageSize3D.height()/2; + } + else // grid + { + mirrorPlaneY = getRowPosY(mRowCount-1)-mImageSize3D.height()/2; + } + mRenderer->setMirroringPlaneY(mirrorPlaneY); } + void HgMediaWallRenderer::updateSpacingAndImageSize() { qreal div = mRect.width() <= mRect.height() ? mRect.width() : mRect.height(); @@ -645,14 +670,16 @@ qreal HgMediaWallRenderer::getWorldWidth() const { - qreal width = (qreal)mDataProvider->imageCount() / (qreal)mRowCount - 1.0f; + qreal width = ceil((qreal)mDataProvider->imageCount() / (qreal)mRowCount - 1.0f); + // if we are in vertical orientation we want last and first item + // to place at the top and bottom of the screen instead of center if (mOrientation == Qt::Vertical) { qreal step = mSpacing2D.height() + mImageSize2D.height(); width -= (mRect.height() / step - 1.0f); } - + return width; } @@ -731,8 +758,8 @@ qreal frac = (position.x() - ipos) * step; qreal posX = -(qreal)(selectedItemIndex + 0) * step - frac; qreal zFar = -mFrontCoverElevation; - qreal posY = 0; - + qreal posY = 0; + int count = mDataProvider->imageCount(); int quadIndex = 0; int itemIndex = ((int)(ipos - (qreal)selectedItemIndex)); @@ -974,4 +1001,15 @@ return mRenderer->getVisibleQuads(QRectF(0, 0, mRect.width(), mRect.height())); } +void HgMediaWallRenderer::setFrontItemPosition(const QPointF& position) +{ + mFrontItemPosition = position; + + mRenderer->setTranslation( + QVector2D(position.x(), position.y())); +} +QPointF HgMediaWallRenderer::frontItemPosition() const +{ + return mFrontItemPosition; +} diff -r 89c329efa980 -r e48454f237ca ganeswidgets/src/hgquadrenderer.cpp --- a/ganeswidgets/src/hgquadrenderer.cpp Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/src/hgquadrenderer.cpp Mon May 03 13:32:54 2010 +0300 @@ -54,3 +54,29 @@ mImageFader = fader; } +void HgQuadRenderer::setDefaultImage(QImage defaultImage) +{ + mDefaultImage = defaultImage; +} + +void HgQuadRenderer::setTranslation(const QVector2D& translate) +{ + mTranslation = translate; +} + +HgQuad* HgQuadRenderer::getQuadByUserData(const QVariant& userData) const +{ + for (int i = 0; i < mQuads.count(); i++) + { + HgQuad* quad = mQuads[i]; + if (quad->userData() == userData) + return quad; + } + return NULL; +} + +QImage HgQuadRenderer::getDefaultImage() const +{ + return mDefaultImage; +} + diff -r 89c329efa980 -r e48454f237ca ganeswidgets/src/hgvgimage.cpp --- a/ganeswidgets/src/hgvgimage.cpp Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/src/hgvgimage.cpp Mon May 03 13:32:54 2010 +0300 @@ -75,7 +75,7 @@ } -void HgVgImage::setImage(QImage& image) +void HgVgImage::setImage(const QImage& image) { if (image.isNull()) return; @@ -89,6 +89,12 @@ } +QImage HgVgImage::getQImage() const +{ + return mQImage; +} + + void HgVgImage::releaseImage() { if (mVgImage != VG_INVALID_HANDLE) @@ -108,6 +114,8 @@ void HgVgImage::upload(bool mirror) { + if( mQImage.isNull()) + return; if (mVgImage == VG_INVALID_HANDLE) { @@ -140,8 +148,12 @@ return; } - vgImageSubData(mVgImage, mQImage.bits(), mQImage.bytesPerLine(), - format, 0, 0, mQImage.width(), mQImage.height() ); + // bits function performs deep copy if we dont fetch data with const specifier. + const uchar *bits = mQImage.bits(); + + vgImageSubData(mVgImage, bits, mQImage.bytesPerLine(), + format, 0, 0, mQImage.width(), mQImage.height() ); + } if (mirror && mMirrorImage == VG_INVALID_HANDLE) @@ -162,10 +174,10 @@ { qreal t = qreal(i) / qreal(mirrorImage.height()); int a = (int)(t * 255.0); + uchar* scanline = mirrorImage.scanLine(i); for (int j = 0; j < mirrorImage.width(); j++) { - QRgb rgb = mirrorImage.pixel(j, i); - mirrorImage.setPixel(j, i, qRgba(qRed(rgb), qGreen(rgb), qBlue(rgb), a)); + scanline[j*4+3] = a; } } diff -r 89c329efa980 -r e48454f237ca ganeswidgets/src/hgvgquadrenderer.cpp --- a/ganeswidgets/src/hgvgquadrenderer.cpp Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/src/hgvgquadrenderer.cpp Mon May 03 13:32:54 2010 +0300 @@ -38,18 +38,20 @@ int index() const; bool isPointInside(const QPointF& point) const; void transformQuad(int index, const QMatrix4x4& matrix, HgQuad* quad, - const QRectF& rect, qreal mirroringPlaneY); + const QRectF& rect, qreal mirroringPlaneY, const QVector2D& translate); void draw(); void getTransformedPoints(QPolygonF& polygon) const; void computeMirrorMatrix(const QMatrix4x4& tm, const QMatrix4x4& projView, - const QRectF& rect, qreal mirroringPlaneY); + const QRectF& rect, qreal mirroringPlaneY, + const QVector2D& translate); bool perspectiveTransformPoints(QVector2D* points, const QMatrix4x4& matrix, const QRectF& rect); - void computeWarpMatrix(VGfloat* matrix, int pxWidth, int pxHeight, const QVector2D* points); + void computeWarpMatrix(VGfloat* matrix, int pxWidth, int pxHeight, const QVector2D* points, + const QVector2D& translate); void drawImage(HgVgImage* image, qreal alpha); @@ -99,7 +101,7 @@ void HgVgQuad::computeMirrorMatrix(const QMatrix4x4& trans, const QMatrix4x4& projView, - const QRectF& rect, qreal mirroringPlaneY) + const QRectF& rect, qreal mirroringPlaneY, const QVector2D& translate) { HgQuad* quad = mQuad; @@ -122,16 +124,19 @@ if (image == NULL) { image = mRenderer->defaultImage(); + if (!image) { + return; + } } int pxWidth = image->mirrorImageWidth(); int pxHeight = image->mirrorImageHeight(); - computeWarpMatrix(mMirrorMatrix, pxWidth, pxHeight, temp); + computeWarpMatrix(mMirrorMatrix, pxWidth, pxHeight, temp, translate); } void HgVgQuad::transformQuad(int index, const QMatrix4x4& projView, HgQuad* quad, - const QRectF& rect, qreal mirroringPlaneY) + const QRectF& rect, qreal mirroringPlaneY, const QVector2D& translate) { mIndex = index; mQuad = quad; @@ -142,7 +147,7 @@ if (mQuad->mirrorImageEnabled()) { - computeMirrorMatrix(tm, projView, rect, mirroringPlaneY); + computeMirrorMatrix(tm, projView, rect, mirroringPlaneY, translate); } tm.translate(quad->position()); @@ -163,12 +168,18 @@ if (image == NULL) { image = mRenderer->defaultImage(); + if (!image) + return; } int pxWidth = image->width(); int pxHeight = image->height(); - computeWarpMatrix(mMatrix, pxWidth, pxHeight, mTransformedPoints); + + computeWarpMatrix(mMatrix, pxWidth, pxHeight, mTransformedPoints, translate); + + for (int i = 0; i < 4; i++) + mTransformedPoints[i] += translate; } @@ -199,13 +210,15 @@ return true; } -void HgVgQuad::computeWarpMatrix(VGfloat* matrix, int pxWidth, int pxHeight, const QVector2D* points) +void HgVgQuad::computeWarpMatrix(VGfloat* matrix, int pxWidth, int pxHeight, const QVector2D* points, + const QVector2D& translate) { + vguComputeWarpQuadToQuad( - points[0].x(), points[0].y(), - points[1].x(), points[1].y(), - points[2].x(), points[2].y(), - points[3].x(), points[3].y(), + points[0].x() + translate.x(), points[0].y() + translate.y(), + points[1].x() + translate.x(), points[1].y() + translate.y(), + points[2].x() + translate.x(), points[2].y() + translate.y(), + points[3].x() + translate.x(), points[3].y() + translate.y(), 0, pxHeight, pxWidth, pxHeight, pxWidth, 0, @@ -232,8 +245,9 @@ if (image == NULL || image->alpha() == 0) { - return; - //drawImage(mRenderer->defaultImage(), 1.0f); + if (mRenderer->defaultImage()) { + drawImage(mRenderer->defaultImage(), 1.0f); + } } else { @@ -241,14 +255,18 @@ if (image->image() == VG_INVALID_HANDLE) { - drawImage(mRenderer->defaultImage(), 1.0f); + if (mRenderer->defaultImage()) { + drawImage(mRenderer->defaultImage(), 1.0f); + } } else { if ( mQuad->alpha() < 1.0f ) { - drawImage(mRenderer->defaultImage(), 1.0f - mQuad->alpha()); + if (mRenderer->defaultImage()) { + drawImage(mRenderer->defaultImage(), 1.0f - mQuad->alpha()); + } } drawImage(image, mQuad->alpha()); @@ -354,7 +372,7 @@ if (q->visible()) { - tq->transformQuad(i, pv, q, rect, mMirroringPlaneY); + tq->transformQuad(i, pv, q, rect, mMirroringPlaneY, mTranslation); mSortedQuads.append(tq); } } @@ -434,7 +452,10 @@ HgVgImage* HgVgQuadRenderer::defaultImage() { - if (mDefaultVgImage == NULL) + if (mDefaultVgImage && mDefaultVgImage->image() == VG_INVALID_HANDLE) { + mDefaultVgImage->upload(true); + } +/* if (mDefaultVgImage == NULL) { QImage defaultImage(64,64,QImage::Format_RGB16); defaultImage.fill(qRgb(255,0,0)); @@ -442,9 +463,20 @@ mDefaultVgImage->setImage(defaultImage); mDefaultVgImage->upload(true); } + */ return mDefaultVgImage; } +void HgVgQuadRenderer::setDefaultImage(QImage defaultImage) +{ + HgQuadRenderer::setDefaultImage(defaultImage); + delete mDefaultVgImage; + mDefaultVgImage = 0; + mDefaultVgImage = static_cast(createNativeImage()); + mDefaultVgImage->setImage(mDefaultImage); + mDefaultVgImage->upload(true); +} + HgImageFader* HgVgQuadRenderer::imageFader() { return mImageFader; diff -r 89c329efa980 -r e48454f237ca ganeswidgets/src/hgwidgetitem.cpp --- a/ganeswidgets/src/hgwidgetitem.cpp Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/src/hgwidgetitem.cpp Mon May 03 13:32:54 2010 +0300 @@ -16,9 +16,11 @@ */ #include "hgwidgetitem.h" #include "hgquadrenderer.h" +#include "trace.h" #include #include #include +#include "hgvgimage.h" HgWidgetItem::HgWidgetItem(HgQuadRenderer* renderer): mTitle(""), @@ -48,13 +50,15 @@ delete mHgImage; } -void HgWidgetItem::setImage( QImage image ) +void HgWidgetItem::setImage(const QImage &image) { if (!mHgImage) { mHgImage = mRenderer->createNativeImage(); } + mHgImage->setImage(image); + if (!mVisibility) mHgImage->setAlpha(0); @@ -120,8 +124,11 @@ if (size.width() != 0 && size.height() != 0 ){ QPixmap pixmap = qicon.pixmap(size); if (!pixmap.isNull()){ - setImage(pixmap.toImage()); - mValidData = true; + QImage tempImage = pixmap.toImage(); + if (!tempImage.isNull()) { + setImage(tempImage); + mValidData = true; + } } break; } @@ -133,15 +140,25 @@ // QIcon too. QIcon tempIcon = image.value(); QList sizes = tempIcon.availableSizes(); - QSize size; - foreach(size, sizes){ - if (size.width() != 0 && size.height() != 0 ){ - QPixmap pixmap = tempIcon.pixmap(size); - if (!pixmap.isNull()){ - setImage(pixmap.toImage()); - mValidData = true; + if (sizes.count() == 0 && !(tempIcon.isNull())) { + QPixmap pixmap = tempIcon.pixmap(tempIcon.actualSize(QSize(250, 250))); + if (!pixmap.isNull()){ + INFO("Valid image found for" << mModelIndex); + setImage(pixmap.toImage()); + mValidData = true; + } + } + else { + QSize size; + foreach(size, sizes){ + if (size.width() != 0 && size.height() != 0 ){ + QPixmap pixmap = tempIcon.pixmap(size); + if (!pixmap.isNull()){ + setImage(pixmap.toImage()); + mValidData = true; + } + break; } - break; } } } @@ -165,6 +182,9 @@ mValidData = false; if (mHgImage) mHgImage->releaseImage(); + + delete mHgImage; + mHgImage = 0; } bool HgWidgetItem::validData() const diff -r 89c329efa980 -r e48454f237ca ganeswidgets/src/hgwidgets.cpp --- a/ganeswidgets/src/hgwidgets.cpp Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/src/hgwidgets.cpp Mon May 03 13:32:54 2010 +0300 @@ -30,18 +30,31 @@ #include "hggridcontainer.h" #include "trace.h" -HgWidget::HgWidget(HbWidgetPrivate* widgetPrivate, QGraphicsItem *parent ): - HbWidget(*widgetPrivate, parent) + + +HgWidget::HgWidget( QGraphicsItem *parent ) : HbWidget(parent), p_ptr( new HgWidgetPrivate ) { - Q_D(HgWidget); - d->q_ptr = this; - + HbStyleLoader::registerFilePath(":/hgwidget.css"); HbStyleLoader::registerFilePath(":/hgwidget.widgetml"); + + Q_D( HgWidget ); + d->q_ptr = this; +} + +HgWidget::HgWidget(HgWidgetPrivate &dd, QGraphicsItem *parent ): + HbWidget(parent), p_ptr( &dd ) +{ + HbStyleLoader::registerFilePath(":/hgwidget.css"); + HbStyleLoader::registerFilePath(":/hgwidget.widgetml"); + Q_D( HgWidget ); + d->q_ptr = this; } HgWidget::~HgWidget() { + delete p_ptr; + HbStyleLoader::unregisterFilePath(":/hgwidget.css"); HbStyleLoader::unregisterFilePath(":/hgwidget.widgetml"); } @@ -129,19 +142,7 @@ void HgWidget::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight) { Q_D( HgWidget); - // TODO,take columns into count - for( int i = topLeft.row(); i <= bottomRight.row(); i++ ){ - // if data for item outside our current buffer has changed - // we just have to ignore it since we dont have resources - // to handle it(or we dont want to waste resources). - if(d->mBufferManager->positionInsideBuffer(i)){ - HgWidgetItem* item = d->mContainer->itemByIndex( i ); - if( item ){ - item->updateItemData(); - } - } - } - d->mContainer->itemDataChanged( topLeft, bottomRight ); + d->dataChanged(topLeft, bottomRight); } /*! @@ -322,4 +323,47 @@ return d->indexFeedbackPolicy(); } +void HgWidget::setDefaultImage(QImage defaultImage) +{ + Q_D(HgWidget); + d->setDefaultImage(defaultImage); +} + +void HgWidget::setItemSizePolicy(HgWidget::ItemSizePolicy policy) +{ + Q_D(HgWidget); + d->setItemSizePolicy(policy); +} + +HgWidget::ItemSizePolicy HgWidget::itemSizePolicy() const +{ + Q_D(const HgWidget); + return d->itemSizePolicy(); +} + +void HgWidget::setItemSize(const QSizeF& size) +{ + Q_D(HgWidget); + d->setItemSize(size); +} + +QSizeF HgWidget::itemSize() const +{ + Q_D(const HgWidget); + return d->itemSize(); +} + +void HgWidget::setItemSpacing(const QSizeF& spacing) +{ + Q_D(HgWidget); + d->setItemSpacing(spacing); +} + +QSizeF HgWidget::itemSpacing() const +{ + Q_D(const HgWidget); + return d->itemSpacing(); +} + + // EOF diff -r 89c329efa980 -r e48454f237ca ganeswidgets/src/hgwidgets_p.cpp --- a/ganeswidgets/src/hgwidgets_p.cpp Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/src/hgwidgets_p.cpp Mon May 03 13:32:54 2010 +0300 @@ -29,7 +29,7 @@ #include "hgindexfeedback.h" static const int INITIAL_SCROLLBAR_HIDE_TIMEOUT(4000); -static const int DEFAULT_BUFFER_SIZE(40); +static const int DEFAULT_BUFFER_SIZE(30); HgWidgetPrivate::HgWidgetPrivate() : mLayout(0), @@ -41,7 +41,8 @@ mScrollBar(0), mAbleToScroll(false), mHandleLongPress(false), - mBufferSize(DEFAULT_BUFFER_SIZE) + mBufferSize(DEFAULT_BUFFER_SIZE), + mStaticScrollDirection(false) { FUNC_LOG; } @@ -50,6 +51,7 @@ { FUNC_LOG; + delete mScrollBarHideTimer; delete mDefaultSelectionModel; delete mBufferManager; } @@ -59,16 +61,16 @@ FUNC_LOG; Q_Q(HgWidget); - mScrollBarHideTimer.setParent(q); - mScrollBarHideTimer.setSingleShot(true); + mScrollBarHideTimer = new QTimer(); + mScrollBarHideTimer->setSingleShot(true); q->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); q->setFlag( QGraphicsItem::ItemClipsChildrenToShape, true ); q->setFocusPolicy(Qt::StrongFocus); - createScrollBar(container->orientation()); + createScrollBar(container->scrollDirection()); - QObject::connect(&(mScrollBarHideTimer), SIGNAL(timeout()), q, SLOT(_q_hideScrollBars())); + //QObject::connect(&(mScrollBarHideTimer), SIGNAL(timeout()), q, SLOT(_q_hideScrollBars())); mContainer = container; @@ -82,6 +84,7 @@ q, SIGNAL(longPressed(const QModelIndex&, const QPointF &))); q->connect(mContainer, SIGNAL(scrollingStarted()), q, SIGNAL(scrollingStarted())); q->connect(mContainer, SIGNAL(scrollingEnded()), q, SIGNAL(scrollingEnded())); + q->connect(mScrollBarHideTimer, SIGNAL(timeout()), q, SLOT(_q_hideScrollBars())); mIndexFeedback = new HgIndexFeedback(q); mIndexFeedback->setWidget(q); @@ -214,6 +217,7 @@ if (index.isValid()) { if (mContainer) { mContainer->scrollTo(index); + updateScrollMetrics(mContainer->scrollPosition()); } if (mBufferManager) { mBufferManager->scrollPositionChanged(index.row()); @@ -244,28 +248,20 @@ SLOT(_q_removeRows(QModelIndex, int, int))); q->connect(mModel, SIGNAL(rowsMoved(QModelIndex, int, int, QModelIndex, int)), SLOT(_q_moveRows(QModelIndex, int, int, QModelIndex, int))); - + q->connect(mModel, SIGNAL(modelReset()),SLOT(_q_modelReset())); + mContainer->setItemCount(mModel->rowCount(QModelIndex())); QList items = mContainer->items(); // set model indexes for the items firsts - int itemCount = items.count(); + const int itemCount = items.count(); for( int i=0; isetModelIndex(mModel->index(i, 0, QModelIndex())); } - if( mBufferManager ) - { - delete mBufferManager; - mBufferManager = 0; - } - - mBufferManager = new HgScrollBufferManager(mBufferSize,mBufferSize/4,0,itemCount); - q->connect( mBufferManager, SIGNAL(releaseItems(int,int)), q, SLOT(_q_releaseItems(int,int))); - q->connect( mBufferManager, SIGNAL(requestItems(int,int)), q, SLOT(_q_requestItems(int,int))); - mBufferManager->resetBuffer(0, itemCount); - + initBufferManager(itemCount); + setSelectionModel(0); // Default if (mModel->rowCount() > 0) @@ -286,9 +282,12 @@ mModel->disconnect(q, SLOT(_q_insertRows(QModelIndex, int, int))); mModel->disconnect(q, SLOT(_q_removeRows(QModelIndex, int, int))); mModel->disconnect(q, SLOT(_q_moveRows(QModelIndex, int, int, QModelIndex, int))); + mModel->disconnect(q, SLOT(_q_modelReset())); mModel = 0; } - + else if (mContainer) { + mContainer->setItemCount(0); + } // TODO: setSelectionModel(0); } @@ -391,8 +390,9 @@ mScrollBar->setVisible(false); } - if (scrollBarsVisible && !mScrollBarHideTimer.isActive()) { - mScrollBarHideTimer.start(INITIAL_SCROLLBAR_HIDE_TIMEOUT); + if (scrollBarsVisible) { + mScrollBarHideTimer->stop(); + mScrollBarHideTimer->start(INITIAL_SCROLLBAR_HIDE_TIMEOUT); } } @@ -430,7 +430,7 @@ // only scrollareaprivate is a friend class. if (false/*scrollBarPressed(mHorizontalScrollBar) || scrollBarPressed(mVerticalScrollBar)*/) { - mScrollBarHideTimer.start(); + mScrollBarHideTimer->start(); } else if(mScrollBarPolicy != HgWidget::ScrollBarAlwaysOn && mScrollBar->isVisible()){ mScrollBar->setVisible(false); @@ -450,9 +450,9 @@ // TODO, stop all scrolling and animations - if (mScrollBarHideTimer.isActive()) { - mScrollBarHideTimer.stop(); - mScrollBarHideTimer.start(); + if (mScrollBarHideTimer->isActive()) { + mScrollBarHideTimer->stop(); + mScrollBarHideTimer->start(); } } @@ -464,6 +464,8 @@ Q_Q(HgWidget); if (mContainer) { + int oldItemCount = mContainer->itemCount(); + mBufferManager->addItems(start, end); mContainer->addItems(start, end); // re-set model indexes for the items including and after the added indexes QList items = mContainer->items(); @@ -471,7 +473,10 @@ for (int i = start; i < newItemCount; i++) { items.at(i)->setModelIndex(mModel->index(i, 0, QModelIndex())); } - mBufferManager->addItems(start, end, newItemCount); + mBufferManager->flushRequestBuffers(); + if (oldItemCount == 0 && newItemCount > 0) { + setCurrentIndex(mModel->index(0, 0)); + } q->update(); } } @@ -484,14 +489,19 @@ Q_Q(HgWidget); if (mContainer && mBufferManager) { - mContainer->removeItems(start, end); + int itemCount = mContainer->itemCount(); + int first= qBound(0, start, itemCount-1); + int last = qBound(0, end, itemCount-1); + + mBufferManager->removeItems(first, last); + mContainer->removeItems(first, last); // re-set model indexes for the items after the removed indexes QList items = mContainer->items(); int newItemCount = items.count(); - for (int i = start; i < newItemCount; i++) { + for (int i = first; i < newItemCount; i++) { items.at(i)->setModelIndex(mModel->index(i, 0, QModelIndex())); } - mBufferManager->removeItems(start, end, newItemCount); + mBufferManager->flushRequestBuffers(); q->update(); } } @@ -508,17 +518,49 @@ if (mContainer) { mContainer->moveItems(sourceStart, sourceEnd, destinationRow); + mBufferManager->moveItems(sourceStart, sourceEnd, destinationRow); // re-set model indexes for the items after the removed indexes QList items = mContainer->items(); int itemCount = items.count(); for (int i = qMin(sourceStart, destinationRow); i < itemCount; i++) { items.at(i)->setModelIndex(mModel->index(i, 0, QModelIndex())); } - mBufferManager->moveItems(sourceStart, sourceEnd, destinationRow, itemCount); + mBufferManager->flushRequestBuffers(); q->update(); } } +void HgWidgetPrivate::_q_modelReset() +{ + if (mContainer && mBufferManager) { + const int oldItemCount = mContainer->itemCount(); + const int newItemCount = mModel->rowCount(); + if (newItemCount == oldItemCount) { + // Model is reseted but itemcount is still the same. + // Just reload all data for current buffer. + mBufferManager->resetBuffer(mContainer->scrollPosition(), newItemCount); + } + else { + // Container destroyes all old items when new itemcount is set. + mContainer->setItemCount(newItemCount); + + // set model indexes for the items + QList items = mContainer->items(); + const int itemCount = items.count(); + for( int i=0; isetModelIndex(mModel->index(i, 0, QModelIndex())); + } + + // Buffermanager requests items to be updated. + mBufferManager->resetBuffer(0, newItemCount); + if (mModel->rowCount() > 0) { + setCurrentIndex(mModel->index(0, 0)); + scrollTo(mModel->index(0, 0)); + } + } + } +} + void HgWidgetPrivate::setScrollBarMetrics(qreal pos) { Q_Q( HgWidget ); @@ -564,9 +606,6 @@ QRectF scrollAreaBoundingRect = q->boundingRect(); - if (!mContainer || scrollAreaBoundingRect.isNull() || - !scrollAreaBoundingRect.isValid()) - return; qreal screenSize, worldSize; mContainer->dimensions(screenSize,worldSize); @@ -592,7 +631,7 @@ mContainer->resize(scrollAreaBoundingRect.size()); - updateScrollMetrics(0); + updateScrollMetrics(mContainer->scrollPosition()); } @@ -635,9 +674,11 @@ { Q_Q(HgWidget); if (mContainer->orientation() != orientation) { - createScrollBar(orientation); + mContainer->setOrientation(orientation); + if (!mStaticScrollDirection) { + createScrollBar(orientation); + } q->repolish(); - mContainer->setOrientation(orientation); adjustGeometry(); } } @@ -690,4 +731,74 @@ return mIndexFeedback->indexFeedbackPolicy(); } +void HgWidgetPrivate::setDefaultImage(QImage defaultImage) +{ + mContainer->setDefaultImage(defaultImage); +} + +void HgWidgetPrivate::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight) +{ + FUNC_LOG; + + // TODO,take columns into count + for( int i = topLeft.row(); i <= bottomRight.row(); i++ ){ + // if data for item outside our current buffer has changed + // we just have to ignore it since we dont have resources + // to handle it(or we dont want to waste resources). + if (mBufferManager->positionInsideBuffer(i)) { + HgWidgetItem* item = mContainer->itemByIndex( i ); + if (item) { + item->updateItemData(); + } + } + } + mContainer->itemDataChanged(topLeft, bottomRight); +} + +void HgWidgetPrivate::setItemSizePolicy(HgWidget::ItemSizePolicy policy) +{ + mContainer->setItemSizePolicy(policy); +} + +HgWidget::ItemSizePolicy HgWidgetPrivate::itemSizePolicy() const +{ + return mContainer->itemSizePolicy(); +} + +void HgWidgetPrivate::setItemSize(const QSizeF& size) +{ + mContainer->setItemSize(size); +} + +QSizeF HgWidgetPrivate::itemSize() const +{ + return mContainer->itemSize(); +} + +void HgWidgetPrivate::setItemSpacing(const QSizeF& spacing) +{ + mContainer->setItemSpacing(spacing); +} + +QSizeF HgWidgetPrivate::itemSpacing() const +{ + return mContainer->itemSpacing(); +} + +void HgWidgetPrivate::initBufferManager(int itemCount) +{ + Q_Q(HgWidget); + if (mBufferManager) { + q->disconnect( mBufferManager, SIGNAL(releaseItems(int,int)), q, SLOT(_q_releaseItems(int,int))); + q->disconnect( mBufferManager, SIGNAL(requestItems(int,int)), q, SLOT(_q_requestItems(int,int))); + delete mBufferManager; + mBufferManager = 0; + } + + mBufferManager = new HgScrollBufferManager(mBufferSize,qMax(mContainer->rowCount()*2,3),0,itemCount); + q->connect( mBufferManager, SIGNAL(releaseItems(int,int)), q, SLOT(_q_releaseItems(int,int))); + q->connect( mBufferManager, SIGNAL(requestItems(int,int)), q, SLOT(_q_requestItems(int,int))); + mBufferManager->resetBuffer(0, itemCount); +} + #include "moc_hgwidgets.cpp" diff -r 89c329efa980 -r e48454f237ca ganeswidgets/tsrc/fute/HgWidgetTest/hgwidgettest.pro --- a/ganeswidgets/tsrc/fute/HgWidgetTest/hgwidgettest.pro Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/tsrc/fute/HgWidgetTest/hgwidgettest.pro Mon May 03 13:32:54 2010 +0300 @@ -8,39 +8,44 @@ # Nokia Corporation - initial contribution. # Contributors: # Description: - - TEMPLATE = app CONFIG += hb TARGET = hgwidgettest DEPENDPATH += . INCLUDEPATH += . -INCLUDEPATH += $$MW_LAYER_SYSTEMINCLUDE $$APP_LAYER_SYSTEMINCLUDE -TARGET.CAPABILITY = All -TCB - -INCLUDEPATH += /sf/mw/hb/src/hbwidgets/itemviews /sf/mw/hb/src/hbcore/gui - -symbian { - TARGET.EPOCHEAPSIZE = 0x10000 0x2000000 +INCLUDEPATH += $$MW_LAYER_SYSTEMINCLUDE \ + $$APP_LAYER_SYSTEMINCLUDE +TARGET.CAPABILITY = All \ + -TCB +INCLUDEPATH += /sf/mw/hb/src/hbwidgets/itemviews \ + /sf/mw/hb/src/hbcore/gui +symbian { + TARGET.EPOCHEAPSIZE = 0x10000 \ + 0x2000000 BLD_INF_RULES.prj_exports += "rom/hgwidgettest.iby CORE_APP_LAYER_IBY_EXPORT_PATH(hgwidgettest.iby)" \ - "rom/hgwidgettestresource.iby LANGUAGE_APP_LAYER_IBY_EXPORT_PATH(hgwidgettestresource.iby)" + "rom/hgwidgettestresource.iby LANGUAGE_APP_LAYER_IBY_EXPORT_PATH(hgwidgettestresource.iby)" } - -SOURCES += src/main.cpp \ - src/hgwidgettestdatamodel.cpp \ - src/hgwidgettestalbumartmanager.cpp \ - src/hgwidgettestview.cpp \ - src/hgtestview.cpp \ - src/hgselectiondialog.cpp \ - src/hgflipwidget.cpp -HEADERS += inc/hgwidgettestdatamodel.h \ - inc/hgwidgettestalbumartmanager.h \ - inc/hgwidgettestview.h \ - inc/hgtestview.h \ - inc/hgselectiondialog.h \ - inc/hgflipwidget.h +SOURCES += src/hgcoverflowwidget.cpp \ + src/hgwidgetoptionsview.cpp \ + src/main.cpp \ + src/hgwidgettestdatamodel.cpp \ + src/hgwidgettestalbumartmanager.cpp \ + src/hgwidgettestview.cpp \ + src/hgtestview.cpp \ + src/hgselectiondialog.cpp \ + src/hgflipwidget.cpp \ + src/buffermanager.cpp \ + src/hgitemsizedialog.cpp +HEADERS += inc/hgcoverflowwidget.h \ + inc/hgwidgetoptionsview.h \ + inc/hgwidgettestdatamodel.h \ + inc/hgwidgettestalbumartmanager.h \ + inc/hgwidgettestview.h \ + inc/hgtestview.h \ + inc/hgselectiondialog.h \ + inc/hgflipwidget.h \ + inc/buffermanager.h \ + inc/hgitemsizedialog.h LIBS += -lganeswidgets.dll \ -lthumbnailmanagerqt.dll - RESOURCES += data/hgwidgettest.qrc - diff -r 89c329efa980 -r e48454f237ca ganeswidgets/tsrc/fute/HgWidgetTest/inc/buffermanager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ganeswidgets/tsrc/fute/HgWidgetTest/inc/buffermanager.h Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,77 @@ +/* +* 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: +* +*/ + +#ifndef BUFFERMANAGER_H_ +#define BUFFERMANAGER_H_ + +class AbstractDataProvider +{ +public: + + enum requestsOrder { + ascending, + descending + }; + + virtual void release(int start, int end) = 0; + virtual void request(int start, int end, requestsOrder order) = 0; +}; + + +class BufferManager +{ +public: + + BufferManager( + AbstractDataProvider* aObserver, + int aBufferSize, + int aBufferTreshold, + int aInitialPosition, + int aTotalCount ); + + ~BufferManager(); + + void setPosition( int aIndex ); + + void resetBuffer( int aPosition, int aTotalCount); + + void itemCountChanged( int aIndex, bool aRemoved, int aNewTotalCount ); + void resizeCache(int newSize, int newTreshold); + +private: + void calculate(); + +private: + AbstractDataProvider* mObserver; + + int mBufferSize; + int mBufferTreshold; + int mBufferPosition; + int mDiff; + int mTotalCount; + + bool mResetOrdered; + + int mRequestStart; + int mRequestCount; + int mReleaseStart; + int mReleaseCount; +}; + + + +#endif /*BUFFERMANAGER_H_*/ diff -r 89c329efa980 -r e48454f237ca ganeswidgets/tsrc/fute/HgWidgetTest/inc/hgcoverflowwidget.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ganeswidgets/tsrc/fute/HgWidgetTest/inc/hgcoverflowwidget.h Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,52 @@ +/* +* Copyright (c) 2010 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: Another view for test application. +* +*/ +#ifndef HGCOVERFLOWWIDGET_H_ +#define HGCOVERFLOWWIDGET_H_ + +#include +#include +#include +#include +#include + +/** + * Coverflowwidget class which adds labels to normal MediaWall + */ +class HgCoverflowWidget : public HgMediawall +{ + Q_OBJECT +public: + + HgCoverflowWidget(QGraphicsItem *parent=0); + virtual ~HgCoverflowWidget(); + + void updateTextPositions(); + +private slots: + void frontItemChanged ( const QModelIndex & current, const QModelIndex & previous ); + +private: + void resizeEvent(QGraphicsSceneResizeEvent *event); + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); + +private: + HbLabel* mTitleLabel; + HbLabel* mDescLabel; + bool mTextPositionsDirty; +}; + +#endif /* HGTESTVIEW_H_ */ diff -r 89c329efa980 -r e48454f237ca ganeswidgets/tsrc/fute/HgWidgetTest/inc/hgitemsizedialog.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ganeswidgets/tsrc/fute/HgWidgetTest/inc/hgitemsizedialog.h Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,59 @@ +/* +* Copyright (c) 2010 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: Another view for test application. +* +*/ +#ifndef HGITEMSIZEDIALOG_H_ +#define HGITEMSIZEDIALOG_H_ + +#include +#include +#include +#include + +class HgItemSizeDialog : public HbDialog +{ + Q_OBJECT +public: + + HgItemSizeDialog(QSizeF size, QSizeF spacing, HbWidget *parent=0); + + QSizeF itemSize() const; + QSizeF itemSpacing() const; + + void setSliderLimits(int min, int max); + +signals: + void updateItemSizeAndSpacing(); + void closed(); +private slots: + void itemSizeXChanged(int); + void itemSizeYChanged(int); + void itemSpacingXChanged(int); + void itemSpacingYChanged(int); + void buttonClosed(bool); +private: + HbLabel* mSizeXLabel; + HbLabel* mSizeYLabel; + HbLabel* mSpacingXLabel; + HbLabel* mSpacingYLabel; + QSizeF mSize; + QSizeF mSpacing; + HbSlider* mSizeXSlider; + HbSlider* mSizeYSlider; + HbSlider* mSpacingXSlider; + HbSlider* mSpacingYSlider; +}; + +#endif /* HGTESTVIEW_H_ */ diff -r 89c329efa980 -r e48454f237ca ganeswidgets/tsrc/fute/HgWidgetTest/inc/hgtestdefs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ganeswidgets/tsrc/fute/HgWidgetTest/inc/hgtestdefs.h Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,50 @@ +/* +* Copyright (c) 2010 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: +* +*/ + +#ifndef HGTESTDEFS_H_ +#define HGTESTDEFS_H_ + +enum HgTestWidgetType { + HgWidgetNone = 0, + HgWidgetGrid, + HgWidgetCoverflow, + HgWidgetTBone +}; + +enum HgTestImageType { + ImageTypeNone = 0, + ImageTypeQIcon, + ImageTypeHbIcon, + ImageTypeQImage +}; + +static const QString SETT_ORGANIZATION = "Nokia"; +static const QString SETT_APPLICATION = "HgWidgetTestApp"; +static const QString SETT_WIDGET_TYPE = "WidgetType"; +static const QString SETT_SCROLLBAR_VISIBILITY = "ScrollBarVisibility"; +static const QString SETT_SCROLLBAR_INTERACTIVITY = "ScrollBarInteractivity"; +static const QString SETT_MODEL_IMAGE_TYPE = "ModelImageType"; +static const QString SETT_WIDGET_HEIGHT = "WidgetHeight"; +static const QString SETT_WIDGET_WIDTH = "WidgetWidth"; +static const QString SETT_LOW_RES_IMAGES = "LowResImages"; +static const QString SETT_TITLE_POSITION = "TitlePosition"; +static const QString SETT_TITLE_FONT = "TitleFont"; +static const QString SETT_DESCRIPTION_POSITION = "DescriptionPosition"; +static const QString SETT_DESCRIPTION_FONT = "DescriptionFont"; +static const QString SETT_REFLECTIONS_ENABLED = "Reflections enabled"; + +#endif /* HGTESTDEFS_H_ */ diff -r 89c329efa980 -r e48454f237ca ganeswidgets/tsrc/fute/HgWidgetTest/inc/hgtestview.h --- a/ganeswidgets/tsrc/fute/HgWidgetTest/inc/hgtestview.h Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/tsrc/fute/HgWidgetTest/inc/hgtestview.h Mon May 03 13:32:54 2010 +0300 @@ -29,14 +29,13 @@ public: HgTestView(const QString &title1, const QString &title2, const QPixmap &pixmap, QGraphicsItem *parent=0); -private slots: - void closeView(); +signals: + void closeRequested(); private: void resizeEvent(QGraphicsSceneResizeEvent *event); private: - HbAction *mBackAction; HbLabel *mIconLabel; QPixmap mPixmap; }; diff -r 89c329efa980 -r e48454f237ca ganeswidgets/tsrc/fute/HgWidgetTest/inc/hgwidgetoptionsview.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ganeswidgets/tsrc/fute/HgWidgetTest/inc/hgwidgetoptionsview.h Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,68 @@ +/* +* 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: +* +*/ + +#ifndef HGWIDGETOPTIONSVIEW_H_ +#define HGWIDGETOPTIONSVIEW_H_ + +#include +#include +#include "hgtestdefs.h" + +class HbDataForm; +class HbDataFormModel; + +class HgWidgetOptionsView : public HbView +{ + Q_OBJECT + +public: + + HgWidgetOptionsView(QGraphicsItem *parent = 0); + ~HgWidgetOptionsView(); + +signals: + void optionsClosed(); + void widgetTypeChanged(HgTestWidgetType); + void scrollBarVisibilityChanged(HgWidget::ScrollBarPolicy); + void scrollBarInteractivityChanged(bool); + void imageTypeChanged(HgTestImageType); + void lowResImageUseChanged(bool); + void titlePositionChanged(HgMediawall::LabelPosition); + void titleFontChanged(const HbFontSpec &); + void descriptionPositionChanged(HgMediawall::LabelPosition); + void descriptionFontChanged(const HbFontSpec &); + void widgetHeightChanged(int); + void widgetWidthChanged(int); + void reflectionsEnabledChanged(bool); +private slots: + void updateData(QModelIndex startIn, QModelIndex endIn); + +private: + void setCoverflowEnabled(bool value); + void storeWidgetSize(); + void setupData(); + void resizeEvent(QGraphicsSceneResizeEvent *event); + +private: // data + HbDataForm *mForm; + HbDataFormModel *mModel; + bool mContentReady; + bool mUpdateWidgetSize; +}; + + +#endif /* HGWIDGETOPTIONSVIEW_H_ */ diff -r 89c329efa980 -r e48454f237ca ganeswidgets/tsrc/fute/HgWidgetTest/inc/hgwidgettestdatamodel.h --- a/ganeswidgets/tsrc/fute/HgWidgetTest/inc/hgwidgettestdatamodel.h Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/tsrc/fute/HgWidgetTest/inc/hgwidgettestdatamodel.h Mon May 03 13:32:54 2010 +0300 @@ -23,11 +23,16 @@ #include #include #include +#include +#include +#include "buffermanager.h" +#include "hgtestdefs.h" class HgWidgetTestAlbumArtManager; +class ThumbnailManager; -class HgWidgetTestDataModel : public QAbstractListModel +class HgWidgetTestDataModel : public QAbstractListModel, public AbstractDataProvider { Q_OBJECT @@ -37,7 +42,8 @@ virtual ~HgWidgetTestDataModel(); void setThumbnailSize(ThumbnailManager::ThumbnailSize size); - + void setBuffer(int buffer, int treshhold); + int rowCount(const QModelIndex &parent=QModelIndex()) const; QVariant data(const QModelIndex &index, int role=Qt::DisplayRole) const; bool setData(const QModelIndex& index, const QVariant& value, int role=Qt::EditRole); @@ -47,17 +53,21 @@ void remove(const QItemSelection &selection); void move(const QItemSelection &selection, const QModelIndex &target); void add(const QModelIndex &target, int count); - - enum ImageType{TypeQIcon, TypeHbIcon, TypeQImage}; + void reset(); - void setImageDataType(ImageType type); - + HgTestImageType imageDataType() const; + void setImageDataType(HgTestImageType type); + void enableLowResImages(bool enabled); bool lowResImagesEnabled() const; + +public slots: + void thumbnailReady( QPixmap , void* , int, int ); private: void init(); + void getNextThumbnail(); public slots: @@ -65,16 +75,29 @@ void albumCacheReady(); private: + + void release(int start, int end); + void request(int start, int end, requestsOrder order); + +private: - HgWidgetTestAlbumArtManager *mAlbumArtManager; // Own bool mCachingInProgress; QStringList mFiles; - ImageType mImageType; + HgTestImageType mImageType; HbIcon mHbIcon; QIcon mQIcon; QImage mDefaultIcon; QList mVisibility; bool mUseLowResImages; + QList mImages; + BufferManager *mBufferManager; + + ThumbnailManager* mWrapper; + QStringList mWaitingThumbnails; + bool mThumbnailRequestPending; + int mThumbnailRequestIndex; + int mThumbnailRequestID; + }; #endif // HgWidgetTestDataModel_H diff -r 89c329efa980 -r e48454f237ca ganeswidgets/tsrc/fute/HgWidgetTest/inc/hgwidgettestview.h --- a/ganeswidgets/tsrc/fute/HgWidgetTest/inc/hgwidgettestview.h Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/tsrc/fute/HgWidgetTest/inc/hgwidgettestview.h Mon May 03 13:32:54 2010 +0300 @@ -19,7 +19,8 @@ #define HGWIDGETTESTVIEW_H_ #include -#include +#include +#include "hgtestdefs.h" class HbAction; class QGraphicsLinearLayout; @@ -27,6 +28,9 @@ class HbListWidget; class HgFlipWidget; class HbLabel; +class HbDialog; + +class HgItemSizeDialog; class HgWidgetTestView : public HbView { @@ -38,62 +42,68 @@ ~HgWidgetTestView(); private slots: - - void switchWidget(HbAction* action); + void initWidget(HgTestWidgetType type); + void changeScrollBarVisibility(HgWidget::ScrollBarPolicy policy); + void changeScrollBarInteractivity(bool value); + void changeModelImageType(HgTestImageType); + void changeLowResImageUse(bool value); + void changeTitlePosition(HgMediawall::LabelPosition); + void changeTitleFont(const HbFontSpec &); + void changeDescriptionPosition(HgMediawall::LabelPosition); + void changeDescriptionFont(const HbFontSpec &); + void changeWidgetHeight(int); + void changeWidgetWidth(int); void toggleScrollDirection(); void openDialog(const QModelIndex &index); void openView(const QModelIndex& index); + void closeCurrentView(); void openDeleteItemsDialog(); void openMoveItemsDialog(); void openAddItemsDialog(); - void autoHideScrollBar(); - void scrollBarAlwaysOn(); - void scrollBarAlwaysOff(); - void interactiveScrollBar(); - void unInteractiveScrollBar(); - void feedqimages(); - void feedqicons(); - void feedhbicons(); void flipClosed(); - void orientationChanged(); void onScrollingStarted(); void onScrollingEnded(); - void setDescriptionAboveImage(); - void setDescriptionBelowImage(); - void setDescriptionHidden(); - void setTitleAboveImage(); - void setTitleBelowImage(); - void setTitleHidden(); - void toggleLowResForCoverflow(); + void showOptions(); + void hideOptions(); + void orientationChanged(Qt::Orientation); + + void startItemSizeChange(); + void itemSizeDialogClosed(); + void updateItemSizeAndSpacing(); + void startItemPosChange(); + void updateItemPos(); + void itemPosDialogClosed(); + + void resetOptions(); + void changeReflectionsEnabled(bool); + void resetModel(); private: - - enum WidgetType { - HgWidgetGrid, - HgWidgetCoverflow - }; void createMenu(); - void initWidget( WidgetType type ); - void setScrollBarPolicy( HgWidget::ScrollBarPolicy policy ); - void setScrollBarInteractive( bool value ); - HgWidget *createWidget(WidgetType type) const; + void setupWidget(); + void setupWidgetOptions(); + void setupWidgetSize(); + HgWidget *createWidget(HgTestWidgetType type) const; HgWidget *copyWidget() const; + void resizeEvent(QGraphicsSceneResizeEvent *event); + Qt::Orientation orientation() const; private: // data HgWidget *mWidget; QGraphicsLinearLayout *mLayout; HgWidgetTestDataModel *mModel; - WidgetType mWidgetType; + HgTestWidgetType mWidgetType; HbListWidget *mListWidget; bool mToggleOrientation; - bool mTBone; QItemSelectionModel *mSelectionModel; HgFlipWidget* mFlipWidget; QModelIndex mFlippedIndex; HbLabel* mFrontItem; - HbAction* mUseLowResAction; + HbView *mOptionsView; + HgItemSizeDialog *mItemSizeDialog; + HgItemSizeDialog *mItemPosDialog; }; diff -r 89c329efa980 -r e48454f237ca ganeswidgets/tsrc/fute/HgWidgetTest/src/buffermanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ganeswidgets/tsrc/fute/HgWidgetTest/src/buffermanager.cpp Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,244 @@ +/* +* 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 "buffermanager.h" +#include + +BufferManager::BufferManager( + AbstractDataProvider* aObserver, + int aBufferSize, + int aBufferTreshold, + int aInitialPosition, + int aTotalCount ) +: +mObserver(aObserver), +mBufferSize( aBufferSize ), +mBufferTreshold( aBufferTreshold ), +mBufferPosition( aInitialPosition ), +mTotalCount( aTotalCount ) +{ + mBufferPosition -= (mBufferSize / 2); + + if( mBufferPosition + mBufferSize > mTotalCount - 1 ){ + mBufferPosition = (mTotalCount - 1) - mBufferSize; + } + + if(mBufferPosition < 0 ){ + mBufferPosition = 0; + } + + mDiff = 0; + //request Initial Buffer + mRequestStart = mBufferPosition; + mRequestCount = mBufferSize; + + calculate(); +} + + +BufferManager::~BufferManager() +{ +} + +void BufferManager::resizeCache(int newSize, int newTreshold) +{ + if (newTreshold != mBufferTreshold){ + mBufferTreshold = newTreshold; + } + + if (newSize!=mBufferSize){ +// int pos = mBufferPosition + (mBufferSize / 2); + + int a = qMax(0, mBufferPosition + mBufferSize/2 - newSize/2); + int b = qMin(a + newSize, mTotalCount); + if ( b == mTotalCount){ + a = mTotalCount - newSize; + } + + int c = qMax(0, mBufferPosition); + int d = qMin(c + mBufferSize, mTotalCount); + if ( d == mTotalCount){ + c = mTotalCount - mBufferSize; + } + + if ( newSize>mBufferSize){ + mObserver->request(a, c-1, AbstractDataProvider::ascending); + mObserver->request(d, b-1, AbstractDataProvider::ascending); + }else if ( newSizerelease(c, a-1); + mObserver->release(b, d); + } + mBufferPosition = a; + mBufferSize = newSize; + } +} + +void BufferManager::calculate() +{ + AbstractDataProvider::requestsOrder direction = AbstractDataProvider::ascending; + + if(mResetOrdered){ + mResetOrdered = false; + } else { + if(mDiff < 0){ + mReleaseStart = mBufferPosition; + mRequestStart = mBufferPosition + mBufferSize; + direction = AbstractDataProvider::ascending; + } else if( mDiff > 0) { + mReleaseStart = mBufferPosition + mBufferSize - mDiff; + mRequestStart = mBufferPosition - mDiff; + direction = AbstractDataProvider::descending; + } + } + + // Release + int end = mReleaseStart + mReleaseCount < mTotalCount ? + mReleaseStart + mReleaseCount: mTotalCount; + end--; + if(end >= mReleaseStart ){ + mObserver->release(mReleaseStart, end); + } + + mReleaseCount = 0; + + // Request + end = mRequestStart + mRequestCount < mTotalCount ? + mRequestStart + mRequestCount : mTotalCount; + + end--; + if(end >= mRequestStart ){ + mObserver->request(mRequestStart, end, direction); + } + + mRequestCount = 0; + + // Move Buffer + mBufferPosition -= mDiff; + // Reset Diff + mDiff = 0; +} + +// ----------------------------------------------------------------------------- +// BufferManager::SetPosition() +// ----------------------------------------------------------------------------- +// +void BufferManager::setPosition( int aIndex ) +{ + // If all the items fit in the buffer no need to move the buffer + if(mTotalCount <= mBufferSize) return; + + bool forceUpdate = false; + aIndex -= mBufferSize / 2; // normalize index to Buffer start + + if(aIndex < 0){ + aIndex = 0; + forceUpdate = true; + }else if( aIndex > mTotalCount - mBufferSize ){ + aIndex = mTotalCount - mBufferSize; + forceUpdate = true; + } + + mDiff = mBufferPosition - aIndex; + + // Too large change reset whole buffer + if( mDiff >= mBufferSize || -mDiff >= mBufferSize || mResetOrdered ) { + resetBuffer(aIndex + (mBufferSize/2), mTotalCount); + } else if( mDiff >= mBufferTreshold ) { // Move Up + mRequestCount = mDiff; + mReleaseCount = mDiff; + calculate(); + } else if ( -mDiff >= mBufferTreshold ) {// Move Down + mRequestCount = -mDiff; + mReleaseCount = -mDiff; + calculate(); + } else if( forceUpdate && mDiff ) { // Top or bottom has been reached + int diff = mDiff < 0 ? -mDiff : mDiff; + mRequestCount = diff; + mReleaseCount = diff; + calculate(); + } +} + +// ----------------------------------------------------------------------------- +// BufferManager::ResetBuffer() +// ----------------------------------------------------------------------------- +// +void BufferManager::resetBuffer( int aPosition, int aTotalCount) +{ + if( !mResetOrdered ){ + // release Old buffer + mReleaseStart = mBufferPosition; + mReleaseCount = mBufferSize; + } + + // set position and count + mBufferPosition = aPosition - (mBufferSize / 2); + mTotalCount = aTotalCount; + mDiff = 0; + + if( mBufferPosition + mBufferSize > mTotalCount - 1 ){ + mBufferPosition = mTotalCount - mBufferSize; + } + + if(mBufferPosition < 0 ){ + mBufferPosition = 0; + } + + //request new Buffer + mRequestStart = mBufferPosition; + mRequestCount = mBufferSize; + mResetOrdered = true; + calculate(); +} + +void BufferManager::itemCountChanged( int aIndex, + bool aRemoved, + int aNewTotalCount ) +{ + mTotalCount = aNewTotalCount; + AbstractDataProvider::requestsOrder direction = AbstractDataProvider::ascending; + if ( aIndex >= mBufferPosition && aIndex < mBufferPosition + mBufferSize ){ + // Change inside the buffer + if( aRemoved ){ + // Release removed item ( Item deleted already from the owner ) + mObserver->release( aIndex, aIndex ); + if( mTotalCount >= mBufferSize ){ + // There are more items to keep the buffer filled + if( mBufferPosition + mBufferSize <= mTotalCount ){ + // Requested from the end + mObserver->request( mBufferPosition + mBufferSize, + mBufferPosition + mBufferSize, + direction ); + }else if( mBufferPosition > 0 ){ + // Move buffer and request from the beginning + mBufferPosition--; + mObserver->request( mBufferPosition, mBufferPosition, direction); + } + } + }else{ + if( mTotalCount > mBufferSize ){ + // One item needs to be released + if( mBufferPosition + mBufferSize < mTotalCount ){ + // Release from the end of the buffer + mObserver->release(mBufferPosition + mBufferSize, mBufferPosition + mBufferSize); + } + } + // Request added item + mObserver->request(aIndex, aIndex, direction); + } + } +} + diff -r 89c329efa980 -r e48454f237ca ganeswidgets/tsrc/fute/HgWidgetTest/src/hgcoverflowwidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ganeswidgets/tsrc/fute/HgWidgetTest/src/hgcoverflowwidget.cpp Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,104 @@ +/* +* Copyright (c) 2010 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: Another view for test application. +* +*/ +#include "hgcoverflowwidget.h" +#include "trace.h" + +#include +#include + + + +HgCoverflowWidget::HgCoverflowWidget(QGraphicsItem *parent) : HgMediawall(parent), +mTextPositionsDirty(false) +{ + mTitleLabel = new HbLabel("Title", this); + mTitleLabel->setAlignment(Qt::AlignCenter); + mDescLabel = new HbLabel("Description", this); + mDescLabel->setAlignment(Qt::AlignCenter); +} + +HgCoverflowWidget::~HgCoverflowWidget() +{ + +} + +void HgCoverflowWidget::frontItemChanged ( const QModelIndex & current, const QModelIndex & previous ) +{ + if (!this->model()) + return; + + QVariant variant = this->model()->data(current, Qt::DisplayRole); + QStringList texts = variant.toStringList(); + HbLabel* labels[2]; + labels[0] = mTitleLabel; + labels[1] = mDescLabel; + int n = texts.size() > 2 ? 2 : texts.size(); + for (int i = 0; i < n; i++) + labels[i]->setPlainText(texts[i]); + + mTextPositionsDirty = true; +} + +void HgCoverflowWidget::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + HgMediawall::resizeEvent(event); + + mTextPositionsDirty = true; + + QObject::connect(selectionModel(), SIGNAL(currentChanged(const QModelIndex&, const QModelIndex&)), + this, SLOT(frontItemChanged(const QModelIndex&, const QModelIndex&))); +} + +void HgCoverflowWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +{ + HgMediawall::paint(painter, option, widget); + + if (mTextPositionsDirty) + { + QModelIndex index = this->currentIndex(); + + if (index.isValid()) + { + QRectF bounds; + + QPointF halfSize = QPointF(itemSize().width()/2, itemSize().height()/2); + bounds.setTopLeft(rect().center() + frontItemPositionDelta() - halfSize); + bounds.setBottomRight(rect().center() + frontItemPositionDelta() + halfSize); + + mTitleLabel->resize(QSizeF(size().width(), mTitleLabel->minimumSize().height())); + mTitleLabel->setPos(QPointF(bounds.center().x() - size().width()/2, + bounds.top() - 40)); + mDescLabel->resize(QSizeF(size().width(), mDescLabel->minimumSize().height())); + mDescLabel->setPos(QPointF(bounds.center().x() - size().width()/2, + bounds.bottom() + 40 - mDescLabel->minimumSize().height())); + + frontItemChanged(index, index); + + mTextPositionsDirty = false; + } + + } + +} + +void HgCoverflowWidget::updateTextPositions() +{ + mTextPositionsDirty = true; +} + + + diff -r 89c329efa980 -r e48454f237ca ganeswidgets/tsrc/fute/HgWidgetTest/src/hgitemsizedialog.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ganeswidgets/tsrc/fute/HgWidgetTest/src/hgitemsizedialog.cpp Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,168 @@ +/* +* Copyright (c) 2010 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: Another view for test application. +* +*/ +#include "hgitemsizedialog.h" + +#include +#include +#include +#include + +#include "trace.h" + + + +HgItemSizeDialog::HgItemSizeDialog(QSizeF size, QSizeF spacing, HbWidget *parent) : HbDialog(parent), +mSize(size), +mSpacing(spacing) +{ + + this->setAttribute(Qt::WA_DeleteOnClose); + this->setFlag(QGraphicsItem::ItemIsMovable); + this->setModal(false); + this->setBackgroundFaded(false); + this->setDismissPolicy(HbPopup::TapOutside); + this->setTimeout(5000); + this->setMinimumSize(QSizeF(200, 200)); + + QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical); + + QSizeF itemSize = mSize; + QSizeF itemSpacing = mSpacing; + + int maxVal = 500; + if (parent) + maxVal = qMax(parent->size().width(), parent->size().height()); + + + HbSlider* slider1 = new HbSlider(Qt::Horizontal); + slider1->setMinimum(1); + slider1->setMaximum(maxVal); + slider1->setValue(itemSize.width()); + mSizeXSlider = slider1; + + HbSlider* slider2 = new HbSlider(Qt::Horizontal); + slider2->setMinimum(1); + slider2->setMaximum(maxVal); + slider2->setValue(itemSize.height()); + mSizeYSlider = slider2; + + HbSlider* slider3 = new HbSlider(Qt::Horizontal); + slider3->setMinimum(0); + slider3->setMaximum(maxVal); + slider3->setValue(itemSpacing.width()); + mSpacingXSlider = slider3; + + HbSlider* slider4 = new HbSlider(Qt::Horizontal); + slider4->setMinimum(0); + slider4->setMaximum(maxVal); + slider4->setValue(itemSpacing.height()); + mSpacingYSlider = slider4; + + mSizeXLabel = new HbLabel(); + mSizeYLabel = new HbLabel(); + mSpacingXLabel = new HbLabel(); + mSpacingYLabel = new HbLabel(); + + layout->addItem(mSizeXLabel); + layout->addItem(slider1); + layout->addItem(mSizeYLabel); + layout->addItem(slider2); + layout->addItem(mSpacingXLabel); + layout->addItem(slider3); + layout->addItem(mSpacingYLabel); + layout->addItem(slider4); + + mSizeXLabel->setNumber(itemSize.width()); + mSizeYLabel->setNumber(itemSize.height()); + mSpacingXLabel->setNumber(itemSpacing.width()); + mSpacingYLabel->setNumber(itemSpacing.height()); + + QObject::connect(slider1, SIGNAL(valueChanged(int)), this, SLOT(itemSizeXChanged(int))); + QObject::connect(slider2, SIGNAL(valueChanged(int)), this, SLOT(itemSizeYChanged(int))); + QObject::connect(slider3, SIGNAL(valueChanged(int)), this, SLOT(itemSpacingXChanged(int))); + QObject::connect(slider4, SIGNAL(valueChanged(int)), this, SLOT(itemSpacingYChanged(int))); + + HbPushButton* button = new HbPushButton("Close"); + QObject::connect(button, SIGNAL(clicked(bool)), this, SLOT(buttonClosed(bool))); + layout->addItem(button); + + this->setLayout(layout); + +} + +void HgItemSizeDialog::itemSizeXChanged(int value) +{ + QSizeF s = mSize; + mSize = QSizeF(value, s.height()); + mSizeXLabel->setNumber(value); + emit updateItemSizeAndSpacing(); +} + +void HgItemSizeDialog::itemSizeYChanged(int value) +{ + QSizeF s = mSize; + mSize = QSizeF(s.width(), value); + mSizeYLabel->setNumber(value); + emit updateItemSizeAndSpacing(); +} + +void HgItemSizeDialog::itemSpacingXChanged(int value) +{ + QSizeF s = mSpacing; + mSpacing = QSizeF(value, s.height()); + mSpacingXLabel->setNumber(value); + emit updateItemSizeAndSpacing(); +} + +void HgItemSizeDialog::itemSpacingYChanged(int value) +{ + QSizeF s = mSpacing; + mSpacing = QSizeF(s.width(), value); + mSpacingYLabel->setNumber(value); + emit updateItemSizeAndSpacing(); +} + +void HgItemSizeDialog::buttonClosed(bool) +{ + close(); + emit closed(); +} + +QSizeF HgItemSizeDialog::itemSize() const +{ + return mSize; +} + +QSizeF HgItemSizeDialog::itemSpacing() const +{ + return mSpacing; +} + +static void setSliderScale(HbSlider* slider, int min, int max) +{ + slider->setMinimum(min); + slider->setMaximum(max); +} + + +void HgItemSizeDialog::setSliderLimits(int min, int max) +{ + setSliderScale(mSizeXSlider, min, max); + setSliderScale(mSizeYSlider, min, max); + setSliderScale(mSpacingXSlider, min, max); + setSliderScale(mSpacingYSlider, min, max); +} diff -r 89c329efa980 -r e48454f237ca ganeswidgets/tsrc/fute/HgWidgetTest/src/hgtestview.cpp --- a/ganeswidgets/tsrc/fute/HgWidgetTest/src/hgtestview.cpp Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/tsrc/fute/HgWidgetTest/src/hgtestview.cpp Mon May 03 13:32:54 2010 +0300 @@ -34,12 +34,10 @@ HbMainWindow *primaryWindow = mainWindows[0]; setTitle(primaryWindow->currentView()->title()); - setItemVisible(Hb::AllItems, true); // ensure that all needed view items stay visible - // set view as parent because action will be removed on view exit - mBackAction = new HbAction(Hb::BackAction, this); - primaryWindow->addSoftKeyAction(Hb::SecondarySoftKey, mBackAction); - connect(mBackAction, SIGNAL(triggered()), SLOT(closeView())); + HbAction *backAction = new HbAction(Hb::BackNaviAction); + connect(backAction, SIGNAL(triggered()), SIGNAL(closeRequested())); + setNavigationAction(backAction); QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical); HANDLE_ERROR_NULL(layout); @@ -66,21 +64,6 @@ } } -void HgTestView::closeView() -{ - FUNC_LOG; - - QList mainWindows = hbInstance->allMainWindows(); - if (mainWindows.count() > 0) - { - HbMainWindow *primaryWindow = mainWindows[0]; - primaryWindow->removeView(this); - primaryWindow->setViewSwitchingEnabled(true); - primaryWindow->removeSoftKeyAction(Hb::SecondarySoftKey, mBackAction); // restores original action - } - delete this; // ownership transferred back from HbMainWindow -} - void HgTestView::resizeEvent(QGraphicsSceneResizeEvent *event) { FUNC_LOG; diff -r 89c329efa980 -r e48454f237ca ganeswidgets/tsrc/fute/HgWidgetTest/src/hgwidgetoptionsview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ganeswidgets/tsrc/fute/HgWidgetTest/src/hgwidgetoptionsview.cpp Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,566 @@ +/* +* 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 "hgwidgetoptionsview.h" +#include "trace.h" + +static const QString WIDGET_TYPE = "Widget type"; +static const QString SCROLLBAR_VISIBILITY = "Scrollbar visibility"; +static const QString INTERACTIVE_SCROLLBAR = "Interactive scrollbar"; +static const QString MODEL_IMAGE_TYPE = "Datamodel image type"; +static const QString WIDGET_HEIGHT = "Widget height"; +static const QString WIDGET_WIDTH = "Widget width"; +static const QString LOW_RES_IMAGES = "Use low res images"; +static const QString TITLE_POSITION = "Title position"; +static const QString TITLE_FONT = "Title font"; +static const QString DESCRIPTION_POSITION = "Description position"; +static const QString DESCRIPTION_FONT = "Description font"; +static const QString REFLECTIONS_ENABLED = "Reflections enabled"; + +enum DataFormItems { + ItemWidgetType = 0, + ItemScrollBarVisibility, + ItemScrollBarInteractivity, + ItemModelImageType, + ItemWidgetHeight, + ItemWidgetWidth, + ItemLowResImages, + ItemTitlePosition, + ItemTitleFont, + ItemDescriptionPosition, + ItemDescriptionFont, + ItemReflectionEnabled, +}; + +HgWidgetOptionsView::HgWidgetOptionsView(QGraphicsItem *parent) : + HbView(parent), + mForm(new HbDataForm(this)), + mModel(new HbDataFormModel(this)), + mContentReady(false), + mUpdateWidgetSize(true) +{ + HbAction *backAction = new HbAction(Hb::BackNaviAction); + connect(backAction, SIGNAL(triggered()), SIGNAL(optionsClosed())); + setNavigationAction(backAction); + + HbDataFormModelItem *item = mModel->appendDataFormItem( + HbDataFormModelItem::ComboBoxItem, WIDGET_TYPE); + item->setContentWidgetData(QString("items"), QStringList("Grid") << "Coverflow" << "T-Bone"); + + item = mModel->appendDataFormItem( + HbDataFormModelItem::ComboBoxItem, SCROLLBAR_VISIBILITY); + item->setContentWidgetData(QString("items"), QStringList("Autohide") << "Always on" << "Always off"); + + item = mModel->appendDataFormItem( + HbDataFormModelItem::ToggleValueItem, INTERACTIVE_SCROLLBAR); + item->setContentWidgetData(QString("text"), QString("no")); + item->setContentWidgetData(QString("additionalText"), QString("yes")); + + item = mModel->appendDataFormItem( + HbDataFormModelItem::ComboBoxItem, MODEL_IMAGE_TYPE); + item->setContentWidgetData(QString("items"), QStringList("QImage") << "HbIcon" << "QIcon"); + + item = mModel->appendDataFormItem( + HbDataFormModelItem::TextItem, WIDGET_HEIGHT); + item->setContentWidgetData(QString("text"), QString("0")); + item->setContentWidgetData(QString("inputMethodHints"), Qt::ImhDigitsOnly); + + item = mModel->appendDataFormItem( + HbDataFormModelItem::TextItem, WIDGET_WIDTH); + item->setContentWidgetData(QString("text"), QString("0")); + item->setContentWidgetData(QString("inputMethodHints"), Qt::ImhDigitsOnly); + + item = mModel->appendDataFormItem( + HbDataFormModelItem::ToggleValueItem, LOW_RES_IMAGES); + item->setContentWidgetData(QString("text"), QString("no")); + item->setContentWidgetData(QString("additionalText"), QString("yes")); + + item = mModel->appendDataFormItem( + HbDataFormModelItem::ComboBoxItem, TITLE_POSITION); + item->setContentWidgetData(QString("items"), QStringList("Hidden") << "Above" << "Below"); + + item = mModel->appendDataFormItem( + HbDataFormModelItem::ComboBoxItem, TITLE_FONT); + item->setContentWidgetData(QString("items"), QStringList("Primary") << "Secondary" << "Title" << "Primary small" << "Digital"); + + item = mModel->appendDataFormItem( + HbDataFormModelItem::ComboBoxItem, DESCRIPTION_POSITION); + item->setContentWidgetData(QString("items"), QStringList("Hidden") << "Above" << "Below"); + + item = mModel->appendDataFormItem( + HbDataFormModelItem::ComboBoxItem, DESCRIPTION_FONT); + item->setContentWidgetData(QString("items"), QStringList("Primary") << "Secondary" << "Title" << "Primary small" << "Digital"); + + item = mModel->appendDataFormItem( + HbDataFormModelItem::ToggleValueItem, REFLECTIONS_ENABLED); + item->setContentWidgetData(QString("text"), QString("no")); + item->setContentWidgetData(QString("additionalText"), QString("yes")); + + connect(mModel, SIGNAL(dataChanged(QModelIndex, QModelIndex)), SLOT(updateData(QModelIndex, QModelIndex))); + mForm->setModel(mModel); + + setupData(); + mContentReady = true; + + QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical); + layout->addItem(mForm); + setLayout(layout); +} + +HgWidgetOptionsView::~HgWidgetOptionsView() +{ +} + +void HgWidgetOptionsView::updateData(QModelIndex startIn, QModelIndex endIn) +{ + Q_UNUSED(endIn); + + if (!mContentReady) return; + + QSettings settings(SETT_ORGANIZATION, SETT_APPLICATION); + + HbDataFormModelItem *item = mModel->itemFromIndex(startIn); + if (item->data(HbDataFormModelItem::LabelRole).toString() == WIDGET_TYPE) { + int index = item->contentWidgetData(QString("currentIndex")).toInt(); + HgTestWidgetType type = HgWidgetNone; + switch (index) { + case 0: + type = HgWidgetGrid; + break; + case 1: + type = HgWidgetCoverflow; + break; + case 2: + type = HgWidgetTBone; + break; + default: break; + } + + setCoverflowEnabled(index == 1 || index == 2); + settings.setValue(SETT_WIDGET_TYPE, type); + emit widgetTypeChanged(type); + } + else if (item->data(HbDataFormModelItem::LabelRole).toString() == SCROLLBAR_VISIBILITY) { + int index = item->contentWidgetData(QString("currentIndex")).toInt(); + HgWidget::ScrollBarPolicy visibility = HgWidget::ScrollBarAutoHide; + switch (index) { + case 0: + visibility = HgWidget::ScrollBarAutoHide; + break; + case 1: + visibility = HgWidget::ScrollBarAlwaysOn; + break; + case 2: + visibility = HgWidget::ScrollBarAlwaysOff; + break; + default: break; + } + + settings.setValue(SETT_SCROLLBAR_VISIBILITY, visibility); + emit scrollBarVisibilityChanged(visibility); + } + else if (item->data(HbDataFormModelItem::LabelRole).toString() == INTERACTIVE_SCROLLBAR) { + QVariant data = item->contentWidgetData(QString("text")); + bool value = data.toString() == "yes"; + settings.setValue(SETT_SCROLLBAR_INTERACTIVITY, value); + if (value) { + item = mModel->itemFromIndex(mModel->index(ItemScrollBarVisibility, 0)); + if (item) { + item->setContentWidgetData(QString("currentIndex"), 1); // Set scroll bar always on + } + } + emit scrollBarInteractivityChanged(value); + } + else if (item->data(HbDataFormModelItem::LabelRole).toString() == MODEL_IMAGE_TYPE) { + int index = item->contentWidgetData(QString("currentIndex")).toInt(); + HgTestImageType type = ImageTypeNone; + switch (index) { + case 0: + type = ImageTypeQImage; + break; + case 1: + type = ImageTypeHbIcon; + break; + case 2: + type = ImageTypeQIcon; + break; + default: break; + } + + settings.setValue(SETT_MODEL_IMAGE_TYPE, type); + emit imageTypeChanged(type); + } + else if (item->data(HbDataFormModelItem::LabelRole).toString() == WIDGET_HEIGHT) { + emit widgetHeightChanged(item->contentWidgetData(QString("text")).toInt()); + storeWidgetSize(); + } + else if (item->data(HbDataFormModelItem::LabelRole).toString() == WIDGET_WIDTH) { + emit widgetWidthChanged(item->contentWidgetData(QString("text")).toInt()); + storeWidgetSize(); + + } + else if (item->data(HbDataFormModelItem::LabelRole).toString() == LOW_RES_IMAGES) { + QVariant data = item->contentWidgetData(QString("text")); + bool value = data.toString() == "yes"; + settings.setValue(SETT_LOW_RES_IMAGES, value); + emit lowResImageUseChanged(value); + } + else if (item->data(HbDataFormModelItem::LabelRole).toString() == TITLE_POSITION) { + int index = item->contentWidgetData(QString("currentIndex")).toInt(); + HgMediawall::LabelPosition position = HgMediawall::PositionNone; + switch (index) { + case 0: + position = HgMediawall::PositionNone; + break; + case 1: + position = HgMediawall::PositionAboveImage; + break; + case 2: + position = HgMediawall::PositionBelowImage; + break; + default: break; + } + + settings.setValue(SETT_TITLE_POSITION, position); + emit titlePositionChanged(position); + } + else if (item->data(HbDataFormModelItem::LabelRole).toString() == TITLE_FONT) { + int index = item->contentWidgetData(QString("currentIndex")).toInt(); + HbFontSpec::Role role = HbFontSpec::Undefined; + switch (index) { + case 0: + role = HbFontSpec::Primary; + break; + case 1: + role = HbFontSpec::Secondary; + break; + case 2: + role = HbFontSpec::Title; + break; + case 3: + role = HbFontSpec::PrimarySmall; + break; + case 4: + role = HbFontSpec::Digital; + break; + default: break; + } + settings.setValue(SETT_TITLE_FONT, role); + emit titleFontChanged(HbFontSpec(role)); + } + else if (item->data(HbDataFormModelItem::LabelRole).toString() == DESCRIPTION_POSITION) { + int index = item->contentWidgetData(QString("currentIndex")).toInt(); + HgMediawall::LabelPosition position = HgMediawall::PositionNone; + switch (index) { + case 0: + position = HgMediawall::PositionNone; + break; + case 1: + position = HgMediawall::PositionAboveImage; + break; + case 2: + position = HgMediawall::PositionBelowImage; + break; + default: break; + } + + settings.setValue(SETT_DESCRIPTION_POSITION, position); + emit descriptionPositionChanged(position); + } + else if (item->data(HbDataFormModelItem::LabelRole).toString() == DESCRIPTION_FONT) { + int index = item->contentWidgetData(QString("currentIndex")).toInt(); + HbFontSpec::Role role = HbFontSpec::Undefined; + switch (index) { + case 0: + role = HbFontSpec::Primary; + break; + case 1: + role = HbFontSpec::Secondary; + break; + case 2: + role = HbFontSpec::Title; + break; + case 3: + role = HbFontSpec::PrimarySmall; + break; + case 4: + role = HbFontSpec::Digital; + break; + default: break; + } + settings.setValue(SETT_DESCRIPTION_FONT, role); + emit descriptionFontChanged(HbFontSpec(role)); + } + else if (item->data(HbDataFormModelItem::LabelRole).toString() == REFLECTIONS_ENABLED) { + QVariant data = item->contentWidgetData(QString("text")); + bool value = data.toString() == "yes"; + settings.setValue(SETT_REFLECTIONS_ENABLED, value); + emit reflectionsEnabledChanged(value); + } +} + +void HgWidgetOptionsView::setCoverflowEnabled(bool value) +{ + HbAbstractViewItem *item = mForm->itemByIndex(mModel->index(ItemLowResImages, 0)); + if (item) item->setEnabled(value); + item = mForm->itemByIndex(mModel->index(ItemTitlePosition, 0)); + if (item) item->setEnabled(value); + item = mForm->itemByIndex(mModel->index(ItemTitleFont, 0)); + if (item) item->setEnabled(value); + item = mForm->itemByIndex(mModel->index(ItemDescriptionPosition, 0)); + if (item) item->setEnabled(value); + item = mForm->itemByIndex(mModel->index(ItemDescriptionFont, 0)); + if (item) item->setEnabled(value); + item = mForm->itemByIndex(mModel->index(ItemReflectionEnabled, 0)); + if (item) item->setEnabled(value); +} + +void HgWidgetOptionsView::storeWidgetSize() +{ + QSettings settings(SETT_ORGANIZATION, SETT_APPLICATION); + + HbDataFormModelItem *item = item = mModel->itemFromIndex(mModel->index(ItemWidgetHeight, 0)); + if (item) { + int value = item->contentWidgetData(QString("text")).toInt(); + settings.setValue(SETT_WIDGET_HEIGHT, value); + } + item = mModel->itemFromIndex(mModel->index(ItemWidgetWidth, 0)); + if (item) { + int value = item->contentWidgetData(QString("text")).toInt(); + settings.setValue(SETT_WIDGET_WIDTH, value); + } + + mUpdateWidgetSize = false; +} + +void HgWidgetOptionsView::setupData() +{ + FUNC_LOG; + + QSettings settings(SETT_ORGANIZATION, SETT_APPLICATION); + + HbDataFormModelItem *item = mModel->itemFromIndex(mModel->index(ItemWidgetType, 0)); + QVariant value = settings.value(SETT_WIDGET_TYPE); + if (item && value.isValid()) { + int index(0); + switch (value.toInt()) { + case HgWidgetGrid: + index = 0; + break; + case HgWidgetCoverflow: + index = 1; + break; + case HgWidgetTBone: + index = 2; + break; + default: break; + } + item->setContentWidgetData(QString("currentIndex"), index); + setCoverflowEnabled(index == 1 || index == 2); + } + + item = mModel->itemFromIndex(mModel->index(ItemScrollBarVisibility, 0)); + value = settings.value(SETT_SCROLLBAR_VISIBILITY); + if (item && value.isValid()) { + int index(0); + switch (value.toInt()) { + case HgWidget::ScrollBarAutoHide: + index = 0; + break; + case HgWidget::ScrollBarAlwaysOn: + index = 1; + break; + case HgWidget::ScrollBarAlwaysOff: + index = 2; + break; + default: break; + } + item->setContentWidgetData(QString("currentIndex"), index); + } + + item = mModel->itemFromIndex(mModel->index(ItemScrollBarInteractivity, 0)); + value = settings.value(SETT_SCROLLBAR_INTERACTIVITY); + if (item && value.isValid()) { + item->setContentWidgetData(QString("text"), value.toBool() ? "yes" : "no"); + item->setContentWidgetData(QString("alternateText"), value.toBool() ? "no" : "yes"); + } + + item = mModel->itemFromIndex(mModel->index(ItemModelImageType, 0)); + value = settings.value(SETT_MODEL_IMAGE_TYPE); + if (item && value.isValid()) { + int index(0); + switch (value.toInt()) { + case ImageTypeQImage: + value = 0; + break; + case ImageTypeHbIcon: + value = 1; + break; + case ImageTypeQIcon: + value = 2; + break; + default: break; + } + item->setContentWidgetData(QString("currentIndex"), index); + } + + item = mModel->itemFromIndex(mModel->index(ItemWidgetHeight, 0)); + value = settings.value(SETT_WIDGET_HEIGHT); + if (item && value.isValid()) { + item->setContentWidgetData(QString("text"), value.toInt()); + mUpdateWidgetSize = false; + } + + item = mModel->itemFromIndex(mModel->index(ItemWidgetWidth, 0)); + value = settings.value(SETT_WIDGET_WIDTH); + if (item && value.isValid()) { + item->setContentWidgetData(QString("text"), value.toInt()); + mUpdateWidgetSize = false; + } + + item = mModel->itemFromIndex(mModel->index(ItemLowResImages, 0)); + value = settings.value(SETT_LOW_RES_IMAGES); + if (item && value.isValid()) { + item->setContentWidgetData(QString("text"), value.toBool() ? "yes" : "no"); + item->setContentWidgetData(QString("alternateText"), value.toBool() ? "no" : "yes"); + } + + item = mModel->itemFromIndex(mModel->index(ItemTitlePosition, 0)); + value = settings.value(SETT_TITLE_POSITION); + if (item && value.isValid()) { + int index(0); + switch (value.toInt()) { + case HgMediawall::PositionNone: + index = 0; + break; + case HgMediawall::PositionAboveImage: + index = 1; + break; + case HgMediawall::PositionBelowImage: + index = 2; + break; + default: break; + } + item->setContentWidgetData(QString("currentIndex"), index); + } + else if (item) { + item->setContentWidgetData(QString("currentIndex"), 1); + } + + item = mModel->itemFromIndex(mModel->index(ItemTitleFont, 0)); + value = settings.value(SETT_TITLE_FONT); + if (item && value.isValid()) { + int index(0); + switch (value.toInt()) { + case HbFontSpec::Primary: + index = 0; + break; + case HbFontSpec::Secondary: + index = 1; + break; + case HbFontSpec::Title: + index = 2; + break; + case HbFontSpec::PrimarySmall: + index = 3; + break; + case HbFontSpec::Digital: + index = 4; + break; + default: break; + } + item->setContentWidgetData(QString("currentIndex"), index); + } + + item = mModel->itemFromIndex(mModel->index(ItemDescriptionPosition, 0)); + value = settings.value(SETT_DESCRIPTION_POSITION); + if (item && value.isValid()) { + int index(0); + switch (value.toInt()) { + case HgMediawall::PositionNone: + index = 0; + break; + case HgMediawall::PositionAboveImage: + index = 1; + break; + case HgMediawall::PositionBelowImage: + index = 2; + break; + default: break; + } + item->setContentWidgetData(QString("currentIndex"), index); + } + + item = mModel->itemFromIndex(mModel->index(ItemDescriptionFont, 0)); + value = settings.value(SETT_DESCRIPTION_FONT); + if (item && value.isValid()) { + int index(0); + switch (value.toInt()) { + case HbFontSpec::Primary: + index = 0; + break; + case HbFontSpec::Secondary: + index = 1; + break; + case HbFontSpec::Title: + index = 2; + break; + case HbFontSpec::PrimarySmall: + index = 3; + break; + case HbFontSpec::Digital: + index = 4; + break; + default: break; + } + item->setContentWidgetData(QString("currentIndex"), index); + } + + item = mModel->itemFromIndex(mModel->index(ItemReflectionEnabled, 0)); + value = settings.value(SETT_REFLECTIONS_ENABLED); + if (item && value.isValid()) { + item->setContentWidgetData(QString("text"), value.toBool() ? "yes" : "no"); + item->setContentWidgetData(QString("alternateText"), value.toBool() ? "no" : "yes"); + } + +} + +void HgWidgetOptionsView::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + FUNC_LOG; + + if (mUpdateWidgetSize) { + mContentReady = false; + HbDataFormModelItem *item = item = mModel->itemFromIndex(mModel->index(ItemWidgetHeight, 0)); + if (item) { + item->setContentWidgetData(QString("text"), event->newSize().height()); + } + + item = mModel->itemFromIndex(mModel->index(ItemWidgetWidth, 0)); + if (item) { + item->setContentWidgetData(QString("text"), event->newSize().width()); + } + mContentReady = true; + } +} diff -r 89c329efa980 -r e48454f237ca ganeswidgets/tsrc/fute/HgWidgetTest/src/hgwidgettestdatamodel.cpp --- a/ganeswidgets/tsrc/fute/HgWidgetTest/src/hgwidgettestdatamodel.cpp Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/tsrc/fute/HgWidgetTest/src/hgwidgettestdatamodel.cpp Mon May 03 13:32:54 2010 +0300 @@ -54,15 +54,23 @@ HgWidgetTestDataModel::HgWidgetTestDataModel(QObject *parent) : QAbstractListModel(parent), mCachingInProgress(false), - mImageType(TypeQImage), + mImageType(ImageTypeNone), mDefaultIcon((":/images/default.svg")), - mUseLowResImages(false) + mUseLowResImages(false), + mWrapper( new ThumbnailManager() ), + mThumbnailRequestPending(false), + mThumbnailRequestIndex(-1), + mThumbnailRequestID(-1), + mBufferManager(0) { FUNC_LOG; + mWrapper->setQualityPreference( ThumbnailManager::OptimizeForPerformance ); - mAlbumArtManager = new HgWidgetTestAlbumArtManager; - connect( mAlbumArtManager, SIGNAL(albumArtReady(int)), this, SLOT(updateAlbumArt(int)) ); - connect( mAlbumArtManager, SIGNAL(albumCacheReady()), this, SLOT(albumCacheReady()) ); + mWrapper->setProperty("qimageSupport","true"); + + QObject::connect( mWrapper, SIGNAL(thumbnailReady( QPixmap , void* , int, int ) ), + this, SLOT( thumbnailReady( QPixmap , void* , int , int ))); + init(); } @@ -73,14 +81,14 @@ { FUNC_LOG; - disconnect( mAlbumArtManager, SIGNAL(albumArtReady(int)), this, SLOT(updateAlbumArt(int)) ); - disconnect( mAlbumArtManager, SIGNAL(albumCacheReady()), this, SLOT(albumCacheReady()) ); - delete mAlbumArtManager; + disconnect( mWrapper, SIGNAL(thumbnailReady( QPixmap , void* , int , int )), this, SLOT(thumbnailReady( QPixmap , void* , int , int )) ); + delete mWrapper; + delete mBufferManager; } void HgWidgetTestDataModel::setThumbnailSize(ThumbnailManager::ThumbnailSize size) { - mAlbumArtManager->setThumbnailSize(size); + mWrapper->setThumbnailSize(size); } void HgWidgetTestDataModel::init() @@ -103,6 +111,7 @@ QString s = fileInfo.filePath(); if (s.indexOf(QString(".jpg"),0,Qt::CaseInsensitive)>0){ mFiles.append(s); + mImages.append(QImage()); mVisibility.append(true); } } @@ -112,7 +121,7 @@ if (!pixmap.isNull()){ mQIcon = QIcon(pixmap); if (!mQIcon.isNull()){ - mHbIcon = HbIcon(mQIcon); + mHbIcon = HbIcon(mQIcon); } } } @@ -146,10 +155,13 @@ int row = index.row(); - if( row >= mFiles.count() ){ + if( row < 0 && row >= mFiles.count() ){ return returnValue; } + if( mBufferManager ) + mBufferManager->setPosition( row ); + switch ( role ) { case HgWidget::HgVisibilityRole: @@ -175,35 +187,35 @@ returnValue = mDefaultIcon; } else { - QImage icon = mAlbumArtManager->albumArt(mFiles.at(row), row); + QImage icon = mImages.at(row); if ( !icon.isNull() ) { - if (mUseLowResImages) { + if (mUseLowResImages) { QSize size = icon.size(); icon = icon.scaled(QSize(size.width()/4, size.height()/4)); } switch(mImageType) { - case TypeHbIcon: + case ImageTypeHbIcon: { returnValue = mHbIcon; break; } - case TypeQImage: + case ImageTypeQImage: { returnValue = icon; break; } - case TypeQIcon: + case ImageTypeQIcon: { returnValue = mQIcon; break; } default: - break; + break; } - + } else { @@ -231,10 +243,10 @@ } break; } - + case (Qt::UserRole+2): { - QImage icon = mAlbumArtManager->albumArt(mFiles.at(row), row); + QImage icon = mImages.at(row); if (!icon.isNull()) { returnValue = icon; @@ -252,30 +264,9 @@ void HgWidgetTestDataModel::refreshModel() { // Cancel all outstanding album art request first, then reset the model. - mAlbumArtManager->cancel(); - // Before providing the new data to the view (list, grid, etc.), we want - // to make sure that we have enough album arts for the first screen. -/* mFiles.count() = mCollectionData->count(); - if ( mFiles.count() > 0 ) { - int initCount = ( mFiles.count() > KInitCacheSize ) ? KInitCacheSize : mFiles.count(); - QStringList albumArtList; - QString albumArtUri; - for ( int i = 0; i < initCount; i++ ) { - albumArtUri = mCollectionData->itemData(i, MpMpxCollectionData::AlbumArtUri); - if ( !albumArtUri.isEmpty() ) { - albumArtList << albumArtUri; - } - } - mCachingInProgress = mAlbumArtManager->cacheAlbumArt(albumArtList); - if ( !mCachingInProgress ) { - reset(); - } - } - else { - reset(); - } - */ + // TODO FIX + } /*! @@ -368,6 +359,14 @@ } } +void HgWidgetTestDataModel::reset() +{ + emit beginResetModel(); + mImages.removeAt(0); + mFiles.removeAt(0); + emit endResetModel(); +} + /*! Slot to be called when album art for the \a index needs to be updated. */ @@ -390,7 +389,12 @@ } } -void HgWidgetTestDataModel::setImageDataType(ImageType type) +HgTestImageType HgWidgetTestDataModel::imageDataType() const +{ + return mImageType; +} + +void HgWidgetTestDataModel::setImageDataType(HgTestImageType type) { mImageType = type; } @@ -416,3 +420,102 @@ return mUseLowResImages; } +void HgWidgetTestDataModel::getNextThumbnail() +{ + if ( !mThumbnailRequestPending && mWaitingThumbnails.count()){ + QString image = mWaitingThumbnails.takeFirst(); + int index = mFiles.indexOf(image); + int *clientData = new int(index); + mThumbnailRequestID = mWrapper->getThumbnail(image, clientData, -1); + mThumbnailRequestIndex = index; + mThumbnailRequestPending = true; + } +} + +void HgWidgetTestDataModel::setBuffer(int buffer, int treshhold) +{ + mWaitingThumbnails.clear(); + + if (mThumbnailRequestID!=-1){ + mWrapper->cancelRequest(mThumbnailRequestID); + } + + mThumbnailRequestID = -1; + mThumbnailRequestIndex = -1; + mThumbnailRequestPending = false; + + delete mBufferManager; + mBufferManager = 0; + mBufferManager = new BufferManager(this, buffer, treshhold, 0, mFiles.count()); + for (int i = 0; i=start?end:start; + if (last>=mFiles.count()) + last=mFiles.count()-1; + + + for (int i(first); i<=last; i++){ + mWaitingThumbnails.removeOne(mFiles.at(i)); + if (mThumbnailRequestIndex==i && mThumbnailRequestID!=-1){ + mWrapper->cancelRequest(mThumbnailRequestID); + requestNew = true; + } + mImages.replace(i,QImage()); + } + + if (requestNew){ + mThumbnailRequestIndex = -1; + mThumbnailRequestID = -1; + mThumbnailRequestPending = false; + getNextThumbnail(); + } +} + +void HgWidgetTestDataModel::request(int start, int end, requestsOrder order) +{ + int first = start; + int last = end; + + if (first<0) + first =0; + + if (last>=mFiles.count()) + last=mFiles.count()-1; + + if (order == ascending){ + for (int i(first); i<=last; i++){ + mWaitingThumbnails.append(mFiles.at(i)); + } + } else if (order ==descending){ + for (int i(last); i>=first; i--){ + mWaitingThumbnails.append(mFiles.at(i)); + } + } + + getNextThumbnail(); +} + +void HgWidgetTestDataModel::thumbnailReady( QPixmap pixmap, void* data, int /*id*/, int error ) +{ + if (!error && !pixmap.isNull() ){ +// int idx = reinterpret_cast(data); + mImages.replace(mThumbnailRequestIndex,pixmap.toImage().convertToFormat(QImage::Format_RGB16)); + QModelIndex modelIndex = QAbstractItemModel::createIndex(mThumbnailRequestIndex, 0); + emit dataChanged(modelIndex, modelIndex); + } + mThumbnailRequestIndex = -1; + mThumbnailRequestID = -1; + mThumbnailRequestPending = false; + getNextThumbnail(); +} + diff -r 89c329efa980 -r e48454f237ca ganeswidgets/tsrc/fute/HgWidgetTest/src/hgwidgettestview.cpp --- a/ganeswidgets/tsrc/fute/HgWidgetTest/src/hgwidgettestview.cpp Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/tsrc/fute/HgWidgetTest/src/hgwidgettestview.cpp Mon May 03 13:32:54 2010 +0300 @@ -24,35 +24,45 @@ #include #include #include +#include #include "hgwidgettestview.h" #include "hgtestview.h" +#include "hgwidgetoptionsview.h" #include "hgselectiondialog.h" #include "hgwidgettestdatamodel.h" #include "hgflipwidget.h" +#include "hgitemsizedialog.h" +#include "hgcoverflowwidget.h" #include "trace.h" #include #include + +static const int GRIDBUFFERSIZE(400); +static const int COVERFLOWBUFFERSIZE(130); + HgWidgetTestView::HgWidgetTestView(QGraphicsItem *parent) : HbView(parent), - mWidget(NULL), - mModel(NULL), - mListWidget(NULL), + mWidget(0), + mModel(0), + mWidgetType(HgWidgetNone), + mListWidget(0), mToggleOrientation(false), - mTBone(false), - mFlipWidget(NULL), - mFrontItem(NULL) + mFlipWidget(0), + mFrontItem(0), + mOptionsView(0), + mItemSizeDialog(0), + mItemPosDialog(0) { mModel = new HgWidgetTestDataModel(this); - mModel->setImageDataType(HgWidgetTestDataModel::TypeQImage); mSelectionModel = new QItemSelectionModel(mModel, this); createMenu(); mLayout = new QGraphicsLinearLayout(Qt::Vertical); mLayout->setContentsMargins(0,0,0,0); - initWidget( HgWidgetGrid ); - setLayout( mLayout ); + setupWidget(); + setLayout(mLayout); } HgWidgetTestView::~HgWidgetTestView() @@ -63,130 +73,18 @@ { FUNC_LOG; - HbMenu* modeMenu = new HbMenu("Change widget type"); - menu()->addMenu(modeMenu); - - HbMenu* scrollBarMenu = new HbMenu("ScrollBar settings"); - menu()->addMenu( scrollBarMenu ); - - HbMenu* imageTypeMenu = new HbMenu("Datamodel image type"); - menu()->addMenu( imageTypeMenu ); - - HbAction* gridAction = modeMenu->addAction( "Use grid" ); - HbAction* coverFlowAction = modeMenu->addAction( "Use coverFlow" ); - HbAction* TBone = modeMenu->addAction( "Use TBone" ); - connect( modeMenu, SIGNAL(triggered(HbAction*)), this, SLOT(switchWidget(HbAction*)) ); - - QActionGroup* ac1 = new QActionGroup( this ); - gridAction->setCheckable( true ); - coverFlowAction->setCheckable( true ); - TBone->setCheckable(true); - gridAction->setChecked( true ); - ac1->addAction( gridAction ); - ac1->addAction( coverFlowAction ); - ac1->addAction( TBone ); - - HbAction* scrollBarAutoHideAction = scrollBarMenu->addAction( "Autohide ScrollBar" ); - HbAction* scrollBarAlwaysOnAction = scrollBarMenu->addAction( "ScrollBar always on" ); - HbAction* scrollBarAlwaysOffAction = scrollBarMenu->addAction( "ScrollBar always off" ); - scrollBarMenu->addSeparator(); - HbAction* interactiveScrollBarAction = scrollBarMenu->addAction( "Interactive scrollbar" ); - HbAction* uninteractiveScrollBarAction = scrollBarMenu->addAction( "Uninteractive scrollbar" ); - connect( scrollBarAutoHideAction, SIGNAL(triggered()), this, SLOT(autoHideScrollBar()) ); - connect( scrollBarAlwaysOnAction, SIGNAL(triggered()), this, SLOT(scrollBarAlwaysOn()) ); - connect( scrollBarAlwaysOffAction, SIGNAL(triggered()), this, SLOT(scrollBarAlwaysOff()) ); - connect( interactiveScrollBarAction, SIGNAL(triggered()), this, SLOT(interactiveScrollBar()) ); - connect( uninteractiveScrollBarAction, SIGNAL(triggered()), this, SLOT(unInteractiveScrollBar()) ); - - QActionGroup* ac2 = new QActionGroup( this ); - scrollBarAutoHideAction->setCheckable( true ); - scrollBarAlwaysOnAction->setCheckable( true ); - scrollBarAlwaysOffAction->setCheckable(true); - scrollBarAutoHideAction->setChecked( true ); - ac2->addAction( scrollBarAutoHideAction ); - ac2->addAction( scrollBarAlwaysOnAction ); - ac2->addAction( scrollBarAlwaysOffAction ); - - QActionGroup* ac3 = new QActionGroup( this ); - interactiveScrollBarAction->setCheckable( true ); - uninteractiveScrollBarAction->setCheckable( true ); - uninteractiveScrollBarAction->setChecked( true ); - ac3->addAction( interactiveScrollBarAction ); - ac3->addAction( uninteractiveScrollBarAction ); - - HbAction* qimageAction = imageTypeMenu->addAction( "feed QImages" ); - HbAction* hbiconAction = imageTypeMenu->addAction( "feed HbIcons" ); - HbAction* qiconAction = imageTypeMenu->addAction( "feed QIcons" ); - connect( qimageAction, SIGNAL(triggered()), this, SLOT(feedqimages()) ); - connect( hbiconAction, SIGNAL(triggered()), this, SLOT(feedhbicons()) ); - connect( qiconAction, SIGNAL(triggered()), this, SLOT(feedqicons()) ); - - QActionGroup* ac4 = new QActionGroup( this ); - qimageAction->setCheckable( true ); - hbiconAction->setCheckable( true ); - qiconAction->setCheckable( true ); - qimageAction->setChecked( true ); - ac4->addAction( qimageAction ); - ac4->addAction( hbiconAction ); - ac4->addAction( qiconAction ); - + menu()->addAction("Options", this, SLOT(showOptions())); + menu()->addAction("Reset Options", this, SLOT(resetOptions())); menu()->addAction("Toggle scrolldirection", this, SLOT(toggleScrollDirection())); menu()->addAction("Simulate orientation switch", this, SLOT(orientationChanged())); - - mUseLowResAction = menu()->addAction( "Use low res images for coverflow" ); - mUseLowResAction->setCheckable(true); - mUseLowResAction->setChecked(false); - mUseLowResAction->setEnabled(false); - connect( mUseLowResAction, SIGNAL(triggered()), this, SLOT(toggleLowResForCoverflow()) ); - + menu()->addAction("Edit item size", this, SLOT(startItemSizeChange())); + menu()->addAction("Edit item pos", this, SLOT(startItemPosChange())); + HbMenu *modelChangeSubMenu = menu()->addMenu("Change model"); modelChangeSubMenu->addAction("Remove items", this, SLOT(openDeleteItemsDialog())); modelChangeSubMenu->addAction("Move items", this, SLOT(openMoveItemsDialog())); modelChangeSubMenu->addAction("Add items", this, SLOT(openAddItemsDialog())); - - HbMenu *labelChangeSubMenu = menu()->addMenu("Change labels"); - HbMenu *titleSubMenu = labelChangeSubMenu->addMenu("Title"); - HbAction *aboveAction1 = titleSubMenu->addAction("Above", this, SLOT(setTitleAboveImage())); - HbAction *belowAction1 = titleSubMenu->addAction("Below", this, SLOT(setTitleBelowImage())); - HbAction *hiddenAction1 = titleSubMenu->addAction("Hide", this, SLOT(setTitleHidden())); - QActionGroup* ac5 = new QActionGroup(this); - aboveAction1->setCheckable(true); - belowAction1->setCheckable(true); - hiddenAction1->setCheckable(true); - hiddenAction1->setChecked(true); - ac5->addAction(aboveAction1); - ac5->addAction(belowAction1); - ac5->addAction(hiddenAction1); - - HbMenu *descriptionSubMenu = labelChangeSubMenu->addMenu("Description"); - HbAction *aboveAction2 = descriptionSubMenu->addAction("Above", this, SLOT(setDescriptionAboveImage())); - HbAction *belowAction2 = descriptionSubMenu->addAction("Below", this, SLOT(setDescriptionBelowImage())); - HbAction *hiddenAction2 = descriptionSubMenu->addAction("Hide", this, SLOT(setDescriptionHidden())); - QActionGroup* ac6 = new QActionGroup(this); - aboveAction2->setCheckable(true); - belowAction2->setCheckable(true); - hiddenAction2->setCheckable(true); - hiddenAction2->setChecked(true); - ac6->addAction(aboveAction2); - ac6->addAction(belowAction2); - ac6->addAction(hiddenAction2); -} - -void HgWidgetTestView::switchWidget(HbAction* action) -{ - FUNC_LOG; - - mTBone = false; - if( action->text() == "Use grid"){ - initWidget( HgWidgetGrid ); - } - else if( action->text() == "Use coverFlow"){ - initWidget( HgWidgetCoverflow ); - } - else if( action->text() == "Use TBone" ){ - mTBone = true; - initWidget( HgWidgetCoverflow ); - } + modelChangeSubMenu->addAction("Reset model", this, SLOT(resetModel())); } void HgWidgetTestView::toggleScrollDirection() @@ -194,77 +92,191 @@ FUNC_LOG; mToggleOrientation = !mToggleOrientation; - initWidget( mWidgetType ); + initWidget(mWidgetType); } -void HgWidgetTestView::initWidget( WidgetType type ) +void HgWidgetTestView::initWidget(HgTestWidgetType type) { FUNC_LOG; - mWidgetType = type; + if (mWidgetType != type) { + mWidgetType = type; - // TODO, disconnecting signals required? + // TODO, disconnecting signals required? - if( mWidget ) - mLayout->removeItem(mWidget); - if( mListWidget ) - mLayout->removeItem(mListWidget); + if( mWidget ) + mLayout->removeItem(mWidget); + if( mListWidget ) + mLayout->removeItem(mListWidget); - delete mWidget; - mWidget = NULL; + delete mWidget; + mWidget = NULL; - delete mListWidget; - mListWidget = NULL; + delete mListWidget; + mListWidget = NULL; - mWidget = createWidget(type); - mLayout->addItem(mWidget); + mWidget = createWidget(type); + mLayout->addItem(mWidget); - switch (type) - { - case HgWidgetGrid: - { - mUseLowResAction->setEnabled(false); - mModel->enableLowResImages(false); - // TODO, init grid different model, - mModel->setThumbnailSize(ThumbnailManager::ThumbnailMedium); - break; - } - case HgWidgetCoverflow: - { - mUseLowResAction->setEnabled(true); - mModel->enableLowResImages(mUseLowResAction->isChecked()); - mModel->setThumbnailSize(ThumbnailManager::ThumbnailLarge); - if (mTBone) { + switch (type) { + case HgWidgetGrid: + setItemVisible(Hb::AllItems, true); + mModel->enableLowResImages(false); + // TODO, init grid different model, + mModel->setThumbnailSize(ThumbnailManager::ThumbnailMedium); + break; + case HgWidgetCoverflow: + mModel->setThumbnailSize(ThumbnailManager::ThumbnailLarge); + setItemVisible(Hb::AllItems, orientation() != Qt::Horizontal); + break; + case HgWidgetTBone: + setItemVisible(Hb::AllItems, true); + mModel->setThumbnailSize(ThumbnailManager::ThumbnailMedium); mListWidget = new HbListWidget; mLayout->addItem(mListWidget); mListWidget->addItem( "List item 1"); mListWidget->addItem( "List item 2"); mListWidget->addItem( "List item 3"); - } - break; - } - default: - break; + break; + default: + break; } - HANDLE_ERROR_NULL(mWidget); - if (mWidget) - { - mWidget->setModel( mModel ); + HANDLE_ERROR_NULL(mWidget); + mWidget->setModel(mModel); connect(mWidget, SIGNAL(activated(QModelIndex)), SLOT(openDialog(QModelIndex))); connect(mWidget, SIGNAL(longPressed(QModelIndex, QPointF)), SLOT(openView(QModelIndex))); QList mainWindows = hbInstance->allMainWindows(); - if (mainWindows.count() > 0) - { + if (mainWindows.count() > 0) { HbMainWindow *primaryWindow = mainWindows[0]; connect(primaryWindow, SIGNAL(orientationChanged(Qt::Orientation)), mWidget, SLOT(orientationChanged(Qt::Orientation))); + connect(primaryWindow, SIGNAL(orientationChanged(Qt::Orientation)), this, SLOT(orientationChanged(Qt::Orientation))); } + setupWidgetOptions(); + setupWidgetSize(); + + connect(mWidget, SIGNAL(scrollingStarted()), SLOT(onScrollingStarted())); + connect(mWidget, SIGNAL(scrollingEnded()), SLOT(onScrollingEnded())); + } +} + +void HgWidgetTestView::changeScrollBarVisibility(HgWidget::ScrollBarPolicy policy) +{ + FUNC_LOG; + + if (mWidget->scrollBarPolicy() != policy) { + mWidget->setScrollBarPolicy(policy); + } +} + +void HgWidgetTestView::changeScrollBarInteractivity(bool value) +{ + FUNC_LOG; + + if (mWidget->scrollBar()->isInteractive() != value) { + mWidget->scrollBar()->setInteractive(value); + + if (mWidgetType == HgWidgetCoverflow || mWidgetType == HgWidgetTBone) { + mWidget->setIndexFeedbackPolicy(HgWidget::IndexFeedbackSingleCharacter); + } + } +} + +void HgWidgetTestView::changeModelImageType(HgTestImageType type) +{ + FUNC_LOG; + + if (mModel->imageDataType() != type) { + mModel->setImageDataType(type); + } +} + +void HgWidgetTestView::changeLowResImageUse(bool value) +{ + FUNC_LOG; + + if (mWidgetType == HgWidgetCoverflow || mWidgetType == HgWidgetTBone) { + mModel->enableLowResImages(value); + initWidget(mWidgetType); + } +} + +void HgWidgetTestView::changeTitlePosition(HgMediawall::LabelPosition position) +{ + FUNC_LOG; + + HgMediawall *mediawall = qobject_cast(mWidget); + if (mediawall && mediawall->titlePosition() != position) { + mediawall->setTitlePosition(position); + } +} - connect(mWidget, SIGNAL(scrollingStarted()), SLOT(onScrollingStarted())); - connect(mWidget, SIGNAL(scrollingEnded()), SLOT(onScrollingEnded())); +void HgWidgetTestView::changeTitleFont(const HbFontSpec &fontSpec) +{ + FUNC_LOG; + + HgMediawall *mediawall = qobject_cast(mWidget); + if (mediawall && mediawall->titleFontSpec() != fontSpec) { + mediawall->setTitleFontSpec(fontSpec); + } +} + +void HgWidgetTestView::changeDescriptionPosition(HgMediawall::LabelPosition position) +{ + FUNC_LOG; + + HgMediawall *mediawall = qobject_cast(mWidget); + if (mediawall && mediawall->descriptionPosition() != position) { + mediawall->setDescriptionPosition(position); + } +} + +void HgWidgetTestView::changeDescriptionFont(const HbFontSpec &fontSpec) +{ + FUNC_LOG; + + HgMediawall *mediawall = qobject_cast(mWidget); + if (mediawall && mediawall->descriptionFontSpec() != fontSpec) { + mediawall->setDescriptionFontSpec(fontSpec); } } +void HgWidgetTestView::changeWidgetHeight(int value) +{ + FUNC_LOG; + + int height(rect().height()); + if (value < height) { + qreal left(0), top(0), right(0), bottom(0); + mLayout->getContentsMargins(&left, &top, &right, &bottom); + + if (mWidgetType == HgWidgetTBone) { + mListWidget->setPreferredSize(mListWidget->preferredSize().width(), height-value); + mLayout->setContentsMargins(left, 0, right, 0); + } + else { + int margin(0); + margin = (height-value)/2; + mLayout->setContentsMargins(left, margin, right, margin); + } + } +} + +void HgWidgetTestView::changeWidgetWidth(int value) +{ + FUNC_LOG; + + int width(rect().width()); + int margin(0); + if (value < width) { + margin = (width-value)/2; + } + + qreal left(0), top(0), right(0), bottom(0); + mLayout->getContentsMargins(&left, &top, &right, &bottom); + mLayout->setContentsMargins(margin, top, margin, bottom); +} + void HgWidgetTestView::openDialog(const QModelIndex& index) { FUNC_LOG; @@ -272,7 +284,7 @@ QVariant image = mModel->data(index, Qt::DecorationRole); QVariant texts = mModel->data(index, Qt::DisplayRole); - if (mWidgetType == HgWidgetCoverflow) + if (mWidgetType == HgWidgetCoverflow || mWidgetType == HgWidgetTBone) { if (image.canConvert() && texts.canConvert()) { @@ -281,7 +293,7 @@ { if (mFrontItem) mFrontItem->setVisible(false); - + if (mFlipWidget) delete mFlipWidget; @@ -290,6 +302,7 @@ return; QRectF itemRect = poly.boundingRect(); + itemRect.moveTo(itemRect.topLeft() + mWidget->geometry().topLeft()); mFlipWidget = new HgFlipWidget( @@ -355,18 +368,31 @@ strList.at(0), strList.at(1), QPixmap::fromImage(image.value())); + connect(view, SIGNAL(closeRequested()), SLOT(closeCurrentView())); QList mainWindows = hbInstance->allMainWindows(); if (mainWindows.count() > 0) { HbMainWindow *primaryWindow = mainWindows[0]; primaryWindow->addView(view); - primaryWindow->setViewSwitchingEnabled(false); primaryWindow->setCurrentView(view); } } } } +void HgWidgetTestView::closeCurrentView() +{ + FUNC_LOG; + + QList mainWindows = hbInstance->allMainWindows(); + if (mainWindows.count() > 0) { + HbMainWindow *primaryWindow = mainWindows[0]; + HbView *currentView = primaryWindow->currentView(); + primaryWindow->setCurrentView(this); + primaryWindow->removeView(currentView); + } +} + void HgWidgetTestView::openDeleteItemsDialog() { FUNC_LOG; @@ -458,65 +484,180 @@ mWidget->show(); } -void HgWidgetTestView::autoHideScrollBar() +void HgWidgetTestView::showOptions() { - setScrollBarPolicy(HgWidget::ScrollBarAutoHide); + FUNC_LOG; + + QList mainWindows = hbInstance->allMainWindows(); + if (mainWindows.count() > 0) { + HbMainWindow *primaryWindow = mainWindows[0]; + if (!mOptionsView) { + HgWidgetOptionsView* view = new HgWidgetOptionsView; + connect(view, SIGNAL(optionsClosed()), SLOT(hideOptions())); + connect(view, SIGNAL(widgetTypeChanged(HgTestWidgetType)), + SLOT(initWidget(HgTestWidgetType))); + connect(view, SIGNAL(scrollBarVisibilityChanged(HgWidget::ScrollBarPolicy)), + SLOT(changeScrollBarVisibility(HgWidget::ScrollBarPolicy))); + connect(view, SIGNAL(scrollBarInteractivityChanged(bool)), + SLOT(changeScrollBarInteractivity(bool))); + connect(view, SIGNAL(imageTypeChanged(HgTestImageType)), + SLOT(changeModelImageType(HgTestImageType))); + connect(view, SIGNAL(lowResImageUseChanged(bool)), SLOT(changeLowResImageUse(bool))); + connect(view, SIGNAL(widgetHeightChanged(int)), SLOT(changeWidgetHeight(int))); + connect(view, SIGNAL(widgetWidthChanged(int)), SLOT(changeWidgetWidth(int))); + connect(view, SIGNAL(titlePositionChanged(HgMediawall::LabelPosition)), + SLOT(changeTitlePosition(HgMediawall::LabelPosition))); + connect(view, SIGNAL(titleFontChanged(HbFontSpec)), + SLOT(changeTitleFont(HbFontSpec))); + connect(view, SIGNAL(descriptionPositionChanged(HgMediawall::LabelPosition)), + SLOT(changeDescriptionPosition(HgMediawall::LabelPosition))); + connect(view, SIGNAL(descriptionFontChanged(HbFontSpec)), + SLOT(changeDescriptionFont(HbFontSpec))); + connect(view, SIGNAL(reflectionsEnabledChanged(bool)), + SLOT(changeReflectionsEnabled(bool))); + + mOptionsView = view; + primaryWindow->addView(mOptionsView); + } + primaryWindow->setCurrentView(mOptionsView); + } } -void HgWidgetTestView::scrollBarAlwaysOn() -{ - setScrollBarPolicy(HgWidget::ScrollBarAlwaysOn); -} - -void HgWidgetTestView::scrollBarAlwaysOff() +void HgWidgetTestView::hideOptions() { - setScrollBarPolicy(HgWidget::ScrollBarAlwaysOff); -} + FUNC_LOG; -void HgWidgetTestView::setScrollBarPolicy( HgWidget::ScrollBarPolicy policy ) -{ - mWidget->setScrollBarPolicy( policy ); + QList mainWindows = hbInstance->allMainWindows(); + if (mainWindows.count() > 0) { + HbMainWindow *primaryWindow = mainWindows[0]; + primaryWindow->setCurrentView(this); + } } -void HgWidgetTestView::setScrollBarInteractive( bool value ) +void HgWidgetTestView::setupWidget() { - if( value ) - setScrollBarPolicy(HgWidget::ScrollBarAlwaysOn); + FUNC_LOG; + + QSettings settings(SETT_ORGANIZATION, SETT_APPLICATION); - mWidget->scrollBar()->setInteractive(value); + QVariant value = settings.value(SETT_WIDGET_TYPE); + if (value.isValid()) { + initWidget(static_cast(value.toInt())); + } + else { + initWidget(HgWidgetGrid); + } - if (mWidgetType == HgWidgetCoverflow) { - mWidget->setIndexFeedbackPolicy(HgWidget::IndexFeedbackSingleCharacter); + value = settings.value(SETT_LOW_RES_IMAGES); + if (value.isValid()) { + changeLowResImageUse(value.toBool()); } - } -void HgWidgetTestView::interactiveScrollBar() +void HgWidgetTestView::setupWidgetOptions() { - setScrollBarInteractive(true); + FUNC_LOG; + + QSettings settings(SETT_ORGANIZATION, SETT_APPLICATION); + + QVariant value = settings.value(SETT_SCROLLBAR_VISIBILITY); + if (value.isValid()) { + changeScrollBarVisibility(static_cast(value.toInt())); + } + + value = settings.value(SETT_SCROLLBAR_INTERACTIVITY); + if (value.isValid()) { + changeScrollBarInteractivity(value.toBool()); + } + + value = settings.value(SETT_MODEL_IMAGE_TYPE); + if (value.isValid()) { + changeModelImageType(static_cast(value.toInt())); + } + else { + changeModelImageType(ImageTypeQImage); + } + + value = settings.value(SETT_TITLE_POSITION); + if (value.isValid()) { + changeTitlePosition(static_cast(value.toInt())); + } + + value = settings.value(SETT_TITLE_FONT); + if (value.isValid()) { + changeTitleFont(HbFontSpec(static_cast(value.toInt()))); + } + + value = settings.value(SETT_DESCRIPTION_POSITION); + if (value.isValid()) { + changeDescriptionPosition(static_cast(value.toInt())); + } + + value = settings.value(SETT_DESCRIPTION_FONT); + if (value.isValid()) { + changeDescriptionFont(HbFontSpec(static_cast(value.toInt()))); + } + + value = settings.value(SETT_REFLECTIONS_ENABLED); + if (value.isValid()) { + changeReflectionsEnabled(value.toBool()); + } + } -void HgWidgetTestView::unInteractiveScrollBar() +void HgWidgetTestView::setupWidgetSize() { - setScrollBarInteractive(false); + QSettings settings(SETT_ORGANIZATION, SETT_APPLICATION); + + QVariant value = settings.value(SETT_WIDGET_HEIGHT); + if (value.isValid()) { + changeWidgetHeight(value.toInt()); + } + + value = settings.value(SETT_WIDGET_WIDTH); + if (value.isValid()) { + changeWidgetWidth(value.toInt()); + } } -HgWidget *HgWidgetTestView::createWidget(WidgetType type) const +HgWidget *HgWidgetTestView::createWidget(HgTestWidgetType type) const { FUNC_LOG; HANDLE_ERROR_NULL(mModel); HANDLE_ERROR_NULL(mSelectionModel); - Qt::Orientation scrollDirection = !mToggleOrientation ? Qt::Vertical : Qt::Horizontal ; + Qt::Orientation scrollDirection = Qt::Vertical; + QList mainWindows = hbInstance->allMainWindows(); + if (mainWindows.count() > 0) + { + HbMainWindow *primaryWindow = mainWindows[0]; + if (primaryWindow->orientation() == Qt::Horizontal) { + scrollDirection = Qt::Horizontal; + } + } HgWidget* widget = 0; - + HgCoverflowWidget* temp = 0; + switch (type) { case HgWidgetGrid: + mModel->setThumbnailSize(ThumbnailManager::ThumbnailMedium); + mModel->setBuffer(GRIDBUFFERSIZE, GRIDBUFFERSIZE/3); widget = new HgGrid(scrollDirection); break; case HgWidgetCoverflow: - widget = new HgMediawall(); + mModel->setThumbnailSize(ThumbnailManager::ThumbnailLarge); + mModel->setBuffer(COVERFLOWBUFFERSIZE, COVERFLOWBUFFERSIZE/3); + widget = new HgCoverflowWidget(); + temp = (HgCoverflowWidget*)widget; + temp->setTitlePosition(HgMediawall::PositionNone); + break; + case HgWidgetTBone: + mModel->setThumbnailSize(ThumbnailManager::ThumbnailLarge); + mModel->setBuffer(COVERFLOWBUFFERSIZE, COVERFLOWBUFFERSIZE/3); + widget = new HgCoverflowWidget(); + temp = (HgCoverflowWidget*)widget; + temp->setTitlePosition(HgMediawall::PositionNone); break; default: break; @@ -552,42 +693,23 @@ return widget; } -void HgWidgetTestView::feedqimages() -{ - mModel->setImageDataType(HgWidgetTestDataModel::TypeQImage); -} - -void HgWidgetTestView::feedqicons() -{ - mModel->setImageDataType(HgWidgetTestDataModel::TypeQIcon); -} - -void HgWidgetTestView::feedhbicons() -{ - mModel->setImageDataType(HgWidgetTestDataModel::TypeHbIcon); -} - void HgWidgetTestView::flipClosed() { delete mFlipWidget; mFlipWidget = 0; mModel->setData(mFlippedIndex, true, Qt::UserRole+1); - + if (mFrontItem) { mFrontItem->setVisible(true); } - -} -void HgWidgetTestView::orientationChanged() -{ - mWidget->orientationChanged(Qt::Horizontal); + } void HgWidgetTestView::onScrollingStarted() { FUNC_LOG; - // scrolling started, need to hide + // scrolling started, need to hide // label displaying full resolution image if (mFrontItem) mFrontItem->setVisible(false); @@ -599,104 +721,193 @@ FUNC_LOG; if (mModel->lowResImagesEnabled()) { - + if (!mWidget) return; - + // get index to current item QModelIndex index = mWidget->currentIndex(); if (!index.isValid()) return; - + // get outlines of the item so we know where to render QPolygonF poly; if (!mWidget->getItemOutline(index, poly)) return; - + // fetch highresolution image from the model - QVariant imgVariant = mModel->data(index, Qt::UserRole+2); + QVariant imgVariant = mModel->data(index, Qt::UserRole+2); if (imgVariant.isNull()) return; - + QRectF itemRect = poly.boundingRect(); - + itemRect.moveTo(itemRect.topLeft() + mWidget->geometry().topLeft()); + // show it using HbLabel - QPixmap pixmap = imgVariant.value().scaled(itemRect.width(), itemRect.height()); - + QPixmap pixmap = imgVariant.value().scaled(itemRect.width(), itemRect.height()); + if (!mFrontItem) { mFrontItem = new HbLabel(this); } - - + + mFrontItem->setVisible(false); mFrontItem->setIcon(HbIcon(pixmap)); mFrontItem->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter); mFrontItem->setPos(itemRect.center() - QPointF(itemRect.width()/2, itemRect.height()/2)); mFrontItem->resize(itemRect.width(), itemRect.height()); mFrontItem->setVisible(true); - - } - -} - -void HgWidgetTestView::toggleLowResForCoverflow() -{ - if (mWidgetType == HgWidgetCoverflow) { - mModel->enableLowResImages(mUseLowResAction->isChecked()); - initWidget(mWidgetType); - } -} - -void HgWidgetTestView::setTitleAboveImage() -{ - FUNC_LOG; - HgMediawall *mediawall = qobject_cast(mWidget); - if (mediawall) { - mediawall->setTitlePosition(HgMediawall::PositionAboveImage); - } -} - -void HgWidgetTestView::setTitleBelowImage() -{ - FUNC_LOG; - HgMediawall *mediawall = qobject_cast(mWidget); - if (mediawall) { - mediawall->setTitlePosition(HgMediawall::PositionBelowImage); } } -void HgWidgetTestView::setTitleHidden() +void HgWidgetTestView::orientationChanged(Qt::Orientation orientation) +{ + if (orientation == Qt::Horizontal && mWidgetType == HgWidgetCoverflow ) { + setItemVisible(Hb::AllItems, false); + } + else if (orientation == Qt::Horizontal && mWidgetType == HgWidgetTBone) { + initWidget(HgWidgetCoverflow); +// HbEffect::add(mWidget,":/effect1.fxml", "end"); +// HbEffect::start(mWidget, "end"); + setItemVisible(Hb::AllItems, false); + } + else if (orientation == Qt::Vertical && mWidgetType == HgWidgetCoverflow) { + initWidget(HgWidgetTBone); +// HbEffect::add(mWidget,":/effect1.fxml", "end"); +// HbEffect::start(mWidget, "end"); + setItemVisible(Hb::AllItems, true); + } + + HgCoverflowWidget* wall = qobject_cast(mWidget); + if (wall) + wall->updateTextPositions(); +} +void HgWidgetTestView::resizeEvent(QGraphicsSceneResizeEvent *event) +{ + Q_UNUSED(event); + FUNC_LOG; + + setupWidgetSize(); + +/* if (mWidgetType == HgWidgetCoverflow || + mWidgetType == HgWidgetTBone) + { + HgMediawall* wall = qobject_cast(mWidget); + wall->setFrontItemPosition(QPointF(mWidget->size().width()/2, + mWidget->size().height()/2)); + }*/ +} + +Qt::Orientation HgWidgetTestView::orientation() const { FUNC_LOG; - HgMediawall *mediawall = qobject_cast(mWidget); - if (mediawall) { - mediawall->setTitlePosition(HgMediawall::PositionNone); + + if (mainWindow()) { + return mainWindow()->orientation(); } + + return Qt::Horizontal; } -void HgWidgetTestView::setDescriptionAboveImage() +void HgWidgetTestView::startItemSizeChange() { - FUNC_LOG; - HgMediawall *mediawall = qobject_cast(mWidget); - if (mediawall) { - mediawall->setDescriptionPosition(HgMediawall::PositionAboveImage); - } + if (mItemSizeDialog) + return; + + if (!mWidget) + return; + + QSizeF itemSize = mWidget->itemSize(); + QSizeF itemSpacing = mWidget->itemSpacing(); + mItemSizeDialog = new HgItemSizeDialog(itemSize, itemSpacing, this); + + QObject::connect(mItemSizeDialog, SIGNAL(updateItemSizeAndSpacing()), this, SLOT(updateItemSizeAndSpacing())); + QObject::connect(mItemSizeDialog, SIGNAL(closed()), this, SLOT(itemSizeDialogClosed())); } -void HgWidgetTestView::setDescriptionBelowImage() +void HgWidgetTestView::startItemPosChange() { - FUNC_LOG; - HgMediawall *mediawall = qobject_cast(mWidget); - if (mediawall) { - mediawall->setDescriptionPosition(HgMediawall::PositionBelowImage); + if (mItemPosDialog) + return; + + if (!mWidget) + return; + + HgMediawall* wall = qobject_cast(mWidget); + if (!wall) + return; + + QPointF itemPos = wall->frontItemPositionDelta(); + QSizeF s(itemPos.x(), itemPos.y()); + mItemPosDialog = new HgItemSizeDialog(s, s, this); + + mItemPosDialog->setSliderLimits(-500, 500); + + QObject::connect(mItemPosDialog, SIGNAL(updateItemSizeAndSpacing()), this, SLOT(updateItemPos())); + QObject::connect(mItemPosDialog, SIGNAL(closed()), this, SLOT(itemPosDialogClosed())); +} + + + +void HgWidgetTestView::updateItemSizeAndSpacing() +{ + if (!mItemSizeDialog) + return; + + mWidget->setItemSize(mItemSizeDialog->itemSize()); + mWidget->setItemSpacing(mItemSizeDialog->itemSpacing()); + + HgCoverflowWidget* wall = qobject_cast(mWidget); + if (wall) + { + wall->updateTextPositions(); } + + mWidget->update(); + } -void HgWidgetTestView::setDescriptionHidden() +void HgWidgetTestView::updateItemPos() +{ + if (!mItemPosDialog) + return; + + HgCoverflowWidget* wall = qobject_cast(mWidget); + if (!wall) + return; + + QSizeF s = mItemPosDialog->itemSize(); + wall->setFrontItemPositionDelta(QPointF(s.width(), s.height())); + wall->updateTextPositions(); + mWidget->update(); +} + +void HgWidgetTestView::itemSizeDialogClosed() { - FUNC_LOG; - HgMediawall *mediawall = qobject_cast(mWidget); - if (mediawall) { - mediawall->setDescriptionPosition(HgMediawall::PositionNone); - } + // dialog deletes it self at close + mItemSizeDialog = NULL; +} + +void HgWidgetTestView::itemPosDialogClosed() +{ + mItemPosDialog = NULL; } + +void HgWidgetTestView::resetOptions() +{ + QSettings settings(SETT_ORGANIZATION, SETT_APPLICATION); + settings.clear(); + setupWidget(); +} + +void HgWidgetTestView::changeReflectionsEnabled(bool enabled) +{ + HgMediawall* wall = qobject_cast(mWidget); + if (wall) + wall->enableReflections(enabled); +} + +void HgWidgetTestView::resetModel() +{ + mModel->reset(); +} diff -r 89c329efa980 -r e48454f237ca ganeswidgets/tsrc/unit/unittest_ganeswidgets.cpp --- a/ganeswidgets/tsrc/unit/unittest_ganeswidgets.cpp Mon Apr 19 14:40:06 2010 +0300 +++ b/ganeswidgets/tsrc/unit/unittest_ganeswidgets.cpp Mon May 03 13:32:54 2010 +0300 @@ -20,8 +20,10 @@ #include #include "hbautotest.h" #include +#include #include #include +#include #include #include #include @@ -39,6 +41,16 @@ static const QPointF grid_portrait_pos7(180, 200); static const QPointF grid_portrait_pos8(280, 200); +// These work with 360x640 resolution +static const QPointF expected_label_pos_above_alone(180, 144); +static const QPointF expected_label_pos_above_top(180, 132); +static const QPointF expected_label_pos_above_bottom(180, 163); +static const QPointF expected_label_pos_below_alone(180, 324); +static const QPointF expected_label_pos_below_top(180, 312); +static const QPointF expected_label_pos_below_bottom(180, 342); + +static const int default_delay(1500); + class TestGanesWidgets : public QObject { Q_OBJECT @@ -55,6 +67,7 @@ void cleanup(); private slots: + void test_setModel(); void test_panGridLandscape(); void test_panGridPortrait(); void test_panCoverFlowLandscape(); @@ -75,15 +88,22 @@ void test_addItemsCoverFlow(); void test_removeItemsCoverFlow(); void test_moveItemsCoverFlow(); + void test_labelPositionsCoverFlow(); + void test_labelFontSpecsCoverFlow(); + void test_resetModelCoverFlow(); + void test_resetModelGrid(); private: void pan( Qt::Orientation, TBool begin ); + bool checkLabelAt(HbMainWindow *window, const QPointF &pos, const QString &expectedText); + HbLabel *findLabelAt(QGraphicsItem *parent, const QPointF &pos); private: HbMainWindow* mWindow; HgWidget* mWidget; + HgMediawall* mMediawall; }; @@ -105,8 +125,8 @@ void removeItems(int index, int count=1); void moveItems(int from, int to, int count=1); void changeItem(int index); - void reset(); - + void reset(int newItemCount=0); + QImage mImage; QStringList mItems; bool mValidData; @@ -129,7 +149,7 @@ void TestModel::generateItems(int count) { for (int i=0; i 0) { + generateItems(newItemCount); + } endResetModel(); } - void TestModel::changeItem(int index) { if ( index >= 0 && index < mItems.count() ) { @@ -189,6 +211,8 @@ int TestModel::rowCount(const QModelIndex &parent) const { + Q_UNUSED(parent); + return mItems.count(); } @@ -205,14 +229,10 @@ { case Qt::DisplayRole: { - QStringList texts; - QString text("Primary %0"); - text.arg(row); - texts << text; - text = "Secondary %0"; - text.arg(row); - texts << text; - returnValue = texts; + QStringList list; + list << QString("Primary %1").arg(row); + list << QString("Secondary %1").arg(row); + returnValue = list; break; } case Qt::DecorationRole: @@ -284,6 +304,36 @@ HbAutoTest::mouseRelease( (HbAutoTestMainWindow*)mWindow, mWidget, end, 100 ); } +void TestGanesWidgets::test_setModel() +{ + mWindow = new HbMainWindow; + mWidget = new HgGrid(Qt::Horizontal); + mWindow->addView(mWidget); + QVERIFY(mWidget->model() == 0); + + TestModel model1; + model1.generateItems(10); + mWidget->setModel(&model1); + QVERIFY(&model1 == mWidget->model()); + + mWindow->show(); + + QTest::qWait(2000); + + TestModel model2; + model2.generateItems(20); + mWidget->setModel(&model2); + QVERIFY(&model2 == mWidget->model()); + + QTest::qWait(2000); + + mWidget->setModel(0); + QVERIFY(mWidget->model() == 0); + + delete mWindow; + mWindow = 0; +} + void TestGanesWidgets::test_panGridLandscape() { mWindow = new HbMainWindow; @@ -713,7 +763,7 @@ qRegisterMetaType("QModelIndex"); QSignalSpy currentItemSpy(mWidget->selectionModel(), SIGNAL(currentChanged(QModelIndex, QModelIndex))); - QTest::qWait(2000); + QTest::qWait(default_delay); QVERIFY(mWidget->currentIndex() == model.index(0, 0)); @@ -725,7 +775,7 @@ currentItemSpy.clear(); HbAutoTest::mouseClick((HbAutoTestMainWindow*)mWindow, mWidget, pos1, 100); - QTest::qWait(1000); + QTest::qWait(default_delay); QVERIFY(mWidget->currentIndex() == model.index(0, 0)); QVERIFY(currentItemSpy.count() == 1); QVERIFY(currentItemSpy.at(0).count() > 0); @@ -733,7 +783,7 @@ currentItemSpy.clear(); HbAutoTest::mouseClick((HbAutoTestMainWindow*)mWindow, mWidget, pos2, 100); - QTest::qWait(1000); + QTest::qWait(default_delay); QVERIFY(mWidget->currentIndex() == model.index(1, 0)); QVERIFY(currentItemSpy.count() == 1); QVERIFY(currentItemSpy.at(0).count() > 0); @@ -741,7 +791,7 @@ currentItemSpy.clear(); HbAutoTest::mouseClick((HbAutoTestMainWindow*)mWindow, mWidget, pos2, 100); - QTest::qWait(1000); + QTest::qWait(default_delay); QVERIFY(mWidget->currentIndex() == model.index(2, 0)); QVERIFY(currentItemSpy.count() == 1); QVERIFY(currentItemSpy.at(0).count() > 0); @@ -749,7 +799,7 @@ currentItemSpy.clear(); HbAutoTest::mouseClick((HbAutoTestMainWindow*)mWindow, mWidget, pos2, 100); - QTest::qWait(1000); + QTest::qWait(default_delay); QVERIFY(mWidget->currentIndex() == model.index(3, 0)); QVERIFY(currentItemSpy.count() == 1); QVERIFY(currentItemSpy.at(0).count() > 0); @@ -757,7 +807,7 @@ currentItemSpy.clear(); HbAutoTest::mouseClick((HbAutoTestMainWindow*)mWindow, mWidget, pos3, 100); - QTest::qWait(1000); + QTest::qWait(default_delay); QVERIFY(mWidget->currentIndex() == model.index(2, 0)); QVERIFY(currentItemSpy.count() == 1); QVERIFY(currentItemSpy.at(0).count() > 0); @@ -765,7 +815,7 @@ currentItemSpy.clear(); HbAutoTest::mouseClick((HbAutoTestMainWindow*)mWindow, mWidget, pos3, 100); - QTest::qWait(1000); + QTest::qWait(default_delay); QVERIFY(mWidget->currentIndex() == model.index(1, 0)); QVERIFY(currentItemSpy.count() == 1); QVERIFY(currentItemSpy.at(0).count() > 0); @@ -773,7 +823,7 @@ currentItemSpy.clear(); HbAutoTest::mouseClick((HbAutoTestMainWindow*)mWindow, mWidget, pos3, 100); - QTest::qWait(1000); + QTest::qWait(default_delay); QVERIFY(mWidget->currentIndex() == model.index(0, 0)); QVERIFY(currentItemSpy.count() == 1); QVERIFY(currentItemSpy.at(0).count() > 0); @@ -781,11 +831,11 @@ currentItemSpy.clear(); HbAutoTest::mouseClick((HbAutoTestMainWindow*)mWindow, mWidget, pos3, 100); - QTest::qWait(1000); + QTest::qWait(default_delay); QVERIFY(mWidget->currentIndex() == model.index(0, 0)); QVERIFY(currentItemSpy.count() == 0); - QTest::qWait(2000); + QTest::qWait(default_delay); delete mWindow; mWindow = 0; @@ -1279,73 +1329,74 @@ QList requestedIndexes; TestModel model(&requestedIndexes); - model.generateItems(120); + model.generateItems(110); mWidget->setModel(&model); mWindow->addView(mWidget); mWindow->show(); QTest::qWait(2000); - QVERIFY(requestedIndexes.count() == 40); // Scroll buffer size in coverflow mode is assumed to be 40 + QVERIFY(requestedIndexes.count() == 30); // Scroll buffer size in coverflow mode is assumed to be 30 QVERIFY(requestedIndexes.front() == model.index(0, 0)); - QVERIFY(requestedIndexes.back() == model.index(39, 0)); + QVERIFY(requestedIndexes.back() == model.index(29, 0)); requestedIndexes.clear(); // Move buffer to the end of items - mWidget->scrollTo(model.index(119, 0)); + mWidget->setCurrentIndex(model.index(95, 0)); + mWidget->scrollTo(model.index(95, 0)); QTest::qWait(1000); requestedIndexes.clear(); // Add one item to beginning of buffer model.insertItems(80, 1); QTest::qWait(1000); - QVERIFY(requestedIndexes.count() == 0); // New item falls outside of buffer as buffer is moved up + QVERIFY(requestedIndexes.count() == 0); // Buffer is moved up to 81 requestedIndexes.clear(); - // Last item is now 120 + // Last item is now 110 // Add many items to beginning of buffer model.insertItems(81, 4); QTest::qWait(1000); - QVERIFY(requestedIndexes.count() == 0); // New items falls outside of buffer as buffer is moved up + QVERIFY(requestedIndexes.count() == 0); // // Buffer is moved up to 85 requestedIndexes.clear(); - // Last item is now 124 + // Last item is now 114 - // Add one item to the end - model.insertItems(124, 1); + // Add one item to the end of the buffer + model.insertItems(114, 1); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 1); // The new item is requested - QVERIFY(requestedIndexes.front() == model.index(124, 0)); + QVERIFY(requestedIndexes.front() == model.index(114, 0)); requestedIndexes.clear(); - // Last item is now 125 + // Last item is now 115 // Add many items to the end - model.insertItems(125, 4); + model.insertItems(111, 4); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 4); // The new items are requested - QVERIFY(requestedIndexes.front() == model.index(125, 0)); - QVERIFY(requestedIndexes.back() == model.index(128, 0)); + QVERIFY(requestedIndexes.front() == model.index(111, 0)); + QVERIFY(requestedIndexes.back() == model.index(114, 0)); requestedIndexes.clear(); - // Last item is now 129 + // Last item is now 119 // Add one item to middle of buffer - model.insertItems(110, 1); + model.insertItems(100, 1); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 1); // The new item is requested - QVERIFY(requestedIndexes.front() == model.index(110, 0)); + QVERIFY(requestedIndexes.front() == model.index(100, 0)); requestedIndexes.clear(); // Last item is now 130 // Add many items to middle of buffer - model.insertItems(110, 4); + model.insertItems(100, 4); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 4); // The new items are requested - QVERIFY(requestedIndexes.front() == model.index(110, 0)); - QVERIFY(requestedIndexes.back() == model.index(113, 0)); + QVERIFY(requestedIndexes.front() == model.index(100, 0)); + QVERIFY(requestedIndexes.back() == model.index(103, 0)); requestedIndexes.clear(); // Last item is now 134 // Add items to the buffer limit (beginning of buffer) - model.insertItems(90, 20); + model.insertItems(70, 20); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 0); // New item falls outside of buffer as buffer is moved up // Last item is now 154 @@ -1357,86 +1408,79 @@ requestedIndexes.clear(); // Move buffer to the beginning of items - mWidget->scrollTo(model.index(0, 0)); + mWidget->setCurrentIndex(model.index(15, 0)); + mWidget->scrollTo(model.index(15, 0)); QTest::qWait(1000); requestedIndexes.clear(); // Add one item to beginning model.insertItems(0, 1); QTest::qWait(1000); - QVERIFY(requestedIndexes.count() == 1); // The new item is requested - QVERIFY(requestedIndexes.front() == model.index(0, 0)); - requestedIndexes.clear(); + QVERIFY(requestedIndexes.count() == 0); // Buffer is moved up // Add many items to beginning - model.insertItems(0, 5); + model.insertItems(1, 5); QTest::qWait(1000); - QVERIFY(requestedIndexes.count() == 5); // The new items are requested - QVERIFY(requestedIndexes.front() == model.index(0, 0)); - QVERIFY(requestedIndexes.back() == model.index(4, 0)); - requestedIndexes.clear(); + QVERIFY(requestedIndexes.count() == 0); // Buffer is moved up // Add one item to middle of buffer - model.insertItems(20, 1); + model.insertItems(10, 1); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 1); // The new item is requested - QVERIFY(requestedIndexes.front() == model.index(20, 0)); + QVERIFY(requestedIndexes.front() == model.index(10, 0)); requestedIndexes.clear(); // Add many items to middle of buffer - model.insertItems(20, 5); + model.insertItems(10, 5); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 5); // The new items are requested - QVERIFY(requestedIndexes.front() == model.index(20, 0)); - QVERIFY(requestedIndexes.back() == model.index(24, 0)); + QVERIFY(requestedIndexes.front() == model.index(10, 0)); + QVERIFY(requestedIndexes.back() == model.index(14, 0)); requestedIndexes.clear(); // Add one item to end of buffer - model.insertItems(39, 1); + model.insertItems(35, 1); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 1); // The new item is requested - QVERIFY(requestedIndexes.front() == model.index(39, 0)); + QVERIFY(requestedIndexes.front() == model.index(35, 0)); requestedIndexes.clear(); // Add many items to end of buffer - model.insertItems(30, 10); + model.insertItems(26, 10); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 10); // The new items are requested - QVERIFY(requestedIndexes.front() == model.index(30, 0)); - QVERIFY(requestedIndexes.back() == model.index(39, 0)); + QVERIFY(requestedIndexes.front() == model.index(26, 0)); + QVERIFY(requestedIndexes.back() == model.index(35, 0)); requestedIndexes.clear(); // Add items to outside of buffer (after buffer) - model.insertItems(40, 10); + model.insertItems(50, 10); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 0); // The new items are not requested requestedIndexes.clear(); // Add items to the buffer limit (end of buffer) - model.insertItems(35, 10); + model.insertItems(31, 10); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 5); // The new items inside buffer are requested - QVERIFY(requestedIndexes.front() == model.index(35, 0)); - QVERIFY(requestedIndexes.back() == model.index(39, 0)); + QVERIFY(requestedIndexes.front() == model.index(31, 0)); + QVERIFY(requestedIndexes.back() == model.index(35, 0)); // Move buffer to the middle of items + mWidget->setCurrentIndex(model.index(60, 0)); mWidget->scrollTo(model.index(60, 0)); QTest::qWait(1000); requestedIndexes.clear(); // Add items to the buffer limit (beginning of buffer) - model.insertItems(35, 10); + model.insertItems(40, 10); QTest::qWait(1000); - QVERIFY(requestedIndexes.count() == 5); // The new items inside buffer are requested - QVERIFY(requestedIndexes.front() == model.index(40, 0)); - QVERIFY(requestedIndexes.back() == model.index(44, 0)); + QVERIFY(requestedIndexes.count() == 0); // The buffer is moved up // Add items over the whole buffer - model.insertItems(35, 50); + model.insertItems(40, 50); QTest::qWait(1000); - QVERIFY(requestedIndexes.count() == 40); // The new items inside buffer are requested - QVERIFY(requestedIndexes.front() == model.index(40, 0)); - QVERIFY(requestedIndexes.back() == model.index(79, 0)); + QVERIFY(requestedIndexes.count() == 0); // The buffer is moved up QTest::qWait(2000); @@ -1455,20 +1499,21 @@ QList requestedIndexes; TestModel model(&requestedIndexes); - model.generateItems(240); + model.generateItems(230); mWidget->setModel(&model); mWindow->addView(mWidget); mWindow->show(); QTest::qWait(2000); - QVERIFY(requestedIndexes.count() == 40); // Scroll buffer size in coverflow mode is assumed to be 40 + QVERIFY(requestedIndexes.count() == 30); // Scroll buffer size in coverflow mode is assumed to be 40 QVERIFY(requestedIndexes.front() == model.index(0, 0)); - QVERIFY(requestedIndexes.back() == model.index(39, 0)); + QVERIFY(requestedIndexes.back() == model.index(29, 0)); requestedIndexes.clear(); // Move buffer to the end of items - mWidget->scrollTo(model.index(239, 0)); + mWidget->setCurrentIndex(model.index(229, 0)); + mWidget->scrollTo(model.index(229, 0)); QTest::qWait(1000); requestedIndexes.clear(); @@ -1478,7 +1523,7 @@ QVERIFY(requestedIndexes.count() == 1); // New item is fetched to replace the removed one QVERIFY(requestedIndexes.front() == model.index(199, 0)); requestedIndexes.clear(); - // Last item is now 238 + // Last item is now 228 // Remove many items from beginning of buffer model.removeItems(199, 4); @@ -1487,24 +1532,24 @@ QVERIFY(requestedIndexes.front() == model.index(195, 0)); QVERIFY(requestedIndexes.back() == model.index(198, 0)); requestedIndexes.clear(); - // Last item is now 234 + // Last item is now 224 // Remove one item from the end - model.removeItems(234, 1); + model.removeItems(224, 1); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 1); // New item is fetched to replace the removed one QVERIFY(requestedIndexes.front() == model.index(194, 0)); requestedIndexes.clear(); - // Last item is now 233 + // Last item is now 223 // Remove many items from the end - model.removeItems(230, 4); + model.removeItems(220, 4); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 4); // New items are fetched to replace the removed ones QVERIFY(requestedIndexes.front() == model.index(190, 0)); QVERIFY(requestedIndexes.back() == model.index(193, 0)); requestedIndexes.clear(); - // Last item is now 229 + // Last item is now 219 // Remove one item from the middle of buffer model.removeItems(210, 1); @@ -1512,7 +1557,7 @@ QVERIFY(requestedIndexes.count() == 1); // New item is fetched to replace the removed one QVERIFY(requestedIndexes.front() == model.index(189, 0)); requestedIndexes.clear(); - // Last item is now 228 + // Last item is now 218 // Remove many items from the middle of buffer model.removeItems(210, 4); @@ -1521,25 +1566,26 @@ QVERIFY(requestedIndexes.front() == model.index(185, 0)); QVERIFY(requestedIndexes.back() == model.index(188, 0)); requestedIndexes.clear(); - // Last item is now 224 + // Last item is now 214 // Remove items from the buffer limit (beginning of buffer) model.removeItems(180, 10); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 5); // New items are fetched to replace the removed ones - QVERIFY(requestedIndexes.front() == model.index(175, 0)); - QVERIFY(requestedIndexes.back() == model.index(179, 0)); + QVERIFY(requestedIndexes.front() == model.index(180, 0)); + QVERIFY(requestedIndexes.back() == model.index(184, 0)); requestedIndexes.clear(); - // Last item is now 214 + // Last item is now 204 // Remove items from outside of buffer (before buffer) model.removeItems(0, 10); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 0); // Buffer is not moved requestedIndexes.clear(); - // Last item is now 204 + // Last item is now 194 // Move buffer to the beginning of items + mWidget->setCurrentIndex(model.index(0, 0)); mWidget->scrollTo(model.index(0, 0)); QTest::qWait(1000); requestedIndexes.clear(); @@ -1548,70 +1594,71 @@ model.removeItems(0, 1); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 1); // New item is fetched to replace the removed one - QVERIFY(requestedIndexes.front() == model.index(39, 0)); + QVERIFY(requestedIndexes.front() == model.index(29, 0)); requestedIndexes.clear(); - // Last item is now 203 + // Last item is now 193 // Remove many items from beginning model.removeItems(0, 5); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 5); // New items are fetched to replace the removed ones - QVERIFY(requestedIndexes.front() == model.index(35, 0)); - QVERIFY(requestedIndexes.back() == model.index(39, 0)); + QVERIFY(requestedIndexes.front() == model.index(25, 0)); + QVERIFY(requestedIndexes.back() == model.index(29, 0)); requestedIndexes.clear(); - // Last item is now 198 + // Last item is now 188 // Remove one item from the middle of buffer - model.removeItems(20, 1); + model.removeItems(15, 1); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 1); // New item is fetched to replace the removed one - QVERIFY(requestedIndexes.front() == model.index(39, 0)); + QVERIFY(requestedIndexes.front() == model.index(29, 0)); requestedIndexes.clear(); - // Last item is now 197 + // Last item is now 187 // Remove many items from the middle of buffer - model.removeItems(20, 5); + model.removeItems(15, 5); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 5); // New items are fetched to replace the removed ones - QVERIFY(requestedIndexes.front() == model.index(35, 0)); - QVERIFY(requestedIndexes.back() == model.index(39, 0)); + QVERIFY(requestedIndexes.front() == model.index(25, 0)); + QVERIFY(requestedIndexes.back() == model.index(29, 0)); requestedIndexes.clear(); - // Last item is now 192 + // Last item is now 182 // Remove one item from the end of buffer - model.removeItems(39, 1); + model.removeItems(29, 1); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 1); // New item is fetched to replace the removed one - QVERIFY(requestedIndexes.front() == model.index(39, 0)); + QVERIFY(requestedIndexes.front() == model.index(29, 0)); requestedIndexes.clear(); - // Last item is now 191 + // Last item is now 181 // Remove many items from the end of buffer - model.removeItems(30, 10); + model.removeItems(20, 10); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 10); // New items are fetched to replace the removed ones - QVERIFY(requestedIndexes.front() == model.index(30, 0)); - QVERIFY(requestedIndexes.back() == model.index(39, 0)); + QVERIFY(requestedIndexes.front() == model.index(20, 0)); + QVERIFY(requestedIndexes.back() == model.index(29, 0)); requestedIndexes.clear(); - // Last item is now 181 + // Last item is now 171 // Remove items from outside of buffer (after buffer) model.removeItems(50, 10); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 0); // Buffer is not updated requestedIndexes.clear(); - // Last item is now 171 + // Last item is now 161 // Remove items from the buffer limit (end of buffer) - model.insertItems(35, 10); + model.removeItems(25, 10); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 5); // The new items inside buffer are requested - QVERIFY(requestedIndexes.front() == model.index(35, 0)); - QVERIFY(requestedIndexes.back() == model.index(39, 0)); - // Last item is now 161 + QVERIFY(requestedIndexes.front() == model.index(25, 0)); + QVERIFY(requestedIndexes.back() == model.index(29, 0)); + // Last item is now 151 // Move buffer to the middle of items - mWidget->scrollTo(model.index(80, 0)); + mWidget->setCurrentIndex(model.index(75, 0)); + mWidget->scrollTo(model.index(75, 0)); QTest::qWait(1000); requestedIndexes.clear(); @@ -1619,15 +1666,14 @@ model.removeItems(59, 2); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 1); // New item is fetched to replace the one removed from the buffer - QVERIFY(requestedIndexes.front() == model.index(99, 0)); - // Last item is now 159 + QVERIFY(requestedIndexes.front() == model.index(88, 0)); // Buffer is moved forward, this is the last item + requestedIndexes.clear(); + // Last item is now 149 // Remove items over the whole buffer model.removeItems(55, 50); QTest::qWait(1000); - QVERIFY(requestedIndexes.count() == 40); // Whole buffer is updated - QVERIFY(requestedIndexes.front() == model.index(60, 0)); - QVERIFY(requestedIndexes.back() == model.index(99, 0)); + QVERIFY(requestedIndexes.count() == 30); // Whole buffer is updated QTest::qWait(2000); @@ -1653,9 +1699,9 @@ QTest::qWait(2000); - QVERIFY(requestedIndexes.count() == 40); // Scroll buffer size in coverflow mode is assumed to be 40 + QVERIFY(requestedIndexes.count() == 30); // Scroll buffer size in coverflow mode is assumed to be 40 QVERIFY(requestedIndexes.front() == model.index(0, 0)); - QVERIFY(requestedIndexes.back() == model.index(39, 0)); + QVERIFY(requestedIndexes.back() == model.index(29, 0)); requestedIndexes.clear(); // Move one item forward @@ -1667,7 +1713,7 @@ QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 0); // New items are not fetched as the changes happened inside the buffer - model.moveItems(0, 39, 1); + model.moveItems(0, 29, 1); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 0); // New items are not fetched as the changes happened inside the buffer @@ -1677,20 +1723,20 @@ QVERIFY(requestedIndexes.count() == 0); // New items are not fetched as the changes happened inside the buffer // Move one item backward - model.moveItems(39, 20, 1); + model.moveItems(29, 20, 1); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 0); // New items are not fetched as the changes happened inside the buffer - model.moveItems(39, 38, 1); + model.moveItems(29, 28, 1); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 0); // New items are not fetched as the changes happened inside the buffer - model.moveItems(39, 0, 1); + model.moveItems(29, 0, 1); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 0); // New items are not fetched as the changes happened inside the buffer // Move many items backward - model.moveItems(30, 20, 10); + model.moveItems(20, 5, 10); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 0); // New items are not fetched as the changes happened inside the buffer @@ -1700,128 +1746,275 @@ QVERIFY(requestedIndexes.count() == 0); // New items are not fetched as the changes happened inside the buffer // Move items from the border of the buffer forward - model.moveItems(35, 50, 10); + model.moveItems(25, 50, 10); QTest::qWait(1000); - QVERIFY(requestedIndexes.count() == 5); // New items are fetched to replace the moved ones - QVERIFY(requestedIndexes.front() == model.index(35, 0)); - QVERIFY(requestedIndexes.back() == model.index(39, 0)); + QVERIFY(requestedIndexes.count() == 30); // The whole buffer is reset requestedIndexes.clear(); // Move items from the border of the buffer backward - model.moveItems(35, 20, 10); + model.moveItems(25, 10, 10); QTest::qWait(1000); - QVERIFY(requestedIndexes.count() == 5); // Items that were originally outside of buffer are fetched - QVERIFY(requestedIndexes.front() == model.index(25, 0)); - QVERIFY(requestedIndexes.back() == model.index(29, 0)); + QVERIFY(requestedIndexes.count() == 30); // The whole buffer is reset requestedIndexes.clear(); // Move items from the buffer outside it model.moveItems(20, 90, 10); QTest::qWait(1000); - QVERIFY(requestedIndexes.count() == 10); // New items are fetched to replace the moved ones - QVERIFY(requestedIndexes.front() == model.index(30, 0)); - QVERIFY(requestedIndexes.back() == model.index(39, 0)); + QVERIFY(requestedIndexes.count() == 30); // The whole buffer is reset requestedIndexes.clear(); // Move items from outside the buffer inside it - model.moveItems(90, 20, 10); + model.moveItems(90, 15, 10); QTest::qWait(1000); - QVERIFY(requestedIndexes.count() == 10); // Moved items are fetched - QVERIFY(requestedIndexes.front() == model.index(20, 0)); - QVERIFY(requestedIndexes.back() == model.index(29, 0)); + QVERIFY(requestedIndexes.count() == 30); // The whole buffer is reset requestedIndexes.clear(); // Move buffer to the end of items - mWidget->scrollTo(model.index(119, 0)); + mWidget->setCurrentIndex(model.index(110, 0)); + mWidget->scrollTo(model.index(110, 0)); QTest::qWait(1000); requestedIndexes.clear(); // Move one item forward - model.moveItems(80, 100, 1); + model.moveItems(90, 100, 1); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 0); // New items are not fetched as the changes happened inside the buffer - model.moveItems(80, 82, 1); + // Move buffer to the end of items + mWidget->setCurrentIndex(model.index(110, 0)); + mWidget->scrollTo(model.index(110, 0)); + QTest::qWait(1000); + requestedIndexes.clear(); + + model.moveItems(90, 92, 1); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 0); // New items are not fetched as the changes happened inside the buffer - model.moveItems(80, 119, 1); + // Move buffer to the end of items + mWidget->setCurrentIndex(model.index(110, 0)); + mWidget->scrollTo(model.index(110, 0)); + QTest::qWait(1000); + requestedIndexes.clear(); + + model.moveItems(90, 119, 1); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 0); // New items are not fetched as the changes happened inside the buffer + // Move buffer to the end of items + mWidget->setCurrentIndex(model.index(110, 0)); + mWidget->scrollTo(model.index(110, 0)); + QTest::qWait(1000); + requestedIndexes.clear(); + // Move many items forward - model.moveItems(80, 100, 5); + model.moveItems(90, 100, 5); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 0); // New items are not fetched as the changes happened inside the buffer + // Move buffer to the end of items + mWidget->setCurrentIndex(model.index(120, 0)); + mWidget->scrollTo(model.index(120, 0)); + QTest::qWait(1000); + requestedIndexes.clear(); + // Move one item backward model.moveItems(119, 100, 1); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 0); // New items are not fetched as the changes happened inside the buffer + // Move buffer to the end of items + mWidget->setCurrentIndex(model.index(110, 0)); + mWidget->scrollTo(model.index(120, 0)); + QTest::qWait(1000); + requestedIndexes.clear(); + model.moveItems(119, 118, 1); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 0); // New items are not fetched as the changes happened inside the buffer - model.moveItems(119, 80, 1); + // Move buffer to the end of items + mWidget->setCurrentIndex(model.index(110, 0)); + mWidget->scrollTo(model.index(110, 0)); + QTest::qWait(1000); + requestedIndexes.clear(); + + model.moveItems(119, 90, 1); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 0); // New items are not fetched as the changes happened inside the buffer + // Move buffer to the end of items + mWidget->setCurrentIndex(model.index(110, 0)); + mWidget->scrollTo(model.index(110, 0)); + QTest::qWait(1000); + requestedIndexes.clear(); + // Move many items backward model.moveItems(110, 95, 10); QTest::qWait(1000); QVERIFY(requestedIndexes.count() == 0); // New items are not fetched as the changes happened inside the buffer - // Move items from the border of the buffer backward - model.moveItems(75, 60, 10); + // Move buffer to the end of items + mWidget->setCurrentIndex(model.index(110, 0)); + mWidget->scrollTo(model.index(110, 0)); QTest::qWait(1000); - QVERIFY(requestedIndexes.count() == 5); // New items are fetched to replace the moved ones - QVERIFY(requestedIndexes.front() == model.index(80, 0)); - QVERIFY(requestedIndexes.back() == model.index(84, 0)); + requestedIndexes.clear(); + + // Move items from the border of the buffer backward + model.moveItems(85, 60, 10); + QTest::qWait(1000); + QVERIFY(requestedIndexes.count() == 30); // The whole buffer is reset + + // Move buffer to the end of items + mWidget->setCurrentIndex(model.index(110, 0)); + mWidget->scrollTo(model.index(110, 0)); + QTest::qWait(1000); requestedIndexes.clear(); // Move items from the border of the buffer forward - model.moveItems(75, 100, 10); + model.moveItems(85, 100, 10); QTest::qWait(1000); - QVERIFY(requestedIndexes.count() == 5); // Items that were originally outside of buffer are fetched - QVERIFY(requestedIndexes.front() == model.index(100, 0)); - QVERIFY(requestedIndexes.back() == model.index(104, 0)); + QVERIFY(requestedIndexes.count() == 30); // The whole buffer is reset + + // Move buffer to the end of items + mWidget->setCurrentIndex(model.index(110, 0)); + mWidget->scrollTo(model.index(110, 0)); + QTest::qWait(1000); requestedIndexes.clear(); // Move items from the buffer outside it model.moveItems(100, 10, 10); QTest::qWait(1000); - QVERIFY(requestedIndexes.count() == 10); // New items are fetched to replace the moved ones - QVERIFY(requestedIndexes.front() == model.index(80, 0)); - QVERIFY(requestedIndexes.back() == model.index(89, 0)); + QVERIFY(requestedIndexes.count() == 30); // The whole buffer is reset + + // Move buffer to the end of items + mWidget->setCurrentIndex(model.index(110, 0)); + mWidget->scrollTo(model.index(110, 0)); + QTest::qWait(1000); requestedIndexes.clear(); // Move items from outside the buffer inside it model.moveItems(10, 100, 10); QTest::qWait(1000); - QVERIFY(requestedIndexes.count() == 10); // Moved items are fetched - QVERIFY(requestedIndexes.front() == model.index(100, 0)); - QVERIFY(requestedIndexes.back() == model.index(109, 0)); + QVERIFY(requestedIndexes.count() == 30); // The whole buffer is reset + + // Move buffer to the end of items + mWidget->setCurrentIndex(model.index(110, 0)); + mWidget->scrollTo(model.index(110, 0)); + QTest::qWait(1000); requestedIndexes.clear(); // Move buffer to the middle of items + mWidget->setCurrentIndex(model.index(60, 0)); + mWidget->scrollTo(model.index(60, 0)); + QTest::qWait(1000); + + // Move buffer to the end of items + mWidget->setCurrentIndex(model.index(60, 0)); mWidget->scrollTo(model.index(60, 0)); QTest::qWait(1000); requestedIndexes.clear(); // Move items over the whole buffer forward - model.moveItems(35, 110, 50); + model.moveItems(40, 110, 50); QTest::qWait(1000); - QVERIFY(requestedIndexes.count() == 40); // Whole buffer is updated - QVERIFY(requestedIndexes.front() == model.index(40, 0)); - QVERIFY(requestedIndexes.back() == model.index(79, 0)); + QVERIFY(requestedIndexes.count() == 30); // The whole buffer is reset + + // Move buffer to the middle of items + mWidget->setCurrentIndex(model.index(60, 0)); + mWidget->scrollTo(model.index(60, 0)); + QTest::qWait(1000); + requestedIndexes.clear(); // Move items over the whole buffer backward - model.moveItems(35, 10, 50); + model.moveItems(40, 10, 50); + QTest::qWait(1000); + QVERIFY(requestedIndexes.count() == 30); // The whole buffer is reset + + QTest::qWait(2000); + + delete mWindow; + mWindow = 0; +} + +void TestGanesWidgets::test_labelPositionsCoverFlow() +{ + mWindow = new HbMainWindow; + mMediawall = new HgMediawall(); + + TestModel model; + model.generateItems(50); + mWindow->addView(mMediawall); + mMediawall->setModel(&model); + mWindow->show(); + + mMediawall->setTitlePosition(HgMediawall::PositionNone); + mMediawall->setDescriptionPosition(HgMediawall::PositionNone); + QVERIFY(mMediawall->titlePosition() == HgMediawall::PositionNone); + QVERIFY(mMediawall->descriptionPosition() == HgMediawall::PositionNone); + + // This updates the title and description label. But how to test they are in correct positions? + mMediawall->setCurrentIndex(model.index(1, 0)); + QTest::qWait(1000); + + mMediawall->setDescriptionPosition(HgMediawall::PositionAboveImage); + QVERIFY(mMediawall->titlePosition() == HgMediawall::PositionNone); + QVERIFY(mMediawall->descriptionPosition() == HgMediawall::PositionAboveImage); + mMediawall->setCurrentIndex(model.index(2, 0)); + QTest::qWait(1000); + QVERIFY(checkLabelAt(mWindow, expected_label_pos_above_alone, "Secondary 2")); + + mMediawall->setDescriptionPosition(HgMediawall::PositionBelowImage); + QVERIFY(mMediawall->titlePosition() == HgMediawall::PositionNone); + QVERIFY(mMediawall->descriptionPosition() == HgMediawall::PositionBelowImage); + mMediawall->setCurrentIndex(model.index(3, 0)); QTest::qWait(1000); - QVERIFY(requestedIndexes.count() == 40); // Whole buffer is updated - QVERIFY(requestedIndexes.front() == model.index(40, 0)); - QVERIFY(requestedIndexes.back() == model.index(79, 0)); + QVERIFY(checkLabelAt(mWindow, expected_label_pos_below_alone, "Secondary 3")); + + mMediawall->setTitlePosition(HgMediawall::PositionAboveImage); + QVERIFY(mMediawall->titlePosition() == HgMediawall::PositionAboveImage); + QVERIFY(mMediawall->descriptionPosition() == HgMediawall::PositionBelowImage); + mMediawall->setCurrentIndex(model.index(4, 0)); + QTest::qWait(1000); + QVERIFY(checkLabelAt(mWindow, expected_label_pos_above_alone, "Primary 4")); + QVERIFY(checkLabelAt(mWindow, expected_label_pos_below_alone, "Secondary 4")); + + mMediawall->setDescriptionPosition(HgMediawall::PositionAboveImage); + QVERIFY(mMediawall->titlePosition() == HgMediawall::PositionAboveImage); + QVERIFY(mMediawall->descriptionPosition() == HgMediawall::PositionAboveImage); + mMediawall->setCurrentIndex(model.index(5, 0)); + QTest::qWait(1000); + QVERIFY(checkLabelAt(mWindow, expected_label_pos_above_top, "Primary 5")); + QVERIFY(checkLabelAt(mWindow, expected_label_pos_above_bottom, "Secondary 5")); + + mMediawall->setDescriptionPosition(HgMediawall::PositionNone); + QVERIFY(mMediawall->titlePosition() == HgMediawall::PositionAboveImage); + QVERIFY(mMediawall->descriptionPosition() == HgMediawall::PositionNone); + mMediawall->setCurrentIndex(model.index(6, 0)); + QTest::qWait(1000); + QVERIFY(checkLabelAt(mWindow, expected_label_pos_above_alone, "Primary 6")); + + mMediawall->setTitlePosition(HgMediawall::PositionBelowImage); + QVERIFY(mMediawall->titlePosition() == HgMediawall::PositionBelowImage); + QVERIFY(mMediawall->descriptionPosition() == HgMediawall::PositionNone); + mMediawall->setCurrentIndex(model.index(7, 0)); + QTest::qWait(1000); + QVERIFY(checkLabelAt(mWindow, expected_label_pos_below_alone, "Primary 7")); + + mMediawall->setDescriptionPosition(HgMediawall::PositionAboveImage); + QVERIFY(mMediawall->titlePosition() == HgMediawall::PositionBelowImage); + QVERIFY(mMediawall->descriptionPosition() == HgMediawall::PositionAboveImage); + mMediawall->setCurrentIndex(model.index(8, 0)); + QTest::qWait(1000); + QVERIFY(checkLabelAt(mWindow, expected_label_pos_above_alone, "Secondary 8")); + QVERIFY(checkLabelAt(mWindow, expected_label_pos_below_alone, "Primary 8")); + + mMediawall->setDescriptionPosition(HgMediawall::PositionBelowImage); + QVERIFY(mMediawall->titlePosition() == HgMediawall::PositionBelowImage); + QVERIFY(mMediawall->descriptionPosition() == HgMediawall::PositionBelowImage); + mMediawall->setCurrentIndex(model.index(9, 0)); + QTest::qWait(1000); + QVERIFY(checkLabelAt(mWindow, expected_label_pos_below_top, "Primary 9")); + QVERIFY(checkLabelAt(mWindow, expected_label_pos_below_bottom, "Secondary 9")); QTest::qWait(2000); @@ -1829,6 +2022,129 @@ mWindow = 0; } +void TestGanesWidgets::test_labelFontSpecsCoverFlow() +{ + mWindow = new HbMainWindow; + mMediawall = new HgMediawall(); + + TestModel model; + model.generateItems(50); + mWindow->addView(mMediawall); + mMediawall->setModel(&model); + mWindow->show(); + + mMediawall->setTitleFontSpec(HbFontSpec(HbFontSpec::Primary)); + QVERIFY(mMediawall->titleFontSpec() == HbFontSpec(HbFontSpec::Primary)); + + mMediawall->setDescriptionFontSpec(HbFontSpec(HbFontSpec::Secondary)); + QVERIFY(mMediawall->descriptionFontSpec() == HbFontSpec(HbFontSpec::Secondary)); + + mMediawall->setTitleFontSpec(HbFontSpec(HbFontSpec::Title)); + QVERIFY(mMediawall->titleFontSpec() == HbFontSpec(HbFontSpec::Title)); + + mMediawall->setDescriptionFontSpec(HbFontSpec(HbFontSpec::PrimarySmall)); + QVERIFY(mMediawall->descriptionFontSpec() == HbFontSpec(HbFontSpec::PrimarySmall)); + + QTest::qWait(2000); + + delete mWindow; + mWindow = 0; +} + +void TestGanesWidgets::test_resetModelCoverFlow() +{ + mWindow = new HbMainWindow; + mMediawall = new HgMediawall(); + + TestModel model; + model.generateItems(50); + mWindow->addView(mMediawall); + mMediawall->setModel(&model); + mWindow->show(); + + // Reset with same item count + model.reset(50); + QTest::qWait(2000); + + // Reset with smaller item count + model.reset(20); + QTest::qWait(2000); + + // Reset with larger item count + model.reset(100); + QTest::qWait(2000); + + delete mWindow; + mWindow = 0; + +} + +void TestGanesWidgets::test_resetModelGrid() +{ + mWindow = new HbMainWindow; + mWidget = new HgGrid(Qt::Vertical); + + TestModel model; + model.generateItems(50); + mWindow->addView(mWidget); + mWidget->setModel(&model); + mWindow->show(); + + QTest::qWait(2000); + + // Reset with same item count + model.reset(50); + QTest::qWait(2000); + + // Reset with smaller item count + model.reset(20); + QTest::qWait(2000); + + // Reset with larger item count + model.reset(100); + QTest::qWait(2000); + + delete mWindow; + mWindow = 0; + +} + +bool TestGanesWidgets::checkLabelAt(HbMainWindow *window, const QPointF &pos, const QString &expectedText) +{ + HbLabel *label = findLabelAt(window->currentView(), pos); + if (label) { + if (label->plainText() == expectedText) { + return true; + } + else { + qDebug() << "Label text did not match: expected" << expectedText << "got" << label->plainText(); + return false; + } + } + qDebug() << "Label not found at pos" << pos; + return false; +} + +HbLabel *TestGanesWidgets::findLabelAt(QGraphicsItem *parent, const QPointF &pos) +{ + QList subItems = parent->childItems(); + int count = subItems.count(); + for (int i = 0; i < count; i++) { + QGraphicsItem *item = subItems.at(i); + QRectF itemRect(item->pos(), item->boundingRect().size()); + if (itemRect.contains(pos)) { + HbLabel *label = qgraphicsitem_cast(subItems.at(i)); + if (label) { + return label; + } + else { + return findLabelAt(subItems.at(i), pos); + } + } + } + return NULL; +} + #ifdef _UNITTEST_GANESWIDGETS_LOG_TO_C_ int main (int argc, char* argv[]) { diff -r 89c329efa980 -r e48454f237ca hgcacheproxymodel/hgcacheproxymodel.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgcacheproxymodel/hgcacheproxymodel.pro Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,45 @@ +# 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: + +TEMPLATE = lib +TARGET = hgcacheproxymodel +symbian:TARGET.UID3 = 0x2002EA2A + +CONFIG += qt hb +QT -= gui + +symbian { + TARGET.EPOCALLOWDLLDATA = 1 + TARGET.CAPABILITY = ALL -TCB +} + +DEFINES += BUILD_CACHEPROXYMODEL +INCLUDEPATH += /sf/mw/qt/src/gui/image/ + +#DEFINES += ENABLETRACE +#if TRACE_FILENAME not set, then RDebug is used +DEFINES += TRACE_FILE + +# Input +HEADERS += \ + ../hgwidgets_plat/hgcacheproxymodel_api/inc/hgcacheproxymodel.h \ + ../hgwidgets_plat/hgcacheproxymodel_api/inc/hgdataprovidermodel.h \ + inc/hgbuffermanager.h \ + inc/hglogger.h + + +SOURCES += \ + src/hgcacheproxymodel.cpp \ + src/hgdataprovidermodel.cpp \ + src/hgbuffermanager.cpp + +include(rom/rom.pri) +include(sis/stub.pri) diff -r 89c329efa980 -r e48454f237ca hgcacheproxymodel/inc/hgbuffermanager.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgcacheproxymodel/inc/hgbuffermanager.h Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,60 @@ +/* +* 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: +* +* Version : %version: 1 % +*/ +#ifndef HGBUFFERMANAGER_H_ +#define HGBUFFERMANAGER_H_ + +class HgBufferManagerObserver; + +class HgBufferManager +{ +public: + + HgBufferManager( + HgBufferManagerObserver* aObserver, + int aBufferSize, + int aBufferTreshold, + int aInitialPosition, + int aTotalCount ); + ~HgBufferManager(); + + void setPosition( int aIndex ); + void resetBuffer( int aPosition, int aTotalCount); + void itemCountChanged( int aIndex, bool aRemoved, int aNewTotalCount ); + void resizeCache(int newSize, int newTreshold); + +private: + void calculate(); + +private: + HgBufferManagerObserver* mObserver; + + int mBufferSize; + int mBufferTreshold; + int mBufferPosition; + int mDiff; + int mTotalCount; + + bool mResetOrdered; + + int mRequestStart; + int mRequestCount; + int mReleaseStart; + int mReleaseCount; +}; + +#endif // HGBUFFERMANAGER_H_ diff -r 89c329efa980 -r e48454f237ca hgcacheproxymodel/inc/hglogger.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgcacheproxymodel/inc/hglogger.h Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,88 @@ +/* +* 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: +* +* Version : %version: 1 % +*/ +#ifndef HGLOGGER_H_ +#define HGLOGGER_H_ + +//To enable tracking define ENABLETRACE +//if TRACE_FILENAME is set then trace will go to file, otherwise to RDebug + +#include +#include + +#define XQCONNECT_ASSERT(a, b, c, d) if (!(QObject::connect((a),(b), (c), (d)))) { qFatal("Connection failed: connect(%s, %s, %s, %s)", #a, #b, #c, #d); } + +// stolen from qt-music :) +#ifdef ENABLETRACE + #include + #include + #include + #include + #include + #include + + #ifdef TRACE_FILE + #define _TRACE_FILENAME "c:/trace.txt" + #define _TX_INIT void __tx_myMessageOutput(QtMsgType type, const char *msg) {\ + static const QString timeFmt("hh:mm:ss.zzz");\ + FILE *f = fopen(_TRACE_FILENAME, "a");\ + fprintf(f, "%s ", QTime::currentTime().toString(timeFmt).toLatin1().data() );\ + switch (type) {\ + case QtDebugMsg: fprintf(f, "[DEB] [TX] %s\n", msg); break;\ + case QtWarningMsg: fprintf(f, "[WRN] [TX] %s\n", msg); break;\ + case QtCriticalMsg: fprintf(f, "[CRT] [TX] %s\n", msg); break;\ + case QtFatalMsg: fprintf(f, "[FTL] [TX] %s\n", msg); fclose(f); abort();\ + } fclose(f);\ + } + #else + #define _TX_INIT void __tx_myMessageOutput(QtMsgType /*type*/, const char *msg) {\ + RDebug::Printf("[TX] %s", msg);\ + } + #endif // TRACE_FILE + + #define _TX_INSTALL qInstallMsgHandler(__tx_myMessageOutput); + #define TX_MAIN(a, b) _TX_INIT \ + int __tx__main(int, char**); int main(int (a), char **(b)) { _TX_INSTALL return __tx__main(a, b); } int __tx__main(int (a), char **(b)) + + #define TX_UNUSED(name); + #define TX_STATIC_ENTRY qDebug() << __PRETTY_FUNCTION__ << "entry"; + #define TX_STATIC_ENTRY_ARGS(args) qDebug() << __PRETTY_FUNCTION__ << "entry," << args; + #define TX_STATIC_EXIT qDebug() << __PRETTY_FUNCTION__ << "exit"; + #define TX_STATIC_EXIT_ARGS(args) qDebug() << __PRETTY_FUNCTION__ << "exit," << args; + #define TX_ENTRY qDebug() << __PRETTY_FUNCTION__ << "this" << (void *)this << "entry"; + #define TX_ENTRY_ARGS(args) qDebug() << __PRETTY_FUNCTION__ << "this" << (void *)this << "entry," << args; + #define TX_EXIT qDebug() << __PRETTY_FUNCTION__ << "exit"; + #define TX_EXIT_ARGS(args) qDebug() << __PRETTY_FUNCTION__ << "exit," << args; + #define TX_LOG qDebug() << __PRETTY_FUNCTION__ << "this" << (void *)this; + #define TX_LOG_ARGS(args) qDebug() << __PRETTY_FUNCTION__ << args; +#else + #define TX_MAIN(a,b) int main(int (a), char **(b)) + #define TX_UNUSED(name) Q_UNUSED(name); + #define TX_STATIC_ENTRY ; + #define TX_STATIC_ENTRY_ARGS(args) ; + #define TX_STATIC_EXIT ; + #define TX_STATIC_EXIT_ARGS(args) ; + #define TX_ENTRY ; + #define TX_ENTRY_ARGS(args) ; + #define TX_EXIT ; + #define TX_EXIT_ARGS(args) ; + #define TX_LOG ; + #define TX_LOG_ARGS(args) ; +#endif // ENABLETRACE + + +#endif // HGLOGGER_H_ diff -r 89c329efa980 -r e48454f237ca hgcacheproxymodel/rom/hgcacheproxymodel.iby --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgcacheproxymodel/rom/hgcacheproxymodel.iby Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,28 @@ +/* +* 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: +* +*/ + +#ifndef HGCACHEPROXYMODEL_IBY +#define HGCACHEPROXYMODEL_IBY + +#include + +#include + +file=ABI_DIR\BUILD_DIR\hgcacheproxymodel.dll SHARED_LIB_DIR\hgcacheproxymodel.dll +data=ZSYSTEM\install\hgcacheproxymodelstub.sis System\Install\hgcacheproxymodelstub.sis + +#endif //HGCACHEPROXYMODEL_IBY diff -r 89c329efa980 -r e48454f237ca hgcacheproxymodel/rom/rom.pri --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgcacheproxymodel/rom/rom.pri Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,27 @@ +# +# 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: +# + +symbian { + HGCACHEPROXYMODEL_IBY_DIR = $$section(PWD,":",1) + + exists(/epoc32/include/platform_paths.hrh) { + BLD_INF_RULES.prj_exports += "$${LITERAL_HASH}include " + } else { + BLD_INF_RULES.prj_exports += "$${LITERAL_HASH}include " + } + + BLD_INF_RULES.prj_exports += "$$HGCACHEPROXYMODEL_IBY_DIR/hgcacheproxymodel.iby CORE_MW_LAYER_IBY_EXPORT_PATH(hgcacheproxymodel.iby)" +} \ No newline at end of file diff -r 89c329efa980 -r e48454f237ca hgcacheproxymodel/sis/hgcacheproxymodelstub.pkg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgcacheproxymodel/sis/hgcacheproxymodelstub.pkg Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,32 @@ +; +; 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: +; +; Installation file for hgcacheproxymodel library stub for IAD +; +;Language - standard language definitions +&EN + +; standard SIS file header +#{"hgcacheproxymodel"},(0x2002EA2A),10,0,0, TYPE=SA + +;Localised Vendor name +%{"Nokia"} + +;Unique Vendor name +:"Nokia" + +;Files to install +;hgcacheproxymodel +"" - "z:\sys\bin\hgcacheproxymodel.dll" diff -r 89c329efa980 -r e48454f237ca hgcacheproxymodel/sis/hgcacheproxymodelstub.sis Binary file hgcacheproxymodel/sis/hgcacheproxymodelstub.sis has changed diff -r 89c329efa980 -r e48454f237ca hgcacheproxymodel/sis/stub.pri --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgcacheproxymodel/sis/stub.pri Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,21 @@ +# +# 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: +# + +symbian { + HGCACHEPROXYMODEL_STUB_DIR = $$section(PWD,":",1) + + BLD_INF_RULES.prj_exports += "$$HGCACHEPROXYMODEL_STUB_DIR/hgcacheproxymodelstub.sis /epoc32/data/z/system/install/hgcacheproxymodelstub.sis" +} \ No newline at end of file diff -r 89c329efa980 -r e48454f237ca hgcacheproxymodel/src/hgbuffermanager.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgcacheproxymodel/src/hgbuffermanager.cpp Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,221 @@ +/* +* 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: +* +* Version : %version: 1 % +*/ +#include "hgbuffermanager.h" +#include + + +HgBufferManager::HgBufferManager( + HgBufferManagerObserver* aObserver, + int aBufferSize, + int aBufferTreshold, + int aInitialPosition, + int aTotalCount ) +: +mObserver(aObserver), +mBufferSize( aBufferSize ), +mBufferTreshold( aBufferTreshold ), +mBufferPosition( aInitialPosition ), +mTotalCount( aTotalCount ) +{ + ASSERT( mObserver != 0 ); + mBufferPosition -= (mBufferSize / 2); + + if( mBufferPosition + mBufferSize > mTotalCount - 1 ){ + mBufferPosition = (mTotalCount - 1) - mBufferSize; + } + + if(mBufferPosition < 0 ){ + mBufferPosition = 0; + } + + mDiff = 0; + //request Initial Buffer + mRequestStart = mBufferPosition; + mRequestCount = mBufferSize; + + calculate(); +} + + +HgBufferManager::~HgBufferManager() +{ +} + +void HgBufferManager::resizeCache(int newSize, int newTreshold) +{ + if (newTreshold != mBufferTreshold){ + mBufferTreshold = newTreshold; + } + + if (newSize!=mBufferSize){ +// int pos = mBufferPosition + (mBufferSize / 2); + + int a = Max(0, mBufferPosition + mBufferSize/2 - newSize/2); + int b = Min(a + newSize, mTotalCount); + if ( b == mTotalCount){ + a = mTotalCount - newSize; + } + + int c = Max(0, mBufferPosition); + int d = Min(c + mBufferSize, mTotalCount); + if ( d == mTotalCount){ + c = mTotalCount - mBufferSize; + } + + if ( newSize>mBufferSize){ + mObserver->request(a, c-1, HgCacheProxyModel::HgRequestOrderAscending); + mObserver->request(d, b-1, HgCacheProxyModel::HgRequestOrderAscending); + }else if ( newSizerelease(c, a-1); + mObserver->release(b, d); + } + mBufferPosition = a; + mBufferSize = newSize; + } +} + +void HgBufferManager::calculate() +{ + HgCacheProxyModel::HgRequestOrder direction = HgCacheProxyModel::HgRequestOrderAscending; + + if(mResetOrdered){ + mResetOrdered = false; + } else { + if(mDiff < 0){ + mReleaseStart = mBufferPosition; + mRequestStart = mBufferPosition + mBufferSize; + direction = HgCacheProxyModel::HgRequestOrderAscending; + } else if( mDiff > 0) { + mReleaseStart = mBufferPosition + mBufferSize - mDiff; + mRequestStart = mBufferPosition - mDiff; + direction = HgCacheProxyModel::HgRequestOrderDescending; + } + } + + // Release + int end = mReleaseStart + mReleaseCount < mTotalCount ? + mReleaseStart + mReleaseCount: mTotalCount; + end--; + if(end >= mReleaseStart ){ + mObserver->release(mReleaseStart, end); + } + + mReleaseCount = 0; + + // Request + end = mRequestStart + mRequestCount < mTotalCount ? + mRequestStart + mRequestCount : mTotalCount; + + end--; + if(end >= mRequestStart ){ + mObserver->request(mRequestStart, end, direction); + } + + mRequestCount = 0; + + // Move Buffer + mBufferPosition -= mDiff; + // Reset Diff + mDiff = 0; +} + +// ----------------------------------------------------------------------------- +// BufferManager::SetPosition() +// ----------------------------------------------------------------------------- +// +void HgBufferManager::setPosition( int aIndex ) +{ + // If all the items fit in the buffer no need to move the buffer + if(mTotalCount <= mBufferSize) + return; + + bool forceUpdate = false; + aIndex -= mBufferSize / 2; // normalize index to Buffer start + + if(aIndex < 0){ + aIndex = 0; + forceUpdate = true; + }else if( aIndex > mTotalCount - mBufferSize ){ + aIndex = mTotalCount - mBufferSize; + forceUpdate = true; + } + + mDiff = mBufferPosition - aIndex; + + // Too large change reset whole buffer + if( mDiff >= mBufferSize || -mDiff >= mBufferSize || mResetOrdered ) { + resetBuffer(aIndex + (mBufferSize/2), mTotalCount); + } else if( mDiff >= mBufferTreshold ) { // Move Up + mRequestCount = mDiff; + mReleaseCount = mDiff; + calculate(); + } else if ( -mDiff >= mBufferTreshold ) {// Move Down + mRequestCount = -mDiff; + mReleaseCount = -mDiff; + calculate(); + } else if( forceUpdate && mDiff ) { // Top or bottom has been reached + int diff = mDiff < 0 ? -mDiff : mDiff; + mRequestCount = diff; + mReleaseCount = diff; + calculate(); + } +} + +// ----------------------------------------------------------------------------- +// BufferManager::ResetBuffer() +// ----------------------------------------------------------------------------- +// +void HgBufferManager::resetBuffer( int aPosition, int aTotalCount) +{ + if( !mResetOrdered ){ + // release Old buffer + mReleaseStart = mBufferPosition; + mReleaseCount = mBufferSize; + } + + // set position and count + mBufferPosition = aPosition - (mBufferSize / 2); + mTotalCount = aTotalCount; + mDiff = 0; + + if( mBufferPosition + mBufferSize > mTotalCount - 1 ){ + mBufferPosition = mTotalCount - mBufferSize; + } + + if(mBufferPosition < 0 ){ + mBufferPosition = 0; + } + + //request new Buffer + mRequestStart = mBufferPosition; + mRequestCount = mBufferSize; + mResetOrdered = true; + calculate(); +} + +void HgBufferManager::itemCountChanged( int aIndex, + bool aRemoved, + int aNewTotalCount ) +{ + Q_UNUSED(aIndex); + Q_UNUSED(aRemoved); + //release all, to make sure that no old items are skipped + mObserver->release(0, aNewTotalCount); + resetBuffer(mBufferPosition + (mBufferSize / 2), aNewTotalCount); +} +//eof diff -r 89c329efa980 -r e48454f237ca hgcacheproxymodel/src/hgcacheproxymodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgcacheproxymodel/src/hgcacheproxymodel.cpp Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,591 @@ +/* +* 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: +* +* Version : %version: 2 % +*/ +#include +#include + +#include +#include +#include "hgbuffermanager.h" +#include "hglogger.h" + + + + + +Q_DECL_EXPORT HgCacheProxyModel::HgCacheProxyModel(QObject *parent): +QAbstractItemModel(parent), +mBufferManager(0), +mSortFilterProxyModel(new QSortFilterProxyModel(this)), +mDataProviderModel(0), +mResetNeeded(false), +mSupressBM(false), +mSortParameterChanged(true), +mFilterParameterChanged(true) +{ + connect(mSortFilterProxyModel, SIGNAL(columnsAboutToBeInserted(QModelIndex,int,int)), + this, SIGNAL(columnsAboutToBeInserted(QModelIndex,int,int))); + + connect(mSortFilterProxyModel, SIGNAL(columnsAboutToBeMoved(QModelIndex, int, int, QModelIndex, int)), + this, SIGNAL(columnsAboutToBeMoved(QModelIndex, int, int, QModelIndex, int))); + + connect(mSortFilterProxyModel, SIGNAL(columnsAboutToBeRemoved(QModelIndex,int,int)), + this, SIGNAL(columnsAboutToBeRemoved(QModelIndex,int,int))); + + connect(mSortFilterProxyModel, SIGNAL(columnsInserted(QModelIndex,int,int)), + this, SIGNAL(columnsInserted(QModelIndex,int,int))); + + connect(mSortFilterProxyModel, SIGNAL(columnsMoved(QModelIndex, int, int, QModelIndex, int)), + this, SIGNAL(columnsMoved(QModelIndex, int, int, QModelIndex, int))); + + connect(mSortFilterProxyModel, SIGNAL(columnsRemoved(QModelIndex,int,int)), + this, SIGNAL(columnsRemoved(QModelIndex,int,int))); + + connect(mSortFilterProxyModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)), + this, SLOT(dataUpdated(QModelIndex,QModelIndex))); + + connect(mSortFilterProxyModel, SIGNAL(headerDataChanged(Qt::Orientation,int,int)), + this, SIGNAL(headerDataChanged(Qt::Orientation,int,int))); + + connect(mSortFilterProxyModel, SIGNAL(layoutAboutToBeChanged()), + this, SIGNAL(layoutAboutToBeChanged())); + + connect(mSortFilterProxyModel, SIGNAL(layoutChanged()), + this, SIGNAL(layoutChanged())); + + connect(mSortFilterProxyModel, SIGNAL(modelAboutToBeReset()), + this, SLOT(sourceAboutToBeReset())); + + connect(mSortFilterProxyModel, SIGNAL(modelReset()), + this, SLOT(sourceReset())); + + connect(mSortFilterProxyModel, SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int)), + this, SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int))); + + connect(mSortFilterProxyModel, SIGNAL(rowsAboutToBeMoved(QModelIndex, int, int, QModelIndex, int)), + this, SIGNAL(rowsAboutToBeMoved(QModelIndex, int, int, QModelIndex, int))); + + connect(mSortFilterProxyModel, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)), + this, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int))); + + connect(mSortFilterProxyModel, SIGNAL(rowsInserted(QModelIndex,int,int)), + this, SIGNAL(rowsInserted(QModelIndex,int,int))); + + connect(mSortFilterProxyModel, SIGNAL(rowsInserted(QModelIndex,int,int)), + this, SLOT(sourceRowsInserted(QModelIndex,int,int))); + + connect(mSortFilterProxyModel, SIGNAL(rowsMoved(QModelIndex, int, int, QModelIndex, int)), + this, SIGNAL(rowsMoved(QModelIndex, int, int, QModelIndex, int))); + + connect(mSortFilterProxyModel, SIGNAL(rowsRemoved(QModelIndex,int,int)), + this, SIGNAL(rowsRemoved(QModelIndex,int,int))); + + connect(mSortFilterProxyModel, SIGNAL(rowsRemoved(QModelIndex,int,int)), + this, SLOT(sourceRowsRemoved(QModelIndex,int,int))); +} + +Q_DECL_EXPORT HgCacheProxyModel::~HgCacheProxyModel() +{ + delete mBufferManager; +} + +Q_DECL_EXPORT void HgCacheProxyModel::setDataProvider(HgDataProviderModel *dataProvider, int cacheSize, int cacheTreshold) +{ + TX_ENTRY + mDataProviderModel = dataProvider; + mSortFilterProxyModel->setSourceModel(mDataProviderModel); + if (mDataProviderModel){ + mDataProviderModel->registerObserver(this); + mDataProviderModel->resizeQPixmapPool(cacheSize); + + delete mBufferManager; + mBufferManager = NULL; + mBufferManager = new HgBufferManager(this, cacheSize, cacheTreshold, 0, count() ); + } + TX_EXIT +} + +Q_DECL_EXPORT HgDataProviderModel* HgCacheProxyModel::DataProvider() +{ + return mDataProviderModel; +} + +Q_DECL_EXPORT void HgCacheProxyModel::resizeCache(int newSize, int newTreshold) +{ + TX_ENTRY + if (mDataProviderModel) + mDataProviderModel->resizeQPixmapPool(newSize); + if (mBufferManager) + mBufferManager->resizeCache( newSize, newTreshold ); + TX_EXIT +} + +Q_DECL_EXPORT QModelIndex HgCacheProxyModel::index(int row, int column, const QModelIndex &parent) const +{ + Q_UNUSED(parent); + if ( row >= rowCount() ){ + row = -1; + } + if ( column >= columnCount() ){ + column = -1; + } + + return QAbstractItemModel::createIndex(row, column); +} + +Q_DECL_EXPORT QModelIndex HgCacheProxyModel::parent(const QModelIndex &child) const +{ + return mSortFilterProxyModel->parent(mapToSource(child)); +} + +Q_DECL_EXPORT int HgCacheProxyModel::rowCount(const QModelIndex &parent) const +{ + return mSortFilterProxyModel->rowCount(mapToSource(parent)); +} + +Q_DECL_EXPORT int HgCacheProxyModel::columnCount(const QModelIndex &parent) const +{ + return mSortFilterProxyModel->columnCount(mapToSource(parent)); +} + +Q_DECL_EXPORT bool HgCacheProxyModel::hasChildren(const QModelIndex &parent) const +{ + return mSortFilterProxyModel->hasChildren(mapToSource(parent)); +} + +Q_DECL_EXPORT QVariant HgCacheProxyModel::data(const QModelIndex &index, int role) const +{ + setBufferPosition(index.row()); + QVariant res = mSortFilterProxyModel->data(mapToSource(index), role); + return res; +} + +Q_DECL_EXPORT bool HgCacheProxyModel::setData(const QModelIndex &index, const QVariant &value, int role) +{ + return mSortFilterProxyModel->setData(mapToSource(index), value, role); +} + +Q_DECL_EXPORT QVariant HgCacheProxyModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + return mSortFilterProxyModel->headerData(section, orientation, role); +} + +Q_DECL_EXPORT bool HgCacheProxyModel::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role) +{ + return mSortFilterProxyModel->setHeaderData(section, orientation, value, role); +} + +Q_DECL_EXPORT QMap HgCacheProxyModel::itemData(const QModelIndex &index) const +{ + setBufferPosition(index.row()); + return mSortFilterProxyModel->itemData(mapToSource(index)); +} + +Q_DECL_EXPORT bool HgCacheProxyModel::setItemData(const QModelIndex &index, const QMap &roles) +{ + return mSortFilterProxyModel->setItemData(mapToSource(index), roles); +} + +Q_DECL_EXPORT QStringList HgCacheProxyModel::mimeTypes() const +{ + return mSortFilterProxyModel->mimeTypes(); +} + +Q_DECL_EXPORT QMimeData *HgCacheProxyModel::mimeData(const QModelIndexList &indexes) const +{ + QModelIndexList list; + for ( int i=0; i < indexes.count(); i++){ + list.append(mapToSource(indexes[i])); + } + return mSortFilterProxyModel->mimeData(list); +} + +Q_DECL_EXPORT bool HgCacheProxyModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) +{ + return mSortFilterProxyModel->dropMimeData(data, action, row, column, mapToSource(parent)); +} + +Q_DECL_EXPORT Qt::DropActions HgCacheProxyModel::supportedDropActions() const +{ + return mSortFilterProxyModel->supportedDropActions(); +} + +Q_DECL_EXPORT bool HgCacheProxyModel::insertRows(int row, int count, const QModelIndex &parent) +{ + return mSortFilterProxyModel->insertRows(row, count, mapToSource(parent)); +} + +Q_DECL_EXPORT bool HgCacheProxyModel::insertColumns(int column, int count, const QModelIndex &parent) +{ + return mSortFilterProxyModel->insertColumns(column, count, mapToSource(parent)); +} + +Q_DECL_EXPORT bool HgCacheProxyModel::removeRows(int row, int count, const QModelIndex &parent) +{ + return mSortFilterProxyModel->removeRows(row, count, mapToSource(parent)); +} + +Q_DECL_EXPORT bool HgCacheProxyModel::removeColumns(int column, int count, const QModelIndex &parent) +{ + return mSortFilterProxyModel->removeColumns(column, count, mapToSource(parent)); +} + +Q_DECL_EXPORT void HgCacheProxyModel::fetchMore(const QModelIndex &parent) +{ + mSortFilterProxyModel->fetchMore(mapToSource(parent)); +} + +Q_DECL_EXPORT bool HgCacheProxyModel::canFetchMore(const QModelIndex &parent) const +{ + return mSortFilterProxyModel->canFetchMore(mapToSource(parent)); +} + +Q_DECL_EXPORT Qt::ItemFlags HgCacheProxyModel::flags(const QModelIndex &index) const +{ + return mSortFilterProxyModel->flags(mapToSource(index)); +} + +Q_DECL_EXPORT void HgCacheProxyModel::sort(int column, Qt::SortOrder order) +{ + if ( mSortParameterChanged || (sortColumn() != column) || (sortOrder() != order) ){ + mSortParameterChanged = false; + mResetNeeded = true; + cleanupForBMResetIfNeeded(); + mSortFilterProxyModel->sort(column, order); + resetBMIfNeeded(); + } +} + +Q_DECL_EXPORT QModelIndex HgCacheProxyModel::buddy(const QModelIndex &index) const +{ + return mSortFilterProxyModel->buddy(mapToSource(index)); +} + +Q_DECL_EXPORT QModelIndexList HgCacheProxyModel::match(const QModelIndex &start, int role, + const QVariant &value, int hits, + Qt::MatchFlags flags) const +{ + return mSortFilterProxyModel->match(mapToSource(start), role, value, hits, flags); +} + +Q_DECL_EXPORT QSize HgCacheProxyModel::span(const QModelIndex &index) const +{ + return mSortFilterProxyModel->span(mapToSource(index)); +} + +Q_DECL_EXPORT Qt::CaseSensitivity HgCacheProxyModel::sortCaseSensitivity() const +{ + return mSortFilterProxyModel->sortCaseSensitivity(); +} + +Q_DECL_EXPORT void HgCacheProxyModel::setSortCaseSensitivity(Qt::CaseSensitivity cs) +{ + if (sortCaseSensitivity() != cs){ + mSortParameterChanged = true; + cleanupForBMResetIfNeeded(); + mSortFilterProxyModel->setSortCaseSensitivity(cs); + resetBMIfNeeded(); + } +} + +Q_DECL_EXPORT bool HgCacheProxyModel::isSortLocaleAware() const +{ + return mSortFilterProxyModel->isSortLocaleAware(); +} + +Q_DECL_EXPORT void HgCacheProxyModel::setSortLocaleAware(bool on) +{ + if (isSortLocaleAware() != on){ + mSortParameterChanged = true; + cleanupForBMResetIfNeeded(); + mSortFilterProxyModel->setSortLocaleAware(on); + resetBMIfNeeded(); + } +} + +Q_DECL_EXPORT int HgCacheProxyModel::sortColumn() const +{ + return mSortFilterProxyModel->sortColumn(); +} + +Q_DECL_EXPORT Qt::SortOrder HgCacheProxyModel::sortOrder() const +{ + return mSortFilterProxyModel->sortOrder(); +} + +Q_DECL_EXPORT bool HgCacheProxyModel::dynamicSortFilter() const +{ + return mSortFilterProxyModel->dynamicSortFilter(); +} + +Q_DECL_EXPORT void HgCacheProxyModel::setDynamicSortFilter(bool enable) +{ + if (dynamicSortFilter() != enable){ + mSortParameterChanged = true; + mFilterParameterChanged = true; + cleanupForBMResetIfNeeded(); + mSortFilterProxyModel->setDynamicSortFilter(enable); + resetBMIfNeeded(); + } +} + +Q_DECL_EXPORT int HgCacheProxyModel::sortRole() const +{ + return mSortFilterProxyModel->sortRole(); +} + +Q_DECL_EXPORT void HgCacheProxyModel::setSortRole(int role) +{ + if (sortRole() != role){ + mSortParameterChanged = true; + cleanupForBMResetIfNeeded(); + mSortFilterProxyModel->setSortRole(role); + resetBMIfNeeded(); + } +} + +//Q_DECL_EXPORT QRegExp HgCacheProxyModel::filterRegExp() const +//{ +// return mSortFilterProxyModel->filterRegExp(); +//} +// +//Q_DECL_EXPORT void HgCacheProxyModel::setFilterRegExp(const QRegExp ®Exp) +//{ +// if (filterRegExp() != regExp){ +// mFilterParameterChanged = true; +// cleanupForBMResetIfNeeded(); +// mSortFilterProxyModel->setFilterRegExp(regExp); +// resetBMIfNeeded(); +// } +//} +// +//Q_DECL_EXPORT int HgCacheProxyModel::filterKeyColumn() const +//{ +// return mSortFilterProxyModel->filterKeyColumn(); +//} +// +//Q_DECL_EXPORT void HgCacheProxyModel::setFilterKeyColumn(int column) +//{ +// if (filterKeyColumn() != column){ +// mFilterParameterChanged = true; +// cleanupForBMResetIfNeeded(); +// mSortFilterProxyModel->setFilterKeyColumn(column); +// resetBMIfNeeded(); +// } +//} +// +//Q_DECL_EXPORT Qt::CaseSensitivity HgCacheProxyModel::filterCaseSensitivity() const +//{ +// return mSortFilterProxyModel->filterCaseSensitivity(); +//} +// +//Q_DECL_EXPORT void HgCacheProxyModel::setFilterCaseSensitivity(Qt::CaseSensitivity cs) +//{ +// if ( filterCaseSensitivity() != cs){ +// mFilterParameterChanged = true; +// cleanupForBMResetIfNeeded(); +// mSortFilterProxyModel->setFilterCaseSensitivity(cs); +// resetBMIfNeeded(); +// } +//} +// +//Q_DECL_EXPORT int HgCacheProxyModel::filterRole() const +//{ +// return mSortFilterProxyModel->filterRole(); +//} +// +//Q_DECL_EXPORT void HgCacheProxyModel::setFilterRole(int role) +//{ +// if ( mFilterParameterChanged || (filterRole() != role)){ +// mFilterParameterChanged = false; +// mResetNeeded = true; +// cleanupForBMResetIfNeeded(); +// mSortFilterProxyModel->setFilterRole(role); +// resetBMIfNeeded(); +// } +//} + +Q_DECL_EXPORT bool HgCacheProxyModel::submit() +{ + return mSortFilterProxyModel->submit(); +} + +Q_DECL_EXPORT void HgCacheProxyModel::revert() +{ + mSortFilterProxyModel->revert(); +} + +Q_DECL_EXPORT void HgCacheProxyModel::release(int start, int end) +{ + TX_ENTRY_ARGS( QString("%0-%1").arg(start).arg(end)); + QList list; + int idx = 0; + if ( start > end){ + idx = end; + end = start; + start = idx; + idx = 0; + } + for ( int i=start; i <=end; i++){ + idx = mapToDataProviderIndex(i); + if ( idx >=0) + list.append(idx); + } + if (mDataProviderModel) + mDataProviderModel->release(list, true); + TX_EXIT +} + +Q_DECL_EXPORT void HgCacheProxyModel::request(int start, int end, HgRequestOrder order) +{ + TX_ENTRY_ARGS( QString("%0-%1").arg(start).arg(end)); + QList list; + int idx; + if (order == HgRequestOrderAscending){ + for ( int i=start; i <=end; i++){ + idx = mapToDataProviderIndex(i); + if ( idx >=0) + list.append(idx); + } + } else { + for ( int i=end; i >=start; i--){ + idx = mapToDataProviderIndex(i); + if ( idx >=0) + list.append(idx); + } + } + if (mDataProviderModel) + mDataProviderModel->request(list, mSupressBM); + TX_EXIT +} + +int HgCacheProxyModel::count()const +{ + return rowCount(index(0, 0, QModelIndex())); +} + +QModelIndex HgCacheProxyModel::mapToSource(const QModelIndex &index) const +{ + return mapToSource(index.row(), index.column()); +} + +QModelIndex HgCacheProxyModel::mapToSource(int row, int col) const +{ + return mSortFilterProxyModel->index(row, col); +} + +int HgCacheProxyModel::mapToDataProviderIndex(int myIndex) const +{ + return mSortFilterProxyModel->mapToSource( mapToSource(myIndex, 0)).row(); +} + +int HgCacheProxyModel::mapFromDataProviderIndex(int myIndex) const +{ + return mSortFilterProxyModel->mapFromSource( mDataProviderModel->index(myIndex, 0) ).row(); +} + +void HgCacheProxyModel::cleanupForBMResetIfNeeded() +{ + if (mResetNeeded || mSortFilterProxyModel->dynamicSortFilter()==true){ + TX_LOG + mSupressBM = true; + mResetNeeded = true; + beginResetModel(); + releaseAll(); + } +} + +void HgCacheProxyModel::resetBMIfNeeded() +{ + if ( mResetNeeded ){ + if (mBufferManager) + mBufferManager->resetBuffer( mCurrentPos, count() ); + mSupressBM = false; + mResetNeeded = false; + endResetModel(); + } + mResetNeeded = false; +} + +void HgCacheProxyModel::releaseAll() +{ + if ( mDataProviderModel ){ + QList list; + for ( int i=0; irowCount(); i++){ + list.append(i); + } + mDataProviderModel->release(list, true); //will quietly replace all icons with default ones, + } +} + +void HgCacheProxyModel::setBufferPosition(int pos) const +{ + if (!mSupressBM && mBufferManager){ + TX_LOG_ARGS(QString("idx:%1 ").arg(pos) ); + if (mCurrentPos!=pos){ + mCurrentPos = pos; + mBufferManager->setPosition(mCurrentPos); + } + } +} + +void HgCacheProxyModel::sourceReset() +{ + mSupressBM = true; + mResetNeeded = true; + releaseAll(); + if (mBufferManager) + mBufferManager->resetBuffer( 0, count() ); + mSupressBM = false; + mResetNeeded = false; + endResetModel(); +} + +void HgCacheProxyModel::sourceAboutToBeReset() +{ + mSupressBM = true; + mResetNeeded = true; + beginResetModel(); +} + +void HgCacheProxyModel::sourceRowsInserted(const QModelIndex &source_parent, int start, int end) +{ + Q_UNUSED(source_parent); + Q_UNUSED(end); + if (mBufferManager) + mBufferManager->itemCountChanged(start, false, count()); +} + +void HgCacheProxyModel::sourceRowsRemoved(const QModelIndex &source_parent, int start, int end) +{ + Q_UNUSED(source_parent); + Q_UNUSED(end); + if (mBufferManager) + mBufferManager->itemCountChanged(start, true, count()); +} + +void HgCacheProxyModel::dataUpdated(QModelIndex from, QModelIndex to) +{ + dataUpdated(from.row(), to.row()); +} + +Q_DECL_EXPORT void HgCacheProxyModel::dataUpdated(int from, int to) +{ + TX_LOG_ARGS(QString("from:%1 to:%2").arg(from).arg(to)); + emit dataChanged(index(mapFromDataProviderIndex(from),0), index ( mapFromDataProviderIndex(to),0) ); +} +//eof diff -r 89c329efa980 -r e48454f237ca hgcacheproxymodel/src/hgdataprovidermodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgcacheproxymodel/src/hgdataprovidermodel.cpp Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,387 @@ +/* +* 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: +* +* Version : %version: 3 % +*/ +#include +#include +#include +#include +#include +#include +#include "hglogger.h" + + +const int KQPixmapCacheEmergencyBuffer = 5; + +HgDataProviderModel::HgDataProviderModel(QObject *parent) : + QAbstractItemModel(parent), + mCache(new QList*>()), + mCacheSize(0), + mUnallocatedPixmaps(0), + mObserver(0) +{ + TX_ENTRY + TX_EXIT +} + +HgDataProviderModel::~HgDataProviderModel() +{ + TX_ENTRY + clearCache(); + delete mCache; + qDeleteAll( mFreePixmaps.begin(), mFreePixmaps.end() ); + mFreePixmaps.clear(); + qDeleteAll( mUsedPixmaps.begin(), mUsedPixmaps.end() ); + mUsedPixmaps.clear(); + TX_EXIT +} + +void HgDataProviderModel::release(QList list, bool silent) +{ + TX_ENTRY + int i=0; + int min = count(); + int max = 0; + + for ( int idx = 0; idx < list.count(); idx++){ + i = list[idx]; + if ( i >=0 && i max) + max = i; + resetIcon(i); + } + } + + doReleaseData(list, silent); + + if (min list, bool silent) +{ + doRequestData(list, silent); +} + +void HgDataProviderModel::registerObserver(HgDataProviderModelObserver* obs) +{ + TX_ENTRY + mObserver = obs; + TX_EXIT +} + +QModelIndex HgDataProviderModel::index(int row, int column, + const QModelIndex &parent) const +{ + Q_UNUSED(parent); + if ( row >= rowCount() ){ + row = -1; + } + if ( column >= columnCount() ){ + column = -1; + } + + return QAbstractItemModel::createIndex(row, column); +} + +QModelIndex HgDataProviderModel::parent(const QModelIndex &child) const +{ + Q_UNUSED(child); + return QModelIndex(); //returns always invalid model index +} + +int HgDataProviderModel::rowCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent); + return count(); +} + +int HgDataProviderModel::columnCount(const QModelIndex &parent) const +{ + Q_UNUSED(parent); + return 1; +} + +QVariant HgDataProviderModel::data(const QModelIndex &index, int role) const +{ + return data(index.row(), role); +} + +QVariant HgDataProviderModel::data(int idx, int role) const +{ + QVariant res; + if ( containsRole(idx, role)){ + res = mCache->at(idx)->value(role); + } else if (role == Qt::DecorationRole ){ + res = defaultIcon(); + } + return res; +} + +QMap HgDataProviderModel::itemData(const QModelIndex &index) const +{ + QMap res; + if ( index.row()>=0 && index.row()(*mCache->at(index.row())); + } + return res; +} + +void HgDataProviderModel::clearCache() +{ + qDeleteAll( mCache->begin(), mCache->end() ); + mCache->clear(); +} + +int HgDataProviderModel::count() const +{ + return mCache->count(); +} + +bool HgDataProviderModel::update(int pos, QList< QPair< QVariant, int > >* list, bool silent) +{ + bool change(false); + if (list && list->count() && pos >=0 && posat(pos)) { + while(list->count()){ + QPair< QVariant, int > pair = list->takeFirst(); + change = update(pos, pair.first, pair.second, true)|change; + } + if ( !silent && change ){ + emitDataChanged(pos, pos, false); + } + } + return change; +} + +bool HgDataProviderModel::update(int pos, QVariant obj, int role, bool silent) +{ + bool change(false); + + if ( pos >=0 && posat(pos)){ + mCache->at(pos)->insert(role, obj); //this will remove old one if needed + change = true; + } + + if ( !silent && change ){ + emitDataChanged(pos, pos, false); + } + return change; +} + +bool HgDataProviderModel::updateIcon(int pos, QVariant obj, bool silent) +{ + if (obj.isValid()==false) + return false; + + bool change(false); + if ( pos >=0 && posat(pos)){ + mCache->at(pos)->insert(Qt::DecorationRole, obj); //will remove old if needed + change = true; + } + + if (!silent && change){ + TX_LOG + if ( mObserver){ + mObserver->dataUpdated(pos,pos); + } else { + QModelIndex topLeft = index(pos, 0); + QModelIndex bottomRight = index(pos, 0); + emit dataChanged(topLeft,bottomRight); + } + } + return change; +} + +void HgDataProviderModel::resetIcon(int pos) +{ + if ( containsRole(pos, Qt::DecorationRole)){ + mCache->at(pos)->remove(Qt::DecorationRole); + } +} + +void HgDataProviderModel::newItem(QList< QPair< QVariant, int > >* list, bool silent) +{ + insertItem(mCache->count(), list, silent); +} + +void HgDataProviderModel::newItem(QPair< QVariant, int > item, bool silent) +{ + insertItem(mCache->count(), item, silent); +} + +void HgDataProviderModel::insertItem(int pos, QList< QPair< QVariant, int > >* list, bool silent) +{ + doInsertItem(pos, list, silent); +} + +void HgDataProviderModel::insertItem(int pos, QPair< QVariant, int > item, bool silent) +{ + QList< QPair< QVariant, int > > list; + list.append(item); + doInsertItem(pos, &list, silent); +} + +void HgDataProviderModel::doInsertItem(int pos, QList< QPair< QVariant, int > >* list, bool silent) +{ + if (pos >mCache->count()){ + pos = mCache->count(); + } else if (pos <0){ + pos = 0; + } + + if ( !silent){ + beginInsertRows(QModelIndex(), pos, pos); + } + + mCache->insert(pos, new QMap()); + if (list && list->count()){ + update(pos, list, true); + } + + if ( !silent){ + endInsertRows(); + } +} + + +void HgDataProviderModel::removeItem(int pos) +{ + removeItems(pos, 1); +} + +void HgDataProviderModel::removeItems(int pos, int size) +{ + if (pos >mCache->count()) + return; + else if (pos <0){ + size = size + pos; //pos <0 + pos = 0; + } + + if (size >mCache->count()){ + size = mCache->count(); + } else if (size <0){ + return; + } + + beginRemoveRows(QModelIndex(),pos, pos+size-1); + for (int i=0; icount(); i++){ + mCache->removeAt(pos); + } + endRemoveRows(); +} + +void HgDataProviderModel::resetModel() +{ + beginResetModel(); + doResetModel(); + endResetModel(); +} + +void HgDataProviderModel::emitDataChanged(int from, int to, bool silent) +{ + if ( !silent ){ + TX_LOG + QModelIndex topLeft = index(from, 0); + QModelIndex bottomRight = index(to, 0); + emit dataChanged(topLeft,bottomRight); + } +} + +void HgDataProviderModel::resizeQPixmapPool(int newSize) +{ + mQPixmapsLock.lock(); + int currentSize = mFreePixmaps.count() + mUsedPixmaps.count(); + int diff = currentSize - newSize - KQPixmapCacheEmergencyBuffer; + mUnallocatedPixmaps = 0; + while (diff != 0){ + if (diff < 0){ + mUnallocatedPixmaps++; + diff++; + }else{ + if (mUnallocatedPixmaps>0){ + mUnallocatedPixmaps--; + } else if (mFreePixmaps.count()){ + mFreePixmaps.removeLast(); + } //else will be deleted with releasePixmap; + diff--; + } + } + mQPixmapsLock.unlock(); + mCacheSize = newSize; +} + +void HgDataProviderModel::releasePixmap(int idx) +{ + mQPixmapsLock.lock(); + if (mUsedPixmaps.contains(idx)){ + QPixmap* pix = mUsedPixmaps.take(idx); + if ( mFreePixmaps.count() + mUsedPixmaps.count() + mUnallocatedPixmaps> mCacheSize + KQPixmapCacheEmergencyBuffer){ + delete pix; //we have too many pixmaps + }else{ + mFreePixmaps.append(pix); + } + }else{ + TX_LOG_ARGS( QString("can't release pixmap for idx=%0").arg(idx)); + } + mQPixmapsLock.unlock(); +} + +QVariant HgDataProviderModel::createIcon(int index, QPixmap aPixmap) +{ + QPixmap* pix = getPixmap(index); + if (pix){ + if ( pix->pixmapData() ){ + pix->pixmapData()->fromImage(aPixmap.toImage(), Qt::AutoColor ); + } else { + *pix = aPixmap; + } + mQPixmapsLock.lock(); + mUsedPixmaps.insert(index, pix); + mQPixmapsLock.unlock(); + return HbIcon(QIcon(*pix)); + } + TX_EXIT_ARGS( QString("No pixmap avilable")); + return QVariant(); +} + +QPixmap* HgDataProviderModel::getPixmap(int idx) +{ + TX_ENTRY + QPixmap* res = NULL; + mQPixmapsLock.lock(); + if ( mUsedPixmaps.contains(idx)){ + res = mUsedPixmaps.take(idx);//let's just replace pixmapdata for that pixmap + } else { + if (!mFreePixmaps.isEmpty()){ + res = mFreePixmaps.takeFirst(); + }else if (mUnallocatedPixmaps){ + mUnallocatedPixmaps--; + res = new QPixmap(); + } else { + TX_LOG_ARGS(QString("no free pixmaps")); + } + } + mQPixmapsLock.unlock(); + TX_EXIT + return res; +} + +//eof diff -r 89c329efa980 -r e48454f237ca hgcacheproxymodel/tsrc/fute/HgCacheProxyModelTestApp/default.png Binary file hgcacheproxymodel/tsrc/fute/HgCacheProxyModelTestApp/default.png has changed diff -r 89c329efa980 -r e48454f237ca hgcacheproxymodel/tsrc/fute/HgCacheProxyModelTestApp/hgcacheproxymodeltestapp.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgcacheproxymodel/tsrc/fute/HgCacheProxyModelTestApp/hgcacheproxymodeltestapp.pro Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,48 @@ +# 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: + +TEMPLATE = app +CONFIG += qtestlib console hb + +TARGET = hgcacheproxymodeltestapp +DEPENDPATH += . \ + inc \ + src + +symbian { + TARGET.EPOCSTACKSIZE = 0x14000 + TARGET.EPOCALLOWDLLDATA = 1 + TARGET.CAPABILITY = ALL \ + -TCB +} +LIBS += -lhgcacheproxymodel \ + -lharvesterclient.dll \ + -lmdeclient.dll \ + -lthumbnailmanagerqt.dll \ + -lflogger + +INCLUDEPATH += $$MW_LAYER_SYSTEMINCLUDE $$APP_LAYER_SYSTEMINCLUDE +INCLUDEPATH += ../../../inc + +#DEFINES += ENABLETRACE +#if TRACE_FILENAME not set, then RDebug is used +DEFINES += TRACE_FILE + + +HEADERS += src\mywindow.h \ + src/mydataprovider.h \ + ../../../inc/txlogger.h + +SOURCES += src\mywindow.cpp \ + src/mydataprovider.cpp \ + src/main.cpp + +RESOURCES += hgcacheproxymodeltestapp.qrc diff -r 89c329efa980 -r e48454f237ca hgcacheproxymodel/tsrc/fute/HgCacheProxyModelTestApp/hgcacheproxymodeltestapp.qrc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgcacheproxymodel/tsrc/fute/HgCacheProxyModelTestApp/hgcacheproxymodeltestapp.qrc Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,5 @@ + + + default.png + + diff -r 89c329efa980 -r e48454f237ca hgcacheproxymodel/tsrc/fute/HgCacheProxyModelTestApp/src/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgcacheproxymodel/tsrc/fute/HgCacheProxyModelTestApp/src/main.cpp Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,41 @@ +/* +* 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: +* +* Version : %version: 1 % +*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mywindow.h" +#include "hglogger.h" + +TX_MAIN(argc, argv) { + TX_STATIC_ENTRY + HbApplication app(argc, argv); + app.setApplicationName("Cache proxy model demo"); + MyWindow mainWindow; + mainWindow.show(); + // Enter event loop + int ret = app.exec(); + TX_STATIC_EXIT + return ret; +} diff -r 89c329efa980 -r e48454f237ca hgcacheproxymodel/tsrc/fute/HgCacheProxyModelTestApp/src/mydataprovider.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgcacheproxymodel/tsrc/fute/HgCacheProxyModelTestApp/src/mydataprovider.cpp Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,236 @@ +/* +* 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: +* +* Version : %version: 1 % +*/ +#include +#include "hglogger.h" +#include +#include "mydataprovider.h" + +//#include "x:\sf\mw\qt\src\openvg\qpixmapdata_vg_p.h" +//typedef VGImage (*pfnVgCreateEGLImageTargetKHR)(VGeglImageKHR); + +const int KItemIdRole = Qt::UserRole+1; + +const int KThumbnailsPriority = EPriorityLess; //standard priority + + +MyDataProvider::MyDataProvider(QObject *parent) : +HgDataProviderModel(parent), +mDefaultIcon(new HbIcon(QIcon(QPixmap(":/icons/default.png")))), +mScheduler(new CActiveSchedulerWait()), +mWrapper( new ThumbnailManager() ), +mThumbnailRequestPending(false), +mThumbnailRequestIndex(-1), +mThumbnailRequestID(-1), +mThumbnailsize(ThumbnailManager::ThumbnailMedium), +mMDSLoadInProgress(false) +{ +// TX_ENTRY + Q_UNUSED(parent); + mWrapper->setThumbnailSize( mThumbnailsize ); + mWrapper->setQualityPreference( ThumbnailManager::OptimizeForPerformance ); + + QObject::connect( mWrapper, SIGNAL(thumbnailReady( QPixmap , void* , int, int ) ), + this, SLOT( thumbnailReady( QPixmap , void* , int , int ))); + + doResetModel(); //will read mds data +} + +MyDataProvider::~MyDataProvider() +{ +// TX_ENTRY + delete mDefaultIcon; + delete mWrapper; + delete mScheduler; +// TX_EXIT +} + +void MyDataProvider::changeIconSize(ThumbnailManager::ThumbnailSize aThumbnailsize) +{ +// TX_ENTRY +// we could remove all iconsfrom cache and put default ones, but probably that would be waste of time, and it's better just to load new icons with correct sizes. + mThumbnailsize = aThumbnailsize; + mWrapper->setThumbnailSize( mThumbnailsize ); +// TX_EXIT +} + +void MyDataProvider::doRequestData(QList list, bool silent) +{ + TX_ENTRY + Q_UNUSED(silent); + QString items = "Requested items:"; + int i = 0; + for (int idx=0; idx=0 && i < count() && containsRole(i, KItemIdRole)) { + int id = (data(i, KItemIdRole)).toInt(); + unsigned long int uId = (unsigned long int)id; +// TX_LOG_ARGS(QString("getThumbnail for index:%0 uID:%1").arg(i).arg(uId)); + void *clientData = reinterpret_cast(i); + mThumbnailRequestID = mWrapper->getThumbnail(uId, clientData, KThumbnailsPriority); + mThumbnailRequestIndex = i; + mThumbnailRequestPending = true; + } + } +// TX_EXIT +} + +void MyDataProvider::readMDSData() +{ + mMDSLoadInProgress = true; +} + +void MyDataProvider::thumbnailReady( QPixmap pixmap, void* data, int id, int error ) +{ +// TX_ENTRY + Q_UNUSED(id); + if (!error && pixmap.rect().height()>0 && pixmap.rect().width()>0 ){ + int idx = reinterpret_cast(data); +// TX_LOG_ARGS(QString("thumbnailReady idx = %0").arg(idx)); + updateIcon(idx, createIcon(idx, pixmap)); + } else { + TX_LOG_ARGS(QString("error:%0 id:%0").arg(error).arg(id)); + } + mThumbnailRequestIndex = -1; + mThumbnailRequestID = -1; + mThumbnailRequestPending = false; + getNextThumbnail(); +// TX_EXIT +} + +void MyDataProvider::doReleaseData(QList list, bool silent) +{ +// TX_ENTRY + Q_UNUSED(silent); + int i = 0; + QString items = "Released items:"; + for (int idx=0;idxcancelRequest(mThumbnailRequestID); + mThumbnailRequestIndex = -1; + mThumbnailRequestID = -1; + mThumbnailRequestPending = false; + } + items += QString("%0 ").arg(i); + mWaitingThumbnails.removeAll(i); + releasePixmap(i); + } + TX_LOG_ARGS(items); + + getNextThumbnail(); +// TX_EXIT +} + +QVariant MyDataProvider::defaultIcon() const +{ + return *mDefaultIcon; +} + +void MyDataProvider::HandleSessionOpened(CMdESession& aSession, TInt aError) +{ + Q_UNUSED(aSession); + Q_UNUSED(aError); + mScheduler->AsyncStop(); +} + +// ---------------------------------------------------------------------------- +// HandleQueryCompleted +// ---------------------------------------------------------------------------- +// +void MyDataProvider::HandleQueryCompleted(CMdEQuery& aQuery, TInt aError) +{ + Q_UNUSED(aError); + clearCache(); + mMDSLoadInProgress = false; + int size = aQuery.ResultIds().Count(); + + for(int i = 0; i < size ; i++){ + QList< QPair< QVariant, int > > list; + unsigned long int id = aQuery.ResultId(i); + QVariant v; + v.setValue(id); + list.append( QPair< QVariant, int >(v, KItemIdRole) ); + int a = count(); + int b = -count(); + int c = a/4 + b/10 + i%30 + i/2; + QString s = QString("ITEM%1 %2 %3").arg(c).arg(a).arg(b); + if (i%2){ + s = s.toLower(); + } + list.append( QPair< QVariant, int >(s, Qt::DisplayRole) ); + list.append( QPair< QVariant, int >(QVariant(a), Qt::UserRole+2) ); + list.append( QPair< QVariant, int >(QVariant(b), Qt::UserRole+3) ); + list.append( QPair< QVariant, int >(QVariant(c), Qt::UserRole+4) ); + + newItem(&list); + } + + TX_LOG_ARGS( QString("size=%1").arg(count()) ); + + mScheduler->AsyncStop(); +} + +void MyDataProvider::doResetModel() +{ + + if (mThumbnailRequestPending && mThumbnailRequestID!=-1){ + mWrapper->cancelRequest(mThumbnailRequestID); + } + mThumbnailRequestIndex = -1; + mThumbnailRequestID = -1; + mThumbnailRequestPending = false; + mWaitingThumbnails.clear(); + + //read MDS data once again + TRAP_IGNORE( + CMdESession* session = CMdESession::NewL( *this ); + mScheduler->Start(); + + CMdENamespaceDef& namespaceDef = session->GetDefaultNamespaceDefL(); + + CMdEObjectDef& objectDef = namespaceDef.GetObjectDefL(_L("Image")); + + CMdEObjectQuery* imageQuery = session->NewObjectQueryL( namespaceDef, objectDef, this ); + CleanupStack::PushL( imageQuery ); + imageQuery->SetResultMode( EQueryResultModeId ); + imageQuery->FindL( ); + mScheduler->Start(); + CleanupStack::PopAndDestroy( 1 ); + delete session; + ); + + +// TX_EXIT +} + diff -r 89c329efa980 -r e48454f237ca hgcacheproxymodel/tsrc/fute/HgCacheProxyModelTestApp/src/mydataprovider.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgcacheproxymodel/tsrc/fute/HgCacheProxyModelTestApp/src/mydataprovider.h Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,79 @@ +/* +* 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: +* +* Version : %version: 1 % +*/ +#ifndef MYDATAPROVIDER2_H +#define MYDATAPROVIDER2_H + +#include + +#include +#include +#include +#include +#include +#include +#include "flogger.h" + +class HbIcon; +class CMdESession; +class CActiveSchedulerWait; +class QEventLoop; + +class MyDataProvider : public HgDataProviderModel, public MMdESessionObserver, public MMdEQueryObserver +{ + Q_OBJECT + +public: + MyDataProvider(QObject *parent = 0); + ~MyDataProvider(); + void changeIconSize(ThumbnailManager::ThumbnailSize aThumbnailsize); + +//from MMdESessionObserver and MMdEQueryObserver + virtual void HandleSessionOpened(CMdESession& aSession, TInt aError); + virtual void HandleSessionError(CMdESession& , TInt ){}; + virtual void HandleQueryNewResults(CMdEQuery& , TInt ,TInt ){}; + virtual void HandleQueryCompleted(CMdEQuery& aQuery, TInt aError); + +//from HgDataProviderModel + virtual void doReleaseData(QList list, bool silent); + virtual void doRequestData(QList list, bool silent); + virtual QVariant defaultIcon() const; + +protected: + virtual void doResetModel(); + +public slots: + void thumbnailReady( QPixmap , void* , int, int ); + +private: + void getNextThumbnail(); + void readMDSData(); + +private: + HbIcon* mDefaultIcon; + CActiveSchedulerWait* mScheduler; + ThumbnailManager* mWrapper; + QList mWaitingThumbnails; + bool mThumbnailRequestPending; + int mThumbnailRequestIndex; + int mThumbnailRequestID; + ThumbnailManager::ThumbnailSize mThumbnailsize; + bool mMDSLoadInProgress; +}; + +#endif // MYDATAPROVIDER2_H + diff -r 89c329efa980 -r e48454f237ca hgcacheproxymodel/tsrc/fute/HgCacheProxyModelTestApp/src/mywindow.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgcacheproxymodel/tsrc/fute/HgCacheProxyModelTestApp/src/mywindow.cpp Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,214 @@ +/* +* 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: +* +* Version : %version: 1 % +*/ +#include "mywindow.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "mydataprovider.h" +#include "hglogger.h" + + +const QStringList KViewNames = (QStringList() << "GridView" << "ListView" ); + +MyWindow::MyWindow() + : HbMainWindow(), + mView(0), + mModel(0), + mMyDataProvider(0), + mTimer(new QTimer(this)) +{ + mMainView = new HbView(); + addView( mMainView ); + + mMainView->setMenu( createMainMenu() ); + + mMyDataProvider = new MyDataProvider(this); + mModel = new HgCacheProxyModel(this); + mModel->setDataProvider(mMyDataProvider, 120, 20); + + connect(mTimer, SIGNAL(timeout()), this, SLOT(timeout())); + + HbAction action; + action.setData ( QVariant(1) ); //select Grid + processAction(&action); +} + +MyWindow::~MyWindow() +{ +// delete mMyDataProvider; +} + +HbMenu *MyWindow::createMainMenu() +{ + HbMenu* mainMenu = new HbMenu( ); + connect(mainMenu, SIGNAL(triggered(HbAction*)),this, SLOT(processAction(HbAction*))); + + HbMenu *viewSubMenu = mainMenu->addMenu("Change view"); + QString temporaryString; + int i(0); + foreach (temporaryString , KViewNames) { + HbAction* subAction = viewSubMenu->addAction(temporaryString); + subAction->setData (QVariant(++i)); + } + + HbMenu *sortSubMenu = mainMenu->addMenu("Sort"); + HbAction* action = sortSubMenu->addAction("Sort1"); + action->setData(QVariant(101)); + action = sortSubMenu->addAction("Sort2"); + action->setData(QVariant(102)); + action = sortSubMenu->addAction("Sort3"); + action->setData(QVariant(103)); + HbMenu *sort4SubMenu = sortSubMenu->addMenu("Sort4 (String)"); + action = sort4SubMenu->addAction("CaseSensitive"); + action->setData(QVariant(104)); + action = sort4SubMenu->addAction("CaseInsensitive"); + action->setData(QVariant(105)); + + HbMenu *filterSubMenu = mainMenu->addMenu("Filter"); + action = filterSubMenu->addAction("Disable filter"); + action->setData(QVariant(201)); + action = filterSubMenu->addAction("Filter ITEM* (Case Sensitive)"); + action->setData(QVariant(202)); + action = filterSubMenu->addAction("Filter ITEM1*(Case Insensitive)"); + action->setData(QVariant(203)); + + action = mainMenu->addAction("Reset"); + action->setData(QVariant(1000)); + action = mainMenu->addAction("Enable dynamic Sort/Filter"); + action->setData(QVariant(1001)); + + action = mainMenu->addAction("Test"); + action->setData(QVariant(1002)); + + action = mainMenu->addAction("Stop Test"); + action->setData(QVariant(1003)); + + return mainMenu; +} + + +void MyWindow::processAction( HbAction* action ) +{ + int command = action->data().toInt(); + if ( command == 1) { + HbGridView* view = new HbGridView(); + if ( orientation() == Qt::Horizontal ) { + view->setColumnCount( 5 ); + view->setRowCount( 3 ); + }else { + view->setColumnCount( 3 ); + view->setRowCount( 5 ); + } + view->setTextVisible(false); + view->setUniformItemSizes( true ); + view->setItemRecycling( true ); + //this could be done to change mode, for images it doesn't make sence, becouse images thumbnails are created by default only for medium and fullsize +// AbstractDataProvider *data = mModel->DataProvider(); +// MyDataProvider *prov = static_cast(data); //of course we have already poiter to that - mMyDataProvider, but it is example how to get it from model +// prov->changeIconSize(ThumbnailManager::ThumbnailMedium); + view->setModel(mModel); + mMainView->setWidget( view ); + mView = view; + } else if (command == 2) { + HbListView* view = new HbListView(); + view->setUniformItemSizes( true ); + view->setItemRecycling( true ); + //this could be done to change mode, for images it doesn't make sence, becouse images thumbnails are created by default only for medium and fullsize +// AbstractDataProvider *data = mModel->DataProvider(); +// MyDataProvider *prov = static_cast(data); //of course we have already poiter to that - mMyDataProvider, but it is example how to get it from model +// prov->changeIconSize(ThumbnailManager::ThumbnailSmall); + view->setModel(mModel); + mMainView->setWidget( view ); + mView = view; + } else if (command == 101) { //sort by KSort1Role + mModel->setSortRole(Qt::UserRole+2); + mModel->sort(0); + } else if (command == 102) { //sort by KSort2Role + mModel->setSortRole(Qt::UserRole+3); + mModel->sort(0); + } else if (command == 103) { //sort by KSort3Role + mModel->setSortRole(Qt::UserRole+4); + mModel->sort(0); + } else if (command == 104) { //sort by DisplayRole CaseSensitive + mModel->setSortRole(Qt::DisplayRole); + mModel->setSortCaseSensitivity(Qt::CaseSensitive); + mModel->sort(0); + } else if (command == 105) { //sort by DisplayRole CaseInsensitive + mModel->setSortRole(Qt::DisplayRole); + mModel->setSortCaseSensitivity(Qt::CaseInsensitive); + mModel->sort(0); + } else if (command == 201) { //disable filter + QRegExp reg = QRegExp(); +// mModel->setFilterRegExp(reg); + } else if (command == 202) { //Filter ITEM* (Case Sensitive) + QRegExp reg = QRegExp("ITEM*", Qt::CaseSensitive, QRegExp::Wildcard); +// mModel->setFilterCaseSensitivity(Qt::CaseSensitive); +// mModel->setFilterRegExp(reg); + } else if (command == 203) { //Filter ITEM1*(Case Insensitive) + QRegExp reg = QRegExp("ITEM1*", Qt::CaseInsensitive, QRegExp::Wildcard); +// mModel->setFilterCaseSensitivity(Qt::CaseInsensitive); +// mModel->setFilterRegExp(reg); + } else if (command == 1000) { //reset + mMyDataProvider->resetModel(); + } else if (command == 1001) { //reset + bool current = !mModel->dynamicSortFilter(); + mModel->setDynamicSortFilter(current); + if (current){ + action->setText("Disable dynamic Sort/Filter"); + }else{ + action->setText("Enable dynamic Sort/Filter"); + } + } else if (command == 1002) { + mTestVal = 500; + timeout(); + } else if (command == 1003) { + mTestVal = 0; + } +} + +void MyWindow::setIndex(int /*index*/) +{ + update(); +} + +void MyWindow::timeout() +{ + HbAction action; + action.setData ( QVariant(101 + mTestVal%4) ); + processAction(&action); + + if (mTestVal>0){ + mTestVal--; + mTimer->start(1000); + } +} + +//eof diff -r 89c329efa980 -r e48454f237ca hgcacheproxymodel/tsrc/fute/HgCacheProxyModelTestApp/src/mywindow.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgcacheproxymodel/tsrc/fute/HgCacheProxyModelTestApp/src/mywindow.h Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,76 @@ +/* +* 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: +* +* Version : %version: 1 % +*/ +#ifndef CONTENTWIDGET_H +#define CONTENTWIDGET_H + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class QTimer; +class HbMenu; +class HbMainWindow; +class HbGridView; +class HbAction; +class HbMenuItem; +class QFileSystemWatcher; +class HgCacheProxyModel; +class HbSlider; +class MyDataProvider; + +class MyWindow : public HbMainWindow +{ + Q_OBJECT + +public: + MyWindow(); + ~MyWindow(); + +private slots: + void processAction ( HbAction* action ); + void setIndex(int index); + void timeout(); + +private: + HbMenu *createMainMenu(); + +private: + HbAbstractItemView* mView; + HgCacheProxyModel *mModel; + + MyDataProvider *mMyDataProvider; + HbView* mMainView; + int mTestVal; + QTimer *mTimer; + +}; + +#endif // CONTENTWIDGET_H diff -r 89c329efa980 -r e48454f237ca hgcacheproxymodel/tsrc/unit/bmhelper.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgcacheproxymodel/tsrc/unit/bmhelper.cpp Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,95 @@ +/* +* 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: +* +* Version : %version: 1 % +*/ +#include "bmhelper.h" +#include + +BMHelper::BMHelper(int totalSize) +{ + for ( int i(0); i < totalSize; i++) + mBuffer.append(false); +} + +BMHelper::~BMHelper() +{ +} + +void BMHelper::release(int start, int end) +{ + if ( start<0) + start = 0; + if (end>mBuffer.size() - 1) + end = mBuffer.size() - 1; + + for ( int i = start; i <= end; i++){ + mBuffer.replace(i, false); + } +} + +void BMHelper::request(int start, int end, HgRequestOrder order) +{ + Q_UNUSED(order); + if ( start<0) + start = 0; + if (end>mBuffer.size() - 1) + end = mBuffer.size() - 1; + + for ( int i = start; i <= end; i++){ + mBuffer.replace(i, true); + } +} + +bool BMHelper::isIntergal(int bufferSize) +{ + int c = mBuffer.count(true); + bool res = (bufferSize == c); + if (res){ ///check integrity ( if all items from first true, to size are true; + int f = mBuffer.indexOf(true); + for ( int i =0; i < mBuffer.count(); i++){ + if (mBuffer[i] != (i>=f && i < f+bufferSize) ){ + res = false; + break; + } + } + } else { + qWarning()< mBuffer.count()) + aIndex = mBuffer.count()-1; + + if ((mBuffer.count() - aNewTotalCount)>0){ + while (mBuffer.count()!=aNewTotalCount){ + if (aIndex > mBuffer.count() ) + aIndex = mBuffer.count() -1; + mBuffer.removeAt(aIndex); + } + } else if ((mBuffer.count() - aNewTotalCount)<0){ + while (mBuffer.count()!=aNewTotalCount){ + mBuffer.insert(aIndex, false); + } + } +} diff -r 89c329efa980 -r e48454f237ca hgcacheproxymodel/tsrc/unit/bmhelper.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgcacheproxymodel/tsrc/unit/bmhelper.h Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,41 @@ +/* +* 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: +* +* Version : %version: 1 % +*/ +#ifndef BUFFERMANAGERHELPER_H +#define BUFFERMANAGERHELPER_H + +#include + +class BMHelper: public HgBufferManagerObserver +{ +public: + BMHelper(int totalSize); + ~BMHelper(); + + virtual void release(int start, int end); + virtual void request(int start, int end, HgRequestOrder order = HgRequestOrderAscending); + + bool isIntergal(int bufferSize); + void itemCountChanged( int aIndex, bool aRemoved, int aNewTotalCount ); + void resizeCache(int newSize); + + +private: + QList< bool > mBuffer; + +}; +#endif // BUFFERMANAGERHELPER_H diff -r 89c329efa980 -r e48454f237ca hgcacheproxymodel/tsrc/unit/cacheproxydatamodel_tsrc.png Binary file hgcacheproxymodel/tsrc/unit/cacheproxydatamodel_tsrc.png has changed diff -r 89c329efa980 -r e48454f237ca hgcacheproxymodel/tsrc/unit/cacheproxyhelper.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgcacheproxymodel/tsrc/unit/cacheproxyhelper.cpp Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,284 @@ +/* +* 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: +* +* Version : %version: 1 % +*/ +#include "cacheproxyhelper.h" + +CacheProxyHelper::CacheProxyHelper(HgCacheProxyModel *model, QObject *parent): +QObject(parent), +mModel(model) +{ + ASSERT(mModel!=0); + + connect(mModel, SIGNAL(dataChanged(QModelIndex,QModelIndex)), + this, SLOT(slotDataChanged(QModelIndex,QModelIndex))); + + connect(mModel, SIGNAL(headerDataChanged(Qt::Orientation,int,int)), + this, SLOT(slotHeaderDataChanged(Qt::Orientation,int,int))); + + connect(mModel, SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int)), + this, SLOT(slotRowsAboutToBeInserted(QModelIndex,int,int))); + + connect(mModel, SIGNAL(rowsInserted(QModelIndex,int,int)), + this, SLOT(slotRowsInserted(QModelIndex,int,int))); + + connect(mModel, SIGNAL(columnsAboutToBeInserted(QModelIndex,int,int)), + this, SLOT(slotColumnsAboutToBeInserted(QModelIndex,int,int))); + + connect(mModel, SIGNAL(columnsInserted(QModelIndex,int,int)), + this, SLOT(slotColumnsInserted(QModelIndex,int,int))); + + connect(mModel, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)), + this, SLOT(slotRowsAboutToBeRemoved(QModelIndex,int,int))); + + connect(mModel, SIGNAL(rowsRemoved(QModelIndex,int,int)), + this, SLOT(slotRowsRemoved(QModelIndex,int,int))); + + connect(mModel, SIGNAL(columnsAboutToBeRemoved(QModelIndex,int,int)), + this, SLOT(slotColumnsAboutToBeRemoved(QModelIndex,int,int))); + + connect(mModel, SIGNAL(columnsRemoved(QModelIndex,int,int)), + this, SLOT(slotColumnsRemoved(QModelIndex,int,int))); + + connect(mModel, SIGNAL(layoutAboutToBeChanged()), + this, SLOT(slotLayoutAboutToBeChanged())); + + connect(mModel, SIGNAL(layoutChanged()), + this, SLOT(slotLayoutChanged())); + + connect(mModel, SIGNAL(modelAboutToBeReset()), + this, SLOT(slotModelAboutToBeReset())); + + connect(mModel, SIGNAL(modelReset()), + this, SLOT(slotModelReset())); + +} + +CacheProxyHelper::~CacheProxyHelper() +{ + disconnect(mModel); +} + +void CacheProxyHelper::slotDataChanged(QModelIndex from,QModelIndex to) +{ + QPair< int, int > p; + p.first = from.row(); + p.second = to.row(); + mSignalDataChanged.append(p); +} + +void CacheProxyHelper::slotHeaderDataChanged(Qt::Orientation orientation, int first, int last) +{ + Q_UNUSED(orientation); + QPair< int, int > p; + p.first = first; + p.second = last; + mSignalHeaderDataChanged.append(p); +} + +void CacheProxyHelper::slotRowsAboutToBeInserted(QModelIndex parent,int from,int to) +{ + Q_UNUSED(parent); + QPair< int, int > p; + p.first = from; + p.second = to; + mSignalRowsAboutToBeInserted.append(p); +} + +void CacheProxyHelper::slotRowsInserted(QModelIndex parent,int from,int to) +{ + Q_UNUSED(parent); + QPair< int, int > p; + p.first = from; + p.second = to; + mSignalRowsInserted.append(p); +} + +void CacheProxyHelper::slotColumnsAboutToBeInserted(QModelIndex parent,int from,int to) +{ + Q_UNUSED(parent); + QPair< int, int > p; + p.first = from; + p.second = to; + mSignalColumnsAboutToBeInserted.append(p); +} + +void CacheProxyHelper::slotColumnsInserted(QModelIndex parent,int from,int to) +{ + Q_UNUSED(parent); + QPair< int, int > p; + p.first = from; + p.second = to; + mSignalColumnsInserted.append(p); +} + +void CacheProxyHelper::slotRowsAboutToBeRemoved(QModelIndex parent,int from,int to) +{ + Q_UNUSED(parent); + QPair< int, int > p; + p.first = from; + p.second = to; + mSignalRowsAboutToBeRemoved.append(p); +} + +void CacheProxyHelper::slotRowsRemoved(QModelIndex parent,int from,int to) +{ + Q_UNUSED(parent); + QPair< int, int > p; + p.first = from; + p.second = to; + mSignalRowsRemoved.append(p); +} + +void CacheProxyHelper::slotColumnsAboutToBeRemoved(QModelIndex parent,int from,int to) +{ + Q_UNUSED(parent); + QPair< int, int > p; + p.first = from; + p.second = to; + mSignalColumnsAboutToBeRemoved.append(p); +} + +void CacheProxyHelper::slotColumnsRemoved(QModelIndex parent,int from,int to) +{ + Q_UNUSED(parent); + QPair< int, int > p; + p.first = from; + p.second = to; + mSignalColumnsRemoved.append(p); +} + +void CacheProxyHelper::slotLayoutAboutToBeChanged() +{ + mSignalLayoutAboutToBeChanged = true; +} + +void CacheProxyHelper::slotLayoutChanged() +{ + mSignalLayoutChanged = true; +} + +void CacheProxyHelper::slotModelAboutToBeReset() +{ + mSignalModelAboutToBeReset = true; +} + +void CacheProxyHelper::slotModelReset() +{ + mSignalModelReset = true; +} + +QList< QPair< int, int > > CacheProxyHelper::getSignalDataChanged() +{ + QList< QPair< int, int > > res = mSignalDataChanged; + mSignalDataChanged.clear(); + return res; +} + +QList< QPair< int, int > > CacheProxyHelper::getSignalHeaderDataChanged() +{ + QList< QPair< int, int > > res = mSignalHeaderDataChanged; + mSignalHeaderDataChanged.clear(); + return res; +} + +QList< QPair< int, int > > CacheProxyHelper::getSignalRowsAboutToBeInserted() +{ + QList< QPair< int, int > > res = mSignalRowsAboutToBeInserted; + mSignalRowsAboutToBeInserted.clear(); + return res; +} + +QList< QPair< int, int > > CacheProxyHelper::getSignalRowsInserted() +{ + QList< QPair< int, int > > res = mSignalRowsInserted; + mSignalRowsInserted.clear(); + return res; +} + +QList< QPair< int, int > > CacheProxyHelper::getSignalColumnsAboutToBeInserted() +{ + QList< QPair< int, int > > res = mSignalColumnsAboutToBeInserted; + mSignalColumnsAboutToBeInserted.clear(); + return res; +} + +QList< QPair< int, int > > CacheProxyHelper::getSignalColumnsInserted() +{ + QList< QPair< int, int > > res = mSignalColumnsInserted; + mSignalColumnsInserted.clear(); + return res; +} + +QList< QPair< int, int > > CacheProxyHelper::getSignalRowsAboutToBeRemoved() +{ + QList< QPair< int, int > > res = mSignalRowsAboutToBeRemoved; + mSignalRowsAboutToBeRemoved.clear(); + return res; +} + +QList< QPair< int, int > > CacheProxyHelper::getSignalRowsRemoved() +{ + QList< QPair< int, int > > res = mSignalRowsRemoved; + mSignalRowsRemoved.clear(); + return res; +} + +QList< QPair< int, int > > CacheProxyHelper::getSignalColumnsAboutToBeRemoved() +{ + QList< QPair< int, int > > res = mSignalColumnsAboutToBeRemoved; + mSignalColumnsAboutToBeRemoved.clear(); + return res; +} + +QList< QPair< int, int > > CacheProxyHelper::getSignalColumnsRemoved() +{ + QList< QPair< int, int > > res = mSignalColumnsRemoved; + mSignalColumnsRemoved.clear(); + return res; +} + +bool CacheProxyHelper::getSignalLayoutAboutToBeChanged() +{ + bool res = mSignalLayoutAboutToBeChanged; + mSignalLayoutAboutToBeChanged = false; + return res; +} + +bool CacheProxyHelper::getSignalLayoutChanged() +{ + bool res = mSignalLayoutChanged; + mSignalLayoutChanged = false; + return res; +} + +bool CacheProxyHelper::getSignalModelAboutToBeReset() +{ + bool res = mSignalModelAboutToBeReset; + mSignalModelAboutToBeReset = false; + return res; +} + +bool CacheProxyHelper::getSignalModelReset() +{ + bool res = mSignalModelReset; + mSignalModelReset = false; + return res; +} + + + + diff -r 89c329efa980 -r e48454f237ca hgcacheproxymodel/tsrc/unit/cacheproxyhelper.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgcacheproxymodel/tsrc/unit/cacheproxyhelper.h Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,82 @@ +/* +* 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: +* +*/ +#ifndef CACHEPROXYHELPER_H +#define CACHEPROXYHELPER_H + +#include + + +class CacheProxyHelper: public QObject +{ + Q_OBJECT +public: + CacheProxyHelper(HgCacheProxyModel *model, QObject *parent = 0); + ~CacheProxyHelper(); + +private slots: + void slotDataChanged(QModelIndex from,QModelIndex to); + void slotHeaderDataChanged(Qt::Orientation orientation, int first, int last); + void slotRowsAboutToBeInserted(QModelIndex parent,int from,int to); + void slotRowsInserted(QModelIndex parent,int from,int to); + void slotColumnsAboutToBeInserted(QModelIndex parent,int from,int to); + void slotColumnsInserted(QModelIndex parent,int from,int to); + void slotRowsAboutToBeRemoved(QModelIndex parent,int from,int to); + void slotRowsRemoved(QModelIndex parent,int from,int to); + void slotColumnsAboutToBeRemoved(QModelIndex parent,int from,int to); + void slotColumnsRemoved(QModelIndex parent,int from,int to); + void slotLayoutAboutToBeChanged(); + void slotLayoutChanged(); + void slotModelAboutToBeReset(); + void slotModelReset(); + +public: + QList< QPair< int, int > > getSignalDataChanged(); + QList< QPair< int, int > > getSignalHeaderDataChanged(); + QList< QPair< int, int > > getSignalRowsAboutToBeInserted(); + QList< QPair< int, int > > getSignalRowsInserted(); + QList< QPair< int, int > > getSignalColumnsAboutToBeInserted(); + QList< QPair< int, int > > getSignalColumnsInserted(); + QList< QPair< int, int > > getSignalRowsAboutToBeRemoved(); + QList< QPair< int, int > > getSignalRowsRemoved(); + QList< QPair< int, int > > getSignalColumnsAboutToBeRemoved(); + QList< QPair< int, int > > getSignalColumnsRemoved(); + bool getSignalLayoutAboutToBeChanged(); + bool getSignalLayoutChanged(); + bool getSignalModelAboutToBeReset(); + bool getSignalModelReset(); + +private: + HgCacheProxyModel* mModel; + + QList< QPair< int, int > > mSignalDataChanged; + QList< QPair< int, int > > mSignalHeaderDataChanged; + QList< QPair< int, int > > mSignalRowsAboutToBeInserted; + QList< QPair< int, int > > mSignalRowsInserted; + QList< QPair< int, int > > mSignalColumnsAboutToBeInserted; + QList< QPair< int, int > > mSignalColumnsInserted; + QList< QPair< int, int > > mSignalRowsAboutToBeRemoved; + QList< QPair< int, int > > mSignalRowsRemoved; + QList< QPair< int, int > > mSignalColumnsAboutToBeRemoved; + QList< QPair< int, int > > mSignalColumnsRemoved; + bool mSignalLayoutAboutToBeChanged; + bool mSignalLayoutChanged; + bool mSignalModelAboutToBeReset; + bool mSignalModelReset; + +}; + +#endif // CACHEPROXYHELPER_H diff -r 89c329efa980 -r e48454f237ca hgcacheproxymodel/tsrc/unit/dataproviderhelper.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgcacheproxymodel/tsrc/unit/dataproviderhelper.cpp Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,378 @@ +/* +* 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: +* +* Version : %version: 3 % +*/ +#include "dataproviderhelper.h" +#include + +const int KRole1 = Qt::UserRole+1; +const int KRole2 = Qt::UserRole+2; +const int KRole3 = Qt::UserRole+3; + +DataProviderHelper::DataProviderHelper(int size, QObject *parent): +HgDataProviderModel(parent) +{ + mDefaultIcon = QString("DefaultIcon"); + + for ( int i(0);i > list; + int a = i; + int b = -i; + int c = a/4 + b/10 + i%30 + i/2; + QString s = QString("ITEM%1 %2 %3").arg(c).arg(a).arg(b); + if (i%2){ + s = s.toLower(); + } + list.append( QPair< QVariant, int >(s, Qt::DisplayRole) ); + list.append( QPair< QVariant, int >(QVariant(a), KRole1) ); + list.append( QPair< QVariant, int >(QVariant(b), KRole2) ); + list.append( QPair< QVariant, int >(QVariant(c), KRole3) ); + newItem(&list, true); + } + + connect(this, SIGNAL(dataChanged(QModelIndex,QModelIndex)), + this, SLOT(slotDataUpdated(QModelIndex,QModelIndex))); + + connect(this, SIGNAL(rowsAboutToBeInserted(QModelIndex,int,int)), + this, SLOT(slotRowsAboutToBeInserted(QModelIndex,int,int))); + + connect(this, SIGNAL(rowsInserted(QModelIndex,int,int)), + this, SLOT(slotRowsInserted(QModelIndex,int,int))); + + connect(this, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)), + this, SLOT(slotRowsAboutToBeRemoved(QModelIndex,int,int))); + + connect(this, SIGNAL(rowsRemoved(QModelIndex,int,int)), + this, SLOT(slotRowsRemoved(QModelIndex,int,int))); + + connect(this, SIGNAL(modelAboutToBeReset()), + this, SLOT(slotModelAboutToBeReset())); + + connect(this, SIGNAL(modelReset()), + this, SLOT(slotModelReset())); +} + +DataProviderHelper::~DataProviderHelper() +{ + +} + +void DataProviderHelper::doReleaseData(QList list, bool silent) +{ + Q_UNUSED(silent); + mLastRelease = QList(list); +} + +void DataProviderHelper::doRequestData(QList list, bool silent) +{ + Q_UNUSED(silent); + mLastRequest = QList(list); + for ( int i=0; i >* list, bool silent) +{ + newItem(list, silent); +} + +void DataProviderHelper::testNewItem(QPair< QVariant, int > item, bool silent) +{ + newItem(item, silent); +} + +bool DataProviderHelper::testUpdate(int pos, QList< QPair< QVariant, int > >* list, bool silent) +{ + return update(pos, list, silent); +} + +bool DataProviderHelper::testUpdate(int pos, QVariant obj, int role, bool silent ) +{ + return update(pos, obj, role, silent); +} + +void DataProviderHelper::testRemoveItems(int pos, int size) +{ + removeItems(pos, size); +} + +void DataProviderHelper::testRemoveItem(int pos) +{ + removeItem(pos); +} + +void DataProviderHelper::testInsertItem(int pos, QPair< QVariant, int > item, bool silent) +{ + insertItem(pos, item, silent); +} + +void DataProviderHelper::doResetModel() +{ + clearCache(); + for ( int i(0);i<1000;i++){ + QList< QPair< QVariant, int > > list; + int a = i; + int b = -i; + int c = a/4 + b/10 + i%30 + i/2; + QString s = QString("NEW ITEM %1 %2 %3").arg(c).arg(a).arg(b); + if (i%2){ + s = s.toLower(); + } + list.append( QPair< QVariant, int >(s, Qt::DisplayRole) ); + list.append( QPair< QVariant, int >(QVariant(a), KRole1) ); + list.append( QPair< QVariant, int >(QVariant(b), KRole2) ); + list.append( QPair< QVariant, int >(QVariant(c), KRole3) ); + newItem(&list, true); + } +} + +bool DataProviderHelper::setData(const QModelIndex &index, const QVariant &value, int role) +{ + bool res = false; + if ( index.row()>=0 && index.row() < count() ){ +// qWarning()< &roles) +{ + bool res = false; + if ( index.row()>=0 && index.row() < count() ){ + QMapIterator i(roles); + while (i.hasNext()){ + i.next(); + res = update(index.row(), i.value(), i.key(), true) | res; + } + } + return res; +} + +QList< QPair< int, int > > DataProviderHelper::getObserverDataUpdated() +{ + QList< QPair< int, int > > res = mObserverDataUpdated; + mObserverDataUpdated.clear(); + return res; +} + +QList< QPair< int, int > > DataProviderHelper::getSignalDataUpdated() +{ + QList< QPair< int, int > > res = mSignalDataUpdated; + mSignalDataUpdated.clear(); + return res; +} + +QList< QPair< int, int > > DataProviderHelper::getSignalRowsAboutToBeInserted() +{ + QList< QPair< int, int > > res = mSignalRowsAboutToBeInserted; + mSignalRowsAboutToBeInserted.clear(); + return res; +} + +QList< QPair< int, int > > DataProviderHelper::getSignalRowsInserted() +{ + QList< QPair< int, int > > res = mSignalRowsInserted; + mSignalRowsInserted.clear(); + return res; +} + +QList< QPair< int, int > > DataProviderHelper::getSignalRowsAboutToBeRemoved() +{ + QList< QPair< int, int > > res = mSignalRowsAboutToBeRemoved; + mSignalRowsAboutToBeRemoved.clear(); + return res; +} + +QList< QPair< int, int > > DataProviderHelper::getSignalRowsRemoved() +{ + QList< QPair< int, int > > res = mSignalRowsRemoved; + mSignalRowsRemoved.clear(); + return res; +} + +bool DataProviderHelper::getSignalAboutToBeReset() +{ + bool res = mSignalAboutToBeReset; + mSignalAboutToBeReset = false; + return res; +} + +bool DataProviderHelper::getSignalReset() +{ + bool res = mSignalReset; + mSignalReset = false; + return res; +} + +QList DataProviderHelper::getLastRelease() +{ + QList res = mLastRelease; + mLastRelease.clear(); + return res; +} + +QList DataProviderHelper::getLastRequest() +{ + QList res = mLastRequest; + mLastRequest.clear(); + return res; +} + +void DataProviderHelper::testReleasePixmap(int idx) +{ + releasePixmap(idx); +} + +QVariant DataProviderHelper::testCreateIcon(int index, QPixmap aPixmap) +{ + return createIcon(index, aPixmap); +} + +void DataProviderHelper::testEmitDataChanged(QModelIndex from,QModelIndex to) +{ + emit dataChanged(from,to); +} + +void DataProviderHelper::testEmitHeaderDataChanged(Qt::Orientation orientation, int first, int last) +{ + emit headerDataChanged(orientation, first, last); +} + +void DataProviderHelper::testEmitRowsInsert(QModelIndex parent,int from,int to) +{ + beginInsertRows(parent, from, to); + endInsertRows(); +} + + +void DataProviderHelper::testEmitColumnsInsert(QModelIndex parent,int from,int to) +{ + beginInsertColumns(parent, from, to); + endInsertColumns(); +} + + +void DataProviderHelper::testEmitRowsRemove(QModelIndex parent,int from,int to) +{ + beginRemoveRows(parent, from, to); + endRemoveRows(); +} + +void DataProviderHelper::testEmitColumnsRemove(QModelIndex parent,int from,int to) +{ + beginRemoveColumns(parent, from, to); + endRemoveColumns(); +} + +void DataProviderHelper::testEmitLayoutAboutToBeChanged() +{ + emit layoutAboutToBeChanged(); +} + +void DataProviderHelper::testEmitLayoutChanged() +{ + emit layoutChanged(); +} + +void DataProviderHelper::testEmitModelAboutToBeReset() +{ + beginResetModel(); +} + +void DataProviderHelper::testEmitModelReset() +{ + endResetModel(); +} + +void DataProviderHelper::dataUpdated(int from, int to) +{ + QPair< int, int > p; + p.first = from; + p.second = to; + mObserverDataUpdated.append(p); +} + +void DataProviderHelper::slotDataUpdated(QModelIndex from,QModelIndex to) +{ + QPair< int, int > p; + p.first = from.row(); + p.second = to.row(); + mSignalDataUpdated.append(p); +} + +void DataProviderHelper::slotRowsAboutToBeInserted(QModelIndex parent, int from, int to) +{ + Q_UNUSED(parent); + QPair< int, int > p; + p.first = from; + p.second = to; + mSignalRowsAboutToBeInserted.append(p); +} + +void DataProviderHelper::slotRowsInserted(QModelIndex parent, int from, int to) +{ + Q_UNUSED(parent); + QPair< int, int > p; + p.first = from; + p.second = to; + mSignalRowsInserted.append(p); +} + +void DataProviderHelper::slotRowsAboutToBeRemoved(QModelIndex parent, int from, int to) +{ + Q_UNUSED(parent); + QPair< int, int > p; + p.first = from; + p.second = to; + mSignalRowsAboutToBeRemoved.append(p); +} + +void DataProviderHelper::slotRowsRemoved(QModelIndex parent, int from, int to) +{ + Q_UNUSED(parent); + Q_UNUSED(parent); + QPair< int, int > p; + p.first = from; + p.second = to; + mSignalRowsRemoved.append(p); +} + +void DataProviderHelper::slotModelAboutToBeReset() +{ + mSignalAboutToBeReset = true; +} + +void DataProviderHelper::slotModelReset() +{ + mSignalReset = true; +} + + + + + + diff -r 89c329efa980 -r e48454f237ca hgcacheproxymodel/tsrc/unit/dataproviderhelper.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgcacheproxymodel/tsrc/unit/dataproviderhelper.h Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,108 @@ +/* +* 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: +* +*/ +#ifndef DATAPROVIDERHELPER_H +#define DATAPROVIDERHELPER_H + +#include +#include +#include + +class DataProviderHelper : public HgDataProviderModel, public HgDataProviderModelObserver +{ + Q_OBJECT + +public: + DataProviderHelper(int size =1200, QObject *parent = 0); + ~DataProviderHelper(); + +//from HgDataProviderModel + virtual void doReleaseData(QList list, bool silent); + virtual void doRequestData(QList list, bool silent); + virtual QVariant defaultIcon() const; + virtual void doResetModel(); + +//from QAbstractItemModel + virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); + virtual bool setItemData(const QModelIndex &index, const QMap &roles); + +//for testing + void testClearCache(); + void testNewItem(QList< QPair< QVariant, int > >* list, bool silent); + void testNewItem(QPair< QVariant, int > item, bool silent); + bool testUpdate(int pos, QList< QPair< QVariant, int > >* list, bool silent); + bool testUpdate(int pos, QVariant obj, int role, bool silent ); + void testRemoveItems(int pos, int size = 1); + void testRemoveItem(int pos); + void testInsertItem(int pos, QPair< QVariant, int > item, bool silent); + + QList< QPair< int, int > > getObserverDataUpdated(); + + QList< QPair< int, int > > getSignalDataUpdated(); + QList< QPair< int, int > > getSignalRowsAboutToBeInserted(); + QList< QPair< int, int > > getSignalRowsInserted(); + QList< QPair< int, int > > getSignalRowsAboutToBeRemoved(); + QList< QPair< int, int > > getSignalRowsRemoved(); + bool getSignalAboutToBeReset(); + bool getSignalReset(); + + QList getLastRelease(); + QList getLastRequest(); + + void testReleasePixmap(int idx); + QVariant testCreateIcon(int index, QPixmap aPixmap); + + void testEmitDataChanged(QModelIndex from,QModelIndex to); + void testEmitHeaderDataChanged(Qt::Orientation orientation, int first, int last); + void testEmitRowsInsert(QModelIndex parent,int from,int to); + void testEmitColumnsInsert(QModelIndex parent,int from,int to); + void testEmitRowsRemove(QModelIndex parent,int from,int to); + void testEmitColumnsRemove(QModelIndex parent,int from,int to); + void testEmitLayoutAboutToBeChanged(); + void testEmitLayoutChanged(); + void testEmitModelAboutToBeReset(); + void testEmitModelReset(); + +//from HgDataProviderModelObserver +public: + virtual void dataUpdated(int from, int to); + +private slots: + void slotDataUpdated(QModelIndex,QModelIndex); + void slotRowsAboutToBeInserted(QModelIndex,int,int); + void slotRowsInserted(QModelIndex,int,int); + void slotRowsAboutToBeRemoved(QModelIndex,int,int); + void slotRowsRemoved(QModelIndex,int,int); + void slotModelAboutToBeReset(); + void slotModelReset(); + +private: + QVariant mDefaultIcon; + QList< QPair< int, int > > mObserverDataUpdated; + + QList< QPair< int, int > > mSignalDataUpdated; + QList< QPair< int, int > > mSignalRowsAboutToBeInserted; + QList< QPair< int, int > > mSignalRowsInserted; + QList< QPair< int, int > > mSignalRowsAboutToBeRemoved; + QList< QPair< int, int > > mSignalRowsRemoved; + bool mSignalAboutToBeReset; + bool mSignalReset; + QList mLastRelease; + QList mLastRequest; + +}; + +#endif // DATAPROVIDERHELPER_H diff -r 89c329efa980 -r e48454f237ca hgcacheproxymodel/tsrc/unit/test_hgcacheproxydatamodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgcacheproxymodel/tsrc/unit/test_hgcacheproxydatamodel.cpp Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,1094 @@ +/* +* 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: +* +* Version : %version: 3 % +*/ +#include +#include +#include "test_hgcacheproxydatamodel.h" + +#include "../../inc/hgbuffermanager.h" +#include "bmhelper.h" + +#include "dataproviderhelper.h" +#include "cacheproxyhelper.h" +#include + +// ======== MEMBER FUNCTIONS ======== +void TestCacheProxy::testQAbstractItemModel(QAbstractItemModel* model, int rows, int columns) +{ + QVERIFY(model != 0); + QModelIndex idx = model->index(0, 0); + if ( rows > 0 && columns > 0){ + QVERIFY(idx.isValid() == true); + QVERIFY(idx.row() == 0); + QVERIFY(idx.column() == 0); + + idx = model->index(rows/2, 0); + QVERIFY(idx.row() == rows/2); + QVERIFY(idx.column() == 0); + + idx = model->index(0, columns/2); + QVERIFY(idx.row() == 0); + QVERIFY(idx.column() == columns/2); + + idx = model->index(-10, 0); + QVERIFY(idx.row() == -10); + QVERIFY(idx.column() == 0); + + idx = model->index(0, -10); + QVERIFY(idx.row() == 0); + QVERIFY(idx.column() == -10); + + idx = model->index(rows*2, 0); + QVERIFY(idx.row() == -1); + QVERIFY(idx.column() == 0); + + idx = model->index(0, columns*2); + QVERIFY(idx.row() == 0); + QVERIFY(idx.column() == -1); + }else{ + QVERIFY(idx.row() == -1); + QVERIFY(idx.column() == -1); + + idx = model->index(-10, 0); + QVERIFY(idx.row() == -10); + QVERIFY(idx.column() == -1); + + idx = model->index(0, -10); + QVERIFY(idx.row() == -1); + QVERIFY(idx.column() == -10); + + idx = model->index(10, 0); + QVERIFY(idx.row() == -1); + QVERIFY(idx.column() == -1); + + idx = model->index(0, 10); + QVERIFY(idx.row() == -1); + QVERIFY(idx.column() == -1); + } + + idx = model->parent(idx); + QVERIFY(idx.isValid() == false); + QVERIFY(model->columnCount() == columns); + QVERIFY(model->rowCount() == rows); + +// QVERIFY(model->hasChildren() == false); +// QVERIFY(model->headerData(0, Qt::Horizontal).isValid == false); + +} + +void TestCacheProxy::initTestCase() +{ + bm = 0; + bmh = 0; + dph = 0; + cp = 0; + cph = 0; +} + +void TestCacheProxy::cleanupTestCase() +{ + delete bm; + delete bmh; + delete dph; + delete cp; + delete cph; +} + +void TestCacheProxy::init() +{ + delete bm; + delete bmh; + bm = 0; + bmh = 0; + + delete dph; + dph = 0; + + delete cp; + cp = 0; + + delete cph; + cph = 0; +} + +void TestCacheProxy::cleanup() +{ + delete bm; + delete bmh; + bm = 0; + bmh = 0; + + delete dph; + dph = 0; + + delete cp; + cp = 0; + + delete cph; + cph = 0; +} + +//BufferManager +void TestCacheProxy::testBM_SetPosition() +{ + int totalsize = 100; + int bufferSize = 100; + bmh = new BMHelper(totalsize); + bm = new HgBufferManager(bmh, bufferSize, 40, 110, totalsize); + delete bmh; + delete bm; + + totalsize = 100; + bufferSize = 200; + bmh = new BMHelper(totalsize); + bm = new HgBufferManager(bmh, bufferSize, 40, -20, totalsize); + delete bmh; + delete bm; + + totalsize = 1000; + bufferSize = 100; + bmh = new BMHelper(totalsize); + bm = new HgBufferManager(bmh, bufferSize, 40, 0, totalsize); + + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(5); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(23); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(50); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(111); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(120); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(130); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(271); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(507); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(800); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(880); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(899); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(910); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(950); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(996); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(1000); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(1200); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(950); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(501); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(160); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(150); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(140); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(100); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(37); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(1); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(-200); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(250); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(-100); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(891); + QVERIFY(bmh->isIntergal(bufferSize)); +} + +void TestCacheProxy::testBM_ResetBuffer() +{ + int totalsize = 1000; + int bufferSize = 100; + bmh = new BMHelper(totalsize); + bm = new HgBufferManager(bmh, bufferSize, 40, 0, totalsize); + + bm->resetBuffer(0, totalsize); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(891); + bm->resetBuffer(0, totalsize); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->resetBuffer(880, totalsize); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(891); + bm->resetBuffer(880, totalsize); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(999); + bm->resetBuffer(0, totalsize); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(999); + bm->resetBuffer(995, totalsize); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(10); + bm->resetBuffer(910, totalsize); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->resetBuffer(10, totalsize); + QVERIFY(bmh->isIntergal(bufferSize)); +} + +void TestCacheProxy::testBM_ItemCountChanged() +{ + int totalsize = 1000; + int bufferSize = 100; + bmh = new BMHelper(totalsize); + bm = new HgBufferManager(bmh, bufferSize, 40, 0, totalsize); + + totalsize--; + bmh->itemCountChanged(0, true, totalsize); + bm->itemCountChanged(0, true, totalsize); + QVERIFY(bmh->isIntergal(bufferSize)); + + totalsize--; + bmh->itemCountChanged(150, true, totalsize); + bm->itemCountChanged(150, true, totalsize); + QVERIFY(bmh->isIntergal(bufferSize)); + + totalsize--; + bm->setPosition(100); + bmh->itemCountChanged(150, true, totalsize); + bm->itemCountChanged(150, true, totalsize); + QVERIFY(bmh->isIntergal(bufferSize)); + + totalsize--; + bm->setPosition(891); + bmh->itemCountChanged(150, true, totalsize); + bm->itemCountChanged(150, true, totalsize); + QVERIFY(bmh->isIntergal(bufferSize)); + + totalsize--; + bm->setPosition(900); + bmh->itemCountChanged(890, true, totalsize); + bm->itemCountChanged(890, true, totalsize); + QVERIFY(bmh->isIntergal(bufferSize)); + + totalsize--; + bm->setPosition(totalsize); + bmh->itemCountChanged(totalsize, true, totalsize); + bm->itemCountChanged(totalsize, true, totalsize); + QVERIFY(bmh->isIntergal(bufferSize)); + + totalsize--; + bm->setPosition(totalsize+200); + bmh->itemCountChanged(totalsize+200, true, totalsize); + bm->itemCountChanged(totalsize+200, true, totalsize); + QVERIFY(bmh->isIntergal(bufferSize)); + + + totalsize= totalsize - 10; + bm->setPosition(0); + bmh->itemCountChanged(0, true, totalsize); + bm->itemCountChanged(0, true, totalsize); + QVERIFY(bmh->isIntergal(bufferSize)); + + totalsize= totalsize - 10; + bm->setPosition(totalsize); + bmh->itemCountChanged(totalsize, true, totalsize); + bm->itemCountChanged(totalsize, true, totalsize); + QVERIFY(bmh->isIntergal(bufferSize)); + + totalsize= totalsize - 10; + bm->setPosition(totalsize/2); + bmh->itemCountChanged(totalsize/2, true, totalsize); + bm->itemCountChanged(totalsize/2, true, totalsize); + QVERIFY(bmh->isIntergal(bufferSize)); + + totalsize++; + bm->setPosition(0); + bmh->itemCountChanged(0, false, totalsize); + bm->itemCountChanged(0, false, totalsize); + QVERIFY(bmh->isIntergal(bufferSize)); + + totalsize++; + bmh->itemCountChanged(50, false, totalsize); + bm->itemCountChanged(50, false, totalsize); + QVERIFY(bmh->isIntergal(bufferSize)); + + totalsize++; + bm->setPosition(100); + bmh->itemCountChanged(80, false, totalsize); + bm->itemCountChanged(80, false, totalsize); + QVERIFY(bmh->isIntergal(bufferSize)); + + totalsize++; + bm->setPosition(500); + bmh->itemCountChanged(480, false, totalsize); + bm->itemCountChanged(480, false, totalsize); + QVERIFY(bmh->isIntergal(bufferSize)); + + totalsize++; + bm->setPosition(totalsize-20); + bmh->itemCountChanged(totalsize, false, totalsize); + bm->itemCountChanged(totalsize, false, totalsize); + QVERIFY(bmh->isIntergal(bufferSize)); + + totalsize=totalsize+10; + bm->setPosition(totalsize-20); + bmh->itemCountChanged(totalsize, false, totalsize); + bm->itemCountChanged(totalsize, false, totalsize); + QVERIFY(bmh->isIntergal(bufferSize)); + + totalsize=totalsize+10; + bm->setPosition(20); + bmh->itemCountChanged(totalsize, false, totalsize); + bm->itemCountChanged(totalsize, false, totalsize); + QVERIFY(bmh->isIntergal(bufferSize)); + + totalsize=totalsize+10; + bm->setPosition(totalsize/2-20); + bmh->itemCountChanged(totalsize, false, totalsize); + bm->itemCountChanged(totalsize, false, totalsize); + QVERIFY(bmh->isIntergal(bufferSize)); +} + +void TestCacheProxy::testBM_ResizeCache() +{ + int totalsize = 1000; + int bufferSize = 100; + bmh = new BMHelper(totalsize); + bm = new HgBufferManager(bmh, bufferSize, 40, 0, totalsize); + + bm->resizeCache(100, 40); + QVERIFY(bmh->isIntergal(bufferSize)); + + bufferSize = 50; + bm->resizeCache(bufferSize, 40); + QVERIFY(bmh->isIntergal(bufferSize)); + + bufferSize = 150; + bm->resizeCache(bufferSize, 50); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(30); + bm->resizeCache(bufferSize, 30); + QVERIFY(bmh->isIntergal(bufferSize)); + + bufferSize = 50; + bm->resizeCache(bufferSize, 40); + QVERIFY(bmh->isIntergal(bufferSize)); + + bufferSize = 150; + bm->resizeCache(bufferSize, 40); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(500); + bm->resizeCache(bufferSize, 40); + QVERIFY(bmh->isIntergal(bufferSize)); + + bufferSize = 50; + bm->resizeCache(bufferSize, 40); + QVERIFY(bmh->isIntergal(bufferSize)); + + bufferSize = 151; + bm->resizeCache(bufferSize, 40); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(totalsize-20); + bm->resizeCache(bufferSize, 40); + QVERIFY(bmh->isIntergal(bufferSize)); + + bufferSize = 53; + bm->resizeCache(bufferSize, 40); + QVERIFY(bmh->isIntergal(bufferSize)); + + bufferSize = 150; + bm->resizeCache(bufferSize, 40); + QVERIFY(bmh->isIntergal(bufferSize)); + + bm->setPosition(totalsize); + bm->resizeCache(bufferSize, 40); + QVERIFY(bmh->isIntergal(bufferSize)); + + bufferSize = 50; + bm->resizeCache(bufferSize, 40); + QVERIFY(bmh->isIntergal(bufferSize)); + + bufferSize = 175; + bm->resizeCache(bufferSize, 40); + QVERIFY(bmh->isIntergal(bufferSize)); +} + +//DataProvider +void TestCacheProxy::testDP_QAbstractItemModel() +{ + dph = new DataProviderHelper(); + delete dph; + dph = new DataProviderHelper(200); + testQAbstractItemModel(dph, 200, 1); +} + +void TestCacheProxy::testDP_RequestReleaseAndData() +{ + dph = new DataProviderHelper(); + QModelIndex idx = dph->index(0,0); + QVariant res = dph->data(idx, Qt::DisplayRole); + QVERIFY(res.isValid() == true); + QString s = res.toString(); + QVERIFY(s.isNull() == false); + + res = dph->data(idx, Qt::UserRole+1); //int value (not less then 0) + QVERIFY(res.isValid() == true); + QVERIFY(res.toInt() >= 0); + + res = dph->data(idx, Qt::UserRole+100); //should be empty + QVERIFY(res.isValid() == false); + + res = dph->data(idx, Qt::DecorationRole); //should give defaultIcon(); + QVERIFY(res.isValid() == true); + s = res.toString(); + QVERIFY(s.isNull() == false); + QVERIFY(res == dph->defaultIcon()); + + idx = dph->index(-10, 0); + res = dph->data(idx, Qt::DisplayRole); + QVERIFY(res.isValid() == false); + + idx = dph->index(1000000, 0); + res = dph->data(idx, Qt::DisplayRole); + QVERIFY(res.isValid() == false); + + QList list; + list<<-1; + list<<0; + list<<1; + list<<2; + list<<1000000; + dph->registerObserver(dph); + dph->request(list); + QList< QPair< int, int > > updates = dph->getObserverDataUpdated(); + QVERIFY(updates.count() == 3); //3 updates - for 0 1 and 2 + QVERIFY(updates[0].first == 0); //for 0 + QVERIFY(updates[0].second == 0); //for 0 + QVERIFY(updates[1].first == 1); //for 1 + QVERIFY(updates[1].second == 1); //for 1 + QVERIFY(updates[2].first == 2); //for 2 + QVERIFY(updates[2].second == 2); //for 2 + + idx = dph->index(0,0); + res = dph->data(idx, Qt::DecorationRole); + QVERIFY(res.isValid() == true); + s = res.toString(); + QVERIFY(s.isNull() == false); + s = QString("MyNiceIcon %1").arg(0); + QVERIFY(res.toString() == s); + + idx = dph->index(1,0); + res = dph->data(idx, Qt::DecorationRole); + QVERIFY(res.isValid() == true); + s = res.toString(); + QVERIFY(s.isNull() == false); + s = QString("MyNiceIcon 1"); + QVERIFY(res.toString() == s); + + idx = dph->index(2,0); + res = dph->data(idx, Qt::DecorationRole); + QVERIFY(res.isValid() == true); + s = res.toString(); + QVERIFY(s.isNull() == false); + s = QString("MyNiceIcon 2"); + QVERIFY(res.toString() == s); + + idx = dph->index(3,0); + res = dph->data(idx, Qt::DecorationRole); + QVERIFY(res.isValid() == true); + s = res.toString(); + QVERIFY(s.isNull() == false); + s = QString("MyNiceIcon 3"); + QVERIFY(res.toString() != s); + QVERIFY(res == dph->defaultIcon()); + + dph->release(list, false); + updates = dph->getObserverDataUpdated(); + QVERIFY(updates.count() == 0); //0 updates - updates from emit not observer + updates = dph->getSignalDataUpdated(); + QVERIFY(updates.count() == 1); //1 update for all items + QVERIFY(updates[0].first == 0); //for 0 + QVERIFY(updates[0].second == 2); //for 0 + + idx = dph->index(0, 0); + res = dph->data(idx, Qt::DecorationRole); + QVERIFY(res == dph->defaultIcon()); + + idx = dph->index(1, 0); + res = dph->data(idx, Qt::DecorationRole); + QVERIFY(res == dph->defaultIcon()); + + idx = dph->index(2, 0); + res = dph->data(idx, Qt::DecorationRole); + QVERIFY(res == dph->defaultIcon()); + + idx = dph->index(3, 0); + res = dph->data(idx, Qt::DecorationRole); + QVERIFY(res == dph->defaultIcon()); + dph->registerObserver(NULL); + dph->request(list); + updates = dph->getObserverDataUpdated(); + QVERIFY(updates.count() == 0); //0 updates - no observer + dph->getSignalDataUpdated(); + dph->release(list, false); + updates = dph->getObserverDataUpdated(); + QVERIFY(updates.count() == 0); //0 updates - no observer +} + +void TestCacheProxy::testDP_CacheManagment() +{ + dph = new DataProviderHelper(100); + //signals status reset + dph->getObserverDataUpdated(); + dph->getSignalDataUpdated(); + dph->getSignalRowsAboutToBeInserted(); + dph->getSignalRowsInserted(); + dph->getSignalRowsAboutToBeRemoved(); + dph->getSignalRowsRemoved(); + dph->getSignalAboutToBeReset(); + dph->getSignalReset(); + + int size = dph->rowCount(); + QModelIndex idx; + QVariant res; + for ( int i=0; iindex(i,0); + res = dph->data(idx, Qt::UserRole+1); + QVERIFY(res.isValid() == true); + QVERIFY(res.toInt() == i); + } + idx = dph->index(0,0); + dph->testClearCache(); + res = dph->data(idx, Qt::DisplayRole); + QVERIFY(res.isValid() == false); + + QList< QPair< QVariant, int > > list; + QString s = "NEWITEM"; + list.append( QPair< QVariant, int >(s, Qt::DisplayRole) ); + + dph->testUpdate(0, &list, false); //update shouldn't change - no item + dph->testUpdate(-1, &list, true); //update shouldn't change - no item + dph->testUpdate(120000, &list, false); //update shouldn't change - no item + res = dph->data(idx, Qt::DisplayRole); + QVERIFY(res.isValid() == false); + QVERIFY(dph->getObserverDataUpdated().count() == 0); + + dph->testNewItem(&list, false); + QList< QPair< int, int > > resList = dph->getSignalRowsAboutToBeInserted(); + QVERIFY(resList.count() == 1); + QVERIFY(resList[0].first == 0); //for item 0 + QVERIFY(resList[0].second == 0); //for item 0 + resList = dph->getSignalRowsInserted(); + QVERIFY(resList.count() == 1); + QVERIFY(resList[0].first == 0); //for item 0 + QVERIFY(resList[0].second == 0); //for item 0 + + QVERIFY(dph->rowCount() == 1); + + idx = dph->index(0,0); + res = dph->data(idx, Qt::DisplayRole); + QVERIFY(res.isValid() == true); + QVERIFY(res == s); + dph->testNewItem(&list, true); + QVERIFY(dph->getSignalRowsAboutToBeInserted().count() == 0);//no updates it was suuposed to be silent + QVERIFY(dph->getSignalRowsInserted().count() == 0);//no updates it was suuposed to be silent + QVERIFY(dph->rowCount() == 2); + + dph->testNewItem(&list, false); + dph->testNewItem(&list, false); + resList = dph->getSignalRowsInserted(); + QVERIFY(resList.count() == 2); + QVERIFY(resList[0].first == 2); //for item 2 + QVERIFY(resList[0].second == 2); //for item 2 + QVERIFY(resList[1].first == 3); //for item 3 + QVERIFY(resList[1].second == 3); //for item 3 + + list.clear(); + QString s2 = "NEWITEM2"; + list.append( QPair< QVariant, int >(s2, Qt::DisplayRole) ); + dph->testUpdate(0, &list, false); + resList = dph->getSignalDataUpdated(); + QVERIFY(resList.count() == 1); + QVERIFY(resList[0].first == 0); + QVERIFY(resList[0].second == 0); + res = dph->data(idx, Qt::DisplayRole); + QVERIFY(res.isValid() == true); + QVERIFY(res == s2); + + dph->testRemoveItems(0, 1);//should remove item + resList = dph->getSignalRowsAboutToBeRemoved(); + QVERIFY(resList.count() == 1); + QVERIFY(resList[0].first == 0); + QVERIFY(resList[0].second == 0); + resList = dph->getSignalRowsRemoved(); + QVERIFY(resList.count() == 1); + QVERIFY(resList[0].first == 0); + QVERIFY(resList[0].second == 0); + + QVERIFY(dph->rowCount() == 3); + dph->testRemoveItems(-2, 10);//should remove remaining items (0,1, 2) + resList = dph->getSignalRowsAboutToBeRemoved(); + QVERIFY(resList.count() == 1); + QVERIFY(resList[0].first == 0); + QVERIFY(resList[0].second == 2); + + QVERIFY(dph->rowCount() == 0); + idx = dph->index(0,0); + res = dph->data(idx, Qt::DisplayRole); //invalid variant, for not existing item + QVERIFY(res.isValid() == false); + + QVERIFY(dph->getSignalAboutToBeReset() == false); + QVERIFY(dph->getSignalReset() == false); + dph->resetModel(); + QVERIFY(dph->getSignalAboutToBeReset() == true); + QVERIFY(dph->getSignalReset() == true); + QVERIFY(dph->columnCount() == 1); + QVERIFY(dph->rowCount() == 1000); + idx = dph->index(0,0); + res = dph->data(idx, Qt::DisplayRole); + QVERIFY(res.isValid() == true); + QVERIFY(res.toString().startsWith(QString("NEW ITEM")) == true); + + dph->testRemoveItems(0, 100);//should remove items 0 - 99 + QVERIFY(dph->rowCount() == 900); + idx = dph->index(0,0); + res = dph->data(idx, Qt::UserRole+1); + QVERIFY(res.isValid() == true); + QVERIFY(res.toInt() == 100); + + dph->testUpdate(0, QString(""), Qt::DisplayRole, false); + idx = dph->index(0,0); + res = dph->data(idx, Qt::DisplayRole); + QVERIFY(res.isValid() == true); + QVERIFY(res.toString() == QString("")); + + resList = dph->getSignalDataUpdated(); + QVERIFY(resList.count() == 1); + QVERIFY(resList[0].first == 0); + QVERIFY(resList[0].second == 0); + + dph->testNewItem( QPair< QVariant, int >(QString(""), Qt::DisplayRole), false); + resList = dph->getSignalRowsInserted(); + QVERIFY(resList.count() == 1); + QVERIFY(resList[0].first == dph->rowCount()-1); + QVERIFY(resList[0].second == dph->rowCount()-1); + + dph->getSignalRowsInserted(); + dph->getSignalRowsRemoved(); + dph->testInsertItem(100, QPair< QVariant, int >(QString(""), Qt::DisplayRole), false); + resList = dph->getSignalRowsInserted(); + QVERIFY(resList.count() == 1); + QVERIFY(resList[0].first == 100); + QVERIFY(resList[0].second == 100); + dph->testRemoveItem(100); + resList = dph->getSignalRowsRemoved(); + QVERIFY(resList.count() == 1); + QVERIFY(resList[0].first == 100); + QVERIFY(resList[0].second == 100); + + dph->getSignalRowsInserted(); + dph->getSignalRowsRemoved(); + dph->testInsertItem(-10, QPair< QVariant, int >(QString(""), Qt::DisplayRole), false); //insert with -10 puts it at begining + resList = dph->getSignalRowsInserted(); + QVERIFY(resList.count() == 1); + QVERIFY(resList[0].first == 0); + QVERIFY(resList[0].second == 0); + dph->testRemoveItem(-10); + resList = dph->getSignalRowsRemoved(); + QVERIFY(resList.count() == 0); + + dph->getSignalRowsInserted(); + dph->getSignalRowsRemoved(); + dph->testInsertItem(100000, QPair< QVariant, int >(QString(""), Qt::DisplayRole), false); //insert with beyond range puts it at end + resList = dph->getSignalRowsInserted(); + QVERIFY(resList.count() == 1); + QVERIFY(resList[0].first == dph->rowCount()-1); + QVERIFY(resList[0].second == dph->rowCount()-1); + dph->testRemoveItem(100000); + resList = dph->getSignalRowsRemoved(); + QVERIFY(resList.count() == 0); + + idx = dph->index(579,0); + QMap it = dph->itemData(idx); + QCOMPARE(it.size(), 4); + QCOMPARE(it.contains(Qt::DisplayRole), true); + QVariant r2 = it[Qt::DisplayRole]; + QCOMPARE(r2.isValid(), true); + res = dph->data(idx, Qt::DisplayRole); + QCOMPARE(res.isValid(), true); + QCOMPARE(res.toString(), r2.toString()); + +} + +void TestCacheProxy::testDP_QPixmapPool() +{ + dph = new DataProviderHelper(100); + QPixmap pix; + QVariant res = dph->testCreateIcon(0, pix); + QVERIFY(res.isValid() == false); + + dph->resizeQPixmapPool(10); + + res = dph->testCreateIcon(0, pix); + QVERIFY(res.isValid() == true); + QVERIFY(res != dph->defaultIcon()); + + QVariant res2 = dph->testCreateIcon(0, pix); + QVERIFY(res2.isValid() == true); + QVERIFY(res != dph->defaultIcon()); + + dph->testCreateIcon(0, pix); + dph->testCreateIcon(1, pix); + dph->testCreateIcon(2, pix); + dph->testCreateIcon(3, pix); + dph->testCreateIcon(4, pix); + + dph->testReleasePixmap(-10); + dph->testReleasePixmap(4); + dph->testReleasePixmap(5); + dph->testReleasePixmap(200); + dph->resizeQPixmapPool(20); + dph->resizeQPixmapPool(5); + dph->testReleasePixmap(100); + dph->resizeQPixmapPool(100); + dph->resizeQPixmapPool(2); + dph->testReleasePixmap(1); + dph->testReleasePixmap(2); + dph->testReleasePixmap(3); + dph->testReleasePixmap(4); + dph->testCreateIcon(1, pix); + dph->testCreateIcon(2, pix); + dph->testCreateIcon(3, pix); + dph->testCreateIcon(4, pix); + dph->testCreateIcon(6, pix); + dph->resizeQPixmapPool(1); + res = dph->testCreateIcon(10, pix); + QVERIFY(res.isValid() == false); +} + +void TestCacheProxy::testCP_QAbstractItemModel() +{ + cp = new HgCacheProxyModel(); + dph = new DataProviderHelper(200); + testQAbstractItemModel(cp, 0, 0); + + cp->setDataProvider(dph); + QVERIFY(cp->DataProvider() == dph); + testQAbstractItemModel(cp, 200, 1); + cp->setDataProvider(0); + QVERIFY(cp->DataProvider() == 0); +} + +void TestCacheProxy::testCP_SignalsForward() +{ + cp = new HgCacheProxyModel(); + cph = new CacheProxyHelper(cp); + dph = new DataProviderHelper(200); + cp->setDataProvider(dph, 50, 20); + + QList< QPair< int, int > > resList = cph->getSignalDataChanged(); + QVERIFY(resList.count() == 50); + QVERIFY(resList[0].first == 0); + QVERIFY(resList[0].second == 0); + QVERIFY(resList[49].first == 49); + QVERIFY(resList[49].second == 49); + + QList< QPair< QVariant, int > > list; + QString s = "NEWITEM"; + list.append( QPair< QVariant, int >(s, Qt::DisplayRole) ); + + dph->testNewItem(&list, false); + resList = cph->getSignalRowsAboutToBeInserted(); + QVERIFY(resList.count() == 1); + QVERIFY(resList[0].first == dph->rowCount()-1); + QVERIFY(resList[0].second == dph->rowCount()-1); + resList = cph->getSignalRowsInserted(); + QVERIFY(resList.count() == 1); + QVERIFY(resList[0].first == dph->rowCount()-1); + QVERIFY(resList[0].second == dph->rowCount()-1); + + dph->testRemoveItems(0, 1);//should remove item + resList = cph->getSignalRowsAboutToBeRemoved(); + QVERIFY(resList.count() == 1); + QVERIFY(resList[0].first == 0); + QVERIFY(resList[0].second == 0); + resList = cph->getSignalRowsRemoved(); + QVERIFY(resList.count() == 1); + QVERIFY(resList[0].first == 0); + QVERIFY(resList[0].second == 0); + + cph->getSignalModelAboutToBeReset(); + cph->getSignalModelReset(); + dph->resetModel(); + QVERIFY(cph->getSignalModelAboutToBeReset() == true); + QVERIFY(cph->getSignalModelReset() == true); + QVERIFY(cp->columnCount() == 1); + QVERIFY(cp->rowCount() == 1000); + +} + +void TestCacheProxy::testCP_ResizeCache() +{ + cp = new HgCacheProxyModel(); + cph = new CacheProxyHelper(cp); + dph = new DataProviderHelper(200); + cp->setDataProvider(dph, 50, 20); + dph->getLastRelease(); + dph->getLastRequest(); + cp->resizeCache(20, 5); + + QList l = dph->getLastRelease(); + QVERIFY(l.count() > 0); + l = dph->getLastRequest(); + QVERIFY(l.count() == 0); + + dph->getLastRelease(); + dph->getLastRequest(); + cp->resizeCache(100, 5); + dph->getLastRelease(); + QVERIFY(l.count() == 0); + l = dph->getLastRequest(); + QVERIFY(l.count() > 0); +} + +void TestCacheProxy::testCP_Data() +{ + cp = new HgCacheProxyModel(); + cph = new CacheProxyHelper(cp); + dph = new DataProviderHelper(200); + cp->setDataProvider(dph, 50, 20); + dph->getLastRelease(); + dph->getLastRequest(); + + QModelIndex idx = cp->index(0, 0); + QVariant res = cp->data(idx, Qt::UserRole+1); + QCOMPARE(res.isValid(), true); + QCOMPARE(res.toInt(), 0); + + idx = cp->index(100, 0); + res = cp->data(idx, Qt::UserRole+1); + QCOMPARE(res.isValid(), true); + QCOMPARE(res.toInt(), 100); + + idx = cp->index(101, 0); + res = cp->data(idx, Qt::UserRole+1); + QCOMPARE(res.isValid(), true); + QCOMPARE(res.toInt(), 101); + + idx = cp->index(50, 0); + res = cp->data(idx, Qt::UserRole+1); + QCOMPARE(res.isValid(), true); + QCOMPARE(res.toInt(), 50); + + idx = cp->index(40, 0); + res = cp->data(idx, Qt::UserRole+1); + QCOMPARE(res.isValid(), true); + QCOMPARE(res.toInt(), 40); + + idx = cp->index(35, 0); + res = cp->data(idx, Qt::UserRole+1); + QCOMPARE(res.isValid(), true); + QCOMPARE(res.toInt(), 35); + + idx = cp->index(25, 0); + res = cp->data(idx, Qt::UserRole+1); + QCOMPARE(res.isValid(), true); + QCOMPARE(res.toInt(), 25); + + int v = 234234; + res = QVariant(v); + idx = cp->index(0, 0); + cp->setData(idx, res, Qt::UserRole+1); + res = cp->data(idx, Qt::UserRole+1); + QCOMPARE(res.isValid(), true); + QCOMPARE(res.toInt(), v); + + QMap map = cp->itemData(idx); + QCOMPARE(map.size(), 5); + map[v]=v; + cp->setItemData(idx, map); + res = cp->data(idx, v); + QCOMPARE(res.isValid(), true); + QCOMPARE(res.toInt(), v); + + +} + +void TestCacheProxy::testCP_Sort() +{ + cp = new HgCacheProxyModel(); + cph = new CacheProxyHelper(cp); + dph = new DataProviderHelper(200); + cp->setDataProvider(dph, 50, 20); + + cp->setSortRole(Qt::UserRole+2); + QCOMPARE(cp->sortRole(), Qt::UserRole+2); + cp->sort(0, Qt::AscendingOrder); + QCOMPARE(cp->sortColumn(), 0); + QCOMPARE(cp->sortOrder(), Qt::AscendingOrder); + + QModelIndex idx = cp->index(10, 0); + QVariant res = cp->data(idx, Qt::UserRole+2); + QCOMPARE(res.isValid(), true); + QCOMPARE(res.toInt(), -(cp->rowCount(idx) -1 -10)); + res = cp->data(idx, Qt::UserRole+1); + QCOMPARE(res.isValid(), true); + QCOMPARE(res.toInt(), cp->rowCount(idx) -1 -10); + + idx = cp->index(50, 0); + res = cp->data(idx, Qt::UserRole+2); + QCOMPARE(res.isValid(), true); + QCOMPARE(res.toInt(), -(cp->rowCount(idx) -1 -50)); + res = cp->data(idx, Qt::UserRole+1); + QCOMPARE(res.isValid(), true); + QCOMPARE(res.toInt(), cp->rowCount(idx) -1 -50); + + cp->setSortRole(Qt::DisplayRole); + cp->setSortCaseSensitivity(Qt::CaseSensitive); + QCOMPARE(cp->sortCaseSensitivity(), Qt::CaseSensitive); + cp->sort(0, Qt::AscendingOrder); + + idx = cp->index(10, 0); + res = cp->data(idx, Qt::UserRole+1); + QCOMPARE(res.isValid(), true); + QCOMPARE(res.toInt()%2, 0); + + idx = cp->index(110, 0); + res = cp->data(idx, Qt::UserRole+1); + QCOMPARE(res.isValid(), true); +// qWarning("i=%d",res.toInt()); + QCOMPARE(res.toInt()%2, 1); + + cp->setSortLocaleAware(true); + QCOMPARE(cp->isSortLocaleAware(), true); + cp->setSortLocaleAware(false); + QCOMPARE(cp->isSortLocaleAware(), false); + + QString s = QString("AAA"); + cp->setDynamicSortFilter(true); + QCOMPARE(cp->dynamicSortFilter(), true); + cp->setSortRole(Qt::DisplayRole); + cp->setSortCaseSensitivity(Qt::CaseSensitive); + dph->testInsertItem(10, QPair< QVariant, int >(s, Qt::DisplayRole), false); + idx = cp->index(0, 0); + res = cp->data(idx, Qt::DisplayRole); + QCOMPARE(res.isValid(), true); +// qWarning()<setDataProvider(dph, 50, 20); +// +// QModelIndex idx = cp->index(1, 0); +// QVariant res = cp->data(idx, Qt::DisplayRole); +// QCOMPARE(res.isValid(), true); +// QCOMPARE(res.toString().startsWith("item"), true); +// +// QRegExp regexp = QRegExp("ITEM*", Qt::CaseSensitive, QRegExp::Wildcard); +// +// cp->setFilterRegExp(regexp); +// QVERIFY(cp->filterRegExp() == regexp); +// cp->setFilterCaseSensitivity(Qt::CaseSensitive); +// QCOMPARE(cp->filterCaseSensitivity(), Qt::CaseSensitive); +// +// idx = cp->index(1, 0); +// res = cp->data(idx, Qt::DisplayRole); +// QCOMPARE(res.isValid(), true); +// QCOMPARE(res.toString().startsWith("item"), false); +// +// cp->setFilterKeyColumn(1); +// QCOMPARE(cp->filterKeyColumn (), 1); +// cp->setFilterKeyColumn(0); +// +// cp->setFilterRole(Qt::UserRole+1); +// QCOMPARE(cp->filterRole(), Qt::UserRole+1); +// cp->setFilterRole(Qt::DisplayRole); +// +// regexp = QRegExp("ITEM*", Qt::CaseInsensitive, QRegExp::Wildcard); +// cp->setFilterRegExp(regexp); +// QVERIFY(cp->filterRegExp() == regexp); +// cp->setFilterCaseSensitivity(Qt::CaseInsensitive); +// QCOMPARE(cp->filterCaseSensitivity(), Qt::CaseInsensitive); +// +// idx = cp->index(1, 0); +// res = cp->data(idx, Qt::DisplayRole); +// QCOMPARE(res.isValid(), true); +// QCOMPARE(res.toString().startsWith("item"), true); +// +//} + + +#ifdef _CACHEPROXYDATAMODEL_UNITTEST_LOG_TO_C + int main (int argc, char* argv[]) + { + QApplication app(argc, argv); + TestCacheProxy tc; + int c = 3; + char* v[] = {argv[0], "-o", "c:/test.txt"}; + return QTest::qExec(&tc, c, v); + } +#else + QTEST_MAIN(TestCacheProxy) +#endif diff -r 89c329efa980 -r e48454f237ca hgcacheproxymodel/tsrc/unit/test_hgcacheproxydatamodel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgcacheproxymodel/tsrc/unit/test_hgcacheproxydatamodel.h Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,75 @@ +/* +* 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: +* +* Version : %version: 3 % +*/ +#ifndef TestCacheProxy_H +#define TestCacheProxy_H + +#include + +class QAbstractItemModel; + +class BMHelper; +class HgBufferManager; +class DataProviderHelper; +class HgCacheProxyModel; +class CacheProxyHelper; + +class TestCacheProxy: public QObject +{ + Q_OBJECT + +public: + TestCacheProxy(): QObject() {}; + +private: + void testQAbstractItemModel(QAbstractItemModel* model, int rows, int columns); + +private slots: + void initTestCase();//before first + void init();//before each + void cleanup();//after each + void cleanupTestCase(); //after last + + //HgBufferManager + void testBM_SetPosition(); + void testBM_ResetBuffer(); + void testBM_ItemCountChanged(); + void testBM_ResizeCache(); + + //HgDataProviderModel + void testDP_QAbstractItemModel(); + void testDP_RequestReleaseAndData(); + void testDP_CacheManagment(); + void testDP_QPixmapPool(); + + //HgCacheProxyModel + void testCP_QAbstractItemModel(); + void testCP_SignalsForward(); + void testCP_ResizeCache(); + void testCP_Data(); + void testCP_Sort(); +// void testCP_Filter(); + +private: + BMHelper* bmh; + HgBufferManager* bm; + DataProviderHelper* dph; + HgCacheProxyModel* cp; + CacheProxyHelper* cph; + +}; +#endif // TestCacheProxy_H diff -r 89c329efa980 -r e48454f237ca hgcacheproxymodel/tsrc/unit/unittest_hgcacheproxymodel.pro --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgcacheproxymodel/tsrc/unit/unittest_hgcacheproxymodel.pro Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,47 @@ +# 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: + +TEMPLATE = app +TARGET = unittest_hgcacheproxymodel + +#fix that later +#CONFIG += symbian_test + +INCLUDEPATH += . \ + $$APP_LAYER_SYSTEMINCLUDE \ + $$MW_LAYER_SYSTEMINCLUDE \ + ../../inc + +TARGET.CAPABILITY = ALL -TCB + +DEFINES += _CACHEPROXYDATAMODEL_UNITTEST_LOG_TO_C + +# Input +LIBS += -lhgcacheproxymodel \ + -lthumbnailmanagerqt + +SOURCES += test_hgcacheproxydatamodel.cpp \ + bmhelper.cpp \ + ../../src/hgbuffermanager.cpp \ + dataproviderhelper.cpp \ + cacheproxyhelper.cpp \ +# simpledataprovider.cpp\ + +HEADERS += test_hgcacheproxydatamodel.h \ + bmhelper.h \ + ../../inc/hgbuffermanager.h \ + dataproviderhelper.h \ + cacheproxyhelper.h \ +# simpledataprovider.h\ + +CONFIG += qtestlib console + +#RESOURCES += unittest_hgcacheproxymodel.qrc \ No newline at end of file diff -r 89c329efa980 -r e48454f237ca hgcacheproxymodel/tsrc/unit/unittest_hgcacheproxymodel.qrc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgcacheproxymodel/tsrc/unit/unittest_hgcacheproxymodel.qrc Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,5 @@ + + + cacheproxydatamodel_tsrc.png + + diff -r 89c329efa980 -r e48454f237ca hgwidgets.pro --- a/hgwidgets.pro Mon Apr 19 14:40:06 2010 +0300 +++ b/hgwidgets.pro Mon May 03 13:32:54 2010 +0300 @@ -23,3 +23,4 @@ SUBDIRS += hgwidgets_plat/hgwidgets_plat.pro SUBDIRS += ganeswidgets/ganeswidgets.pro +SUBDIRS += hgcacheproxymodel/hgcacheproxymodel.pro diff -r 89c329efa980 -r e48454f237ca hgwidgets_plat/ganeswidgets_api/ganeswidgets_api.pri --- a/hgwidgets_plat/ganeswidgets_api/ganeswidgets_api.pri Mon Apr 19 14:40:06 2010 +0300 +++ b/hgwidgets_plat/ganeswidgets_api/ganeswidgets_api.pri Mon May 03 13:32:54 2010 +0300 @@ -1,18 +1,13 @@ -# # 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: -# PUBLIC_HEADERS += ganeswidgets_api/inc/hgwidgets.h \ ganeswidgets_api/inc/hggrid.h \ diff -r 89c329efa980 -r e48454f237ca hgwidgets_plat/ganeswidgets_api/inc/hggrid.h --- a/hgwidgets_plat/ganeswidgets_api/inc/hggrid.h Mon Apr 19 14:40:06 2010 +0300 +++ b/hgwidgets_plat/ganeswidgets_api/inc/hggrid.h Mon May 03 13:32:54 2010 +0300 @@ -27,11 +27,14 @@ Q_OBJECT public: - HgGrid(Qt::Orientation scrollDirection, QGraphicsItem *parent = 0 ); + explicit HgGrid(Qt::Orientation scrollDirection, QGraphicsItem *parent = 0 ); virtual ~HgGrid(); +protected: + HgGrid(Qt::Orientation scrollDirection, HgGridPrivate &dd, QGraphicsItem *parent); + private: - Q_DECLARE_PRIVATE_D(d_ptr, HgGrid) + Q_DECLARE_PRIVATE_D(p_ptr, HgGrid) Q_DISABLE_COPY(HgGrid) }; diff -r 89c329efa980 -r e48454f237ca hgwidgets_plat/ganeswidgets_api/inc/hgmediawall.h --- a/hgwidgets_plat/ganeswidgets_api/inc/hgmediawall.h Mon Apr 19 14:40:06 2010 +0300 +++ b/hgwidgets_plat/ganeswidgets_api/inc/hgmediawall.h Mon May 03 13:32:54 2010 +0300 @@ -29,11 +29,13 @@ Q_PROPERTY(LabelPosition descriptionPosition READ descriptionPosition WRITE setDescriptionPosition) Q_PROPERTY(HbFontSpec titleFontSpec READ titleFontSpec WRITE setTitleFontSpec) Q_PROPERTY(HbFontSpec descriptionFontSpec READ descriptionFontSpec WRITE setDescriptionFontSpec) + Q_PROPERTY(QPointF frontItemPositionDelta READ frontItemPositionDelta WRITE setFrontItemPositionDelta) + Q_PROPERTY(bool reflectionsEnabled READ reflectionsEnabled WRITE enableReflections) Q_ENUMS(LabelPosition) public: - HgMediawall(QGraphicsItem *parent = 0 ); + explicit HgMediawall(QGraphicsItem *parent = 0 ); virtual ~HgMediawall(); enum LabelPosition { @@ -51,8 +53,17 @@ void setDescriptionFontSpec(const HbFontSpec &fontSpec); HbFontSpec descriptionFontSpec() const; + void setFrontItemPositionDelta(const QPointF& position); + QPointF frontItemPositionDelta() const; + + void enableReflections(bool enabled); + bool reflectionsEnabled() const; + +protected: + HgMediawall(HgMediawallPrivate &dd, QGraphicsItem *parent); + private: - Q_DECLARE_PRIVATE_D(d_ptr, HgMediawall) + Q_DECLARE_PRIVATE_D(p_ptr, HgMediawall) Q_DISABLE_COPY(HgMediawall) }; diff -r 89c329efa980 -r e48454f237ca hgwidgets_plat/ganeswidgets_api/inc/hgwidgets.h --- a/hgwidgets_plat/ganeswidgets_api/inc/hgwidgets.h Mon Apr 19 14:40:06 2010 +0300 +++ b/hgwidgets_plat/ganeswidgets_api/inc/hgwidgets.h Mon May 03 13:32:54 2010 +0300 @@ -41,10 +41,14 @@ Q_PROPERTY(ScrollBarPolicy scrollBarPolicy READ scrollBarPolicy WRITE setScrollBarPolicy) Q_PROPERTY(SelectionMode selectionMode READ selectionMode WRITE setSelectionMode) Q_PROPERTY(IndexFeedbackPolicy IndexFeedbackPolicy READ indexFeedbackPolicy WRITE setIndexFeedbackPolicy) + Q_PROPERTY(ItemSizePolicy ItemSizePolicy READ itemSizePolicy WRITE setItemSizePolicy) + Q_PROPERTY(QSizeF itemSize READ itemSize WRITE setItemSize) + Q_PROPERTY(QSizeF itemSpacing READ itemSpacing WRITE setItemSpacing) Q_ENUMS(ScrollBarPolicy) Q_ENUMS(HgWidgetType) Q_ENUMS(SelectionMode) Q_ENUMS(IndexFeedbackPolicy) + Q_ENUMS(ItemSizePolicy) public: enum HgDataRole @@ -59,14 +63,20 @@ IndexFeedbackString }; - virtual ~HgWidget (); - enum ScrollBarPolicy { ScrollBarAsNeeded = Qt::ScrollBarAsNeeded, ScrollBarAlwaysOff = Qt::ScrollBarAlwaysOff, ScrollBarAlwaysOn = Qt::ScrollBarAlwaysOn, ScrollBarAutoHide }; + + enum ItemSizePolicy { + ItemSizeAutomatic, + ItemSizeUserDefined + }; + + explicit HgWidget (QGraphicsItem *parent = 0); + virtual ~HgWidget (); virtual void setModel(QAbstractItemModel *model); QAbstractItemModel *model() const; @@ -108,6 +118,17 @@ void setIndexFeedbackPolicy( IndexFeedbackPolicy policy); IndexFeedbackPolicy indexFeedbackPolicy() const; + void setDefaultImage(QImage defaultImage); + + void setItemSizePolicy(ItemSizePolicy policy); + ItemSizePolicy itemSizePolicy() const; + + void setItemSize(const QSizeF& size); + QSizeF itemSize() const; + + void setItemSpacing(const QSizeF& spacing); + QSizeF itemSpacing() const; + signals: void activated(const QModelIndex &index); void longPressed(const QModelIndex &index, const QPointF &coords); @@ -123,15 +144,15 @@ void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight); protected: + HgWidgetPrivate * const p_ptr; + HgWidget(HgWidgetPrivate &dd, QGraphicsItem *parent); bool eventFilter(QObject *obj,QEvent *event); bool event(QEvent *event); - - HgWidget(HbWidgetPrivate* widgetPrivate, QGraphicsItem *parent = 0); private: - Q_DECLARE_PRIVATE_D(d_ptr, HgWidget) + Q_DECLARE_PRIVATE_D(p_ptr, HgWidget) Q_DISABLE_COPY(HgWidget) Q_PRIVATE_SLOT(d_func(), void _q_scrollPositionChanged(qreal index, bool scrollBarAnimation)) Q_PRIVATE_SLOT(d_func(), void _q_releaseItems(int releaseStart, int releaseEnd)) @@ -142,6 +163,7 @@ Q_PRIVATE_SLOT(d_func(), void _q_removeRows(const QModelIndex &parent, int start, int end)) Q_PRIVATE_SLOT(d_func(), void _q_moveRows(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationRow)) Q_PRIVATE_SLOT(d_func(), void _q_groovePressed(qreal, Qt::Orientation)) + Q_PRIVATE_SLOT(d_func(), void _q_modelReset()) }; #endif //HGWIDGET_H diff -r 89c329efa980 -r e48454f237ca hgwidgets_plat/hgcacheproxymodel_api/hgcacheproxymodel_api.pri --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgwidgets_plat/hgcacheproxymodel_api/hgcacheproxymodel_api.pri Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,14 @@ +# 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: + +PUBLIC_HEADERS += hgcacheproxymodel_api/inc/hgcacheproxymodel.h \ + hgcacheproxymodel_api/inc/hgdataprovidermodel.h + \ No newline at end of file diff -r 89c329efa980 -r e48454f237ca hgwidgets_plat/hgcacheproxymodel_api/inc/hgcacheproxymodel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgwidgets_plat/hgcacheproxymodel_api/inc/hgcacheproxymodel.h Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,157 @@ +/* +* 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: +* +* Version : %version: 2 % +*/ + +#ifndef HGCACHEPROXYMODEL_H_ +#define HGCACHEPROXYMODEL_H_ + +#include +#include + +#include + +#ifdef BUILD_CACHEPROXYMODEL +#define CACHEPROXYMODEL_EXPORT Q_DECL_EXPORT +#else +#define CACHEPROXYMODEL_EXPORT Q_DECL_IMPORT +#endif + +class HgBufferManager; + +const int KDefaultCacheSize = 120; +const int KDefaultCacheTreshold = 30; + +class HgBufferManagerObserver +{ +public: + enum HgRequestOrder { + HgRequestOrderAscending, + HgRequestOrderDescending + }; + + virtual void release(int start, int end) = 0; + virtual void request(int start, int end, HgRequestOrder order = HgRequestOrderAscending) = 0; +}; + +class HgCacheProxyModel : public QAbstractItemModel, public HgBufferManagerObserver, public HgDataProviderModelObserver +{ + Q_OBJECT +public: + CACHEPROXYMODEL_EXPORT HgCacheProxyModel(QObject *parent = 0); + CACHEPROXYMODEL_EXPORT ~HgCacheProxyModel(); + + CACHEPROXYMODEL_EXPORT void setDataProvider(HgDataProviderModel *dataProvider, int cacheSize = KDefaultCacheSize, int cacheTreshold = KDefaultCacheTreshold); + CACHEPROXYMODEL_EXPORT HgDataProviderModel* DataProvider(); + CACHEPROXYMODEL_EXPORT void resizeCache(int newSize, int newTreshold); + +//from QAbstractItemModel + CACHEPROXYMODEL_EXPORT virtual QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const; + CACHEPROXYMODEL_EXPORT virtual QModelIndex parent(const QModelIndex &child) const; + CACHEPROXYMODEL_EXPORT virtual int rowCount(const QModelIndex &parent = QModelIndex()) const; + CACHEPROXYMODEL_EXPORT virtual int columnCount(const QModelIndex &parent = QModelIndex()) const; + CACHEPROXYMODEL_EXPORT virtual bool hasChildren(const QModelIndex &parent = QModelIndex()) const; + CACHEPROXYMODEL_EXPORT virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; + CACHEPROXYMODEL_EXPORT virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); + CACHEPROXYMODEL_EXPORT virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; + CACHEPROXYMODEL_EXPORT virtual bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole); + CACHEPROXYMODEL_EXPORT virtual QMap itemData(const QModelIndex &index) const; + CACHEPROXYMODEL_EXPORT virtual bool setItemData(const QModelIndex &index, const QMap &roles); + CACHEPROXYMODEL_EXPORT virtual QStringList mimeTypes() const; + CACHEPROXYMODEL_EXPORT virtual QMimeData *mimeData(const QModelIndexList &indexes) const; + CACHEPROXYMODEL_EXPORT virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent); + CACHEPROXYMODEL_EXPORT virtual Qt::DropActions supportedDropActions() const; + CACHEPROXYMODEL_EXPORT virtual bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()); + CACHEPROXYMODEL_EXPORT virtual bool insertColumns(int column, int count, const QModelIndex &parent = QModelIndex()); + CACHEPROXYMODEL_EXPORT virtual bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()); + CACHEPROXYMODEL_EXPORT virtual bool removeColumns(int column, int count, const QModelIndex &parent = QModelIndex()); + CACHEPROXYMODEL_EXPORT virtual void fetchMore(const QModelIndex &parent); + CACHEPROXYMODEL_EXPORT virtual bool canFetchMore(const QModelIndex &parent) const; + CACHEPROXYMODEL_EXPORT virtual Qt::ItemFlags flags(const QModelIndex &index) const; + CACHEPROXYMODEL_EXPORT virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder); + CACHEPROXYMODEL_EXPORT virtual QModelIndex buddy(const QModelIndex &index) const; + CACHEPROXYMODEL_EXPORT virtual QModelIndexList match(const QModelIndex &start, int role, + const QVariant &value, int hits = 1, + Qt::MatchFlags flags = + Qt::MatchFlags(Qt::MatchStartsWith|Qt::MatchWrap)) const; + CACHEPROXYMODEL_EXPORT virtual QSize span(const QModelIndex &index) const; + +// for sorting + CACHEPROXYMODEL_EXPORT Qt::CaseSensitivity sortCaseSensitivity() const; + CACHEPROXYMODEL_EXPORT void setSortCaseSensitivity(Qt::CaseSensitivity cs); + CACHEPROXYMODEL_EXPORT bool isSortLocaleAware() const; + CACHEPROXYMODEL_EXPORT void setSortLocaleAware(bool on); + CACHEPROXYMODEL_EXPORT int sortColumn() const; + CACHEPROXYMODEL_EXPORT Qt::SortOrder sortOrder() const; + CACHEPROXYMODEL_EXPORT bool dynamicSortFilter() const; + CACHEPROXYMODEL_EXPORT void setDynamicSortFilter(bool enable); + CACHEPROXYMODEL_EXPORT int sortRole() const; + CACHEPROXYMODEL_EXPORT void setSortRole(int role); + +//for filtering +// CACHEPROXYMODEL_EXPORT QRegExp filterRegExp() const; +// CACHEPROXYMODEL_EXPORT void setFilterRegExp(const QRegExp ®Exp); +// CACHEPROXYMODEL_EXPORT int filterKeyColumn() const; +// CACHEPROXYMODEL_EXPORT void setFilterKeyColumn(int column); +// CACHEPROXYMODEL_EXPORT Qt::CaseSensitivity filterCaseSensitivity() const; +// CACHEPROXYMODEL_EXPORT void setFilterCaseSensitivity(Qt::CaseSensitivity cs); +// CACHEPROXYMODEL_EXPORT int filterRole() const; +// CACHEPROXYMODEL_EXPORT void setFilterRole(int role); + +public slots: + virtual bool submit(); + virtual void revert(); + +public: +//from HgBufferManagerObserver + CACHEPROXYMODEL_EXPORT virtual void release(int start, int end); + CACHEPROXYMODEL_EXPORT virtual void request(int start, int end, HgRequestOrder order = HgRequestOrderAscending); + +private: + int count()const; + QModelIndex mapToSource(const QModelIndex &index)const; + QModelIndex mapToSource(int row, int col) const; + int mapToDataProviderIndex(int myIndex) const; + int mapFromDataProviderIndex(int myIndex) const; + void cleanupForBMResetIfNeeded(); + void resetBMIfNeeded(); + void releaseAll(); + void setBufferPosition(int pos) const; + +private slots: + void sourceReset(); + void sourceAboutToBeReset(); + void sourceRowsInserted(const QModelIndex &source_parent, int start, int end); + void sourceRowsRemoved(const QModelIndex &source_parent, int start, int end); + void dataUpdated(QModelIndex from, QModelIndex to); + +//from HgDataProviderModelObserver +public: + CACHEPROXYMODEL_EXPORT virtual void dataUpdated(int from, int to); + +private: + HgBufferManager* mBufferManager; + QSortFilterProxyModel* mSortFilterProxyModel; + HgDataProviderModel* mDataProviderModel; + mutable bool mResetNeeded; + mutable bool mSupressBM; + mutable int mCurrentPos; + bool mSortParameterChanged; + bool mFilterParameterChanged; + +}; + +#endif // HGCACHEPROXYMODEL_H_ diff -r 89c329efa980 -r e48454f237ca hgwidgets_plat/hgcacheproxymodel_api/inc/hgdataprovidermodel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgwidgets_plat/hgcacheproxymodel_api/inc/hgdataprovidermodel.h Mon May 03 13:32:54 2010 +0300 @@ -0,0 +1,142 @@ +/* +* 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: +* +* Version : %version: 3 % +*/ +#ifndef HGDATAPROVIDERMODEL_H_ +#define HGDATAPROVIDERMODEL_H_ + +#include +#include +#include +#include +#include +#include +#include + +class HbIcon; +class QVariant; +class HgCacheProxyModel; + +#ifdef BUILD_CACHEPROXYMODEL +#define CACHEPROXYMODEL_EXPORT Q_DECL_EXPORT +#else +#define CACHEPROXYMODEL_EXPORT Q_DECL_IMPORT +#endif + +class HgDataProviderModelObserver +{ +public: + virtual void dataUpdated(int from, int to) = 0; +}; + +class CACHEPROXYMODEL_EXPORT HgDataProviderModel : public QAbstractItemModel +{ + Q_OBJECT + +public: + HgDataProviderModel(QObject *parent = 0); + ~HgDataProviderModel(); +//to cooperate with buffer manager + void release(QList list, bool silent = true); + void request(QList list, bool silent = false); + virtual void doReleaseData(QList list, bool silent) = 0; + virtual void doRequestData(QList list, bool silent) = 0; + void registerObserver(HgDataProviderModelObserver* obs); + +public: +//from QAbstractItemModel + QModelIndex index(int row, int column, + const QModelIndex &parent = QModelIndex()) const; + virtual QModelIndex parent(const QModelIndex &child) const; + virtual int rowCount(const QModelIndex &parent = QModelIndex()) const; + virtual int columnCount(const QModelIndex &parent = QModelIndex()) const; + virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; + virtual QMap itemData(const QModelIndex &index) const; + +//cache management +protected: + QVariant data(int idx, int role) const; + void clearCache(); + int count() const; + bool update(int pos, QVariant obj, int role, bool silent = false); + bool update(int pos, QList< QPair< QVariant, int > >* list, bool silent = false); + bool updateIcon(int pos, QVariant obj, bool silent = false); + void resetIcon(int idx); + void newItem(QList< QPair< QVariant, int > >* list = NULL, bool silent = true); + void newItem(QPair< QVariant, int > item, bool silent = true); + void insertItem(int pos, QList< QPair< QVariant, int > >* list = NULL, bool silent = true); + void insertItem(int pos, QPair< QVariant, int > item, bool silent = true); + +private: + void doInsertItem(int pos, QList< QPair< QVariant, int > >* list, bool silent); + +protected: + void removeItem(int pos); + void removeItems(int pos, int size); + + virtual QVariant defaultIcon() const = 0; + inline bool containsRole(int idx, int role) const; + inline bool isIndexValid(int idx) const; + +public: + void resetModel(); + +protected: + virtual void doResetModel() {}; + +// helpers fot emits +protected: + void emitDataChanged(int start, int end, bool silent); + +//QPixmap pool +public: + void resizeQPixmapPool(int size); + +protected: + void releasePixmap(int idx); + QVariant createIcon(int index, QPixmap aPixmap); + +private: + QPixmap* getPixmap(int idx); + + +private: + QList*>* mCache; + int mCacheSize; //Number of cached Icons. Not same as mCache->count() + QList< QPixmap* > mFreePixmaps; + QMap< int, QPixmap* > mUsedPixmaps; + int mUnallocatedPixmaps; + QMutex mQPixmapsLock; + HgDataProviderModelObserver *mObserver; +}; + +inline bool HgDataProviderModel::isIndexValid(int idx) const +{ + return ((0 <= idx) && + (idx < mCache->size()) && + (mCache->at(idx))); +} + +inline bool HgDataProviderModel::containsRole(int idx, int role) const +{ + return ( isIndexValid(idx) && + mCache->at(idx)->contains(role) ); +} + + + + +#endif // HGDATAPROVIDERMODEL_H_ diff -r 89c329efa980 -r e48454f237ca hgwidgets_plat/hgwidgets_plat.pro --- a/hgwidgets_plat/hgwidgets_plat.pro Mon Apr 19 14:40:06 2010 +0300 +++ b/hgwidgets_plat/hgwidgets_plat.pro Mon May 03 13:32:54 2010 +0300 @@ -1,18 +1,13 @@ -# # 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: -# TEMPLATE = subdirs @@ -21,6 +16,7 @@ CONFIG += ordered include(ganeswidgets_api/ganeswidgets_api.pri) +include(hgcacheproxymodel_api/hgcacheproxymodel_api.pri) symbian { headers.sources = $$PUBLIC_HEADERS