homescreenapp/hsdomainmodel/src/hswidgethostvisual.cpp
author hgs
Wed, 20 Oct 2010 15:25:39 +0300
changeset 101 ba1b7e218624
parent 90 3ac3aaebaee5
permissions -rw-r--r--
201042
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
69
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 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:
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
#include <QGraphicsLinearLayout>
hgs
parents:
diff changeset
    19
#include <QParallelAnimationGroup>
hgs
parents:
diff changeset
    20
#include <QPropertyAnimation>
hgs
parents:
diff changeset
    21
#include <QGraphicsDropShadowEffect>
hgs
parents:
diff changeset
    22
#include <QGraphicsSceneResizeEvent>
hgs
parents:
diff changeset
    23
#include <QGesture>
hgs
parents:
diff changeset
    24
#include <QGraphicsScene>
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
#include <HbInstantFeedback>
hgs
parents:
diff changeset
    28
#include <HbTouchArea>
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
#include "hswidgethostvisual.h"
hgs
parents:
diff changeset
    31
#include "hswidgethost.h"
hgs
parents:
diff changeset
    32
#include "hsscene.h"
hgs
parents:
diff changeset
    33
#include "hsconfiguration.h"
hgs
parents:
diff changeset
    34
#include "hswidgettoucharea.h"
hgs
parents:
diff changeset
    35
hgs
parents:
diff changeset
    36
hgs
parents:
diff changeset
    37
/*!
hgs
parents:
diff changeset
    38
    \class HsWidgetHostVisual
hgs
parents:
diff changeset
    39
    \ingroup group_hsdomainmodel
hgs
parents:
diff changeset
    40
    \brief Each widget is controlled by the home screen framework through a widget host.
hgs
parents:
diff changeset
    41
*/
hgs
parents:
diff changeset
    42
hgs
parents:
diff changeset
    43
/*!
hgs
parents:
diff changeset
    44
    Constructs a new widget host with given \a databaseId and
hgs
parents:
diff changeset
    45
    \a parent item.
hgs
parents:
diff changeset
    46
*/
hgs
parents:
diff changeset
    47
HsWidgetHostVisual::HsWidgetHostVisual(QGraphicsItem *parent)
hgs
parents:
diff changeset
    48
  : HbWidget(parent),mWidget(0)
hgs
parents:
diff changeset
    49
  
hgs
parents:
diff changeset
    50
{
hgs
parents:
diff changeset
    51
    setFlag(QGraphicsItem::ItemClipsChildrenToShape);
hgs
parents:
diff changeset
    52
    setFlag(QGraphicsItem::ItemHasNoContents);
101
hgs
parents: 90
diff changeset
    53
    setFlag(QGraphicsItem::ItemIsPanel);
hgs
parents: 90
diff changeset
    54
    
69
hgs
parents:
diff changeset
    55
    grabGesture(Qt::PanGesture);
hgs
parents:
diff changeset
    56
    
hgs
parents:
diff changeset
    57
    setupTouchArea();
hgs
parents:
diff changeset
    58
    setupEffects();
hgs
parents:
diff changeset
    59
    
hgs
parents:
diff changeset
    60
    setMinimumSize(HSCONFIGURATION_GET(minimumWidgetSizeInPixels));
hgs
parents:
diff changeset
    61
    setMaximumSize(HSCONFIGURATION_GET(maximumWidgetSizeInPixels));
101
hgs
parents: 90
diff changeset
    62
69
hgs
parents:
diff changeset
    63
}
hgs
parents:
diff changeset
    64
hgs
parents:
diff changeset
    65
/*!
hgs
parents:
diff changeset
    66
    Destructor.
hgs
parents:
diff changeset
    67
*/
hgs
parents:
diff changeset
    68
HsWidgetHostVisual::~HsWidgetHostVisual()
hgs
parents:
diff changeset
    69
{
hgs
parents:
diff changeset
    70
}
hgs
parents:
diff changeset
    71
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
/*!
hgs
parents:
diff changeset
    74
    Reimplemented from QGraphicsItem. Returns the shape of the
hgs
parents:
diff changeset
    75
    this widget host. The shape is computed based on the contained
hgs
parents:
diff changeset
    76
    widget.
hgs
parents:
diff changeset
    77
*/
hgs
parents:
diff changeset
    78
