--- /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 <hbgridlayout_p.h>
+#include <hbgridlayout_p_p.h>
+
+#include <QGraphicsWidget>
+
+/*!
+ \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<QGraphicsWidget *>(status.item);
+ d->stopAnimation(d->animationData(item));
+}
+
+#include "moc_hbgridlayout_p.cpp"
+