diff -r 000000000000 -r 16d8024aca5e src/hbwidgets/itemviews/hbgridlayout_p.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hbwidgets/itemviews/hbgridlayout_p.cpp Mon Apr 19 14:02:13 2010 +0300 @@ -0,0 +1,368 @@ +/**************************************************************************** +** +** Copyright (C) 2008-2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (developer.feedback@nokia.com) +** +** This file is part of the HbWidgets module of the UI Extensions for Mobile. +** +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this file. +** Please review the following information to ensure the GNU Lesser General +** Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at developer.feedback@nokia.com. +** +****************************************************************************/ + +#include +#include + +#include + +/*! + \class HbGridLayout + \brief HbGridLayout manages geometries of grid view contents. + @internal +*/ + +/*! + Constructor. + \param parent parent layout item. +*/ +HbGridLayout::HbGridLayout(QGraphicsLayoutItem *parent) + : QGraphicsLayout(parent), d_ptr(new HbGridLayoutPrivate()) +{ + Q_D(HbGridLayout); + d->q_ptr = this; + d->init(); +} + +HbGridLayout::HbGridLayout(HbGridLayoutPrivate &dd, QGraphicsLayoutItem *parent) + : QGraphicsLayout(parent),d_ptr(&dd) +{ + Q_D(HbGridLayout); + d->q_ptr = this; + d->init(); +} + +/*! + Destructor. +*/ +HbGridLayout::~HbGridLayout() +{ + if (d_ptr) { + for (int i = count() - 1; i >= 0; --i) { + QGraphicsLayoutItem *item = itemAt(i); + // The following lines can be removed, but this removes the item + // from the layout more efficiently than the implementation of + // ~QGraphicsLayoutItem. + d_ptr->removeItem(item, i, false); + if (item) { + item->setParentLayoutItem(0); + if (item->ownedByLayout()) { + delete item; + } + } + } + } + + delete d_ptr; +} + +/*! + adds \a item to gridlayout. + NOTE::there is no support for adding items at a specific row and column yet. +*/ +void HbGridLayout::addItem(QGraphicsLayoutItem *item) +{ + insertItem(-1, item, false); +} +/*! + Sets size of gridlayout to \a size. + \a targetCount will be updated with the maximum no of items it can show + at a time. +*/ +void HbGridLayout::setSize(const QSizeF &size,int &targetCount) +{ + Q_D(HbGridLayout); + d->setSize(size,targetCount); +} + +/*! + Returns position of layout \a item in the grid layout or -1 if not found. +*/ +int HbGridLayout::indexOf(QGraphicsLayoutItem *item) const +{ + const int totalItems = count(); + for(int i = 0; i < totalItems; ++i) { + if (itemAt(i) == item) { + return i; + } + } + return -1; +} + +/*! + Removes \a item from the grid layout. + Equivalent of calling removeAt(indexOf(\aitem)). +*/ +void HbGridLayout::removeItem(QGraphicsLayoutItem *item, bool animate) +{ + Q_D(HbGridLayout); + d->removeItem(item, indexOf(item), animate); +} + +/*! + Sets spacing to \a spacing. + This sets uniform horizontal and vertical spacing between each item in the layout. +*/ +void HbGridLayout::setSpacing(qreal spacing) +{ + Q_D(HbGridLayout); + if( spacing != d->mSpacing){ + //TODO RECALCULATE ITEM SIZE + d->mSpacing = spacing; + if(count()>0){ + d->reset(); + } + } +} + +void HbGridLayout::setMargins(qreal topMargin, qreal bottomMargin, qreal leftMargin, qreal rightMargin) +{ + Q_D(HbGridLayout); + //TODO CALCULATE ITEM SIZE + d->setMargins(topMargin, bottomMargin, leftMargin, rightMargin); + d->reset(); + +} + +/*! + Returns spacing between items.This is uniform spacing between items + in both horizontally and vertically directions +*/ +qreal HbGridLayout::spacing() const +{ + Q_D(const HbGridLayout); + return d->mSpacing; +} +/*! + Inserts a layout at \a item at given position \a index to the grid layout. + If index is out of range, the item is appended to the end of the list. +*/ +void HbGridLayout::insertItem(int index, QGraphicsLayoutItem *item, bool animate) +{ + if (item) { + Q_D(HbGridLayout); + d->insertItem(item, index, animate, true); + } +} + +/*! + \reimp +*/ +void HbGridLayout::setRowCount(int rowCount) +{ + Q_D(HbGridLayout); + if (d->mMaxVisRows!= rowCount){ + //TODO RECALCULATE ITEM SIZE + d->mMaxVisRows = rowCount; + d->reset(); + } +} + +/*! + \reimp +*/ +void HbGridLayout::setColumnCount(int columnCount) +{ + Q_D(HbGridLayout); + if (d->mMaxVisColumns != columnCount){ + //TODO RECALCULATE ITEM SIZE + d->mMaxVisColumns = columnCount; + d->reset(); + } +} + +/*! + \reimp +*/ +int HbGridLayout::count() const +{ + Q_D(const HbGridLayout); + return d->mItems.count(); +} + +/*! + \reimp +*/ +QGraphicsLayoutItem *HbGridLayout::itemAt(int i) const +{ + Q_D(const HbGridLayout); + return d->mItems.value(i); +} + +/*! + \reimp +*/ +int HbGridLayout::rowCount() const +{ + Q_D(const HbGridLayout); + return d->mMaxVisRows; +} + +/*! + \reimp +*/ +int HbGridLayout::columnCount() const +{ + Q_D(const HbGridLayout); + return d->mMaxVisColumns; +} + +/*! + \reimp +*/ +void HbGridLayout::removeAt(int index) +{ + Q_D(HbGridLayout); + + QGraphicsLayoutItem *item = itemAt(index); + if (item){ + d->removeItem(item, index, false); + } +} + +/*! + \reimp +*/ +void HbGridLayout::setGeometry(const QRectF &rect) +{ + Q_D( HbGridLayout ); + if(!d->mClearGeometry) { + return; + } + d->setGeometry(rect); + QRectF newGeom = rect; + newGeom.setSize(rect.size().expandedTo(d->mItemSize) + .boundedTo(d->mMaxSizeHint)); + if (newGeom == d->mGeometry) + return; + d->mGeometry = rect; + QGraphicsLayout::setGeometry(d->mGeometry); +} + + +/*! + \reimp +*/ +QSizeF HbGridLayout::sizeHint( Qt::SizeHint which, const QSizeF &constraint ) const +{ + Q_D(const HbGridLayout); + return d->sizeHint(which,constraint); +} + +/*! + sets the scrollDirection of the layout to \a scrollDirection. + This determines how items are drawni.e horizontally or vertically. +*/ +void HbGridLayout::setScrollDirection(Qt::Orientations scrollDirection) +{ + Q_D(HbGridLayout); + if(d->mScrollDirection != scrollDirection){ + d->mScrollDirection = scrollDirection; + d->reset(); + } +} + +/*! + Returns current scrollDirection. +*/ +Qt::Orientations HbGridLayout::scrollDirection() const +{ + Q_D(const HbGridLayout); + return d->mScrollDirection; +} + +/*! + moves \a item to \a targetIndex and sets clearGeometry Flag to true. + Need to call updateGeometry for updating layout. +*/ +void HbGridLayout::moveItem(QGraphicsLayoutItem *item, int targetIndex, bool animate) +{ + if (item) { + Q_D(HbGridLayout); + + d->removeItem(item, indexOf(item), animate); + d->insertItem(item, targetIndex, animate, false); + } +} + +/*! + \reimp +*/ +void HbGridLayout::invalidate() +{ + Q_D(HbGridLayout); + if(!d->mRecycling) + d->mClearCacheHint = true; + d->mClearGeometry = true; + QGraphicsLayout::invalidate(); +} + +void HbGridLayout::setRecycling(bool enableRecycling) +{ + Q_D(HbGridLayout); + if(enableRecycling != d->mRecycling){ + invalidate(); + d->mRecycling = enableRecycling; + } +} + +bool HbGridLayout::isRecyclingEnabled() +{ + Q_D(HbGridLayout); + return d->mRecycling; +} + +void HbGridLayout::recycleItems(QGraphicsLayoutItem *sourceItem, QGraphicsLayoutItem *targetItem) +{ + Q_D(HbGridLayout); + + HbGridLayoutPrivate::AnimationData *sourceData = d->animationData(sourceItem); + HbGridLayoutPrivate::AnimationData *targetData = d->animationData(targetItem); + + d->stopAnimation(sourceData); + + d->stopAnimation(targetData); +} + +bool HbGridLayout::isAnimated(QGraphicsLayoutItem *item) const +{ + Q_D(const HbGridLayout); + if (d->animationData(item) != 0) { + return true; + } else { + return false; + } +} + +void HbGridLayout::effectFinished(const HbEffect::EffectStatus &status) +{ + Q_D(HbGridLayout); + + QGraphicsLayoutItem *item = static_cast(status.item); + d->stopAnimation(d->animationData(item)); +} + +#include "moc_hbgridlayout_p.cpp" +