ginebra2/ContentViews/WebContentAnimationItem.cpp
author hgs
Fri, 06 Aug 2010 17:23:08 -0400
changeset 9 b39122337a00
parent 3 0954f5dd2cd0
permissions -rw-r--r--
201031
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3
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
*
hgs
parents:
diff changeset
     5
* This program is free software: you can redistribute it and/or modify
hgs
parents:
diff changeset
     6
* it under the terms of the GNU Lesser General Public License as published by
hgs
parents:
diff changeset
     7
* the Free Software Foundation, version 2.1 of the License.
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* This program is distributed in the hope that it will be useful,
hgs
parents:
diff changeset
    10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
hgs
parents:
diff changeset
    11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
hgs
parents:
diff changeset
    12
* GNU Lesser General Public License for more details.
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* You should have received a copy of the GNU Lesser General Public License
hgs
parents:
diff changeset
    15
* along with this program.  If not,
hgs
parents:
diff changeset
    16
* see "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html/".
hgs
parents:
diff changeset
    17
*
hgs
parents:
diff changeset
    18
* Description:
hgs
parents:
diff changeset
    19
*
hgs
parents:
diff changeset
    20
*/
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
#include "WebContentAnimationItem.h"
hgs
parents:
diff changeset
    23
hgs
parents:
diff changeset
    24
#include <QGraphicsWebView>
hgs
parents:
diff changeset
    25
#include <QtGlobal>
hgs
parents:
diff changeset
    26
#include <QWebElement>
hgs
parents:
diff changeset
    27
#include <QWebFrame>
hgs
parents:
diff changeset
    28
hgs
parents:
diff changeset
    29
static const int MinDoubleClickZoomTargetWidth = 100;     //Target block width for applying double tap zoom
hgs
parents:
diff changeset
    30
static const int ZoomCommitDuration = 50;                 //Timeout before commiting zoom
hgs
parents:
diff changeset
    31
static const qreal ZoomableContentMinWidth = 300.;
hgs
parents:
diff changeset
    32
hgs
parents:
diff changeset
    33
