src/hbwidgets/itemviews/hbgridlayout_p.cpp
changeset 0 16d8024aca5e
--- /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"
+