diff -r b95ddb5a0d10 -r eff9df3d9c98 mpviewplugins/mpmediawallviewplugin/src/mpreflectioneffect.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mpviewplugins/mpmediawallviewplugin/src/mpreflectioneffect.cpp Thu Jul 22 16:32:33 2010 +0100 @@ -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 +#include +#include + +#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( 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