QPainterPath HsWidgetHostVisual::shape() const
hgs
parents:
diff changeset
    79
{
hgs
parents:
diff changeset
    80
    QPainterPath path;
hgs
parents:
diff changeset
    81
hgs
parents:
diff changeset
    82
    if (mWidget) {
90
hgs
parents: 69
diff changeset
    83
        QRectF visualRect = rect();
69
hgs
parents:
diff changeset
    84
        path = mWidget->shape();
hgs
parents:
diff changeset
    85
90
hgs
parents: 69
diff changeset
    86
        QRectF widgetRect(path.boundingRect());
hgs
parents: 69
diff changeset
    87
        if (widgetRect.width() > visualRect.width()
hgs
parents: 69
diff changeset
    88
            || widgetRect.height() > visualRect.height()) {
hgs
parents: 69
diff changeset
    89
            QPainterPath newPath;
hgs
parents: 69
diff changeset
    90
            newPath.addRect(visualRect);
hgs
parents: 69
diff changeset
    91
            path = path.intersected(newPath);
hgs
parents: 69
diff changeset
    92
        } else if ( widgetRect.isEmpty() ) {
hgs
parents: 69
diff changeset
    93
            path.addRect(visualRect);
hgs
parents: 69
diff changeset
    94
        }
69
hgs
parents:
diff changeset
    95
hgs
parents:
diff changeset
    96
    }
hgs
parents:
diff changeset
    97
    return path;
hgs
parents:
diff changeset
    98
}
hgs
parents:
diff changeset
    99
void HsWidgetHostVisual::setWidget(QObject *widget)
hgs
parents:
diff changeset
   100
{
hgs
parents:
diff changeset
   101
    mWidget = qobject_cast<QGraphicsWidget *>(widget);
hgs
parents:
diff changeset
   102
    if (mWidget) {
hgs
parents:
diff changeset
   103
        mWidget->installEventFilter(this);
hgs
parents:
diff changeset
   104
        mWidget->setParentItem(this);
hgs
parents:
diff changeset
   105
        setNewSize(mWidget->size());
hgs
parents:
diff changeset
   106
    }
hgs
parents:
diff changeset
   107
}
hgs
parents:
diff changeset
   108
hgs
parents:
diff changeset
   109
void HsWidgetHostVisual::setVisualModel(HsWidgetHost *model)
hgs
parents:
diff changeset
   110
{
hgs
parents:
diff changeset
   111
    mVisualModel = model;
hgs
parents:
diff changeset
   112
}
hgs
parents:
diff changeset
   113
HsWidgetHost *HsWidgetHostVisual::visualModel() const
hgs
parents:
diff changeset
   114
{
hgs
parents:
diff changeset
   115
    return mVisualModel;
hgs
parents:
diff changeset
   116
}
hgs
parents:
diff changeset
   117
/*!
hgs
parents:
diff changeset
   118
    Starts the drag effect.
hgs
parents:
diff changeset
   119
*/
hgs
parents:
diff changeset
   120
void HsWidgetHostVisual::startDragEffect()
hgs
parents:
diff changeset
   121
{
hgs
parents:
diff changeset
   122
    /* TODO: Uncomment after the Qt bug has been fixed.
hgs
parents:
diff changeset
   123
    QGraphicsDropShadowEffect *effect =
hgs
parents:
diff changeset
   124
        static_cast<QGraphicsDropShadowEffect *>(graphicsEffect());
hgs
parents:
diff changeset
   125
    */
hgs
parents:
diff changeset
   126
    HbInstantFeedback::play(HbFeedback::ItemPick);
hgs
parents:
diff changeset
   127
hgs
parents:
diff changeset
   128
    setTransformOriginPoint(rect().center());
hgs
parents:
diff changeset
   129
hgs
parents:
diff changeset
   130
    QParallelAnimationGroup *animationGroup = new QParallelAnimationGroup();
hgs
parents:
diff changeset
   131
hgs
parents:
diff changeset
   132
    QPropertyAnimation *animation = new QPropertyAnimation(this, "scale");
hgs
parents:
diff changeset
   133
    animation->setDuration(HSCONFIGURATION_GET(widgetDragEffectDuration));
hgs
parents:
diff changeset
   134
    animation->setEndValue(1.1);
hgs
parents:
diff changeset
   135
    animationGroup->addAnimation(animation);
hgs
parents:
diff changeset
   136
hgs
parents:
diff changeset
   137
    /* TODO: Uncomment after the Qt bug has been fixed.
hgs
parents:
diff changeset
   138
    animation = new QPropertyAnimation(effect, "offset");
hgs
parents:
diff changeset
   139
    animation->setDuration(200);
hgs
parents:
diff changeset
   140
    animation->setEndValue(QPointF(8 ,8));
hgs
parents:
diff changeset
   141
    animationGroup->addAnimation(animation);
hgs
parents:
diff changeset
   142
    */
hgs
parents:
diff changeset
   143
hgs
parents:
diff changeset
   144
    animationGroup->start(QAbstractAnimation::DeleteWhenStopped);
hgs
parents:
diff changeset
   145
}
hgs
parents:
diff changeset
   146
