mpviewplugins/mpmediawallviewplugin/src/mpreflectioneffect.cpp
author hgs
Fri, 11 Jun 2010 19:36:32 -0500
changeset 37 eb79a7c355bf
permissions -rw-r--r--
201023
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
37
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description: Reflection effect for Music Player Media Wall.
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include <QPainter>
hgs
parents:
diff changeset
    19
#include <QGraphicsItem>
hgs
parents:
diff changeset
    20
#include <hbinstance.h>
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
#include "mpreflectioneffect.h"
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
/*!
hgs
parents:
diff changeset
    26
    \class MpReflectionEffect
hgs
parents:
diff changeset
    27
    \brief The MpReflectionEffect class provides a reflection effect.
hgs
parents:
diff changeset
    28
hgs
parents:
diff changeset
    29
    Renders the source with a reflection.
hgs
parents:
diff changeset
    30
*/
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
/*!
hgs
parents:
diff changeset
    33
    Constructs a new MpReflectionEffect instance.
hgs
parents:
diff changeset
    34
    The \a parent parameter is passed to QGraphicsEffect's constructor.
hgs
parents:
diff changeset
    35
*/
hgs
parents:
diff changeset
    36
MpReflectionEffect::MpReflectionEffect(QObject *parent)
hgs
parents:
diff changeset
    37
    : QGraphicsEffect( parent )
hgs
parents:
diff changeset
    38
{
hgs
parents:
diff changeset
    39
}
hgs
parents:
diff changeset
    40
hgs
parents:
diff changeset
    41
/*!
hgs
parents:
diff changeset
    42
    Destroys the effect.
hgs
parents:
diff changeset
    43
*/
hgs
parents:
diff changeset
    44
MpReflectionEffect::~MpReflectionEffect()
hgs
parents:
diff changeset
    45
{
hgs
parents:
diff changeset
    46
}
hgs
parents:
diff changeset
    47
hgs
parents:
diff changeset
    48
/*!
hgs
parents:
diff changeset
    49
    \reimp
hgs
parents:
diff changeset
    50
*/
hgs
parents:
diff changeset
    51
QRectF MpReflectionEffect::boundingRectFor(const QRectF &rect) const
hgs
parents:
diff changeset
    52
{
hgs
parents:
diff changeset
    53
    QRectF retRect = rect;
hgs
parents:
diff changeset
    54
    //this bounding rect is in device cordinates, correcting based on current transform.
hgs
parents:
diff changeset
    55
    if ( hbInstance->allMainWindows()[0]->orientation() == Qt::Horizontal ) {
hgs
parents:
diff changeset
    56
#ifdef __WINS__        
hgs
parents:
diff changeset
    57
        retRect.adjust(0,0,retRect.width(),0); //wincw with forced rotation is to the right.
hgs
parents:
diff changeset
    58
#else
hgs
parents:
diff changeset
    59
        retRect.adjust(-retRect.width(),0,0,0);//currently hardware rotations is to the left.
hgs
parents:
diff changeset
    60
#endif
hgs
parents:
diff changeset
    61
    } else {
hgs
parents:
diff changeset
    62
        retRect.adjust(0,0,0,retRect.height());
hgs
parents:
diff changeset
    63
    }
hgs
parents:
diff changeset
    64
    
hgs
parents:
diff changeset
    65
    return retRect;
hgs
parents:
diff changeset
    66
}
hgs
parents:
diff changeset
    67
hgs
parents:
diff changeset
    68
/*!
hgs
parents:
diff changeset
    69
    \reimp
hgs
parents:
diff changeset
    70
*/
hgs
parents:
diff changeset
    71
void MpReflectionEffect::draw(QPainter *painter)
hgs
parents:
diff changeset
    72
{
hgs
parents:
diff changeset
    73
    //currently sourceBoundingRect returns somehing like boundingRectFor and 
hgs
parents:
diff changeset
    74
    //wrong rect for widgets with scroll area. As a workaround we can get the
hgs
parents:
diff changeset
    75
    //original bounding rect assuming that the widget using the effect is the 
hgs
parents:
diff changeset
    76
    //effect parent.
hgs
parents:
diff changeset
    77
    QGraphicsItem * sourceItem;
hgs
parents:
diff changeset
    78
    sourceItem = qobject_cast<QGraphicsItem *>( parent() );
hgs
parents:
diff changeset
    79
    QPixmap pixmap;
hgs
parents:
diff changeset
    80
    QPoint offset;
hgs
parents:
diff changeset
    81
    pixmap = sourcePixmap( Qt::LogicalCoordinates,&offset, QGraphicsEffect::NoPad );
hgs
parents:
diff changeset
    82
    painter->drawPixmap( offset, pixmap );
hgs
parents:
diff changeset
    83
    if ( sourceItem ) {
hgs
parents:
diff changeset
    84
        painter->save();
hgs
parents:
diff changeset
    85
        painter->scale( 1, -1 );
hgs
parents:
diff changeset
    86
        //for some reson tranlation does not work, translating cordinates by hand.
hgs
parents:
diff changeset
    87
        QPointF reflectionOffset( 0.0, - 2.0 * sourceItem->boundingRect().height() );
hgs
parents:
diff changeset
    88
        painter->drawPixmap( offset + reflectionOffset, pixmap );
hgs
parents:
diff changeset
    89
        QRectF reflectionRect;
hgs
parents:
diff changeset
    90
        reflectionRect.setTopLeft( reflectionOffset );
hgs
parents:
diff changeset
    91
        reflectionRect.setHeight ( sourceItem->boundingRect().height() );
hgs
parents:
diff changeset
    92
        reflectionRect.setWidth( pixmap.width() );
hgs
parents:
diff changeset
    93
        painter->fillRect( reflectionRect, QColor::fromRgbF( 0, 0, 0, 0.5f ) );
hgs
parents:
diff changeset
    94
        painter->restore();
hgs
parents:
diff changeset
    95
    }
hgs
parents:
diff changeset
    96
}
hgs
parents:
diff changeset
    97
hgs
parents:
diff changeset
    98
// EOF