ginebra2/ContentViews/ViewportMetaData.cpp
author hgs
Fri, 15 Oct 2010 17:30:59 -0400
changeset 16 3c88a81ff781
parent 3 0954f5dd2cd0
permissions -rw-r--r--
201041
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 "ViewportMetaData.h"
16
hgs
parents: 3
diff changeset
    23
#include <QApplication>
hgs
parents: 3
diff changeset
    24
#include <QDesktopWidget>
hgs
parents: 3
diff changeset
    25
#include "WebGestureHelper.h"
3
hgs
parents:
diff changeset
    26
16
hgs
parents: 3
diff changeset
    27
3
hgs
parents:
diff changeset
    28
static const int MinViewportWidth = 200;
hgs
parents:
diff changeset
    29
static const int MaxViewportWidth = 10000;
hgs
parents:
diff changeset
    30
static const int MinViewportHeight = 200;
hgs
parents:
diff changeset
    31
static const int MaxViewportHeight = 10000;
hgs
parents:
diff changeset
    32
static const qreal DefaultMinScale = 0.2;
16
hgs
parents: 3
diff changeset
    33
static const qreal DefaultMaxScale = 3.;
hgs
parents: 3
diff changeset
    34
static const qreal DefaultPageLayoutScale = 0.667;
3
hgs
parents:
diff changeset
    35
hgs
parents:
diff changeset
    36
