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