hgs
parents:
diff changeset
   147
/*!
hgs
parents:
diff changeset
   148
    Starts the drop effect.
hgs
parents:
diff changeset
   149
*/
hgs
parents:
diff changeset
   150
void HsWidgetHostVisual::startDropEffect()
hgs
parents:
diff changeset
   151
{
hgs
parents:
diff changeset
   152
    /* TODO: Uncomment after the Qt bug has been fixed.
hgs
parents:
diff changeset
   153
    QGraphicsDropShadowEffect *effect =
hgs
parents:
diff changeset
   154
        static_cast<QGraphicsDropShadowEffect *>(graphicsEffect());
hgs
parents:
diff changeset
   155
    */
hgs
parents:
diff changeset
   156
    HbInstantFeedback::play(HbFeedback::ItemDrop);
hgs
parents:
diff changeset
   157
hgs
parents:
diff changeset
   158
    QParallelAnimationGroup *animationGroup = new QParallelAnimationGroup;
hgs
parents:
diff changeset
   159
hgs
parents:
diff changeset
   160
    QPropertyAnimation *animation = new QPropertyAnimation(this, "scale");
hgs
parents:
diff changeset
   161
    animation->setDuration(HSCONFIGURATION_GET(widgetDropEffectDuration));
hgs
parents:
diff changeset
   162
    animation->setEndValue(1);
hgs
parents:
diff changeset
   163
    animationGroup->addAnimation(animation);
hgs
parents:
diff changeset
   164
hgs
parents:
diff changeset
   165
    /* TODO: Uncomment after the Qt bug has been fixed.
hgs
parents:
diff changeset
   166
    animation = new QPropertyAnimation(effect, "offset");
hgs
parents:
diff changeset
   167
    animation->setDuration(200);
hgs
parents:
diff changeset
   168
    animation->setEndValue(QPointF(3, 3));
hgs
parents:
diff changeset
   169
    animationGroup->addAnimation(animation);
hgs
parents:
diff changeset
   170
    */
hgs
parents:
diff changeset
   171
hgs
parents:
diff changeset
   172
    animationGroup->start(QAbstractAnimation::DeleteWhenStopped);
hgs
parents:
diff changeset
   173
}
hgs
parents:
diff changeset
   174
/*!
hgs
parents:
diff changeset
   175
    \fn HsWidgetHost::resized()
hgs
parents:
diff changeset
   176
    Notifies the home screen framework that this widget
hgs
parents:
diff changeset
   177
    host has resized itself.
hgs
parents:
diff changeset
   178
*/
hgs
parents:
diff changeset
   179
hgs
parents:
diff changeset
   180
/*!
hgs
parents:
diff changeset
   181
    Reimplemented from QObject for monitoring changes in 
hgs
parents:
diff changeset
   182
    contained widget's size.
hgs
parents:
diff changeset
   183
*/
hgs
parents:
diff changeset
   184
bool HsWidgetHostVisual::eventFilter(QObject *watched, QEvent *event)
hgs
parents:
diff changeset
   185
{
hgs
parents:
diff changeset
   186
    if (event->type() == QEvent::GraphicsSceneResize ) {
hgs
parents:
diff changeset
   187
        QGraphicsSceneResizeEvent *resizeEvent = 
hgs
parents:
diff changeset
   188
            static_cast<QGraphicsSceneResizeEvent *>(event);
hgs
parents:
diff changeset
   189
        setNewSize(resizeEvent->newSize());
hgs
parents:
diff changeset
   190
        emit resized();
hgs
parents:
diff changeset
   191
    }
hgs
parents:
diff changeset
   192
    return HbWidget::eventFilter(watched, event);
hgs
parents:
diff changeset
   193
}
hgs
parents:
diff changeset
   194
hgs
parents:
diff changeset
   195
/*!
hgs
parents:
diff changeset
   196
    Reimplemented from HbWidget for pan gesture handling.
hgs
parents:
diff changeset
   197
*/
hgs
parents:
diff changeset
   198
