~faenil/ubuntu-ui-toolkit/flickableBasedScrollView

« back to all changes in this revision

Viewing changes to src/Ubuntu/Components/plugin/gestures/damper.h

  • Committer: Andrea Bernabei
  • Date: 2015-11-25 11:50:10 UTC
  • mfrom: (1681.2.44 staging)
  • Revision ID: andrea.bernabei@canonical.com-20151125115010-vpxkm2lze1hav9q9
mergeĀ upstream

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (C) 2013 Canonical, Ltd.
 
3
 *
 
4
 * This program is free software; you can redistribute it and/or modify
 
5
 * it under the terms of the GNU General Public License as published by
 
6
 * the Free Software Foundation; version 3.
 
7
 *
 
8
 * This program is distributed in the hope that it will be useful,
 
9
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
11
 * GNU General Public License for more details.
 
12
 *
 
13
 * You should have received a copy of the GNU General Public License
 
14
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
15
 */
 
16
 
 
17
#ifndef UBUNTU_GESTURES_DAMPER_H
 
18
#define UBUNTU_GESTURES_DAMPER_H
 
19
 
 
20
#include <QtCore/QPointF>
 
21
 
 
22
/*
 
23
  Decreases the oscillations of a value along an axis.
 
24
 */
 
25
template <class Type> class Damper {
 
26
public:
 
27
    Damper() : m_value(0), m_maxDelta(0) { }
 
28
 
 
29
    // Maximum delta between the raw value and its dampened counterpart.
 
30
    void setMaxDelta(Type maxDelta) {
 
31
        if (maxDelta < 0) qFatal("Damper::maxDelta must be a positive number.");
 
32
        m_maxDelta = maxDelta;
 
33
    }
 
34
    Type maxDelta() const { return m_maxDelta; }
 
35
 
 
36
    void reset(Type value) {
 
37
        m_value = value;
 
38
    }
 
39
 
 
40
    Type update(Type value) {
 
41
        Type delta = value - m_value;
 
42
        if (delta > 0 && delta > m_maxDelta) {
 
43
            m_value += delta - m_maxDelta;
 
44
        } else if (delta < 0 && delta < -m_maxDelta) {
 
45
            m_value += delta + m_maxDelta;
 
46
        }
 
47
 
 
48
        return m_value;
 
49
    }
 
50
 
 
51
    Type value() const { return m_value; }
 
52
 
 
53
private:
 
54
    Type m_value;
 
55
    Type m_maxDelta;
 
56
};
 
57
 
 
58
/*
 
59
    A point that has its movement dampened.
 
60
 */
 
61
class DampedPointF {
 
62
public:
 
63
    void setMaxDelta(qreal maxDelta) {
 
64
        m_x.setMaxDelta(maxDelta);
 
65
        m_y.setMaxDelta(maxDelta);
 
66
    }
 
67
 
 
68
    qreal maxDelta() const { return m_x.maxDelta(); }
 
69
 
 
70
    void reset(const QPointF &point) {
 
71
        m_x.reset(point.x());
 
72
        m_y.reset(point.y());
 
73
    }
 
74
 
 
75
    void update(const QPointF &point) {
 
76
        m_x.update(point.x());
 
77
        m_y.update(point.y());
 
78
    }
 
79
 
 
80
    qreal x() const { return m_x.value(); }
 
81
    qreal y() const { return m_y.value(); }
 
82
private:
 
83
    Damper<qreal> m_x;
 
84
    Damper<qreal> m_y;
 
85
};
 
86
 
 
87
QDebug operator<<(QDebug dbg, const DampedPointF &p);
 
88
 
 
89
#endif // UBUNTU_GESTURES_DAMPER_H