namespace GVA {
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
ViewportMetaData::ViewportMetaData()
hgs
parents:
diff changeset
    39
{
16
hgs
parents: 3
diff changeset
    40
    #ifndef Q_WS_MAEMO_5
hgs
parents: 3
diff changeset
    41
    QRect screenGeom = browserApp->mainWindow()->geometry();
hgs
parents: 3
diff changeset
    42
    m_defaultViewportWidth = screenGeom.width();
hgs
parents: 3
diff changeset
    43
    m_defaultViewportHeight = screenGeom.height();
hgs
parents: 3
diff changeset
    44
    #else
hgs
parents: 3
diff changeset
    45
    m_defaultViewportWidth = 700;
hgs
parents: 3
diff changeset
    46
    m_defaultViewportHeight = 400;
hgs
parents: 3
diff changeset
    47
    #endif
hgs
parents: 3
diff changeset
    48
    m_maxViewportWidth = m_defaultViewportWidth;
hgs
parents: 3
diff changeset
    49
    m_maxViewportHeight = m_defaultViewportHeight;
3
hgs
parents:
diff changeset
    50
    initialize();
hgs
parents:
diff changeset
    51
}
hgs
parents:
diff changeset
    52
hgs
parents:
diff changeset
    53
ViewportMetaData::ViewportMetaData(const ViewportMetaData& other)
hgs
parents:
diff changeset
    54
{
hgs
parents:
diff changeset
    55
    m_initialScale = other.m_initialScale;
hgs
parents:
diff changeset
    56
    m_minimumScale = other.m_minimumScale;
hgs
parents:
diff changeset
    57
    m_maximumScale = other.m_maximumScale;
hgs
parents:
diff changeset
    58
    m_width = other.m_width;
hgs
parents:
diff changeset
    59
    m_height = other.m_height;
hgs
parents:
diff changeset
    60
    m_userScalable = other.m_userScalable;
hgs
parents:
diff changeset
    61
    m_isValid = other.m_isValid;
hgs
parents:
diff changeset
    62
    m_scaleLimits = other.m_scaleLimits;
hgs
parents:
diff changeset
    63
    m_specifiedData.m_width = other.m_specifiedData.m_width;
hgs
parents:
diff changeset
    64
    m_specifiedData.m_height = other.m_specifiedData.m_height;
hgs
parents:
diff changeset
    65
    m_specifiedData.m_minScale = other.m_specifiedData.m_minScale;
16
hgs
parents: 3
diff changeset
    66
#ifdef VIEWPORT_ALWAYS_ALLOW_ZOOMING
hgs
parents: 3
diff changeset
    67
    m_userScalableOverRidden = other.m_userScalableOverRidden;
hgs
parents: 3
diff changeset
    68
#endif
3
hgs
parents:
diff changeset
    69
}
hgs
parents:
diff changeset
    70
hgs
parents:
diff changeset
    71
ViewportMetaData& ViewportMetaData::operator=(const ViewportMetaData& other)
hgs
parents:
diff changeset
    72
{
hgs
parents:
diff changeset
    73
    m_initialScale = other.m_initialScale;
hgs
parents:
diff changeset
    74
    m_minimumScale = other.m_minimumScale;
hgs
parents:
diff changeset
    75
    m_maximumScale = other.m_maximumScale;
hgs
parents:
diff changeset
    76
    m_width = other.m_width;
hgs
parents:
diff changeset
    77
    m_height = other.m_height;
hgs
parents:
diff changeset
    78
    m_userScalable = other.m_userScalable;
hgs
parents:
diff changeset
    79
    m_isValid = other.m_isValid;
hgs
parents:
diff changeset
    80
    m_scaleLimits = other.m_scaleLimits;
hgs
parents:
diff changeset
    81
    m_specifiedData.m_width = other.m_specifiedData.m_width;
hgs
parents:
diff changeset
    82
    m_specifiedData.m_height = other.m_specifiedData.m_height;
hgs
parents:
diff changeset
    83
    m_specifiedData.m_minScale = other.m_specifiedData.m_minScale;
16
hgs
parents: 3
diff changeset
    84
#ifdef VIEWPORT_ALWAYS_ALLOW_ZOOMING
hgs
parents: 3
diff changeset
    85
    m_userScalableOverRidden = other.m_userScalableOverRidden;
hgs
parents: 3
diff changeset
    86
#endif
3
hgs
parents:
diff changeset
    87
hgs
parents:
diff changeset
    88
    return *this;
hgs
parents:
diff changeset
    89
}
hgs
parents:
diff changeset
    90
hgs
parents:
diff changeset
    91
ViewportMetaData::~ViewportMetaData()
hgs
parents:
diff changeset
    92
{}
hgs
parents:
diff changeset
    93
16
hgs
parents: 3
diff changeset
    94
QSize ViewportMetaData::getSpecifiedSize() const
hgs
parents: 3
diff changeset
    95
{
hgs
parents: 3
diff changeset
    96
    QSize ret(m_maxViewportWidth / DefaultPageLayoutScale,
hgs
parents: 3
diff changeset
    97
              m_maxViewportHeight / DefaultPageLayoutScale);
hgs
parents: 3
diff changeset
    98
    if(m_initialScale > 0)
hgs
parents: 3
diff changeset
    99
        ret = QSize(m_maxViewportWidth / m_initialScale,
hgs
parents: 3
diff changeset
   100
                    m_maxViewportHeight / m_initialScale);
hgs
parents: 3
diff changeset
   101
hgs
parents: 3
diff changeset
   102
    // assign specified data and swap if necessary
hgs
parents: 3
diff changeset
   103
    if(!m_specifiedData.m_width.isEmpty() && m_specifiedData.m_width != "device-width") {
hgs
parents: 3
diff changeset
   104
hgs
parents: 3
diff changeset
   105
        if(m_specifiedData.m_width == "device-height")
hgs
parents: 3
diff changeset
   106
            ret.setWidth(m_maxViewportHeight);
hgs
parents: 3
diff changeset
   107
        else
hgs
parents: 3
diff changeset
   108
            ret.setWidth(m_specifiedData.m_width.toInt());
hgs
parents: 3
diff changeset
   109
    }
hgs
parents: 3
diff changeset
   110
hgs
parents: 3
diff changeset
   111
    if(!m_specifiedData.m_height.isEmpty() && m_specifiedData.m_height != "device-height") {
hgs
parents: 3
diff changeset
   112
        if(m_specifiedData.m_height == "device-width")
hgs
parents: 3
diff changeset
   113
            ret.setHeight(m_maxViewportWidth);
hgs
parents: 3
diff changeset
   114
        else
hgs
parents: 3
diff changeset
   115
            ret.setHeight(m_specifiedData.m_height.toInt());
hgs
parents: 3
diff changeset
   116
    }
hgs
parents: 3
diff changeset
   117
hgs
parents: 3
diff changeset
   118
    return ret;
hgs
parents: 3
diff changeset
   119
}
hgs
parents: 3
diff changeset
   120
hgs
parents: 3
diff changeset
   121
void ViewportMetaData::adjustViewportData(const QSizeF& clientRect)
3
hgs
parents:
diff changeset
   122
{
hgs
parents:
diff changeset
   123
    //Data updated from viewport tag
hgs
parents:
diff changeset
   124
    m_isValid = true;
hgs
parents:
diff changeset
   125
16
hgs
parents: 3
diff changeset
   126
    m_maxViewportWidth = clientRect.width();
hgs
parents: 3
diff changeset
   127
    m_maxViewportHeight = clientRect.height();
hgs
parents: 3
diff changeset
   128
hgs
parents: 3
diff changeset
   129
    QSize s = getSpecifiedSize();
hgs
parents: 3
diff changeset
   130
hgs
parents: 3
diff changeset
   131
//    if((m_maxViewportWidth > m_maxViewportHeight && m_width < m_height) ||
hgs
parents: 3
diff changeset
   132
//       (m_maxViewportWidth < m_maxViewportHeight && m_width > m_height))
hgs
parents: 3
diff changeset
   133
//        qSwap(m_width,m_height);
hgs
parents: 3
diff changeset
   134
hgs
parents: 3
diff changeset
   135
/*
3
hgs
parents:
diff changeset
   136
    //Adjust viewport dimensions
16
hgs
parents: 3
diff changeset
   137
    m_width = qBound(MinViewportWidth, m_width, m_maxViewportWidth);
hgs
parents: 3
diff changeset
   138
    m_height = qBound(MinViewportHeight, m_height, m_maxViewportHeight);
3
hgs
parents:
diff changeset
   139
hgs
parents:
diff changeset
   140
    //Aspect ratio
hgs
parents:
diff changeset
   141
    qreal aspectRation = (qreal)clientRect.width() / clientRect.height();
hgs
parents:
diff changeset
   142
16
hgs
parents: 3
diff changeset
   143
    if (m_width != m_maxViewportWidth && m_height == m_maxViewportHeight) {
3
hgs
parents:
diff changeset
   144
        //Width has been specified. Adjust height, min scale and max scale
hgs
parents:
diff changeset
   145
        m_height = m_width * (1 / aspectRation);
16
hgs
parents: 3
diff changeset
   146
    } else if (m_width == m_maxViewportWidth && m_height != m_maxViewportHeight) {
3
hgs
parents:
diff changeset
   147
        //Height has been specified. Adjust width, min scale and max scale
hgs
parents:
diff changeset
   148
        m_width = m_height * aspectRation;
hgs
parents:
diff changeset
   149
    } else {
hgs
parents:
diff changeset
   150
        //Putting below code under seperate 'else' to make it readable!
hgs
parents:
diff changeset
   151
        m_height = m_width * (1 / aspectRation);
hgs
parents:
diff changeset
   152
    }
16
hgs
parents: 3
diff changeset
   153
*/
hgs
parents: 3
diff changeset
   154
    m_width = qBound(MinViewportWidth, s.width(), m_maxViewportWidth);
hgs
parents: 3
diff changeset
   155
    m_height = qBound(MinViewportHeight, s.height(), m_maxViewportHeight);
3
hgs
parents:
diff changeset
   156
}
hgs
parents:
diff changeset
   157
16
hgs
parents: 3
diff changeset
   158
hgs
parents: 3
diff changeset
   159
void ViewportMetaData::orientationChanged(const QSizeF& newClientRect)
3
hgs
parents:
diff changeset
   160
{
16
hgs
parents: 3
diff changeset
   161
    /*
3
hgs
parents:
diff changeset
   162
    //If still viewport tag has not been parsed
hgs
parents:
diff changeset
   163
    //Do not update values.
hgs
parents:
diff changeset
   164
    if(!m_isValid)
hgs
parents:
diff changeset
   165
        return;
hgs
parents:
diff changeset
   166
hgs
parents:
diff changeset
   167
    //Aspect ratio
hgs
parents:
diff changeset
   168
    qreal aspectRation = (qreal)newClientRect.width() / newClientRect.height();
hgs
parents:
diff changeset
   169
hgs
parents:
diff changeset
   170
    //Update with viewport dimensions
hgs
parents:
diff changeset
   171
    if (m_specifiedData.m_width.length()) {
hgs
parents:
diff changeset
   172
        if (QString::compare(m_specifiedData.m_width, "device-width", Qt::CaseInsensitive) == 0)
hgs
parents:
diff changeset
   173
            m_width = newClientRect.width();
hgs
parents:
diff changeset
   174
        else if(QString::compare(m_specifiedData.m_width, "device-height", Qt::CaseInsensitive) == 0)
hgs
parents:
diff changeset
   175
            m_width = newClientRect.height();
hgs
parents:
diff changeset
   176
hgs
parents:
diff changeset
   177
        m_height = m_width * (1 / aspectRation);
hgs
parents:
diff changeset
   178
    }
hgs
parents:
diff changeset
   179
hgs
parents:
diff changeset
   180
    //Check if width has not bee specified.
hgs
parents:
diff changeset
   181
    if (!m_specifiedData.m_width.length()) {
hgs
parents:
diff changeset
   182
        if (QString::compare(m_specifiedData.m_height, "device-width", Qt::CaseInsensitive) == 0)
hgs
parents:
diff changeset
   183
            m_height = newClientRect.width();
hgs
parents:
diff changeset
   184
        else if(QString::compare(m_specifiedData.m_height, "device-height", Qt::CaseInsensitive) == 0)
hgs
parents:
diff changeset
   185
            m_height = newClientRect.height();
hgs
parents:
diff changeset
   186
hgs
parents:
diff changeset
   187
        m_width = m_height * aspectRation;
hgs
parents:
diff changeset
   188
    }
hgs
parents:
diff changeset
   189
hgs
parents:
diff changeset
   190
    //Update with bounds
16
hgs
parents: 3
diff changeset
   191
    //m_width = qBound(MinViewportWidth, m_width, m_maxViewportWidth);
hgs
parents: 3
diff changeset
   192
    //m_height = qBound(MinViewportHeight, m_height, m_maxViewportHeight);
hgs
parents: 3
diff changeset
   193
     
hgs
parents: 3
diff changeset
   194
     */
hgs
parents: 3
diff changeset
   195
hgs
parents: 3
diff changeset
   196
    m_width = newClientRect.height();
hgs
parents: 3
diff changeset
   197
    m_height = newClientRect.width();
hgs
parents: 3
diff changeset
   198
3
hgs
parents:
diff changeset
   199
}
hgs
parents:
diff changeset
   200
hgs
parents:
diff changeset
   201
bool ViewportMetaData::isLayoutNeeded()
hgs
parents:
diff changeset
   202
{
hgs
parents:
diff changeset
   203
    if (!isUserSpecifiedWidth() || !isUserSpecifiedHeight())
hgs
parents:
diff changeset
   204
        return true;
hgs
parents:
diff changeset
   205
    return false;
hgs
parents:
diff changeset
   206
}
hgs
parents:
diff changeset
   207
void ViewportMetaData::initialize()
hgs
parents:
diff changeset
   208
{
hgs
parents:
diff changeset
   209
    m_initialScale = ValueUndefined;
hgs
parents:
diff changeset
   210
    m_minimumScale = DefaultMinScale;
hgs
parents:
diff changeset
   211
    m_maximumScale = DefaultMaxScale;
16
hgs
parents: 3
diff changeset
   212
    m_width = m_maxViewportWidth; //m_defaultViewportWidth;
hgs
parents: 3
diff changeset
   213
    m_height = m_maxViewportHeight; //m_defaultViewportHeight;
3
hgs
parents:
diff changeset
   214
    m_userScalable = true;
hgs
parents:
diff changeset
   215
    m_isValid = false;
16
hgs
parents: 3
diff changeset
   216
#ifdef VIEWPORT_ALWAYS_ALLOW_ZOOMING
hgs
parents: 3
diff changeset
   217
    m_userScalableOverRidden = false;
hgs
parents: 3
diff changeset
   218
#endif
3
hgs
parents:
diff changeset
   219
hgs
parents:
diff changeset
   220
    //Clear user defined scales
hgs
parents:
diff changeset
   221
    setFlag(UserDefinedMinumumScale, false);
hgs
parents:
diff changeset
   222
    setFlag(UserDefinedMaximumScale, false);
hgs
parents:
diff changeset
   223
    setFlag(UserDefinedInitialScale, false);
16
hgs
parents: 3
diff changeset
   224
    m_specifiedData.m_minScale = -1;
3
hgs
parents:
diff changeset
   225
}
hgs
parents:
diff changeset
   226
16
hgs
parents: 3
diff changeset
   227
void ViewportMetaData::adjustZoomValues(const QSizeF& contentSize)
3
hgs
parents:
diff changeset
   228
{
16
hgs
parents: 3
diff changeset
   229
    qreal fitToWidthZoom = m_width / (qreal)contentSize.width();
3
hgs
parents:
diff changeset
   230
    fitToWidthZoom = qBound(DefaultMinScale, fitToWidthZoom, DefaultMaxScale);
hgs
parents:
diff changeset
   231
hgs
parents:
diff changeset
   232
    m_maximumScale = qBound(fitToWidthZoom, m_maximumScale, DefaultMaxScale);
hgs
parents:
diff changeset
   233
16
hgs
parents: 3
diff changeset
   234
    //Adjust minimum-scale
3
hgs
parents:
diff changeset
   235
    if (getFlag(UserDefinedMinumumScale)) {
hgs
parents:
diff changeset
   236
        m_minimumScale = m_specifiedData.m_minScale;
hgs
parents:
diff changeset
   237
        m_minimumScale = qBound(fitToWidthZoom, m_minimumScale, m_maximumScale);
hgs
parents:
diff changeset
   238
    }
hgs
parents:
diff changeset
   239
    else
hgs
parents:
diff changeset
   240
        m_minimumScale = fitToWidthZoom;
hgs
parents:
diff changeset
   241
hgs
parents:
diff changeset
   242
    //Adjust initial-scale
16
hgs
parents: 3
diff changeset
   243
//    if (getFlag(UserDefinedInitialScale))
hgs
parents: 3
diff changeset
   244
//        m_initialScale = qBound(m_minimumScale, m_initialScale, m_maximumScale);
hgs
parents: 3
diff changeset
   245
//    else
hgs
parents: 3
diff changeset
   246
//        m_initialScale = m_minimumScale;
3
hgs
parents:
diff changeset
   247
16
hgs
parents: 3
diff changeset
   248
#ifdef VIEWPORT_ALWAYS_ALLOW_ZOOMING
hgs
parents: 3
diff changeset
   249
    if (m_minimumScale == m_maximumScale) {
hgs
parents: 3
diff changeset
   250
        m_minimumScale = DefaultMinScale;
hgs
parents: 3
diff changeset
   251
        m_maximumScale = DefaultMaxScale;
hgs
parents: 3
diff changeset
   252
        if(!m_userScalable) {
hgs
parents: 3
diff changeset
   253
            m_userScalable = true;
hgs
parents: 3
diff changeset
   254
            m_userScalableOverRidden = true;
hgs
parents: 3
diff changeset
   255
        }
hgs
parents: 3
diff changeset
   256
    }
hgs
parents: 3
diff changeset
   257
#else
3
hgs
parents:
diff changeset
   258
    //Turn off zooming if min and max zoom are same
hgs
parents:
diff changeset
   259
    if (m_minimumScale == m_maximumScale)
hgs
parents:
diff changeset
   260
        m_userScalable = false;
16
hgs
parents: 3
diff changeset
   261
#endif
3
hgs
parents:
diff changeset
   262
}
hgs
parents:
diff changeset
   263
hgs
parents:
diff changeset
   264
hgs
parents:
diff changeset
   265
//FIX ME : Merge below functions to single. Now in Hurry!!
hgs
parents:
diff changeset
   266
bool ViewportMetaData::isUserSpecifiedWidth()
hgs
parents:
diff changeset
   267
{
hgs
parents:
diff changeset
   268
    if (m_specifiedData.m_width.length()) {
hgs
parents:
diff changeset
   269
        if (!QString::compare(m_specifiedData.m_width, "device-width", Qt::CaseInsensitive)
hgs
parents:
diff changeset
   270
            || !QString::compare(m_specifiedData.m_width, "device-height", Qt::CaseInsensitive))
hgs
parents:
diff changeset
   271
            return false;
hgs
parents:
diff changeset
   272
    }
hgs
parents:
diff changeset
   273
    return true;
hgs
parents:
diff changeset
   274
}
hgs
parents:
diff changeset
   275
hgs
parents:
diff changeset
   276
bool ViewportMetaData::isUserSpecifiedHeight()
hgs
parents:
diff changeset
   277
{
hgs
parents:
diff changeset
   278
    if (m_specifiedData.m_height.length()) {
hgs
parents:
diff changeset
   279
        if (!QString::compare(m_specifiedData.m_height, "device-width", Qt::CaseInsensitive)
hgs
parents:
diff changeset
   280
            || !QString::compare(m_specifiedData.m_height, "device-height", Qt::CaseInsensitive))
hgs
parents:
diff changeset
   281
            return false;
hgs
parents:
diff changeset
   282
    }
hgs
parents:
diff changeset
   283
    return true;
hgs
parents:
diff changeset
   284
}
hgs
parents:
diff changeset
   285
hgs
parents:
diff changeset
   286
}//namespace GVA
hgs
parents:
diff changeset
   287