ginebra2/SlidingWidget.cpp
changeset 0 1450b09d0cfd
child 3 0954f5dd2cd0
child 5 0f2326c2a325
--- /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 <QDebug>
+
+//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
+
+