diff -r 000000000000 -r 1450b09d0cfd ginebra2/SlidingWidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ginebra2/SlidingWidget.cpp Tue May 04 12:39:35 2010 +0300 @@ -0,0 +1,136 @@ +/* +* 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: +* +*/ + + +#include "SlidingWidget.h" +#include "ChromeSnippet.h" + +#include + +//NB: Note that the current implementation only supports one snippet child + +namespace GVA { + + SlidingWidget::SlidingWidget(QGraphicsItem* parent) + : QGraphicsWidget(parent), + m_top(0), + m_window(0), + m_bottom(0), + m_slideMax(0), + m_slidePos(0) + { + //Clip child item so that it can "slide" out of view + setFlags(QGraphicsItem::ItemClipsChildrenToShape); + //setSizePolicy(QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred)); + m_layout = new QGraphicsAnchorLayout(); + m_layout->setContentsMargins(0,0,0,0); + m_layout->setSpacing(0); + setLayout(m_layout); + } + + SlidingWidget:: ~SlidingWidget() + { + } + + void SlidingWidget::resizeEvent(QGraphicsSceneResizeEvent *ev) + { + qDebug() << "SlidingWidget::resizeEvent: " << ev->newSize(); + if(m_window) + m_window->resize(ev->newSize()); + //m_window->resize(ev->newSize().width(), m_window->size().height()); + QGraphicsWidget::resizeEvent(ev); + } + + qreal SlidingWidget::slide(qreal delta) + { + + qreal newPos = m_slidePos + delta; + + //qDebug() << "SlidingWidget::slide: delta: " << delta << " m_slidePos: " << m_slidePos << " newPos: " << newPos; + + if(newPos < 0) { + if(m_slidePos == 0) + return 0; + delta = -m_slidePos; + m_slidePos = 0; + } + + else if(newPos > m_slideMax){ + if(m_slidePos == m_slideMax) + return 0; + delta = m_slideMax - m_slidePos; + m_slidePos = m_slideMax; + } + + else m_slidePos = newPos; + + //qDebug() << "calculated delta: " << delta << " new m_slidePos: " << m_slidePos; + + QTransform transform; + transform.translate(0,delta); + //m_window->setTransform(transform, true); + //m_top->setTransform(transform, true); + m_top->setPos(0, m_top->pos().y() + delta); + m_window->setPos(0, m_window->pos().y() + delta); + return delta; + } + + void SlidingWidget::setWindow(QGraphicsWidget * window) + { + if(m_window) + m_window->setParentItem(0); + m_window = window; + m_window->setParentItem(this); + m_window->resize(size()); + if(m_top) { + slide(0); + QGraphicsWidget* item=m_top; + attachItem(item); + } + else + m_window->setPos(0,0); + //m_layout->addAnchors(m_window, m_layout, Qt::Horizontal); + } + + void SlidingWidget::attachItem(QGraphicsWidget * item) + { + if(m_top) + detachItem(m_top); + m_top = item; + m_top->setParentItem(this); + m_top->setPos(0,0); + m_slideMax = m_top->size().height(); + m_slidePos = m_slideMax; + if(m_window) + m_window->setPos(0, m_top->size().height()); + } + + + void SlidingWidget::detachItem(QGraphicsWidget * item) + { + if(m_top != item) + return; + m_top->setParentItem(0); + m_top = 0; + if(m_window) + m_window->setPos(0,0); + } + + +} // end of namespace GVA + +