File: slide.cpp

package info (click to toggle)
kde4libs 4%3A4.14.2-5
  • links: PTS, VCS
  • area: main
  • in suites: jessie-kfreebsd
  • size: 82,316 kB
  • sloc: cpp: 761,810; xml: 12,344; ansic: 6,295; java: 4,060; perl: 2,938; yacc: 2,507; python: 1,207; sh: 1,179; ruby: 337; lex: 278; makefile: 29
file content (129 lines) | stat: -rw-r--r-- 3,666 bytes parent folder | download | duplicates (5)
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/*
 *   Copyright 2009 Mehmet Ali Akmanalp <makmanalp@wpi.edu>
 *
 *   This program is free software; you can redistribute it and/or modify
 *   it under the terms of the GNU Library General Public License as
 *   published by the Free Software Foundation; either version 2, or
 *   (at your option) any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details
 *
 *   You should have received a copy of the GNU Library General Public
 *   License along with this program; if not, write to the
 *   Free Software Foundation, Inc.,
 *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */

#include "slide_p.h"

#include <QPointF>
#include <kdebug.h>

namespace Plasma
{

void SlideAnimation::setDistance(qreal distance)
{
    m_animDistance = QPointF(distance,  0.0);
}

qreal SlideAnimation::distance() const
{
    return m_animDistance.x();
}

void SlideAnimation::setDistancePointF(const QPointF &distance)
{
    m_animDistance = distance;
}

QPointF SlideAnimation::distancePointF() const
{
    return m_animDistance;
}

SlideAnimation::~SlideAnimation()
{
}

SlideAnimation::SlideAnimation(QObject *parent,
                               MovementDirection direction,
                               qreal distance) : EasingAnimation(parent)
{
    setMovementDirection(direction);
    setDistance(distance);
    setEasingCurve(QEasingCurve::OutCirc);
}

void SlideAnimation::setMovementDirection(const Animation::MovementDirection &direction)
{
    m_animDirection = direction;
}

Animation::MovementDirection SlideAnimation::movementDirection() const
{
    return m_animDirection;
}

void SlideAnimation::updateEffectiveTime(int currentTime)
{
    QGraphicsWidget *w = targetWidget();
    if (w && state() == QAbstractAnimation::Running) {
        const qreal delta = currentTime / qreal(duration());
        w->setPos(m_startPos * (1-delta) + (m_targetPos * delta));
    }
}

void SlideAnimation::updateState(QAbstractAnimation::State newState, QAbstractAnimation::State oldState)
{
    if (oldState == QAbstractAnimation::Stopped && newState == QAbstractAnimation::Running) {
        if (!targetWidget()) {
            return;
        }
        m_startPos = targetWidget()->pos();

        qreal newX = m_startPos.x();
        qreal newY = m_startPos.y();

        QPointF actualDistance = (direction() == \
                                  QAbstractAnimation::Forward ? \
                                  distancePointF():-distancePointF());

        bool moveAnyOnly = true;

        if (m_animDirection.testFlag(MoveUp)) {
            newY -= actualDistance.x();
            moveAnyOnly = false;
        } else if (m_animDirection.testFlag(MoveDown)) {
            newY += actualDistance.x();
            moveAnyOnly = false;
        }

        if (m_animDirection.testFlag(MoveRight)) {
            newX += actualDistance.x();
            moveAnyOnly = false;
        } else if (m_animDirection.testFlag(MoveLeft)) {
            newX -= actualDistance.x();
            moveAnyOnly = false;
        }

        if (moveAnyOnly && m_animDirection.testFlag(MoveAny)) {
            newX += actualDistance.x();
            newY += actualDistance.y();
        }

        if (direction() == QAbstractAnimation::Forward) {
            m_targetPos = QPointF(newX, newY);
        } else {
            m_targetPos = m_startPos;
            m_startPos = QPointF(newX, newY);
        }
    }
}

} //namespace Plasma

#include "slide_p.moc"