src/hbwidgets/itemviews/hbtreeviewitem.cpp
changeset 0 16d8024aca5e
child 1 f7ac710697a9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/hbwidgets/itemviews/hbtreeviewitem.cpp	Mon Apr 19 14:02:13 2010 +0300
@@ -0,0 +1,307 @@
+/****************************************************************************
+**
+** 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 "hbtreeviewitem_p.h"
+
+#include "hbtreeviewitem.h"
+#include "hbtreeview.h"
+#include "hbnamespace.h"
+#include "hbabstractitemview.h"
+#include "hbstyle.h"
+#include "hbstyleoptiontreeviewitem.h"
+#include "hbabstractitemcontainer.h"
+
+#include <QPersistentModelIndex>
+#include <QVariant>
+#include <QDebug>
+
+/*!
+    @alpha
+    @hbwidgets
+    \class HbTreeViewItem
+    \brief The HbTreeViewItem class represents a single item in a hierarchical list.    
+
+    The HbTreeViewItem class provides an item that is used by the HbTreeView class to
+    visualize content within single model index. The item can only be used with HbTreeView
+    or with objects derived from HbTreeView. By default the HbTreeViewItem supports
+    all the same content that HbListViewItem supports. In addition to this it is able to 
+    visualize parent items.
+
+    \b Subclassing
+
+    See HbListViewItem for commmon view item subclassing reference. 
+
+*/
+
+HbTreeViewItemPrivate::HbTreeViewItemPrivate(HbTreeViewItem *prototype) :
+    HbListViewItemPrivate(prototype),
+    mExpandItem(0),
+    mExpanded(false)
+{
+}
+
+HbTreeViewItemPrivate::HbTreeViewItemPrivate(const HbTreeViewItemPrivate &source) :
+    HbListViewItemPrivate(source),
+    mExpandItem(0),
+    mExpanded(source.mExpanded)
+{
+}
+
+HbTreeViewItemPrivate &HbTreeViewItemPrivate::operator=(const HbTreeViewItemPrivate &source)
+{
+    HbListViewItemPrivate::operator=(source);
+    mExpandItem = 0;
+    mExpanded = source.mExpanded;
+    return *this;
+}
+
+HbTreeViewItemPrivate::~HbTreeViewItemPrivate()
+{
+}
+
+int HbTreeViewItemPrivate::modelItemType() const
+{
+    const QAbstractItemModel *model = mIndex.model();
+
+    if (model && model->hasChildren(mIndex)) {
+        return Hb::ParentItem;
+    } else {
+        return HbListViewItemPrivate::modelItemType();
+    }
+}
+
+QGraphicsItem *HbTreeViewItemPrivate::updateExpandItem()
+{
+    Q_Q(HbTreeViewItem);
+    QGraphicsItem *item = mExpandItem;
+
+    if (!item) {
+        mItemsChanged = true;
+        item = q->style()->createPrimitive(HbStyle::P_TreeViewItem_expandicon, q);
+    }
+
+    HbStyleOptionTreeViewItem styleOption;
+    q->initStyleOption(&styleOption);
+
+    q->style()->updatePrimitive(item, HbStyle::P_TreeViewItem_expandicon, &styleOption);
+
+    return item;
+}
+
+
+/*!
+    Constructs an tree view item with the given parent.
+*/
+HbTreeViewItem::HbTreeViewItem(QGraphicsItem *parent) : 
+    HbListViewItem(*new HbTreeViewItemPrivate(this), parent)
+{
+    Q_D( HbTreeViewItem );
+    d->q_ptr = this;
+}
+
+/*!
+    Creates a separate graphics widget with same tree view item state as \a source.
+*/
+HbTreeViewItem::HbTreeViewItem(const HbTreeViewItem &source) :
+    HbListViewItem(*new HbTreeViewItemPrivate(*source.d_func()), 0)
+{
+    Q_D( HbTreeViewItem );
+    d->q_ptr = this;
+}
+
+/*!
+    \internal
+*/
+HbTreeViewItem::HbTreeViewItem(HbTreeViewItemPrivate &dd, QGraphicsItem * parent) :
+    HbListViewItem(dd, parent)
+{
+    Q_D( HbTreeViewItem );
+    d->q_ptr = this;
+}
+
+/*!
+    Destroys the tree view item.
+*/
+HbTreeViewItem::~HbTreeViewItem()
+{
+}
+
+/*!
+    Assigns the \a source tree view item to this tree view item and returns a reference to this item.
+*/
+HbTreeViewItem &HbTreeViewItem::operator=(const HbTreeViewItem &source)
+{
+    Q_D( HbTreeViewItem );
+    *d = *source.d_func();
+    return *this;
+}
+
+
+/*!
+    Creates a new tree view item.
+*/
+HbAbstractViewItem *HbTreeViewItem::createItem()
+{
+    return new HbTreeViewItem(*this);
+}
+
+/*!
+    \reimp
+*/
+void HbTreeViewItem::updateChildItems()
+{
+    Q_D(HbTreeViewItem);
+
+    const QAbstractItemModel *model = d->mIndex.model();
+
+    if (model && model->hasChildren(d->mIndex)) {
+        d->mExpandItem = d->updateExpandItem();
+    } else if (d->mExpandItem) {
+        d->mItemsChanged = true;
+        delete d->mExpandItem;
+        d->mExpandItem = 0;
+    }
+
+    HbListViewItem::updateChildItems();
+}
+
+/*!
+    \reimp
+*/
+void HbTreeViewItem::updatePrimitives()
+{
+    Q_D(HbTreeViewItem);
+    if(d->mExpandItem) {
+        d->updateExpandItem();
+    }
+    HbListViewItem::updatePrimitives();
+}
+
+
+/*!
+    \reimp
+*/
+int HbTreeViewItem::type() const
+{
+    return HbTreeViewItem::Type;
+}
+
+/*!
+    Sets the item to either collapse or expanded, depending on the value of \a expanded.
+
+    \sa isExpanded
+*/
+void HbTreeViewItem::setExpanded(bool expanded)
+{
+    Q_D(HbTreeViewItem);
+    HB_SD(HbAbstractViewItem);
+
+    if (d->mExpanded != expanded) {
+        d->mExpanded = expanded;
+
+		if (sd->mItemView != 0) {
+            HbTreeView *treeView = qobject_cast<HbTreeView *>(sd->mItemView);
+            if (treeView) {
+                treeView->setExpanded(this->modelIndex(), expanded);
+            }
+        }
+
+        if (d->mExpandItem) {
+            d->updateExpandItem();
+        }
+    }
+}
+
+/*!
+    Returns true if the item is expanded; otherwise returns false.
+
+    \sa setExpanded
+*/
+bool HbTreeViewItem::isExpanded() const
+{
+    Q_D(const HbTreeViewItem);
+    return d->mExpanded;
+}
+
+/*!
+    \reimp
+*/
+QMap<int,QVariant> HbTreeViewItem::state() const
+{
+    Q_D(const HbTreeViewItem);
+    QMap<int,QVariant> state = HbListViewItem::state();
+    
+    state.insert(ExpansionKey, d->mExpanded);
+
+    return state;    
+}
+
+/*!
+    \reimp
+*/
+void HbTreeViewItem::setState(const QMap<int,QVariant> &state)
+{
+    Q_D(HbTreeViewItem);
+
+    HbListViewItem::setState(state);
+
+    if (state.contains(ExpansionKey)) {
+        d->mExpanded = state.value(ExpansionKey).toBool();
+    } else {
+        d->mExpanded = false;
+    }
+}
+
+/*!
+    Initialize option with the values from this HbTreeViewItem. 
+
+    This method is useful for subclasses when they need a HbStyleOptionTreeViewItem, 
+    but don't want to fill in all the information themselves.
+*/
+void HbTreeViewItem::initStyleOption(HbStyleOptionTreeViewItem *option) const
+{
+    Q_D(const HbTreeViewItem);
+
+    HbListViewItem::initStyleOption(option);
+
+    option->expanded = d->mExpanded;
+}
+
+/*!
+  Provides access to primitives of HbTreeViewItem.
+  \param primitive is the type of the requested primitive. The available primitives are 
+  \c P_TreeViewItem_expandicon
+ */
+QGraphicsItem *HbTreeViewItem::primitive(HbStyle::Primitive primitive) const
+{
+    Q_D(const HbTreeViewItem);
+    if (primitive == HbStyle::P_TreeViewItem_expandicon) {
+        return d->mExpandItem;
+    } else {
+        return HbListViewItem::primitive(primitive);
+    }
+}
+
+#include "moc_hbtreeviewitem.cpp"
+