aboutsummaryrefslogtreecommitdiff
path: root/src/corelib/core/mpannableviewportscroller.cpp
blob: be854ec40a92dca1e4345b182263b87edd70413d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/***************************************************************************
**
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
** All rights reserved.
** Contact: Nokia Corporation (directui@nokia.com)
**
** This file is part of libmeegotouch.
**
** If you have questions regarding the use of this file, please contact
** Nokia at directui@nokia.com.
**
** This library is free software; you can redistribute it and/or
** modify it under the terms of the GNU Lesser General Public
** License version 2.1 as published by the Free Software Foundation
** and appearing in the file LICENSE.LGPL included in the packaging
** of this file.
**
****************************************************************************/

#include "mpannableviewportscroller.h"
#include "mpannableviewport.h"
#include "mpannableviewport_p.h"

QPoint MPannableViewportScroller::queryScrollingAmount(const QGraphicsWidget *widget,
                                                       const QRect &targetRect,
                                                       const QPoint &originPoint,
                                                       const QPoint &)
{
    const MPannableViewport *viewport = static_cast<const MPannableViewport *>(widget);

    if (viewport->panDirection() == 0) {
        return QPoint(); // unable to scroll
    }

    // First ensure that target rectangle is inside of area of the pannable viewport.
    // Note: We might even move against the wanted direction but this is required to
    // ensure the visibility of the area marked by target rectangle.
    QRect visibleTargetRect(targetRect);
    moveRectInsideArea(viewport->contentsRect().toRect(), visibleTargetRect);

    // Calculate how much pannable contents should be translated.
    const QPoint contentsOffset(visibleTargetRect.topLeft() - originPoint);

    // Calculate the new panning position, i.e. position of the pannable viewport
    // in panned widget coordinates.
    QPointF panningPos(viewport->position() - contentsOffset);

    // Get allowed range for position to be used with MPannableWidget::setPosition().
    QRectF posRange = viewport->range();

    // ...and limit our panning accordingly.
    panningPos.rx() = qBound(posRange.left(), panningPos.x(), posRange.right());
    panningPos.ry() = qMax(posRange.top(), panningPos.y()); // We can extend bottom limit.

    const QPoint translation((viewport->position() - panningPos).toPoint());
    return translation;
}

void MPannableViewportScroller::applyScrolling(QGraphicsWidget *widget, const QPoint &contentsOffset)
{
    MPannableViewport *viewport = static_cast<MPannableViewport *>(widget);

    viewport->d_func()->scrollTo(viewport->position() - contentsOffset);

    // Disables kinetic scrolling until next pointer event.
    viewport->physics()->stop();

    //TODO: After scrolling of every widget the topmost pannable viewport should make sure its range
    // covers at least the sip.
}

void MPannableViewportScroller::restoreScrolling(QGraphicsWidget *widget)
{
    MPannableViewport *viewport = static_cast<MPannableViewport *>(widget);
    viewport->d_func()->setAutoScrollingExtension(0);
}