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