namespace GVA {
hgs
parents:
diff changeset
    34
hgs
parents:
diff changeset
    35
WebContentAnimationItem::WebContentAnimationItem(QGraphicsWidget* parent, Qt::WindowFlags wFlags)
hgs
parents:
diff changeset
    36
    : QGraphicsWidget(parent, wFlags)
hgs
parents:
diff changeset
    37
    , m_zoomCommitTimer(this)
hgs
parents:
diff changeset
    38
    , m_viewportMetaData(0)
hgs
parents:
diff changeset
    39
{
hgs
parents:
diff changeset
    40
    setFlag(QGraphicsItem::ItemHasNoContents, true);
hgs
parents:
diff changeset
    41
    setFlag(QGraphicsItem::ItemClipsChildrenToShape, true);
hgs
parents:
diff changeset
    42
    setFlag(QGraphicsItem::ItemClipsToShape, true);
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
    setFiltersChildEvents(true);
hgs
parents:
diff changeset
    45
hgs
parents:
diff changeset
    46
    connect(&m_zoomCommitTimer, SIGNAL(timeout()), this, SLOT(commitZoom()));
hgs
parents:
diff changeset
    47
    m_zoomCommitTimer.setSingleShot(true);
hgs
parents:
diff changeset
    48
}
hgs
parents:
diff changeset
    49
hgs
parents:
diff changeset
    50
WebContentAnimationItem::~WebContentAnimationItem()
hgs
parents:
diff changeset
    51
{}
hgs
parents:
diff changeset
    52
hgs
parents:
diff changeset
    53
void WebContentAnimationItem::setWebView(QGraphicsWebView* webView)
hgs
parents:
diff changeset
    54
{
hgs
parents:
diff changeset
    55
    Q_ASSERT(m_webView);
hgs
parents:
diff changeset
    56
    m_webView = webView;
hgs
parents:
diff changeset
    57
hgs
parents:
diff changeset
    58
    //Enabling resize to contents avoids scrollbars in mainframe
hgs
parents:
diff changeset
    59
    m_webView->setResizesToContents(true);
hgs
parents:
diff changeset
    60
    m_webView->setParentItem(this);
hgs
parents:
diff changeset
    61
    m_webView->setAttribute(Qt::WA_OpaquePaintEvent, true);
hgs
parents:
diff changeset
    62
}
hgs
parents:
diff changeset
    63
hgs
parents:
diff changeset
    64
void WebContentAnimationItem::updatePreferredContentSize(const QSize& size)
hgs
parents:
diff changeset
    65
{
hgs
parents:
diff changeset
    66
    // FIXME: we have bug in QtWebKit API when tileCacheEnabled is true.
hgs
parents:
diff changeset
    67
    // this causes viewport not to reset between the page loads.
hgs
parents:
diff changeset
    68
    // Thus, we need to update viewport manually until we have fix for this.
hgs
parents:
diff changeset
    69
hgs
parents:
diff changeset
    70
    m_webView->page()->setPreferredContentsSize(size);
hgs
parents:
diff changeset
    71
    resize(contentsSize());
hgs
parents:
diff changeset
    72
}
hgs
parents:
diff changeset
    73
hgs
parents:
diff changeset
    74
QSize WebContentAnimationItem::contentsSize() const
hgs
parents:
diff changeset
    75
{
hgs
parents:
diff changeset
    76
    return m_webView->page()->mainFrame()->contentsSize();
hgs
parents:
diff changeset
    77
}
hgs
parents:
diff changeset
    78
hgs
parents:
diff changeset
    79
void WebContentAnimationItem::setZoomScale(qreal value, bool immediateCommit)
hgs
parents:
diff changeset
    80
{
hgs
parents:
diff changeset
    81
    value = qBound(m_viewportMetaData->m_minimumScale, value, m_viewportMetaData->m_maximumScale);
hgs
parents:
diff changeset
    82
    qreal curZoomScale = zoomScale();
hgs
parents:
diff changeset
    83
hgs
parents:
diff changeset
    84
    if (qFuzzyCompare(value, curZoomScale)) {
hgs
parents:
diff changeset
    85
        notifyZoomActions(curZoomScale);
hgs
parents:
diff changeset
    86
        return;
hgs
parents:
diff changeset
    87
    }
hgs
parents:
diff changeset
    88
hgs
parents:
diff changeset
    89
    if (!immediateCommit)
hgs
parents:
diff changeset
    90
        disableContentUpdates();
hgs
parents:
diff changeset
    91
hgs
parents:
diff changeset
    92
    m_webView->setScale(value);
hgs
parents:
diff changeset
    93
hgs
parents:
diff changeset
    94
    if (immediateCommit)
hgs
parents:
diff changeset
    95
        commitZoom();
hgs
parents:
diff changeset
    96
    else
hgs
parents:
diff changeset
    97
        m_zoomCommitTimer.start(ZoomCommitDuration);
hgs
parents:
diff changeset
    98
}
hgs
parents:
diff changeset
    99
hgs
parents:
diff changeset
   100
qreal WebContentAnimationItem::zoomScale() const
hgs
parents:
diff changeset
   101
{
hgs
parents:
diff changeset
   102
    if (!m_webView)
hgs
parents:
diff changeset
   103
        return 1.;
hgs
parents:
diff changeset
   104
hgs
parents:
diff changeset
   105
    return m_webView->scale();
hgs
parents:
diff changeset
   106
}
hgs
parents:
diff changeset
   107
hgs
parents:
diff changeset
   108
QRectF WebContentAnimationItem::findZoomableRectForPoint(const QPointF& point)
hgs
parents:
diff changeset
   109
{
hgs
parents:
diff changeset
   110
    QPointF zoomPoint = m_webView->mapFromParent(point);
hgs
parents:
diff changeset
   111
hgs
parents:
diff changeset
   112
    QWebHitTestResult hitResult = m_webView->page()->mainFrame()->hitTestContent(zoomPoint.toPoint());
hgs
parents:
diff changeset
   113
    QWebElement targetElement = hitResult.enclosingBlockElement();
hgs
parents:
diff changeset
   114
hgs
parents:
diff changeset
   115
    while (!targetElement.isNull() && targetElement.geometry().width() < MinDoubleClickZoomTargetWidth)
hgs
parents:
diff changeset
   116
        targetElement = targetElement.parent();
hgs
parents:
diff changeset
   117
hgs
parents:
diff changeset
   118
    if (!targetElement.isNull()) {
hgs
parents:
diff changeset
   119
        QRectF elementRect = targetElement.geometry();
hgs
parents:
diff changeset
   120
        qreal overMinWidth = elementRect.width() - ZoomableContentMinWidth;
hgs
parents:
diff changeset
   121
        if (overMinWidth < 0)
hgs
parents:
diff changeset
   122
            elementRect.adjust(overMinWidth / 2, 0, -overMinWidth / 2, 0);
hgs
parents:
diff changeset
   123
        zoomPoint.setX(elementRect.x());
hgs
parents:
diff changeset
   124
        QRectF resultRect(zoomPoint, elementRect.size());
hgs
parents:
diff changeset
   125
        return QRectF(m_webView->mapToParent(resultRect.topLeft()),
hgs
parents:
diff changeset
   126
                      m_webView->mapToParent(resultRect.bottomRight()));
hgs
parents:
diff changeset
   127
    }
hgs
parents:
diff changeset
   128
    return QRectF();
hgs
parents:
diff changeset
   129
}
hgs
parents:
diff changeset
   130
hgs
parents:
diff changeset
   131
void WebContentAnimationItem::disableContentUpdates()
hgs
parents:
diff changeset
   132
{
hgs
parents:
diff changeset
   133
    //Disable tiling updates
hgs
parents:
diff changeset
   134
    m_webView->setTiledBackingStoreFrozen(true);
hgs
parents:
diff changeset
   135
}
hgs
parents:
diff changeset
   136
hgs
parents:
diff changeset
   137
void WebContentAnimationItem::enableContentUpdates()
hgs
parents:
diff changeset
   138
{
hgs
parents:
diff changeset
   139
    //Enable tiling updates
hgs
parents:
diff changeset
   140
    m_webView->setTiledBackingStoreFrozen(false);
hgs
parents:
diff changeset
   141
}
hgs
parents:
diff changeset
   142
hgs
parents:
diff changeset
   143
void WebContentAnimationItem::commitZoom()
hgs
parents:
diff changeset
   144
{
hgs
parents:
diff changeset
   145
    m_zoomCommitTimer.stop();
hgs
parents:
diff changeset
   146
    notifyZoomActions(zoomScale());
hgs
parents:
diff changeset
   147
    enableContentUpdates();
hgs
parents:
diff changeset
   148
}
hgs
parents:
diff changeset
   149
hgs
parents:
diff changeset
   150
void WebContentAnimationItem::resizeEvent(QGraphicsSceneResizeEvent* event)
hgs
parents:
diff changeset
   151
{
hgs
parents:
diff changeset
   152
    QGraphicsWidget::resizeEvent(event);
hgs
parents:
diff changeset
   153
    setZoomScale(size().width() / contentsSize().width());
hgs
parents:
diff changeset
   154
}
hgs
parents:
diff changeset
   155
hgs
parents:
diff changeset
   156
void WebContentAnimationItem::notifyZoomActions(qreal newScale)
hgs
parents:
diff changeset
   157
{
hgs
parents:
diff changeset
   158
    bool enableZoomIn = false;
hgs
parents:
diff changeset
   159
    bool enableZoomOut = false;
hgs
parents:
diff changeset
   160
hgs
parents:
diff changeset
   161
    if (m_viewportMetaData->m_userScalable) {
hgs
parents:
diff changeset
   162
hgs
parents:
diff changeset
   163
        if (newScale > m_viewportMetaData->m_minimumScale)
hgs
parents:
diff changeset
   164
            enableZoomOut = true;
hgs
parents:
diff changeset
   165
        else
hgs
parents:
diff changeset
   166
            enableZoomOut = false;
hgs
parents:
diff changeset
   167
hgs
parents:
diff changeset
   168
        if (newScale < m_viewportMetaData->m_maximumScale)
hgs
parents:
diff changeset
   169
            enableZoomIn = true;
hgs
parents:
diff changeset
   170
        else
hgs
parents:
diff changeset
   171
            enableZoomIn = false;
hgs
parents:
diff changeset
   172
	} 
hgs
parents:
diff changeset
   173
hgs
parents:
diff changeset
   174
    emit updateZoomActions(enableZoomIn, enableZoomOut);
hgs
parents:
diff changeset
   175
}
hgs
parents:
diff changeset
   176
hgs
parents:
diff changeset
   177
} //namespace GVA