mpviewplugins/mpmediawallviewplugin/src/mpreflectioneffect.cpp
changeset 37 eb79a7c355bf
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mpviewplugins/mpmediawallviewplugin/src/mpreflectioneffect.cpp	Fri Jun 11 19:36:32 2010 -0500
@@ -0,0 +1,98 @@
+/*
+* 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: Reflection effect for Music Player Media Wall.
+*
+*/
+
+#include <QPainter>
+#include <QGraphicsItem>
+#include <hbinstance.h>
+
+#include "mpreflectioneffect.h"
+
+
+/*!
+    \class MpReflectionEffect
+    \brief The MpReflectionEffect class provides a reflection effect.
+
+    Renders the source with a reflection.
+*/
+
+/*!
+    Constructs a new MpReflectionEffect instance.
+    The \a parent parameter is passed to QGraphicsEffect's constructor.
+*/
+MpReflectionEffect::MpReflectionEffect(QObject *parent)
+    : QGraphicsEffect( parent )
+{
+}
+
+/*!
+    Destroys the effect.
+*/
+MpReflectionEffect::~MpReflectionEffect()
+{
+}
+
+/*!
+    \reimp
+*/
+QRectF MpReflectionEffect::boundingRectFor(const QRectF &rect) const
+{
+    QRectF retRect = rect;
+    //this bounding rect is in device cordinates, correcting based on current transform.
+    if ( hbInstance->allMainWindows()[0]->orientation() == Qt::Horizontal ) {
+#ifdef __WINS__        
+        retRect.adjust(0,0,retRect.width(),0); //wincw with forced rotation is to the right.
+#else
+        retRect.adjust(-retRect.width(),0,0,0);//currently hardware rotations is to the left.
+#endif
+    } else {
+        retRect.adjust(0,0,0,retRect.height());
+    }
+    
+    return retRect;
+}
+
+/*!
+    \reimp
+*/
+void MpReflectionEffect::draw(QPainter *painter)
+{
+    //currently sourceBoundingRect returns somehing like boundingRectFor and 
+    //wrong rect for widgets with scroll area. As a workaround we can get the
+    //original bounding rect assuming that the widget using the effect is the 
+    //effect parent.
+    QGraphicsItem * sourceItem;
+    sourceItem = qobject_cast<QGraphicsItem *>( parent() );
+    QPixmap pixmap;
+    QPoint offset;
+    pixmap = sourcePixmap( Qt::LogicalCoordinates,&offset, QGraphicsEffect::NoPad );
+    painter->drawPixmap( offset, pixmap );
+    if ( sourceItem ) {
+        painter->save();
+        painter->scale( 1, -1 );
+        //for some reson tranlation does not work, translating cordinates by hand.
+        QPointF reflectionOffset( 0.0, - 2.0 * sourceItem->boundingRect().height() );
+        painter->drawPixmap( offset + reflectionOffset, pixmap );
+        QRectF reflectionRect;
+        reflectionRect.setTopLeft( reflectionOffset );
+        reflectionRect.setHeight ( sourceItem->boundingRect().height() );
+        reflectionRect.setWidth( pixmap.width() );
+        painter->fillRect( reflectionRect, QColor::fromRgbF( 0, 0, 0, 0.5f ) );
+        painter->restore();
+    }
+}
+
+// EOF