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);
}
|