void HsWidgetHostVisual::gestureEvent(QGestureEvent *event)
hgs
parents:
diff changeset
   199
{
hgs
parents:
diff changeset
   200
    HsScene *scene = HsScene::instance();    
hgs
parents:
diff changeset
   201
    QGesture *gesture = event->gesture(Qt::PanGesture);
hgs
parents:
diff changeset
   202
    if (gesture) {
hgs
parents:
diff changeset
   203
        switch (gesture->state()) {
hgs
parents:
diff changeset
   204
            case Qt::GestureStarted:
hgs
parents:
diff changeset
   205
                grabMouse();
hgs
parents:
diff changeset
   206
                emit scene->pagePanStarted(event);
hgs
parents:
diff changeset
   207
                break;
hgs
parents:
diff changeset
   208
            case Qt::GestureUpdated:
hgs
parents:
diff changeset
   209
                emit scene->pagePanUpdated(event);
hgs
parents:
diff changeset
   210
                break;
hgs
parents:
diff changeset
   211
            case Qt::GestureFinished:
hgs
parents:
diff changeset
   212
            case Qt::GestureCanceled:
hgs
parents:
diff changeset
   213
                ungrabMouse();
hgs
parents:
diff changeset
   214
                emit scene->pagePanFinished(event);
hgs
parents:
diff changeset
   215
                break;
hgs
parents:
diff changeset
   216
            default:
hgs
parents:
diff changeset
   217
                break;
hgs
parents:
diff changeset
   218
        }
hgs
parents:
diff changeset
   219
    }
hgs
parents:
diff changeset
   220
}
hgs
parents:
diff changeset
   221
hgs
parents:
diff changeset
   222
/*!
hgs
parents:
diff changeset
   223
    \fn HsWidgetHostVisual::mousePressEvent(QGraphicsSceneMouseEvent *)
hgs
parents:
diff changeset
   224
    Reimplemented from QGraphicsItem for eating all mouse presses.
hgs
parents:
diff changeset
   225
*/
hgs
parents:
diff changeset
   226
hgs
parents:
diff changeset
   227
/*!
hgs
parents:
diff changeset
   228
    Configures the touch are for this widget host.
hgs
parents:
diff changeset
   229
*/
hgs
parents:
diff changeset
   230
void HsWidgetHostVisual::setupTouchArea()
hgs
parents:
diff changeset
   231
{
hgs
parents:
diff changeset
   232
    mTouchArea = new HsWidgetTouchArea(this);
hgs
parents:
diff changeset
   233
    mTouchArea->setZValue(1);
hgs
parents:
diff changeset
   234
}
hgs
parents:
diff changeset
   235
hgs
parents:
diff changeset
   236
/*!
hgs
parents:
diff changeset
   237
    Configures the effects for this widget host.
hgs
parents:
diff changeset
   238
*/
hgs
parents:
diff changeset
   239
void HsWidgetHostVisual::setupEffects()
hgs
parents:
diff changeset
   240
{
hgs
parents:
diff changeset
   241
    /* TODO: Uncomment after the Qt bug has been fixed.
hgs
parents:
diff changeset
   242
    QGraphicsDropShadowEffect *effect =
hgs
parents:
diff changeset
   243
        new QGraphicsDropShadowEffect(this);
hgs
parents:
diff changeset
   244
    effect->setColor(QColor(0, 0, 0, 150));
hgs
parents:
diff changeset
   245
    effect->setBlurRadius(5);
hgs
parents:
diff changeset
   246
    effect->setOffset(3);
hgs
parents:
diff changeset
   247
    setGraphicsEffect(effect);
hgs
parents:
diff changeset
   248
    */
hgs
parents:
diff changeset
   249
}
hgs
parents:
diff changeset
   250
hgs
parents:
diff changeset
   251
hgs
parents:
diff changeset
   252
/*!
hgs
parents:
diff changeset
   253
    Resizes this widget host to the given \a size.
hgs
parents:
diff changeset
   254
*/
hgs
parents:
diff changeset
   255
void HsWidgetHostVisual::setNewSize(const QSizeF &size)
hgs
parents:
diff changeset
   256
{
hgs
parents:
diff changeset
   257
    mTouchArea->resize(size);
hgs
parents:
diff changeset
   258
    resize(size);
hgs
parents:
diff changeset
   259
    setPreferredSize(size);
hgs
parents:
diff changeset
   260
}
hgs
parents:
diff changeset
   261